From b2afb8800bb033a04bb3ecdf0363068d56648ef1 Mon Sep 17 00:00:00 2001 From: Jacek Antonelli Date: Fri, 15 Aug 2008 23:44:54 -0500 Subject: Second Life viewer sources 1.15.0.2 --- linden/indra/SConstruct | 1089 +- linden/indra/indra_complete/indra_complete.sln | 13 + linden/indra/lib/python/indra/llmanifest.py | 19 +- .../linux_crash_logger/linux_crash_logger.cpp | 1 + linden/indra/llaudio/audioengine.cpp | 3 +- linden/indra/llaudio/audioengine.h | 1 + linden/indra/llaudio/audioengine_fmod.cpp | 1 + linden/indra/llaudio/audioengine_fmod.h | 1 + linden/indra/llaudio/listener.cpp | 1 + linden/indra/llaudio/listener.h | 1 + linden/indra/llaudio/listener_ds3d.h | 1 + linden/indra/llaudio/listener_fmod.cpp | 1 + linden/indra/llaudio/listener_fmod.h | 1 + linden/indra/llaudio/listener_openal.h | 1 + linden/indra/llaudio/llaudiodecodemgr.cpp | 3 +- linden/indra/llaudio/llaudiodecodemgr.h | 1 + linden/indra/llaudio/vorbisdecode.cpp | 1 + linden/indra/llaudio/vorbisdecode.h | 1 + linden/indra/llaudio/vorbisencode.cpp | 1 + linden/indra/llaudio/vorbisencode.h | 1 + linden/indra/llcharacter/llanimationstates.cpp | 1 + linden/indra/llcharacter/llanimationstates.h | 1 + linden/indra/llcharacter/llbvhloader.cpp | 3 +- linden/indra/llcharacter/llbvhloader.h | 1 + linden/indra/llcharacter/llcharacter.cpp | 1 + linden/indra/llcharacter/llcharacter.h | 3 +- linden/indra/llcharacter/lleditingmotion.cpp | 1 + linden/indra/llcharacter/lleditingmotion.h | 1 + linden/indra/llcharacter/llgesture.cpp | 1 + linden/indra/llcharacter/llgesture.h | 1 + linden/indra/llcharacter/llhandmotion.cpp | 1 + linden/indra/llcharacter/llhandmotion.h | 1 + linden/indra/llcharacter/llheadrotmotion.cpp | 1 + linden/indra/llcharacter/llheadrotmotion.h | 1 + linden/indra/llcharacter/lljoint.cpp | 1 + linden/indra/llcharacter/lljoint.h | 1 + linden/indra/llcharacter/lljointsolverrp3.cpp | 1 + linden/indra/llcharacter/lljointsolverrp3.h | 1 + linden/indra/llcharacter/lljointstate.h | 1 + linden/indra/llcharacter/llkeyframefallmotion.cpp | 1 + linden/indra/llcharacter/llkeyframefallmotion.h | 1 + linden/indra/llcharacter/llkeyframemotion.cpp | 127 +- linden/indra/llcharacter/llkeyframemotion.h | 16 +- linden/indra/llcharacter/llkeyframemotionparam.cpp | 3 +- linden/indra/llcharacter/llkeyframemotionparam.h | 1 + linden/indra/llcharacter/llkeyframestandmotion.cpp | 1 + linden/indra/llcharacter/llkeyframestandmotion.h | 1 + linden/indra/llcharacter/llkeyframewalkmotion.cpp | 1 + linden/indra/llcharacter/llkeyframewalkmotion.h | 1 + linden/indra/llcharacter/llmotion.cpp | 1 + linden/indra/llcharacter/llmotion.h | 1 + linden/indra/llcharacter/llmotioncontroller.cpp | 122 +- linden/indra/llcharacter/llmotioncontroller.h | 19 +- linden/indra/llcharacter/llmultigesture.cpp | 3 +- linden/indra/llcharacter/llmultigesture.h | 1 + linden/indra/llcharacter/llpose.cpp | 45 +- linden/indra/llcharacter/llpose.h | 7 +- linden/indra/llcharacter/llstatemachine.cpp | 1 + linden/indra/llcharacter/llstatemachine.h | 1 + linden/indra/llcharacter/lltargetingmotion.cpp | 1 + linden/indra/llcharacter/lltargetingmotion.h | 1 + linden/indra/llcharacter/llvisualparam.cpp | 1 + linden/indra/llcharacter/llvisualparam.h | 1 + linden/indra/llcommon/bitpack.cpp | 167 - linden/indra/llcommon/bitpack.h | 1 + linden/indra/llcommon/ctype_workaround.h | 1 + linden/indra/llcommon/doublelinkedlist.h | 1 + linden/indra/llcommon/files.lst | 1 - linden/indra/llcommon/imageids.h | 1 + linden/indra/llcommon/indra_constants.h | 7 +- linden/indra/llcommon/linden_common.h | 1 + linden/indra/llcommon/linked_lists.h | 1 + linden/indra/llcommon/llagentconstants.h | 1 + linden/indra/llcommon/llapp.cpp | 1 + linden/indra/llcommon/llapp.h | 1 + linden/indra/llcommon/llapr.cpp | 1 + linden/indra/llcommon/llapr.h | 1 + linden/indra/llcommon/llassettype.cpp | 1 + linden/indra/llcommon/llassettype.h | 1 + linden/indra/llcommon/llassoclist.h | 1 + linden/indra/llcommon/llavatarconstants.h | 1 + linden/indra/llcommon/llbase32.h | 39 +- linden/indra/llcommon/llbase64.cpp | 1 + linden/indra/llcommon/llbase64.h | 1 + linden/indra/llcommon/llboost.h | 1 + linden/indra/llcommon/llchat.h | 1 + linden/indra/llcommon/llclickaction.h | 1 + linden/indra/llcommon/llcommon.cpp | 1 + linden/indra/llcommon/llcommon.h | 1 + linden/indra/llcommon/llcommon.vcproj | 3 - linden/indra/llcommon/llcommon_vc8.vcproj | 1518 +-- linden/indra/llcommon/llcriticaldamp.cpp | 1 + linden/indra/llcommon/llcriticaldamp.h | 1 + linden/indra/llcommon/lldarray.h | 1 + linden/indra/llcommon/lldarrayptr.h | 1 + linden/indra/llcommon/lldate.cpp | 1 + linden/indra/llcommon/lldate.h | 1 + linden/indra/llcommon/lldefs.h | 1 + linden/indra/llcommon/lldepthstack.h | 1 + linden/indra/llcommon/lldlinked.h | 1 + linden/indra/llcommon/lldqueueptr.h | 1 + linden/indra/llcommon/llendianswizzle.h | 1 + linden/indra/llcommon/llenum.h | 1 + linden/indra/llcommon/llerror.cpp | 7 +- linden/indra/llcommon/llerror.h | 1 + linden/indra/llcommon/llerrorcontrol.h | 1 + linden/indra/llcommon/llerrorlegacy.h | 1 + linden/indra/llcommon/llerrorthread.cpp | 1 + linden/indra/llcommon/llerrorthread.h | 1 + linden/indra/llcommon/llevent.cpp | 1 + linden/indra/llcommon/llevent.h | 1 + linden/indra/llcommon/lleventemitter.h | 1 + linden/indra/llcommon/llfasttimer.cpp | 1 + linden/indra/llcommon/llfasttimer.h | 1 + linden/indra/llcommon/llfile.cpp | 1 + linden/indra/llcommon/llfile.h | 1 + linden/indra/llcommon/llfixedbuffer.cpp | 1 + linden/indra/llcommon/llfixedbuffer.h | 1 + linden/indra/llcommon/llformat.cpp | 1 + linden/indra/llcommon/llformat.h | 1 + linden/indra/llcommon/llframetimer.cpp | 45 + linden/indra/llcommon/llframetimer.h | 16 +- linden/indra/llcommon/llhash.h | 1 + linden/indra/llcommon/llindexedqueue.h | 1 + linden/indra/llcommon/lllinkedqueue.h | 1 + linden/indra/llcommon/llliveappconfig.cpp | 1 + linden/indra/llcommon/llliveappconfig.h | 1 + linden/indra/llcommon/lllivefile.cpp | 1 + linden/indra/llcommon/lllivefile.h | 1 + linden/indra/llcommon/lllocalidhashmap.h | 1 + linden/indra/llcommon/lllslconstants.h | 1 + linden/indra/llcommon/llmap.h | 1 + linden/indra/llcommon/llmemory.cpp | 6 +- linden/indra/llcommon/llmemory.h | 90 +- linden/indra/llcommon/llmemorystream.cpp | 1 + linden/indra/llcommon/llmemorystream.h | 1 + linden/indra/llcommon/llmemtype.h | 1 + linden/indra/llcommon/llmortician.cpp | 1 + linden/indra/llcommon/llmortician.h | 1 + linden/indra/llcommon/llnametable.h | 1 + linden/indra/llcommon/llpagemem.h | 1 + linden/indra/llcommon/llpreprocessor.h | 14 +- linden/indra/llcommon/llpriqueuemap.h | 1 + linden/indra/llcommon/llprocessor.cpp | 239 +- linden/indra/llcommon/llprocessor.h | 1 + linden/indra/llcommon/llptrskiplist.h | 1 + linden/indra/llcommon/llptrskipmap.h | 1 + linden/indra/llcommon/llqueuedthread.cpp | 1 + linden/indra/llcommon/llqueuedthread.h | 1 + linden/indra/llcommon/llrun.cpp | 1 + linden/indra/llcommon/llrun.h | 1 + linden/indra/llcommon/llsd.cpp | 1 + linden/indra/llcommon/llsd.h | 1 + linden/indra/llcommon/llsdserialize.cpp | 1 + linden/indra/llcommon/llsdserialize.h | 1 + linden/indra/llcommon/llsdserialize_xml.cpp | 14 +- linden/indra/llcommon/llsdserialize_xml.h | 1 + linden/indra/llcommon/llsdutil.cpp | 62 +- linden/indra/llcommon/llsdutil.h | 12 + linden/indra/llcommon/llsecondlifeurls.cpp | 1 + linden/indra/llcommon/llsecondlifeurls.h | 1 + linden/indra/llcommon/llsimplehash.h | 1 + linden/indra/llcommon/llskiplist.h | 1 + linden/indra/llcommon/llskipmap.h | 1 + linden/indra/llcommon/llstack.h | 1 + linden/indra/llcommon/llstat.cpp | 6 +- linden/indra/llcommon/llstat.h | 1 + linden/indra/llcommon/llstatenums.h | 1 + linden/indra/llcommon/llstl.h | 1 + linden/indra/llcommon/llstreamtools.cpp | 1 + linden/indra/llcommon/llstreamtools.h | 1 + linden/indra/llcommon/llstrider.h | 1 + linden/indra/llcommon/llstring.cpp | 28 + linden/indra/llcommon/llstring.h | 5 + linden/indra/llcommon/llstringtable.cpp | 1 + linden/indra/llcommon/llstringtable.h | 1 + linden/indra/llcommon/llsys.cpp | 46 +- linden/indra/llcommon/llsys.h | 2 +- linden/indra/llcommon/llthread.cpp | 1 + linden/indra/llcommon/llthread.h | 1 + linden/indra/llcommon/lltimer.cpp | 1 + linden/indra/llcommon/lltimer.h | 1 + linden/indra/llcommon/lluri.cpp | 48 +- linden/indra/llcommon/lluri.h | 14 +- linden/indra/llcommon/lluuidhashmap.h | 11 +- linden/indra/llcommon/llversion.h | 10 +- linden/indra/llcommon/llworkerthread.cpp | 1 + linden/indra/llcommon/llworkerthread.h | 3 +- linden/indra/llcommon/metaclass.cpp | 1 + linden/indra/llcommon/metaclass.h | 1 + linden/indra/llcommon/metaclasst.h | 1 + linden/indra/llcommon/metaproperty.cpp | 1 + linden/indra/llcommon/metaproperty.h | 1 + linden/indra/llcommon/metapropertyt.h | 1 + linden/indra/llcommon/processor.h | 1 + linden/indra/llcommon/reflective.cpp | 1 + linden/indra/llcommon/reflective.h | 1 + linden/indra/llcommon/reflectivet.h | 1 + linden/indra/llcommon/roles_constants.h | 1 + linden/indra/llcommon/stdenums.h | 1 + linden/indra/llcommon/stdtypes.h | 1 + linden/indra/llcommon/string_table.h | 1 + linden/indra/llcommon/timer.h | 1 + linden/indra/llcommon/timing.cpp | 1 + linden/indra/llcommon/timing.h | 1 + linden/indra/llcommon/u64.cpp | 1 + linden/indra/llcommon/u64.h | 1 + linden/indra/llimage/llimage.cpp | 1 + linden/indra/llimage/llimage.h | 1 + linden/indra/llimage/llimagebmp.cpp | 1 + linden/indra/llimage/llimagebmp.h | 1 + linden/indra/llimage/llimagedxt.cpp | 6 +- linden/indra/llimage/llimagedxt.h | 1 + linden/indra/llimage/llimagej2c.cpp | 1 + linden/indra/llimage/llimagej2c.h | 1 + linden/indra/llimage/llimagejpeg.cpp | 1 + linden/indra/llimage/llimagejpeg.h | 2 +- linden/indra/llimage/llimagetga.cpp | 1 + linden/indra/llimage/llimagetga.h | 1 + linden/indra/llimage/llimageworker.cpp | 1 + linden/indra/llimage/llimageworker.h | 1 + linden/indra/llimage/llmapimagetype.h | 1 + linden/indra/llimagej2coj/llimagej2coj.cpp | 23 +- linden/indra/llimagej2coj/llimagej2coj.h | 1 + linden/indra/llinventory/llcategory.cpp | 1 + linden/indra/llinventory/llcategory.h | 1 + linden/indra/llinventory/lleconomy.cpp | 6 + linden/indra/llinventory/lleconomy.h | 1 + linden/indra/llinventory/llinventory.cpp | 15 +- linden/indra/llinventory/llinventory.h | 5 + linden/indra/llinventory/lllandmark.cpp | 1 + linden/indra/llinventory/lllandmark.h | 1 + linden/indra/llinventory/llnotecard.cpp | 1 + linden/indra/llinventory/llnotecard.h | 1 + linden/indra/llinventory/llparcel.cpp | 14 +- linden/indra/llinventory/llparcel.h | 6 +- linden/indra/llinventory/llparcelflags.h | 1 + linden/indra/llinventory/llpermissions.cpp | 11 +- linden/indra/llinventory/llpermissions.h | 1 + linden/indra/llinventory/llpermissionsflags.h | 1 + linden/indra/llinventory/llsaleinfo.cpp | 1 + linden/indra/llinventory/llsaleinfo.h | 1 + linden/indra/llinventory/lltransactionflags.cpp | 1 + linden/indra/llinventory/lltransactionflags.h | 1 + linden/indra/llinventory/lltransactiontypes.h | 1 + linden/indra/llinventory/lluserrelations.cpp | 1 + linden/indra/llinventory/lluserrelations.h | 1 + linden/indra/llmath/camera.h | 1 + linden/indra/llmath/coordframe.h | 1 + linden/indra/llmath/llbboxlocal.cpp | 1 + linden/indra/llmath/llbboxlocal.h | 1 + linden/indra/llmath/llcamera.cpp | 1 + linden/indra/llmath/llcamera.h | 1 + linden/indra/llmath/llcoord.h | 1 + linden/indra/llmath/llcoordframe.cpp | 1 + linden/indra/llmath/llcoordframe.h | 1 + linden/indra/llmath/llcrc.cpp | 1 + linden/indra/llmath/llcrc.h | 1 + linden/indra/llmath/llinterp.h | 1 + linden/indra/llmath/llmath.h | 1 + linden/indra/llmath/llmath.vcproj | 6 +- linden/indra/llmath/llmd5.cpp | 3 +- linden/indra/llmath/llmd5.h | 1 + linden/indra/llmath/lloctree.h | 1 + linden/indra/llmath/llperlin.cpp | 1 + linden/indra/llmath/llperlin.h | 1 + linden/indra/llmath/llplane.h | 1 + linden/indra/llmath/llquantize.h | 1 + linden/indra/llmath/llquaternion.cpp | 1 + linden/indra/llmath/llquaternion.h | 1 + linden/indra/llmath/llrand.cpp | 1 + linden/indra/llmath/llrand.h | 1 + linden/indra/llmath/llrect.cpp | 1 + linden/indra/llmath/llrect.h | 1 + linden/indra/llmath/lltreenode.h | 1 + linden/indra/llmath/lluuid.cpp | 6 + linden/indra/llmath/lluuid.h | 2 + linden/indra/llmath/llvolume.cpp | 5 +- linden/indra/llmath/llvolume.h | 29 +- linden/indra/llmath/llvolumemgr.cpp | 3 +- linden/indra/llmath/llvolumemgr.h | 1 + linden/indra/llmath/m3math.cpp | 1 + linden/indra/llmath/m3math.h | 1 + linden/indra/llmath/m4math.cpp | 67 +- linden/indra/llmath/m4math.h | 22 +- linden/indra/llmath/raytrace.cpp | 1 + linden/indra/llmath/raytrace.h | 1 + linden/indra/llmath/v2math.cpp | 1 + linden/indra/llmath/v2math.h | 1 + linden/indra/llmath/v3color.cpp | 50 + linden/indra/llmath/v3color.h | 3 + linden/indra/llmath/v3dmath.cpp | 1 + linden/indra/llmath/v3dmath.h | 1 + linden/indra/llmath/v3math.cpp | 1 + linden/indra/llmath/v3math.h | 1 + linden/indra/llmath/v4color.cpp | 50 + linden/indra/llmath/v4color.h | 3 + linden/indra/llmath/v4coloru.cpp | 1 + linden/indra/llmath/v4coloru.h | 1 + linden/indra/llmath/v4math.cpp | 1 + linden/indra/llmath/v4math.h | 12 +- linden/indra/llmath/xform.cpp | 1 + linden/indra/llmath/xform.h | 1 + linden/indra/llmedia/llmediabase.cpp | 1 + linden/indra/llmedia/llmediabase.h | 1 + linden/indra/llmedia/llmediaemitter.h | 1 + linden/indra/llmedia/llmediaemitterevents.h | 1 + linden/indra/llmedia/llmediaengine.cpp | 1 + linden/indra/llmedia/llmediaengine.h | 1 + linden/indra/llmedia/llmediaimplquicktime.cpp | 1 + linden/indra/llmedia/llmediaimplquicktime.h | 1 + linden/indra/llmedia/llmediamoviebase.cpp | 1 + linden/indra/llmedia/llmediamoviebase.h | 1 + linden/indra/llmedia/llmediaobservers.h | 1 + linden/indra/llmessage/files.lst | 11 +- linden/indra/llmessage/llassetstorage.cpp | 16 +- linden/indra/llmessage/llassetstorage.h | 1 + linden/indra/llmessage/llblowfishcipher.cpp | 49 +- linden/indra/llmessage/llblowfishcipher.h | 1 + linden/indra/llmessage/llbuffer.cpp | 121 +- linden/indra/llmessage/llbuffer.h | 91 +- linden/indra/llmessage/llbufferstream.cpp | 96 +- linden/indra/llmessage/llbufferstream.h | 1 + linden/indra/llmessage/llcachename.cpp | 1 + linden/indra/llmessage/llcachename.h | 1 + linden/indra/llmessage/llcallbacklisth.h | 1 + linden/indra/llmessage/llchainio.cpp | 1 + linden/indra/llmessage/llchainio.h | 1 + linden/indra/llmessage/llcipher.h | 1 + linden/indra/llmessage/llcircuit.cpp | 1 + linden/indra/llmessage/llcircuit.h | 1 + linden/indra/llmessage/llclassifiedflags.cpp | 1 + linden/indra/llmessage/llclassifiedflags.h | 3 + linden/indra/llmessage/lldatapacker.cpp | 221 +- linden/indra/llmessage/lldatapacker.h | 1 + linden/indra/llmessage/lldbstrings.h | 1 + linden/indra/llmessage/lldispatcher.cpp | 1 + linden/indra/llmessage/lldispatcher.h | 1 + linden/indra/llmessage/lleventflags.h | 1 + linden/indra/llmessage/llfiltersd2xmlrpc.cpp | 1 + linden/indra/llmessage/llfiltersd2xmlrpc.h | 1 + linden/indra/llmessage/llfollowcamparams.h | 1 + linden/indra/llmessage/llhost.cpp | 7 +- linden/indra/llmessage/llhost.h | 1 + linden/indra/llmessage/llhttpassetstorage.cpp | 51 +- linden/indra/llmessage/llhttpassetstorage.h | 1 + linden/indra/llmessage/llhttpclient.cpp | 65 +- linden/indra/llmessage/llhttpclient.h | 17 +- linden/indra/llmessage/llhttpnode.cpp | 1 + linden/indra/llmessage/llhttpnode.h | 1 + linden/indra/llmessage/llhttpsender.cpp | 90 + linden/indra/llmessage/llhttpsender.h | 58 + linden/indra/llmessage/llinstantmessage.cpp | 48 +- linden/indra/llmessage/llinstantmessage.h | 18 +- linden/indra/llmessage/llinvite.h | 1 + linden/indra/llmessage/lliobuffer.cpp | 1 + linden/indra/llmessage/lliobuffer.h | 1 + linden/indra/llmessage/lliohttpserver.cpp | 27 +- linden/indra/llmessage/lliohttpserver.h | 4 +- linden/indra/llmessage/lliopipe.cpp | 1 + linden/indra/llmessage/lliopipe.h | 3 +- linden/indra/llmessage/lliosocket.cpp | 14 +- linden/indra/llmessage/lliosocket.h | 1 + linden/indra/llmessage/llioutil.cpp | 1 + linden/indra/llmessage/llioutil.h | 1 + linden/indra/llmessage/llloginflags.h | 1 + linden/indra/llmessage/lllogtextmessage.cpp | 1 + linden/indra/llmessage/lllogtextmessage.h | 1 + linden/indra/llmessage/llmail.cpp | 1 + linden/indra/llmessage/llmail.h | 1 + linden/indra/llmessage/llmessage.vcproj | 52 +- linden/indra/llmessage/llmessagebuilder.cpp | 38 + linden/indra/llmessage/llmessagebuilder.h | 70 + linden/indra/llmessage/llmessageconfig.cpp | 230 + linden/indra/llmessage/llmessageconfig.h | 51 + linden/indra/llmessage/llmessagereader.cpp | 35 + linden/indra/llmessage/llmessagereader.h | 59 + linden/indra/llmessage/llmessagetemplate.cpp | 146 + linden/indra/llmessage/llmessagetemplate.h | 356 + linden/indra/llmessage/llmessagethrottle.cpp | 1 + linden/indra/llmessage/llmessagethrottle.h | 1 + linden/indra/llmessage/llmime.cpp | 1 + linden/indra/llmessage/llmime.h | 1 + linden/indra/llmessage/llmsgvariabletype.h | 33 + linden/indra/llmessage/llnamevalue.cpp | 1 + linden/indra/llmessage/llnamevalue.h | 1 + linden/indra/llmessage/llnullcipher.cpp | 1 + linden/indra/llmessage/llnullcipher.h | 1 + linden/indra/llmessage/llpacketack.h | 19 +- linden/indra/llmessage/llpacketbuffer.cpp | 1 + linden/indra/llmessage/llpacketbuffer.h | 1 + linden/indra/llmessage/llpacketring.cpp | 1 + linden/indra/llmessage/llpacketring.h | 1 + linden/indra/llmessage/llpartdata.cpp | 1 + linden/indra/llmessage/llpartdata.h | 1 + linden/indra/llmessage/llpumpio.cpp | 9 +- linden/indra/llmessage/llpumpio.h | 2 + linden/indra/llmessage/llqueryflags.h | 4 + linden/indra/llmessage/llregionflags.h | 1 + linden/indra/llmessage/llregionhandle.h | 1 + linden/indra/llmessage/llsdappservices.cpp | 1 + linden/indra/llmessage/llsdappservices.h | 1 + linden/indra/llmessage/llsdhttpserver.cpp | 1 + linden/indra/llmessage/llsdhttpserver.h | 1 + linden/indra/llmessage/llsdmessagebuilder.cpp | 281 + linden/indra/llmessage/llsdmessagebuilder.h | 98 + linden/indra/llmessage/llsdmessagereader.cpp | 264 + linden/indra/llmessage/llsdmessagereader.h | 79 + linden/indra/llmessage/llsdmessagesystem.cpp | 176 - linden/indra/llmessage/llsdmessagesystem.h | 73 - linden/indra/llmessage/llsdrpcclient.cpp | 1 + linden/indra/llmessage/llsdrpcclient.h | 1 + linden/indra/llmessage/llsdrpcserver.cpp | 1 + linden/indra/llmessage/llsdrpcserver.h | 1 + linden/indra/llmessage/llservice.cpp | 1 + linden/indra/llmessage/llservice.h | 3 +- linden/indra/llmessage/llservicebuilder.cpp | 135 + linden/indra/llmessage/llservicebuilder.h | 93 + linden/indra/llmessage/lltaskname.h | 1 + linden/indra/llmessage/llteleportflags.h | 1 + .../indra/llmessage/lltemplatemessagebuilder.cpp | 856 ++ linden/indra/llmessage/lltemplatemessagebuilder.h | 88 + linden/indra/llmessage/lltemplatemessagereader.cpp | 750 ++ linden/indra/llmessage/lltemplatemessagereader.h | 98 + linden/indra/llmessage/llthrottle.cpp | 1 + linden/indra/llmessage/llthrottle.h | 1 + linden/indra/llmessage/lltransfermanager.cpp | 1 + linden/indra/llmessage/lltransfermanager.h | 1 + linden/indra/llmessage/lltransfersourceasset.cpp | 1 + linden/indra/llmessage/lltransfersourceasset.h | 1 + linden/indra/llmessage/lltransfersourcefile.cpp | 1 + linden/indra/llmessage/lltransfersourcefile.h | 1 + linden/indra/llmessage/lltransfertargetfile.cpp | 1 + linden/indra/llmessage/lltransfertargetfile.h | 1 + linden/indra/llmessage/lltransfertargetvfile.cpp | 1 + linden/indra/llmessage/lltransfertargetvfile.h | 1 + linden/indra/llmessage/llurlrequest.cpp | 1 + linden/indra/llmessage/llurlrequest.h | 1 + linden/indra/llmessage/lluseroperation.cpp | 1 + linden/indra/llmessage/lluseroperation.h | 1 + linden/indra/llmessage/llvehicleparams.h | 1 + linden/indra/llmessage/llxfer.cpp | 1 + linden/indra/llmessage/llxfer.h | 1 + linden/indra/llmessage/llxfer_file.cpp | 3 +- linden/indra/llmessage/llxfer_file.h | 1 + linden/indra/llmessage/llxfer_mem.cpp | 1 + linden/indra/llmessage/llxfer_mem.h | 1 + linden/indra/llmessage/llxfer_vfile.cpp | 1 + linden/indra/llmessage/llxfer_vfile.h | 1 + linden/indra/llmessage/llxfermanager.cpp | 1 + linden/indra/llmessage/llxfermanager.h | 1 + linden/indra/llmessage/llxorcipher.cpp | 1 + linden/indra/llmessage/llxorcipher.h | 1 + linden/indra/llmessage/machine.h | 1 + linden/indra/llmessage/mean_collision_data.h | 1 + linden/indra/llmessage/message.cpp | 3687 +++--- linden/indra/llmessage/message.h | 571 +- linden/indra/llmessage/message_prehash.cpp | 45 +- linden/indra/llmessage/message_prehash.h | 23 +- linden/indra/llmessage/message_string_table.cpp | 1 + linden/indra/llmessage/net.cpp | 7 + linden/indra/llmessage/net.h | 1 + linden/indra/llmessage/network.cpp | 1 + linden/indra/llmessage/network.h | 1 + linden/indra/llmessage/partsyspacket.cpp | 1 + linden/indra/llmessage/partsyspacket.h | 1 + linden/indra/llmessage/patch_code.cpp | 1 + linden/indra/llmessage/patch_code.h | 1 + linden/indra/llmessage/patch_dct.cpp | 1 + linden/indra/llmessage/patch_dct.h | 1 + linden/indra/llmessage/patch_idct.cpp | 1 + linden/indra/llmessage/sound_ids.h | 1 + linden/indra/llprimitive/legacy_object_types.h | 1 + linden/indra/llprimitive/llmaterialtable.cpp | 1 + linden/indra/llprimitive/llmaterialtable.h | 1 + linden/indra/llprimitive/llprimitive.cpp | 71 +- linden/indra/llprimitive/llprimitive.h | 1 + linden/indra/llprimitive/lltextureanim.cpp | 1 + linden/indra/llprimitive/lltextureanim.h | 1 + linden/indra/llprimitive/lltextureentry.cpp | 1 + linden/indra/llprimitive/lltextureentry.h | 1 + linden/indra/llprimitive/lltree_common.h | 1 + linden/indra/llprimitive/lltreeparams.cpp | 1 + linden/indra/llprimitive/lltreeparams.h | 1 + linden/indra/llprimitive/llvolumemessage.cpp | 97 +- linden/indra/llprimitive/llvolumemessage.h | 1 + linden/indra/llprimitive/llvolumexml.cpp | 1 + linden/indra/llprimitive/llvolumexml.h | 1 + linden/indra/llprimitive/material_codes.h | 1 + linden/indra/llprimitive/object_flags.h | 1 + linden/indra/llrender/files.lst | 1 - linden/indra/llrender/llfont.cpp | 6 +- linden/indra/llrender/llfont.h | 1 + linden/indra/llrender/llfontgl.cpp | 194 +- linden/indra/llrender/llfontgl.h | 4 + linden/indra/llrender/llgldbg.cpp | 3 +- linden/indra/llrender/llgldbg.h | 1 + linden/indra/llrender/llimagegl.cpp | 12 +- linden/indra/llrender/llimagegl.h | 4 +- linden/indra/llrender/llrender.vcproj | 6 - linden/indra/llrender/llrender_vc8.vcproj | 8 - linden/indra/llrender/llvertexprogramgl.cpp | 1 + linden/indra/llrender/llvertexprogramgl.h | 1 + linden/indra/llrender/text_out.cpp | 115 - linden/indra/llrender/text_out.h | 40 - linden/indra/llui/files.lst | 1 + linden/indra/llui/llalertdialog.cpp | 1 + linden/indra/llui/llalertdialog.h | 1 + linden/indra/llui/llbutton.cpp | 63 +- linden/indra/llui/llbutton.h | 12 +- linden/indra/llui/llcallbackmap.h | 1 + linden/indra/llui/llcheckboxctrl.cpp | 3 +- linden/indra/llui/llcheckboxctrl.h | 1 + linden/indra/llui/llclipboard.cpp | 1 + linden/indra/llui/llclipboard.h | 1 + linden/indra/llui/llcombobox.cpp | 292 +- linden/indra/llui/llcombobox.h | 30 +- linden/indra/llui/llctrlselectioninterface.cpp | 1 + linden/indra/llui/llctrlselectioninterface.h | 1 + linden/indra/llui/lldraghandle.cpp | 9 +- linden/indra/llui/lldraghandle.h | 1 + linden/indra/llui/lleditmenuhandler.cpp | 1 + linden/indra/llui/lleditmenuhandler.h | 1 + linden/indra/llui/llfloater.cpp | 73 +- linden/indra/llui/llfloater.h | 1 + linden/indra/llui/llfocusmgr.cpp | 70 +- linden/indra/llui/llfocusmgr.h | 17 +- linden/indra/llui/llhtmlhelp.h | 40 + linden/indra/llui/lliconctrl.cpp | 1 + linden/indra/llui/lliconctrl.h | 1 + linden/indra/llui/llkeywords.cpp | 1 + linden/indra/llui/llkeywords.h | 1 + linden/indra/llui/lllineeditor.cpp | 35 +- linden/indra/llui/lllineeditor.h | 8 +- linden/indra/llui/llmemberlistener.h | 1 + linden/indra/llui/llmenugl.cpp | 31 +- linden/indra/llui/llmenugl.h | 2 + linden/indra/llui/llmodaldialog.cpp | 21 +- linden/indra/llui/llmodaldialog.h | 1 + linden/indra/llui/llpanel.cpp | 1 + linden/indra/llui/llpanel.h | 1 + linden/indra/llui/llradiogroup.cpp | 1 + linden/indra/llui/llradiogroup.h | 1 + linden/indra/llui/llresizebar.cpp | 130 +- linden/indra/llui/llresizebar.h | 5 +- linden/indra/llui/llresizehandle.cpp | 118 +- linden/indra/llui/llresizehandle.h | 5 +- linden/indra/llui/llresmgr.cpp | 5 +- linden/indra/llui/llresmgr.h | 1 + linden/indra/llui/llrootview.cpp | 1 + linden/indra/llui/llrootview.h | 1 + linden/indra/llui/llscrollbar.cpp | 11 +- linden/indra/llui/llscrollbar.h | 1 + linden/indra/llui/llscrollcontainer.cpp | 3 +- linden/indra/llui/llscrollcontainer.h | 1 + linden/indra/llui/llscrollingpanellist.cpp | 1 + linden/indra/llui/llscrollingpanellist.h | 1 + linden/indra/llui/llscrolllistctrl.cpp | 972 +- linden/indra/llui/llscrolllistctrl.h | 163 +- linden/indra/llui/llslider.cpp | 13 +- linden/indra/llui/llslider.h | 1 + linden/indra/llui/llsliderctrl.cpp | 5 +- linden/indra/llui/llsliderctrl.h | 1 + linden/indra/llui/llspinctrl.cpp | 29 +- linden/indra/llui/llspinctrl.h | 1 + linden/indra/llui/llstyle.cpp | 1 + linden/indra/llui/llstyle.h | 1 + linden/indra/llui/lltabcontainer.cpp | 141 +- linden/indra/llui/lltabcontainer.h | 5 + linden/indra/llui/lltabcontainervertical.cpp | 9 +- linden/indra/llui/lltabcontainervertical.h | 1 + linden/indra/llui/lltextbox.cpp | 9 +- linden/indra/llui/lltextbox.h | 1 + linden/indra/llui/lltexteditor.cpp | 42 +- linden/indra/llui/lltexteditor.h | 8 +- linden/indra/llui/llui.cpp | 20 +- linden/indra/llui/llui.h | 4 + linden/indra/llui/llui.vcproj | 3 + linden/indra/llui/lluiconstants.h | 1 + linden/indra/llui/lluictrl.cpp | 14 + linden/indra/llui/lluictrl.h | 3 + linden/indra/llui/lluictrlfactory.cpp | 5 + linden/indra/llui/lluictrlfactory.h | 1 + linden/indra/llui/lluistring.cpp | 1 + linden/indra/llui/lluistring.h | 1 + linden/indra/llui/lluixmltags.h | 1 + linden/indra/llui/llundo.cpp | 1 + linden/indra/llui/llundo.h | 1 + linden/indra/llui/llview.cpp | 39 +- linden/indra/llui/llview.h | 11 +- linden/indra/llui/llviewborder.cpp | 1 + linden/indra/llui/llviewborder.h | 1 + linden/indra/llui/llviewquery.cpp | 1 + linden/indra/llui/llviewquery.h | 1 + linden/indra/llvfs/lldir.cpp | 1 + linden/indra/llvfs/lldir.h | 1 + linden/indra/llvfs/lldir_linux.cpp | 3 +- linden/indra/llvfs/lldir_linux.h | 1 + linden/indra/llvfs/lldir_mac.cpp | 3 +- linden/indra/llvfs/lldir_mac.h | 3 +- linden/indra/llvfs/lldir_win32.cpp | 1 + linden/indra/llvfs/lldir_win32.h | 1 + linden/indra/llvfs/lllfsthread.cpp | 1 + linden/indra/llvfs/lllfsthread.h | 1 + linden/indra/llvfs/llvfile.cpp | 1 + linden/indra/llvfs/llvfile.h | 1 + linden/indra/llvfs/llvfs.cpp | 1 + linden/indra/llvfs/llvfs.h | 1 + linden/indra/llvfs/llvfsthread.cpp | 1 + linden/indra/llvfs/llvfsthread.h | 1 + linden/indra/llwindow/lldxhardware.cpp | 1 + linden/indra/llwindow/lldxhardware.h | 1 + linden/indra/llwindow/llgl.cpp | 146 +- linden/indra/llwindow/llgl.h | 26 +- linden/indra/llwindow/llglheaders.h | 68 +- linden/indra/llwindow/llglstates.h | 1 + linden/indra/llwindow/llglstubs.h | 1 + linden/indra/llwindow/llgltypes.h | 1 + linden/indra/llwindow/llkeyboard.cpp | 1 + linden/indra/llwindow/llkeyboard.h | 1 + linden/indra/llwindow/llkeyboardmacosx.cpp | 1 + linden/indra/llwindow/llkeyboardmacosx.h | 1 + linden/indra/llwindow/llkeyboardsdl.cpp | 1 + linden/indra/llwindow/llkeyboardsdl.h | 1 + linden/indra/llwindow/llkeyboardwin32.cpp | 1 + linden/indra/llwindow/llkeyboardwin32.h | 1 + linden/indra/llwindow/llmousehandler.h | 7 +- linden/indra/llwindow/llwindow.cpp | 28 + linden/indra/llwindow/llwindow.h | 8 +- linden/indra/llwindow/llwindowheadless.cpp | 1 + linden/indra/llwindow/llwindowheadless.h | 1 + linden/indra/llwindow/llwindowlinux.cpp | 1 + linden/indra/llwindow/llwindowlinux.h | 1 + linden/indra/llwindow/llwindowmacosx-objc.h | 1 + linden/indra/llwindow/llwindowmacosx-objc.mm | 1 + linden/indra/llwindow/llwindowmacosx.cpp | 5 +- linden/indra/llwindow/llwindowmacosx.h | 1 + linden/indra/llwindow/llwindowmesaheadless.cpp | 1 + linden/indra/llwindow/llwindowmesaheadless.h | 1 + linden/indra/llwindow/llwindowsdl.cpp | 14 +- linden/indra/llwindow/llwindowsdl.h | 1 + linden/indra/llwindow/llwindowwin32.cpp | 92 +- linden/indra/llwindow/llwindowwin32.h | 4 +- linden/indra/llxml/llcontrol.cpp | 1 + linden/indra/llxml/llcontrol.h | 1 + linden/indra/llxml/llxmlnode.cpp | 5 +- linden/indra/llxml/llxmlnode.h | 1 + linden/indra/llxml/llxmlparser.cpp | 9 +- linden/indra/llxml/llxmlparser.h | 1 + linden/indra/llxml/llxmltree.cpp | 1 + linden/indra/llxml/llxmltree.h | 1 + linden/indra/lscript/lscript_alloc.h | 1 + linden/indra/lscript/lscript_byteconvert.h | 1 + linden/indra/lscript/lscript_byteformat.h | 1 + .../lscript/lscript_compile/lscript_alloc.cpp | 1 + .../lscript/lscript_compile/lscript_bytecode.cpp | 1 + .../lscript/lscript_compile/lscript_bytecode.h | 1 + .../lscript/lscript_compile/lscript_error.cpp | 1 + .../indra/lscript/lscript_compile/lscript_error.h | 1 + .../indra/lscript/lscript_compile/lscript_heap.cpp | 1 + .../indra/lscript/lscript_compile/lscript_heap.h | 1 + .../lscript/lscript_compile/lscript_resource.cpp | 1 + .../lscript/lscript_compile/lscript_resource.h | 1 + .../lscript/lscript_compile/lscript_scope.cpp | 1 + .../indra/lscript/lscript_compile/lscript_scope.h | 1 + .../indra/lscript/lscript_compile/lscript_tree.cpp | 18 +- .../indra/lscript/lscript_compile/lscript_tree.h | 1 + .../lscript/lscript_compile/lscript_typecheck.cpp | 1 + .../lscript/lscript_compile/lscript_typecheck.h | 1 + linden/indra/lscript/lscript_execute.h | 1 + .../lscript/lscript_execute/lscript_execute.cpp | 10 +- .../lscript_execute/lscript_heapruntime.cpp | 1 + .../lscript/lscript_execute/lscript_heapruntime.h | 1 + .../lscript/lscript_execute/lscript_readlso.cpp | 1 + .../lscript/lscript_execute/lscript_readlso.h | 1 + linden/indra/lscript/lscript_export.h | 1 + linden/indra/lscript/lscript_http.h | 1 + linden/indra/lscript/lscript_library.h | 5 +- .../lscript/lscript_library/lscript_alloc.cpp | 1 + .../lscript/lscript_library/lscript_export.cpp | 1 + .../lscript/lscript_library/lscript_library.cpp | 3 +- linden/indra/lscript/lscript_rt_interface.h | 1 + linden/indra/mac_crash_logger/mac_crash_logger.cpp | 1 + linden/indra/mac_updater/FSCopyObject.h | 1 + linden/indra/mac_updater/GenLinkedList.h | 1 + linden/indra/mac_updater/MoreFilesX.h | 1 + linden/indra/mac_updater/mac_updater.cpp | 52 +- .../indra/newview/English.lproj/InfoPlist.strings | 4 +- linden/indra/newview/Info-SecondLife.plist | 2 +- linden/indra/newview/VertexCache.h | 1 + linden/indra/newview/VorbisFramework.h | 1 + linden/indra/newview/app_settings/keywords.ini | 4 + linden/indra/newview/app_settings/message.xml | 228 + .../shaders/class1/environment/glowF.glsl | 14 + .../shaders/class1/environment/glowV.glsl | 10 + .../shaders/class2/environment/waterF.glsl | 2 + linden/indra/newview/audiosettings.h | 1 + linden/indra/newview/character/avatar_eye.llm | Bin 16011 -> 0 bytes linden/indra/newview/character/avatar_eye_1.llm | Bin 5591 -> 0 bytes .../indra/newview/character/avatar_eyelashes.llm | Bin 65637 -> 0 bytes linden/indra/newview/character/avatar_hair.llm | Bin 690581 -> 0 bytes linden/indra/newview/character/avatar_hair_1.llm | Bin 5031 -> 0 bytes linden/indra/newview/character/avatar_hair_2.llm | Bin 3261 -> 0 bytes linden/indra/newview/character/avatar_hair_3.llm | Bin 1845 -> 0 bytes linden/indra/newview/character/avatar_hair_4.llm | Bin 927 -> 0 bytes linden/indra/newview/character/avatar_hair_5.llm | Bin 927 -> 0 bytes linden/indra/newview/character/avatar_head.llm | Bin 1635981 -> 0 bytes linden/indra/newview/character/avatar_head_1.llm | Bin 7875 -> 0 bytes linden/indra/newview/character/avatar_head_2.llm | Bin 3675 -> 0 bytes linden/indra/newview/character/avatar_head_3.llm | Bin 1797 -> 0 bytes linden/indra/newview/character/avatar_head_4.llm | Bin 1239 -> 0 bytes linden/indra/newview/character/avatar_lad.xml | 11223 ------------------- .../indra/newview/character/avatar_lower_body.llm | Bin 337125 -> 0 bytes .../newview/character/avatar_lower_body_1.llm | Bin 7083 -> 0 bytes .../newview/character/avatar_lower_body_2.llm | Bin 4107 -> 0 bytes .../newview/character/avatar_lower_body_3.llm | Bin 2115 -> 0 bytes .../newview/character/avatar_lower_body_4.llm | Bin 1629 -> 0 bytes linden/indra/newview/character/avatar_skeleton.xml | 74 - linden/indra/newview/character/avatar_skirt.llm | Bin 72497 -> 0 bytes linden/indra/newview/character/avatar_skirt_1.llm | Bin 1899 -> 0 bytes linden/indra/newview/character/avatar_skirt_2.llm | Bin 1551 -> 0 bytes linden/indra/newview/character/avatar_skirt_3.llm | Bin 1191 -> 0 bytes linden/indra/newview/character/avatar_skirt_4.llm | Bin 843 -> 0 bytes .../indra/newview/character/avatar_upper_body.llm | Bin 929297 -> 0 bytes .../newview/character/avatar_upper_body_1.llm | Bin 15627 -> 0 bytes .../newview/character/avatar_upper_body_2.llm | Bin 8991 -> 0 bytes .../newview/character/avatar_upper_body_3.llm | Bin 4557 -> 0 bytes .../newview/character/avatar_upper_body_4.llm | Bin 3453 -> 0 bytes linden/indra/newview/character/blush_alpha.tga | Bin 17352 -> 0 bytes linden/indra/newview/character/body_skingrain.tga | Bin 262188 -> 0 bytes .../indra/newview/character/bodyfreckles_alpha.tga | Bin 257249 -> 0 bytes .../indra/newview/character/bump_face_wrinkles.tga | Bin 25243 -> 0 bytes linden/indra/newview/character/bump_head_base.tga | Bin 105525 -> 0 bytes .../newview/character/bump_lowerbody_base.tga | Bin 112782 -> 0 bytes .../newview/character/bump_pants_wrinkles.tga | Bin 83183 -> 0 bytes .../newview/character/bump_shirt_wrinkles.tga | Bin 81501 -> 0 bytes .../newview/character/bump_upperbody_base.tga | Bin 147581 -> 0 bytes linden/indra/newview/character/eyebrows_alpha.tga | Bin 9469 -> 0 bytes linden/indra/newview/character/eyeliner_alpha.tga | Bin 4720 -> 0 bytes .../newview/character/eyeshadow_inner_alpha.tga | Bin 5466 -> 0 bytes .../newview/character/eyeshadow_outer_alpha.tga | Bin 7382 -> 0 bytes linden/indra/newview/character/eyewhite.tga | Bin 42353 -> 0 bytes .../character/facehair_chincurtains_alpha.tga | Bin 34610 -> 0 bytes .../newview/character/facehair_moustache_alpha.tga | Bin 14017 -> 0 bytes .../newview/character/facehair_sideburns_alpha.tga | Bin 27328 -> 0 bytes .../newview/character/facehair_soulpatch_alpha.tga | Bin 11277 -> 0 bytes linden/indra/newview/character/freckles_alpha.tga | Bin 140558 -> 0 bytes linden/indra/newview/character/genepool.xml | 7107 ------------ .../indra/newview/character/glove_length_alpha.tga | Bin 49745 -> 0 bytes .../newview/character/gloves_fingers_alpha.tga | Bin 39616 -> 0 bytes linden/indra/newview/character/head_alpha.tga | Bin 6066 -> 0 bytes linden/indra/newview/character/head_color.tga | Bin 70715 -> 0 bytes linden/indra/newview/character/head_hair.tga | Bin 75600 -> 0 bytes .../newview/character/head_highlights_alpha.tga | Bin 20503 -> 0 bytes .../indra/newview/character/head_shading_alpha.tga | Bin 35304 -> 0 bytes linden/indra/newview/character/head_skingrain.tga | Bin 262376 -> 0 bytes .../character/jacket_length_lower_alpha.tga | Bin 9768 -> 0 bytes .../character/jacket_length_upper_alpha.tga | Bin 14617 -> 0 bytes .../newview/character/jacket_open_lower_alpha.tga | Bin 19732 -> 0 bytes .../newview/character/jacket_open_upper_alpha.tga | Bin 41606 -> 0 bytes linden/indra/newview/character/lipgloss_alpha.tga | Bin 4738 -> 0 bytes linden/indra/newview/character/lips_mask.tga | Bin 6110 -> 0 bytes linden/indra/newview/character/lipstick_alpha.tga | Bin 7966 -> 0 bytes linden/indra/newview/character/lowerbody_color.tga | Bin 135395 -> 0 bytes .../character/lowerbody_highlights_alpha.tga | Bin 8695 -> 0 bytes .../newview/character/lowerbody_shading_alpha.tga | Bin 41766 -> 0 bytes .../indra/newview/character/nailpolish_alpha.tga | Bin 4656 -> 0 bytes .../indra/newview/character/pants_length_alpha.tga | Bin 26843 -> 0 bytes .../indra/newview/character/pants_waist_alpha.tga | Bin 10487 -> 0 bytes linden/indra/newview/character/rosyface_alpha.tga | Bin 44382 -> 0 bytes linden/indra/newview/character/rouge_alpha.tga | Bin 44382 -> 0 bytes .../indra/newview/character/shirt_bottom_alpha.tga | Bin 32242 -> 0 bytes .../indra/newview/character/shirt_collar_alpha.tga | Bin 14417 -> 0 bytes .../newview/character/shirt_collar_back_alpha.tga | Bin 12789 -> 0 bytes .../indra/newview/character/shirt_sleeve_alpha.tga | Bin 72196 -> 0 bytes .../indra/newview/character/shoe_height_alpha.tga | Bin 24461 -> 0 bytes .../indra/newview/character/skirt_length_alpha.tga | Bin 4114 -> 0 bytes .../newview/character/skirt_slit_back_alpha.tga | Bin 90350 -> 0 bytes .../newview/character/skirt_slit_front_alpha.tga | Bin 90350 -> 0 bytes .../newview/character/skirt_slit_left_alpha.tga | Bin 82006 -> 0 bytes .../newview/character/skirt_slit_right_alpha.tga | Bin 91410 -> 0 bytes .../newview/character/underpants_trial_female.tga | Bin 48063 -> 0 bytes .../newview/character/underpants_trial_male.tga | Bin 144983 -> 0 bytes .../newview/character/undershirt_trial_female.tga | Bin 81390 -> 0 bytes linden/indra/newview/character/upperbody_color.tga | Bin 23348 -> 0 bytes .../character/upperbody_highlights_alpha.tga | Bin 6509 -> 0 bytes .../newview/character/upperbody_shading_alpha.tga | Bin 25297 -> 0 bytes .../newview/character/upperbodyfreckles_alpha.tga | Bin 180104 -> 0 bytes linden/indra/newview/featuretable.txt | 21 +- linden/indra/newview/files.lst | 6 +- linden/indra/newview/fmod_hidden_symbols.exp | 100 + linden/indra/newview/fmodwrapper.cpp | 1 + linden/indra/newview/fonts/MtBdLfRg.ttf | Bin 52444 -> 0 bytes linden/indra/newview/fonts/MtBkLfRg.ttf | Bin 55108 -> 0 bytes linden/indra/newview/fonts/profontdoc.txt | 176 - linden/indra/newview/fonts/profontwindows.ttf | Bin 56376 -> 0 bytes linden/indra/newview/gpu_table.txt | 5 + linden/indra/newview/head.cpp | 1 + linden/indra/newview/head.h | 1 + .../windows/installer_template_multilang.nsi | 938 ++ .../indra/newview/installers/windows/lang_de.nsi | 57 + .../newview/installers/windows/lang_en-us.nsi | 57 + .../indra/newview/installers/windows/lang_ja.nsi | 57 + .../indra/newview/installers/windows/lang_ko.nsi | 57 + linden/indra/newview/licenses-linux.txt | 14 + linden/indra/newview/licenses-mac.txt | 14 + linden/indra/newview/licenses-win32.txt | 14 + linden/indra/newview/linux_tools/client-readme.txt | 50 +- linden/indra/newview/llagent.cpp | 101 +- linden/indra/newview/llagent.h | 13 +- linden/indra/newview/llagentdata.cpp | 1 + linden/indra/newview/llagentdata.h | 1 + linden/indra/newview/llagentpilot.cpp | 1 + linden/indra/newview/llagentpilot.h | 1 + linden/indra/newview/llanimalcontrols.cpp | 1 + linden/indra/newview/llanimalcontrols.h | 1 + linden/indra/newview/llappearance.h | 1 + linden/indra/newview/llassetuploadresponders.cpp | 2 +- linden/indra/newview/llasynchostbyname.cpp | 1 + linden/indra/newview/llasynchostbyname.h | 1 + linden/indra/newview/llaudiosourcevo.cpp | 1 + linden/indra/newview/llaudiosourcevo.h | 1 + linden/indra/newview/llaudiostatus.cpp | 1 + linden/indra/newview/llaudiostatus.h | 1 + linden/indra/newview/llbbox.cpp | 1 + linden/indra/newview/llbbox.h | 1 + linden/indra/newview/llbox.cpp | 1 + linden/indra/newview/llbox.h | 1 + linden/indra/newview/llcallbacklist.cpp | 1 + linden/indra/newview/llcallbacklist.h | 1 + linden/indra/newview/llcallingcard.cpp | 1 + linden/indra/newview/llcallingcard.h | 1 + linden/indra/newview/llcameraview.cpp | 97 +- linden/indra/newview/llcameraview.h | 22 + linden/indra/newview/llcape.cpp | 1 + linden/indra/newview/llcape.h | 1 + linden/indra/newview/llcaphttpsender.cpp | 50 + linden/indra/newview/llcaphttpsender.h | 50 + linden/indra/newview/llchatbar.cpp | 3 +- linden/indra/newview/llchatbar.h | 3 +- linden/indra/newview/llclassifiedinfo.cpp | 1 + linden/indra/newview/llclassifiedinfo.h | 1 + linden/indra/newview/llcloud.cpp | 1 + linden/indra/newview/llcloud.h | 1 + linden/indra/newview/llcolorscheme.cpp | 1 + linden/indra/newview/llcolorscheme.h | 1 + linden/indra/newview/llcolorswatch.cpp | 9 +- linden/indra/newview/llcolorswatch.h | 1 + linden/indra/newview/llcompass.cpp | 1 + linden/indra/newview/llcompass.h | 1 + linden/indra/newview/llcompilequeue.cpp | 25 +- linden/indra/newview/llcompilequeue.h | 1 + linden/indra/newview/llconfirmationmanager.cpp | 1 + linden/indra/newview/llconfirmationmanager.h | 1 + linden/indra/newview/llconsole.cpp | 1 + linden/indra/newview/llconsole.h | 1 + linden/indra/newview/llcontainerview.cpp | 1 + linden/indra/newview/llcontainerview.h | 1 + linden/indra/newview/llcontroldef.cpp | 78 +- linden/indra/newview/llcountdown.cpp | 1 + linden/indra/newview/llcountdown.h | 1 + linden/indra/newview/llcubemap.cpp | 18 +- linden/indra/newview/llcubemap.h | 3 + linden/indra/newview/llcurrencyuimanager.cpp | 1 + linden/indra/newview/llcurrencyuimanager.h | 1 + linden/indra/newview/llcylinder.cpp | 1 + linden/indra/newview/llcylinder.h | 1 + linden/indra/newview/lldebugmessagebox.cpp | 7 +- linden/indra/newview/lldebugmessagebox.h | 1 + linden/indra/newview/lldebugview.cpp | 1 + linden/indra/newview/lldebugview.h | 1 + linden/indra/newview/lldirpicker.cpp | 1 + linden/indra/newview/lldirpicker.h | 1 + linden/indra/newview/lldrawable.cpp | 24 +- linden/indra/newview/lldrawable.h | 4 +- linden/indra/newview/lldrawpool.cpp | 4 + linden/indra/newview/lldrawpool.h | 4 +- linden/indra/newview/lldrawpoolalpha.cpp | 17 +- linden/indra/newview/lldrawpoolalpha.h | 1 + linden/indra/newview/lldrawpoolavatar.cpp | 72 +- linden/indra/newview/lldrawpoolavatar.h | 1 + linden/indra/newview/lldrawpoolbump.cpp | 30 +- linden/indra/newview/lldrawpoolbump.h | 3 +- linden/indra/newview/lldrawpoolclouds.cpp | 1 + linden/indra/newview/lldrawpoolclouds.h | 1 + linden/indra/newview/lldrawpoolground.cpp | 4 +- linden/indra/newview/lldrawpoolground.h | 1 + linden/indra/newview/lldrawpoolsimple.cpp | 100 +- linden/indra/newview/lldrawpoolsimple.h | 21 + linden/indra/newview/lldrawpoolsky.cpp | 4 +- linden/indra/newview/lldrawpoolsky.h | 1 + linden/indra/newview/lldrawpoolstars.cpp | 8 +- linden/indra/newview/lldrawpoolstars.h | 1 + linden/indra/newview/lldrawpoolterrain.cpp | 22 +- linden/indra/newview/lldrawpoolterrain.h | 1 + linden/indra/newview/lldrawpooltree.cpp | 4 +- linden/indra/newview/lldrawpooltree.h | 1 + linden/indra/newview/lldrawpoolwater.cpp | 152 +- linden/indra/newview/lldrawpoolwater.h | 1 + linden/indra/newview/lldriverparam.cpp | 1 + linden/indra/newview/lldriverparam.h | 1 + linden/indra/newview/lldynamictexture.cpp | 1 + linden/indra/newview/lldynamictexture.h | 1 + linden/indra/newview/llemote.cpp | 1 + linden/indra/newview/llemote.h | 1 + linden/indra/newview/lleventinfo.cpp | 1 + linden/indra/newview/lleventinfo.h | 1 + linden/indra/newview/lleventnotifier.cpp | 1 + linden/indra/newview/lleventnotifier.h | 1 + linden/indra/newview/lleventpoll.cpp | 255 +- linden/indra/newview/lleventpoll.h | 13 +- linden/indra/newview/llface.cpp | 37 +- linden/indra/newview/llface.h | 1 + linden/indra/newview/llface.inl | 1 + linden/indra/newview/llfasttimerview.cpp | 1 + linden/indra/newview/llfasttimerview.h | 1 + linden/indra/newview/llfeaturemanager.cpp | 24 +- linden/indra/newview/llfeaturemanager.h | 1 + linden/indra/newview/llfft.cpp | 1 + linden/indra/newview/llfft.h | 1 + linden/indra/newview/llfilepicker.cpp | 2 + linden/indra/newview/llfilepicker.h | 1 + linden/indra/newview/llfirstuse.cpp | 1 + linden/indra/newview/llfirstuse.h | 1 + linden/indra/newview/llflexibleobject.cpp | 1 + linden/indra/newview/llflexibleobject.h | 1 + linden/indra/newview/llfloaterabout.cpp | 3 +- linden/indra/newview/llfloaterabout.h | 1 + linden/indra/newview/llfloateranimpreview.cpp | 13 +- linden/indra/newview/llfloateranimpreview.h | 3 +- linden/indra/newview/llfloaterauction.cpp | 54 +- linden/indra/newview/llfloaterauction.h | 1 + linden/indra/newview/llfloateravatarinfo.cpp | 6 +- linden/indra/newview/llfloateravatarinfo.h | 1 + linden/indra/newview/llfloateravatarpicker.cpp | 35 +- linden/indra/newview/llfloateravatarpicker.h | 1 + linden/indra/newview/llfloateravatartextures.cpp | 12 +- linden/indra/newview/llfloateravatartextures.h | 1 + linden/indra/newview/llfloaterbuildoptions.cpp | 1 + linden/indra/newview/llfloaterbuildoptions.h | 1 + linden/indra/newview/llfloaterbump.cpp | 16 +- linden/indra/newview/llfloaterbump.h | 1 + linden/indra/newview/llfloaterbuy.cpp | 13 +- linden/indra/newview/llfloaterbuy.h | 1 + linden/indra/newview/llfloaterbuycontents.cpp | 11 +- linden/indra/newview/llfloaterbuycontents.h | 1 + linden/indra/newview/llfloaterbuycurrency.cpp | 1 + linden/indra/newview/llfloaterbuycurrency.h | 1 + linden/indra/newview/llfloaterbuyland.cpp | 51 +- linden/indra/newview/llfloaterbuyland.h | 1 + linden/indra/newview/llfloaterchat.cpp | 1 + linden/indra/newview/llfloaterchat.h | 1 + linden/indra/newview/llfloaterclothing.cpp | 9 +- linden/indra/newview/llfloaterclothing.h | 1 + linden/indra/newview/llfloatercolorpicker.cpp | 76 +- linden/indra/newview/llfloatercolorpicker.h | 4 +- linden/indra/newview/llfloatercustomize.cpp | 1 + linden/indra/newview/llfloatercustomize.h | 1 + linden/indra/newview/llfloaterdirectory.cpp | 1 + linden/indra/newview/llfloaterdirectory.h | 1 + linden/indra/newview/llfloatereditui.cpp | 1 + linden/indra/newview/llfloatereditui.h | 1 + linden/indra/newview/llfloaterfriends.cpp | 47 +- linden/indra/newview/llfloaterfriends.h | 10 +- linden/indra/newview/llfloatergesture.cpp | 1 + linden/indra/newview/llfloatergesture.h | 1 + linden/indra/newview/llfloatergodtools.cpp | 15 +- linden/indra/newview/llfloatergodtools.h | 1 + linden/indra/newview/llfloatergroupinfo.cpp | 1 + linden/indra/newview/llfloatergroupinfo.h | 1 + linden/indra/newview/llfloatergroupinvite.cpp | 1 + linden/indra/newview/llfloatergroupinvite.h | 1 + linden/indra/newview/llfloatergroups.cpp | 1 + linden/indra/newview/llfloatergroups.h | 1 + linden/indra/newview/llfloaterhtml.cpp | 164 +- linden/indra/newview/llfloaterhtml.h | 31 +- linden/indra/newview/llfloaterhtmlfind.cpp | 1 + linden/indra/newview/llfloaterhtmlfind.h | 1 + linden/indra/newview/llfloaterhtmlhelp.cpp | 58 +- linden/indra/newview/llfloaterhtmlhelp.h | 15 +- linden/indra/newview/llfloaterimagepreview.cpp | 7 +- linden/indra/newview/llfloaterimagepreview.h | 1 + linden/indra/newview/llfloaterimport.cpp | 34 +- linden/indra/newview/llfloaterimport.h | 1 + linden/indra/newview/llfloaterinspect.cpp | 1 - linden/indra/newview/llfloaterinspect.h | 1 + linden/indra/newview/llfloaterland.cpp | 105 +- linden/indra/newview/llfloaterland.h | 22 +- linden/indra/newview/llfloaterlandholdings.cpp | 15 +- linden/indra/newview/llfloaterlandholdings.h | 1 + linden/indra/newview/llfloatermap.cpp | 45 + linden/indra/newview/llfloatermap.h | 2 + linden/indra/newview/llfloatermute.cpp | 1 + linden/indra/newview/llfloatermute.h | 1 + linden/indra/newview/llfloaternamedesc.cpp | 1 + linden/indra/newview/llfloaternamedesc.h | 1 + linden/indra/newview/llfloaternewim.cpp | 63 +- linden/indra/newview/llfloaternewim.h | 6 +- linden/indra/newview/llfloateropenobject.cpp | 1 + linden/indra/newview/llfloateropenobject.h | 1 + linden/indra/newview/llfloaterpermissionsmgr.cpp | 1 + linden/indra/newview/llfloaterpermissionsmgr.h | 1 + linden/indra/newview/llfloaterpostcard.cpp | 3 +- linden/indra/newview/llfloaterpostcard.h | 1 + linden/indra/newview/llfloaterpreference.cpp | 1 + linden/indra/newview/llfloaterpreference.h | 1 + linden/indra/newview/llfloaterproperties.cpp | 13 +- linden/indra/newview/llfloaterproperties.h | 1 + linden/indra/newview/llfloaterrate.cpp | 277 - linden/indra/newview/llfloaterrate.h | 88 - linden/indra/newview/llfloaterregioninfo.cpp | 73 +- linden/indra/newview/llfloaterregioninfo.h | 1 + linden/indra/newview/llfloaterreporter.cpp | 4 +- linden/indra/newview/llfloaterreporter.h | 1 + linden/indra/newview/llfloatersaveavatar.cpp | 1 + linden/indra/newview/llfloatersaveavatar.h | 1 + linden/indra/newview/llfloaterscriptdebug.cpp | 1 + linden/indra/newview/llfloaterscriptdebug.h | 1 + linden/indra/newview/llfloatersellland.cpp | 1 + linden/indra/newview/llfloatersellland.h | 1 + linden/indra/newview/llfloatersnapshot.cpp | 3 +- linden/indra/newview/llfloatersnapshot.h | 1 + linden/indra/newview/llfloatertelehub.cpp | 3 +- linden/indra/newview/llfloatertelehub.h | 1 + linden/indra/newview/llfloatertest.cpp | 5 +- linden/indra/newview/llfloatertest.h | 1 + linden/indra/newview/llfloatertools.cpp | 3 +- linden/indra/newview/llfloatertools.h | 1 + linden/indra/newview/llfloatertopobjects.cpp | 1 + linden/indra/newview/llfloatertopobjects.h | 1 + linden/indra/newview/llfloatertos.cpp | 2 + linden/indra/newview/llfloatertos.h | 1 + linden/indra/newview/llfloaterworldmap.cpp | 1 + linden/indra/newview/llfloaterworldmap.h | 1 + linden/indra/newview/llfolderview.cpp | 34 +- linden/indra/newview/llfolderview.h | 1 + linden/indra/newview/llfollowcam.cpp | 1 + linden/indra/newview/llfollowcam.h | 1 + linden/indra/newview/llframestats.cpp | 7 +- linden/indra/newview/llframestats.h | 1 + linden/indra/newview/llframestatview.cpp | 7 +- linden/indra/newview/llframestatview.h | 1 + linden/indra/newview/llgenepool.cpp | 1 + linden/indra/newview/llgenepool.h | 1 + linden/indra/newview/llgesturemgr.cpp | 1 + linden/indra/newview/llgesturemgr.h | 1 + linden/indra/newview/llgivemoney.cpp | 1 + linden/indra/newview/llgivemoney.h | 1 + linden/indra/newview/llglsandbox.cpp | 1 + linden/indra/newview/llglslshader.cpp | 1221 ++ linden/indra/newview/llglslshader.h | 232 + linden/indra/newview/llgroupmgr.cpp | 1 + linden/indra/newview/llgroupmgr.h | 1 + linden/indra/newview/llgroupnotify.cpp | 3 +- linden/indra/newview/llgroupnotify.h | 1 + linden/indra/newview/llhippo.cpp | 1 + linden/indra/newview/llhippo.h | 1 + linden/indra/newview/llhoverview.cpp | 5 +- linden/indra/newview/llhoverview.h | 1 + linden/indra/newview/llhudconnector.cpp | 1 + linden/indra/newview/llhudconnector.h | 1 + linden/indra/newview/llhudeffect.cpp | 1 + linden/indra/newview/llhudeffect.h | 1 + linden/indra/newview/llhudeffectbeam.cpp | 1 + linden/indra/newview/llhudeffectbeam.h | 1 + linden/indra/newview/llhudeffectlookat.cpp | 1 + linden/indra/newview/llhudeffectlookat.h | 1 + linden/indra/newview/llhudeffectpointat.cpp | 1 + linden/indra/newview/llhudeffectpointat.h | 1 + linden/indra/newview/llhudeffecttrail.cpp | 1 + linden/indra/newview/llhudeffecttrail.h | 1 + linden/indra/newview/llhudicon.cpp | 1 + linden/indra/newview/llhudicon.h | 1 + linden/indra/newview/llhudmanager.cpp | 1 + linden/indra/newview/llhudmanager.h | 1 + linden/indra/newview/llhudobject.cpp | 1 + linden/indra/newview/llhudobject.h | 1 + linden/indra/newview/llhudrender.cpp | 1 + linden/indra/newview/llhudrender.h | 1 + linden/indra/newview/llhudtext.cpp | 1 + linden/indra/newview/llhudtext.h | 1 + linden/indra/newview/llhudview.cpp | 1 + linden/indra/newview/llhudview.h | 1 + linden/indra/newview/llimpanel.cpp | 497 +- linden/indra/newview/llimpanel.h | 42 +- linden/indra/newview/llimview.cpp | 294 +- linden/indra/newview/llimview.h | 25 +- linden/indra/newview/llinventoryactions.cpp | 137 +- linden/indra/newview/llinventorybridge.cpp | 82 +- linden/indra/newview/llinventorybridge.h | 7 +- linden/indra/newview/llinventoryclipboard.cpp | 1 + linden/indra/newview/llinventoryclipboard.h | 1 + linden/indra/newview/llinventorymodel.cpp | 9 +- linden/indra/newview/llinventorymodel.h | 1 + linden/indra/newview/llinventoryview.cpp | 21 +- linden/indra/newview/llinventoryview.h | 7 +- linden/indra/newview/lljoystickbutton.cpp | 9 +- linden/indra/newview/lljoystickbutton.h | 1 + linden/indra/newview/lllandmarklist.cpp | 1 + linden/indra/newview/lllandmarklist.h | 1 + linden/indra/newview/lllightconstants.h | 1 + linden/indra/newview/lllocalanimationobject.cpp | 1 + linden/indra/newview/lllocalanimationobject.h | 1 + linden/indra/newview/lllogchat.cpp | 1 + linden/indra/newview/lllogchat.h | 1 + linden/indra/newview/llmanip.cpp | 23 +- linden/indra/newview/llmanip.h | 1 + linden/indra/newview/llmaniprotate.cpp | 1 + linden/indra/newview/llmaniprotate.h | 1 + linden/indra/newview/llmanipscale.cpp | 1 + linden/indra/newview/llmanipscale.h | 1 + linden/indra/newview/llmaniptranslate.cpp | 3 +- linden/indra/newview/llmaniptranslate.h | 1 + linden/indra/newview/llmapresponders.cpp | 1 + linden/indra/newview/llmapresponders.h | 1 + linden/indra/newview/llmediaremotectrl.cpp | 1 + linden/indra/newview/llmediaremotectrl.h | 1 + linden/indra/newview/llmemoryview.cpp | 1 + linden/indra/newview/llmemoryview.h | 1 + linden/indra/newview/llmenucommands.cpp | 1 + linden/indra/newview/llmenucommands.h | 1 + linden/indra/newview/llmorphview.cpp | 1 + linden/indra/newview/llmorphview.h | 1 + linden/indra/newview/llmoveview.cpp | 1 + linden/indra/newview/llmoveview.h | 1 + linden/indra/newview/llmutelist.cpp | 9 +- linden/indra/newview/llmutelist.h | 1 + linden/indra/newview/llnamebox.cpp | 1 + linden/indra/newview/llnamebox.h | 1 + linden/indra/newview/llnameeditor.cpp | 3 +- linden/indra/newview/llnameeditor.h | 3 +- linden/indra/newview/llnamelistctrl.cpp | 60 +- linden/indra/newview/llnamelistctrl.h | 1 + linden/indra/newview/llnetmap.cpp | 17 +- linden/indra/newview/llnetmap.h | 1 + linden/indra/newview/llnotify.cpp | 1 + linden/indra/newview/llnotify.h | 1 + linden/indra/newview/lloverlaybar.cpp | 1 + linden/indra/newview/lloverlaybar.h | 1 + linden/indra/newview/llpanelaudioprefs.cpp | 1 + linden/indra/newview/llpanelaudioprefs.h | 1 + linden/indra/newview/llpanelavatar.cpp | 219 +- linden/indra/newview/llpanelavatar.h | 16 +- linden/indra/newview/llpanelclassified.cpp | 23 +- linden/indra/newview/llpanelclassified.h | 4 +- linden/indra/newview/llpanelcontents.cpp | 1 + linden/indra/newview/llpanelcontents.h | 1 + linden/indra/newview/llpaneldebug.cpp | 1 + linden/indra/newview/llpaneldebug.h | 1 + linden/indra/newview/llpaneldirbrowser.cpp | 43 +- linden/indra/newview/llpaneldirbrowser.h | 3 +- linden/indra/newview/llpaneldirclassified.cpp | 1 + linden/indra/newview/llpaneldirclassified.h | 1 + linden/indra/newview/llpaneldirevents.cpp | 5 +- linden/indra/newview/llpaneldirevents.h | 1 + linden/indra/newview/llpaneldirfind.cpp | 1 + linden/indra/newview/llpaneldirfind.h | 1 + linden/indra/newview/llpaneldirgroups.cpp | 26 +- linden/indra/newview/llpaneldirgroups.h | 3 + linden/indra/newview/llpaneldirland.cpp | 3 +- linden/indra/newview/llpaneldirland.h | 1 + linden/indra/newview/llpaneldirpeople.cpp | 1 + linden/indra/newview/llpaneldirpeople.h | 1 + linden/indra/newview/llpaneldirplaces.cpp | 3 +- linden/indra/newview/llpaneldirplaces.h | 1 + linden/indra/newview/llpaneldirpopular.cpp | 1 + linden/indra/newview/llpaneldirpopular.h | 1 + linden/indra/newview/llpaneldisplay.cpp | 44 +- linden/indra/newview/llpaneldisplay.h | 4 + linden/indra/newview/llpanelevent.cpp | 19 +- linden/indra/newview/llpanelevent.h | 4 +- linden/indra/newview/llpanelface.cpp | 1 + linden/indra/newview/llpanelface.h | 1 + linden/indra/newview/llpanelgeneral.cpp | 1 + linden/indra/newview/llpanelgeneral.h | 1 + linden/indra/newview/llpanelgroup.cpp | 1 + linden/indra/newview/llpanelgroup.h | 1 + linden/indra/newview/llpanelgroupgeneral.cpp | 25 +- linden/indra/newview/llpanelgroupgeneral.h | 1 + linden/indra/newview/llpanelgroupinvite.cpp | 11 +- linden/indra/newview/llpanelgroupinvite.h | 1 + linden/indra/newview/llpanelgrouplandmoney.cpp | 41 +- linden/indra/newview/llpanelgrouplandmoney.h | 1 + linden/indra/newview/llpanelgroupnotices.cpp | 16 +- linden/indra/newview/llpanelgroupnotices.h | 1 + linden/indra/newview/llpanelgrouproles.cpp | 1 + linden/indra/newview/llpanelgrouproles.h | 1 + linden/indra/newview/llpanelgroupvoting.cpp | 225 +- linden/indra/newview/llpanelgroupvoting.h | 1 + linden/indra/newview/llpanelinput.cpp | 1 + linden/indra/newview/llpanelinput.h | 1 + linden/indra/newview/llpanelinventory.cpp | 53 +- linden/indra/newview/llpanelinventory.h | 1 + linden/indra/newview/llpanelland.cpp | 1 + linden/indra/newview/llpanelland.h | 1 + linden/indra/newview/llpanellandobjects.cpp | 1 + linden/indra/newview/llpanellandobjects.h | 1 + linden/indra/newview/llpanellandoptions.cpp | 1 + linden/indra/newview/llpanellandoptions.h | 1 + linden/indra/newview/llpanellogin.cpp | 3 +- linden/indra/newview/llpanellogin.h | 1 + linden/indra/newview/llpanelmorph.cpp | 1 + linden/indra/newview/llpanelmorph.h | 1 + linden/indra/newview/llpanelmsgs.cpp | 23 +- linden/indra/newview/llpanelmsgs.h | 1 + linden/indra/newview/llpanelnetwork.cpp | 1 + linden/indra/newview/llpanelnetwork.h | 1 + linden/indra/newview/llpanelobject.cpp | 7 +- linden/indra/newview/llpanelobject.h | 1 + linden/indra/newview/llpanelpermissions.cpp | 5 +- linden/indra/newview/llpanelpermissions.h | 1 + linden/indra/newview/llpanelpick.cpp | 38 +- linden/indra/newview/llpanelpick.h | 11 +- linden/indra/newview/llpanelplace.cpp | 22 +- linden/indra/newview/llpanelplace.h | 4 +- linden/indra/newview/llpanelvolume.cpp | 1 + linden/indra/newview/llpanelvolume.h | 1 + linden/indra/newview/llpanelweb.cpp | 1 + linden/indra/newview/llpanelweb.h | 1 + linden/indra/newview/llpatchvertexarray.cpp | 1 + linden/indra/newview/llpatchvertexarray.h | 1 + linden/indra/newview/llpolymesh.cpp | 7 +- linden/indra/newview/llpolymesh.h | 1 + linden/indra/newview/llpolymorph.cpp | 1 + linden/indra/newview/llpolymorph.h | 1 + linden/indra/newview/llprefschat.cpp | 1 + linden/indra/newview/llprefschat.h | 1 + linden/indra/newview/llprefsim.cpp | 1 + linden/indra/newview/llprefsim.h | 1 + linden/indra/newview/llpreview.cpp | 9 +- linden/indra/newview/llpreview.h | 1 + linden/indra/newview/llpreviewanim.cpp | 25 +- linden/indra/newview/llpreviewanim.h | 1 + linden/indra/newview/llpreviewgesture.cpp | 24 +- linden/indra/newview/llpreviewgesture.h | 1 + linden/indra/newview/llpreviewlandmark.cpp | 1 + linden/indra/newview/llpreviewlandmark.h | 1 + linden/indra/newview/llpreviewnotecard.cpp | 3 +- linden/indra/newview/llpreviewnotecard.h | 1 + linden/indra/newview/llpreviewscript.cpp | 313 +- linden/indra/newview/llpreviewscript.h | 15 + linden/indra/newview/llpreviewsound.cpp | 1 + linden/indra/newview/llpreviewsound.h | 1 + linden/indra/newview/llpreviewtexture.cpp | 3 +- linden/indra/newview/llpreviewtexture.h | 1 + linden/indra/newview/llprogressview.cpp | 7 +- linden/indra/newview/llprogressview.h | 5 +- linden/indra/newview/llregionposition.cpp | 1 + linden/indra/newview/llregionposition.h | 1 + linden/indra/newview/llroam.cpp | 1 + linden/indra/newview/llroam.h | 1 + linden/indra/newview/llsavedsettingsglue.cpp | 1 + linden/indra/newview/llsavedsettingsglue.h | 1 + linden/indra/newview/llselectmgr.cpp | 19 +- linden/indra/newview/llselectmgr.h | 1 + linden/indra/newview/llsky.cpp | 1 + linden/indra/newview/llsky.h | 1 + linden/indra/newview/llspatialpartition.cpp | 69 +- linden/indra/newview/llspatialpartition.h | 1 + linden/indra/newview/llsphere.cpp | 1 + linden/indra/newview/llsphere.h | 1 + linden/indra/newview/llsprite.cpp | 1 + linden/indra/newview/llsprite.h | 1 + linden/indra/newview/llstartup.cpp | 153 +- linden/indra/newview/llstartup.h | 2 + linden/indra/newview/llstatbar.cpp | 1 + linden/indra/newview/llstatbar.h | 1 + linden/indra/newview/llstatgraph.cpp | 3 +- linden/indra/newview/llstatgraph.h | 1 + linden/indra/newview/llstatusbar.cpp | 1 + linden/indra/newview/llstatusbar.h | 1 + linden/indra/newview/llstatview.cpp | 1 + linden/indra/newview/llstatview.h | 1 + linden/indra/newview/llsurface.cpp | 1 + linden/indra/newview/llsurface.h | 1 + linden/indra/newview/llsurfacepatch.cpp | 6 + linden/indra/newview/llsurfacepatch.h | 1 + linden/indra/newview/lltable.h | 1 + linden/indra/newview/lltexlayer.cpp | 1 + linden/indra/newview/lltexlayer.h | 1 + linden/indra/newview/lltexturecache.cpp | 1 + linden/indra/newview/lltexturecache.h | 1 + linden/indra/newview/lltexturectrl.cpp | 3 +- linden/indra/newview/lltexturectrl.h | 1 + linden/indra/newview/lltexturefetch.cpp | 1 + linden/indra/newview/lltexturefetch.h | 1 + linden/indra/newview/lltexturetable.cpp | 1 + linden/indra/newview/lltexturetable.h | 1 + linden/indra/newview/lltextureview.cpp | 1 + linden/indra/newview/lltextureview.h | 1 + linden/indra/newview/lltool.cpp | 23 +- linden/indra/newview/lltool.h | 2 +- linden/indra/newview/lltoolbar.cpp | 1 + linden/indra/newview/lltoolbar.h | 1 + linden/indra/newview/lltoolbrush.cpp | 1 + linden/indra/newview/lltoolbrush.h | 1 + linden/indra/newview/lltoolcomp.cpp | 6 + linden/indra/newview/lltoolcomp.h | 1 + linden/indra/newview/lltooldraganddrop.cpp | 7 +- linden/indra/newview/lltooldraganddrop.h | 1 + linden/indra/newview/lltoolface.cpp | 1 + linden/indra/newview/lltoolface.h | 1 + linden/indra/newview/lltoolfocus.cpp | 1 + linden/indra/newview/lltoolfocus.h | 1 + linden/indra/newview/lltoolgrab.cpp | 1 + linden/indra/newview/lltoolgrab.h | 1 + linden/indra/newview/lltoolgun.cpp | 1 + linden/indra/newview/lltoolgun.h | 1 + linden/indra/newview/lltoolindividual.cpp | 1 + linden/indra/newview/lltoolindividual.h | 1 + linden/indra/newview/lltoolmgr.cpp | 1 + linden/indra/newview/lltoolmgr.h | 1 + linden/indra/newview/lltoolmorph.cpp | 1 + linden/indra/newview/lltoolmorph.h | 1 + linden/indra/newview/lltoolobjpicker.cpp | 1 + linden/indra/newview/lltoolobjpicker.h | 1 + linden/indra/newview/lltoolpie.cpp | 1 + linden/indra/newview/lltoolpie.h | 1 + linden/indra/newview/lltoolpipette.cpp | 1 + linden/indra/newview/lltoolpipette.h | 1 + linden/indra/newview/lltoolplacer.cpp | 1 + linden/indra/newview/lltoolplacer.h | 1 + linden/indra/newview/lltoolselect.cpp | 1 + linden/indra/newview/lltoolselect.h | 1 + linden/indra/newview/lltoolselectland.cpp | 1 + linden/indra/newview/lltoolselectland.h | 1 + linden/indra/newview/lltoolselectrect.cpp | 1 + linden/indra/newview/lltoolselectrect.h | 1 + linden/indra/newview/lltoolview.cpp | 1 + linden/indra/newview/lltoolview.h | 1 + linden/indra/newview/lltracker.cpp | 1 + linden/indra/newview/lltracker.h | 1 + linden/indra/newview/lluiconstants.h | 1 + linden/indra/newview/lluploaddialog.cpp | 3 +- linden/indra/newview/lluploaddialog.h | 1 + linden/indra/newview/llurl.cpp | 1 + linden/indra/newview/llurl.h | 1 + linden/indra/newview/llurlwhitelist.cpp | 1 + linden/indra/newview/llurlwhitelist.h | 1 + linden/indra/newview/lluserauth.cpp | 15 +- linden/indra/newview/lluserauth.h | 1 + linden/indra/newview/llvelocitybar.cpp | 1 + linden/indra/newview/llvelocitybar.h | 1 + linden/indra/newview/llviewchildren.cpp | 1 + linden/indra/newview/llviewchildren.h | 1 + linden/indra/newview/llviewerassetstorage.cpp | 1 + linden/indra/newview/llviewerassetstorage.h | 1 + linden/indra/newview/llviewerbuild.h | 1 + linden/indra/newview/llviewercamera.cpp | 3 + linden/indra/newview/llviewercamera.h | 2 + linden/indra/newview/llviewercontrol.cpp | 1 + linden/indra/newview/llviewercontrol.h | 3 +- linden/indra/newview/llviewerdisplay.cpp | 23 +- linden/indra/newview/llviewerdisplay.h | 1 + linden/indra/newview/llviewergenericmessage.cpp | 97 + linden/indra/newview/llviewergenericmessage.h | 46 + linden/indra/newview/llviewergesture.cpp | 75 +- linden/indra/newview/llviewergesture.h | 3 +- linden/indra/newview/llviewerimage.cpp | 9 +- linden/indra/newview/llviewerimage.h | 1 + linden/indra/newview/llviewerimagelist.cpp | 3 + linden/indra/newview/llviewerimagelist.h | 1 + linden/indra/newview/llviewerinventory.cpp | 1 + linden/indra/newview/llviewerinventory.h | 1 + linden/indra/newview/llviewerjoint.cpp | 3 +- linden/indra/newview/llviewerjoint.h | 1 + linden/indra/newview/llviewerjointattachment.cpp | 1 + linden/indra/newview/llviewerjointattachment.h | 1 + linden/indra/newview/llviewerjointmesh.cpp | 178 +- linden/indra/newview/llviewerjointmesh.h | 1 + linden/indra/newview/llviewerjointshape.cpp | 1 + linden/indra/newview/llviewerjointshape.h | 1 + linden/indra/newview/llviewerjoystick.cpp | 272 + linden/indra/newview/llviewerjoystick.h | 40 + linden/indra/newview/llviewerkeyboard.cpp | 1 + linden/indra/newview/llviewerkeyboard.h | 1 + linden/indra/newview/llviewerlayer.cpp | 1 + linden/indra/newview/llviewerlayer.h | 1 + linden/indra/newview/llviewermenu.cpp | 219 +- linden/indra/newview/llviewermenu.h | 1 + linden/indra/newview/llviewermessage.cpp | 284 +- linden/indra/newview/llviewermessage.h | 14 +- linden/indra/newview/llviewernetwork.cpp | 1 + linden/indra/newview/llviewernetwork.h | 1 + linden/indra/newview/llviewerobject.cpp | 8 + linden/indra/newview/llviewerobject.h | 1 + linden/indra/newview/llviewerobjectlist.cpp | 1 + linden/indra/newview/llviewerobjectlist.h | 1 + linden/indra/newview/llviewerparcelmgr.cpp | 16 +- linden/indra/newview/llviewerparcelmgr.h | 7 +- linden/indra/newview/llviewerparceloverlay.cpp | 1 + linden/indra/newview/llviewerparceloverlay.h | 1 + linden/indra/newview/llviewerpartsim.cpp | 31 +- linden/indra/newview/llviewerpartsim.h | 1 + linden/indra/newview/llviewerpartsource.cpp | 1 + linden/indra/newview/llviewerpartsource.h | 1 + .../indra/newview/llviewerprecompiledheaders.cpp | 1 + linden/indra/newview/llviewerprecompiledheaders.h | 1 + linden/indra/newview/llviewerregion.cpp | 68 +- linden/indra/newview/llviewerregion.h | 15 +- linden/indra/newview/llviewerreputation.cpp | 113 - linden/indra/newview/llviewerreputation.h | 40 - linden/indra/newview/llviewerstats.cpp | 1 + linden/indra/newview/llviewerstats.h | 1 + linden/indra/newview/llviewertexteditor.cpp | 32 +- linden/indra/newview/llviewertexteditor.h | 1 + linden/indra/newview/llviewertextureanim.cpp | 1 + linden/indra/newview/llviewertextureanim.h | 1 + linden/indra/newview/llviewerthrottle.cpp | 1 + linden/indra/newview/llviewerthrottle.h | 1 + linden/indra/newview/llvieweruictrlfactory.cpp | 1 + linden/indra/newview/llvieweruictrlfactory.h | 1 + linden/indra/newview/llviewervisualparam.cpp | 1 + linden/indra/newview/llviewervisualparam.h | 1 + linden/indra/newview/llviewerwindow.cpp | 439 +- linden/indra/newview/llviewerwindow.h | 32 +- linden/indra/newview/llvlcomposition.cpp | 3 +- linden/indra/newview/llvlcomposition.h | 1 + linden/indra/newview/llvlmanager.cpp | 1 + linden/indra/newview/llvlmanager.h | 1 + linden/indra/newview/llvoavatar.cpp | 70 +- linden/indra/newview/llvoavatar.h | 3 +- linden/indra/newview/llvocache.cpp | 1 + linden/indra/newview/llvocache.h | 1 + linden/indra/newview/llvoclouds.cpp | 1 + linden/indra/newview/llvoclouds.h | 1 + linden/indra/newview/llvograss.cpp | 1 + linden/indra/newview/llvograss.h | 1 + linden/indra/newview/llvoground.cpp | 1 + linden/indra/newview/llvoground.h | 1 + linden/indra/newview/llvoinventorylistener.cpp | 1 + linden/indra/newview/llvoinventorylistener.h | 1 + linden/indra/newview/llvolumesliderctrl.cpp | 3 +- linden/indra/newview/llvolumesliderctrl.h | 1 + linden/indra/newview/llvopartgroup.cpp | 1 + linden/indra/newview/llvopartgroup.h | 1 + linden/indra/newview/llvosky.cpp | 28 +- linden/indra/newview/llvosky.h | 22 +- linden/indra/newview/llvostars.cpp | 1 + linden/indra/newview/llvostars.h | 1 + linden/indra/newview/llvosurfacepatch.cpp | 23 +- linden/indra/newview/llvosurfacepatch.h | 1 + linden/indra/newview/llvotextbubble.cpp | 1 + linden/indra/newview/llvotextbubble.h | 1 + linden/indra/newview/llvotree.cpp | 1 + linden/indra/newview/llvotree.h | 1 + linden/indra/newview/llvotreenew.h | 1 + linden/indra/newview/llvovolume.cpp | 55 +- linden/indra/newview/llvovolume.h | 1 + linden/indra/newview/llvowater.cpp | 1 + linden/indra/newview/llvowater.h | 1 + linden/indra/newview/llwaterpatch.cpp | 1 + linden/indra/newview/llwaterpatch.h | 1 + linden/indra/newview/llwearable.cpp | 1 + linden/indra/newview/llwearable.h | 1 + linden/indra/newview/llwearablelist.cpp | 1 + linden/indra/newview/llwearablelist.h | 1 + linden/indra/newview/llweb.cpp | 1 + linden/indra/newview/llweb.h | 1 + linden/indra/newview/llwebbrowserctrl.cpp | 98 +- linden/indra/newview/llwebbrowserctrl.h | 10 + linden/indra/newview/llwind.cpp | 1 + linden/indra/newview/llwind.h | 1 + linden/indra/newview/llwindebug.cpp | 1 + linden/indra/newview/llwindebug.h | 1 + linden/indra/newview/llworld.cpp | 310 +- linden/indra/newview/llworld.h | 16 +- linden/indra/newview/llworldmap.cpp | 1 + linden/indra/newview/llworldmap.h | 1 + linden/indra/newview/llworldmapview.cpp | 9 +- linden/indra/newview/llworldmapview.h | 1 + linden/indra/newview/llxmlrpctransaction.cpp | 2 + linden/indra/newview/llxmlrpctransaction.h | 1 + linden/indra/newview/lsl_guide.html | 124 + linden/indra/newview/macmain.h | 1 + linden/indra/newview/macutil_Prefix.h | 1 + .../newview/macview.xcodeproj/project.pbxproj | 330 +- linden/indra/newview/macview_Prefix.h | 1 + linden/indra/newview/moviemaker.cpp | 1 + linden/indra/newview/moviemaker.h | 1 + linden/indra/newview/newview.vcproj | 40 +- linden/indra/newview/newview_vc8.vcproj | 24 +- linden/indra/newview/noise.cpp | 1 + linden/indra/newview/noise.h | 1 + linden/indra/newview/pipeline.cpp | 1558 +-- linden/indra/newview/pipeline.h | 222 +- linden/indra/newview/randgauss.h | 1 + linden/indra/newview/releasenotes.txt | 1324 +-- linden/indra/newview/res-sdl/arrow.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/arrowcop.BMP | Bin 3126 -> 0 bytes linden/indra/newview/res-sdl/arrowcopmulti.BMP | Bin 3126 -> 0 bytes linden/indra/newview/res-sdl/arrowdrag.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/circleandline.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/cross.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/hand.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/ibeam.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/ll_icon.BMP | Bin 5174 -> 0 bytes linden/indra/newview/res-sdl/llarrow.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/llarrowdrag.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/llarrowdragmulti.BMP | Bin 3126 -> 0 bytes linden/indra/newview/res-sdl/llarrowlocked.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/llgrablocked.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/llno.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/llnolocked.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/lltoolcamera.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/lltoolcreate.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/lltoolfocus.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/lltoolgrab.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/lltoolland.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/lltoolpan.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/lltoolpipette.BMP | Bin 3126 -> 0 bytes linden/indra/newview/res-sdl/lltoolrotate.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/lltoolscale.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/lltooltranslate.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/lltoolzoomin.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/lltoolzoomout.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/sizenesw.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/sizens.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/sizenwse.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/sizewe.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/toolbuy.BMP | Bin 3126 -> 0 bytes linden/indra/newview/res-sdl/toolopen.BMP | Bin 3126 -> 0 bytes linden/indra/newview/res-sdl/toolpay.BMP | Bin 3126 -> 0 bytes linden/indra/newview/res-sdl/toolpickobject.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/toolpickobject2.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/toolpickobject3.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/toolsit.BMP | Bin 3126 -> 0 bytes linden/indra/newview/res-sdl/wait.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res-sdl/working.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/arrow.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/arrow.cur | Bin 326 -> 0 bytes linden/indra/newview/res/arrowcop.cur | Bin 326 -> 0 bytes linden/indra/newview/res/arrowcopmulti.cur | Bin 326 -> 0 bytes linden/indra/newview/res/arrowdrag.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/arrowdrag.cur | Bin 326 -> 0 bytes linden/indra/newview/res/bitmap2.bmp | Bin 25118 -> 0 bytes linden/indra/newview/res/circleandline.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/circleandline.cur | Bin 326 -> 0 bytes linden/indra/newview/res/install_icon.BMP | Bin 262198 -> 0 bytes linden/indra/newview/res/install_icon.ico | Bin 363246 -> 0 bytes linden/indra/newview/res/ll_icon.BMP | Bin 262198 -> 0 bytes linden/indra/newview/res/ll_icon.ico | Bin 364590 -> 0 bytes linden/indra/newview/res/llarrow.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/llarrow.cur | Bin 326 -> 0 bytes linden/indra/newview/res/llarrowdrag.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/llarrowdrag.cur | Bin 326 -> 0 bytes linden/indra/newview/res/llarrowdragmulti.cur | Bin 326 -> 0 bytes linden/indra/newview/res/llarrowlocked.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/llarrowlocked.cur | Bin 326 -> 0 bytes linden/indra/newview/res/llgrablocked.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/llgrablocked.cur | Bin 326 -> 0 bytes linden/indra/newview/res/llno.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/llno.cur | Bin 326 -> 0 bytes linden/indra/newview/res/llnolocked.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/llnolocked.cur | Bin 326 -> 0 bytes linden/indra/newview/res/lltoolcamera.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/lltoolcamera.cur | Bin 326 -> 0 bytes linden/indra/newview/res/lltoolcreate.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/lltoolcreate.cur | Bin 326 -> 0 bytes linden/indra/newview/res/lltoolfocus.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/lltoolfocus.cur | Bin 326 -> 0 bytes linden/indra/newview/res/lltoolgrab.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/lltoolgrab.cur | Bin 326 -> 0 bytes linden/indra/newview/res/lltoolland.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/lltoolland.cur | Bin 326 -> 0 bytes linden/indra/newview/res/lltoolpan.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/lltoolpan.cur | Bin 326 -> 0 bytes linden/indra/newview/res/lltoolpipette.cur | Bin 326 -> 0 bytes linden/indra/newview/res/lltoolrotate.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/lltoolrotate.cur | Bin 326 -> 0 bytes linden/indra/newview/res/lltoolscale.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/lltoolscale.cur | Bin 326 -> 0 bytes linden/indra/newview/res/lltooltranslate.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/lltooltranslate.cur | Bin 326 -> 0 bytes linden/indra/newview/res/lltoolzoomin.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/lltoolzoomin.cur | Bin 326 -> 0 bytes linden/indra/newview/res/lltoolzoomout.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/lltoolzoomout.cur | Bin 326 -> 0 bytes linden/indra/newview/res/loginbackground.bmp | Bin 336054 -> 0 bytes linden/indra/newview/res/newViewRes.rc | 8 +- linden/indra/newview/res/toolbuy.cur | Bin 2238 -> 0 bytes linden/indra/newview/res/toolopen.cur | Bin 2238 -> 0 bytes linden/indra/newview/res/toolpay.cur | Bin 2238 -> 0 bytes linden/indra/newview/res/toolpickobject.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/toolpickobject.cur | Bin 326 -> 0 bytes linden/indra/newview/res/toolpickobject2.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/toolpickobject2.cur | Bin 326 -> 0 bytes linden/indra/newview/res/toolpickobject3.BMP | Bin 2102 -> 0 bytes linden/indra/newview/res/toolpickobject3.cur | Bin 326 -> 0 bytes linden/indra/newview/res/toolpipette.cur | Bin 326 -> 0 bytes linden/indra/newview/res/toolsit.cur | Bin 2238 -> 0 bytes linden/indra/newview/res/uninstall_icon.BMP | Bin 262198 -> 0 bytes linden/indra/newview/res/uninstall_icon.ico | Bin 363246 -> 0 bytes .../indra/newview/secondlife setup build uma.bat | 4 + .../indra/newview/secondlife setup build vaak.bat | 4 + .../indra/newview/secondlife setup build yami.bat | 4 + linden/indra/newview/skins/textures/textures.xml | 3 + linden/indra/newview/skins/xui/de/alerts.xml | 16 - .../indra/newview/skins/xui/de/menu_pie_avatar.xml | 1 - .../indra/newview/skins/xui/de/menu_pie_object.xml | 2 - linden/indra/newview/skins/xui/de/panel_avatar.xml | 1 - linden/indra/newview/skins/xui/en-us/alerts.xml | 61 +- .../newview/skins/xui/en-us/floater_about.xml | 9 +- .../newview/skins/xui/en-us/floater_about_land.xml | 18 +- .../skins/xui/en-us/floater_animation_preview.xml | 4 +- .../newview/skins/xui/en-us/floater_auction.xml | 9 - .../skins/xui/en-us/floater_avatar_picker.xml | 4 +- .../newview/skins/xui/en-us/floater_buy_land.xml | 12 +- .../newview/skins/xui/en-us/floater_directory.xml | 27 +- .../newview/skins/xui/en-us/floater_groups.xml | 81 +- .../indra/newview/skins/xui/en-us/floater_html.xml | 36 +- .../indra/newview/skins/xui/en-us/floater_im.xml | 21 + .../skins/xui/en-us/floater_instant_message.xml | 7 + .../newview/skins/xui/en-us/floater_joystick.xml | 57 + .../newview/skins/xui/en-us/floater_lsl_guide.xml | 23 + .../skins/xui/en-us/floater_preferences.xml | 9 +- .../skins/xui/en-us/floater_script_ed_panel.xml | 8 +- .../newview/skins/xui/en-us/floater_tools.xml | 6 +- .../newview/skins/xui/en-us/menu_inventory.xml | 13 +- .../newview/skins/xui/en-us/menu_pie_avatar.xml | 4 +- .../newview/skins/xui/en-us/menu_pie_object.xml | 12 +- .../indra/newview/skins/xui/en-us/menu_viewer.xml | 24 +- linden/indra/newview/skins/xui/en-us/notify.xml | 6 +- .../indra/newview/skins/xui/en-us/panel_avatar.xml | 28 +- .../indra/newview/skins/xui/en-us/panel_group.xml | 2 +- .../skins/xui/en-us/panel_group_general.xml | 9 +- .../skins/xui/en-us/panel_preferences_general.xml | 3 + .../xui/en-us/panel_preferences_graphics2.xml | 42 +- .../xui/en-us/panel_preferences_graphics3.xml | 5 + .../indra/newview/skins/xui/en-us/role_actions.xml | 2 +- .../newview/skins/xui/en-us/teleport_strings.xml | 87 + linden/indra/newview/skins/xui/es/alerts.xml | 16 - .../indra/newview/skins/xui/es/menu_pie_avatar.xml | 1 - .../indra/newview/skins/xui/es/menu_pie_object.xml | 2 - linden/indra/newview/skins/xui/es/panel_avatar.xml | 1 - linden/indra/newview/skins/xui/fr/alerts.xml | 16 - .../indra/newview/skins/xui/fr/menu_pie_avatar.xml | 1 - .../indra/newview/skins/xui/fr/menu_pie_object.xml | 2 - linden/indra/newview/skins/xui/fr/panel_avatar.xml | 1 - linden/indra/newview/skins/xui/ja/alerts.xml | 16 - .../indra/newview/skins/xui/ja/menu_pie_avatar.xml | 1 - .../indra/newview/skins/xui/ja/menu_pie_object.xml | 2 - linden/indra/newview/skins/xui/ja/panel_avatar.xml | 1 - linden/indra/newview/skins/xui/ko/alerts.xml | 16 - .../indra/newview/skins/xui/ko/menu_pie_avatar.xml | 1 - .../indra/newview/skins/xui/ko/menu_pie_object.xml | 2 - linden/indra/newview/skins/xui/ko/panel_avatar.xml | 1 - linden/indra/newview/skins/xui/pt/alerts.xml | 16 - .../indra/newview/skins/xui/pt/menu_pie_avatar.xml | 1 - .../indra/newview/skins/xui/pt/menu_pie_object.xml | 2 - linden/indra/newview/skins/xui/pt/panel_avatar.xml | 1 - linden/indra/newview/skins/xui/zh/alerts.xml | 729 +- .../indra/newview/skins/xui/zh/floater_about.xml | 19 +- .../newview/skins/xui/zh/floater_about_land.xml | 144 +- .../skins/xui/zh/floater_account_history.xml | 4 + .../skins/xui/zh/floater_animation_preview.xml | 21 +- .../indra/newview/skins/xui/zh/floater_auction.xml | 2 +- .../newview/skins/xui/zh/floater_avatar_picker.xml | 8 +- .../skins/xui/zh/floater_avatar_textures.xml | 28 +- .../indra/newview/skins/xui/zh/floater_bumps.xml | 14 +- .../newview/skins/xui/zh/floater_buy_contents.xml | 4 +- .../newview/skins/xui/zh/floater_buy_currency.xml | 24 +- .../newview/skins/xui/zh/floater_buy_land.xml | 101 +- .../newview/skins/xui/zh/floater_buy_object.xml | 2 +- .../newview/skins/xui/zh/floater_customize.xml | 403 +- .../newview/skins/xui/zh/floater_directory.xml | 24 +- .../indra/newview/skins/xui/zh/floater_friends.xml | 18 +- .../newview/skins/xui/zh/floater_god_tools.xml | 143 + .../newview/skins/xui/zh/floater_group_info.xml | 26 +- .../indra/newview/skins/xui/zh/floater_groups.xml | 2 +- linden/indra/newview/skins/xui/zh/floater_im.xml | 6 +- .../newview/skins/xui/zh/floater_image_preview.xml | 20 +- .../skins/xui/zh/floater_instant_message.xml | 5 +- .../newview/skins/xui/zh/floater_inventory.xml | 54 +- .../skins/xui/zh/floater_inventory_view_finder.xml | 24 + .../newview/skins/xui/zh/floater_land_holdings.xml | 5 +- .../skins/xui/zh/floater_live_lsleditor.xml | 6 +- .../newview/skins/xui/zh/floater_moveview.xml | 19 +- linden/indra/newview/skins/xui/zh/floater_mute.xml | 16 +- .../indra/newview/skins/xui/zh/floater_new_im.xml | 8 +- .../skins/xui/zh/floater_new_outfit_dialog.xml | 114 +- .../newview/skins/xui/zh/floater_openobject.xml | 8 +- linden/indra/newview/skins/xui/zh/floater_pay.xml | 18 +- .../newview/skins/xui/zh/floater_pay_object.xml | 24 +- .../newview/skins/xui/zh/floater_postcard.xml | 4 +- .../newview/skins/xui/zh/floater_preferences.xml | 7 + .../skins/xui/zh/floater_preview_animation.xml | 11 +- .../xui/zh/floater_preview_embedded_texture.xml | 6 +- .../skins/xui/zh/floater_preview_gesture.xml | 30 +- .../skins/xui/zh/floater_preview_notecard.xml | 2 +- .../zh/floater_preview_notecard_keep_discard.xml | 4 +- .../newview/skins/xui/zh/floater_preview_sound.xml | 11 +- .../skins/xui/zh/floater_preview_texture.xml | 5 +- .../zh/floater_preview_texture_keep_discard.xml | 6 +- linden/indra/newview/skins/xui/zh/floater_rate.xml | 44 + .../newview/skins/xui/zh/floater_report_abuse.xml | 30 +- .../newview/skins/xui/zh/floater_report_bug.xml | 8 +- .../skins/xui/zh/floater_script_ed_panel.xml | 18 +- .../skins/xui/zh/floater_script_preview.xml | 2 +- .../newview/skins/xui/zh/floater_script_queue.xml | 2 +- .../newview/skins/xui/zh/floater_script_search.xml | 10 +- .../newview/skins/xui/zh/floater_sell_land.xml | 68 + .../skins/xui/zh/floater_settings_debug.xml | 15 + .../newview/skins/xui/zh/floater_snapshot.xml | 16 +- .../indra/newview/skins/xui/zh/floater_telehub.xml | 8 +- .../newview/skins/xui/zh/floater_texture_ctrl.xml | 12 +- .../indra/newview/skins/xui/zh/floater_tools.xml | 332 +- .../newview/skins/xui/zh/floater_top_objects.xml | 20 +- .../skins/xui/zh/floater_wearable_save_as.xml | 4 +- .../newview/skins/xui/zh/floater_world_map.xml | 23 +- .../indra/newview/skins/xui/zh/menu_inventory.xml | 91 +- .../newview/skins/xui/zh/menu_pie_attachment.xml | 6 + .../indra/newview/skins/xui/zh/menu_pie_avatar.xml | 15 + .../indra/newview/skins/xui/zh/menu_pie_land.xml | 10 + .../indra/newview/skins/xui/zh/menu_pie_object.xml | 23 + .../indra/newview/skins/xui/zh/menu_pie_self.xml | 29 + linden/indra/newview/skins/xui/zh/menu_viewer.xml | 221 + .../newview/skins/xui/zh/need_to_translate.xml | 401 +- .../indra/newview/skins/xui/zh/need_to_update.xml | 479 +- linden/indra/newview/skins/xui/zh/notify.xml | 334 +- .../newview/skins/xui/zh/panel_account_details.xml | 7 + .../skins/xui/zh/panel_account_planning.xml | 2 + .../skins/xui/zh/panel_account_transactions.xml | 7 + linden/indra/newview/skins/xui/zh/panel_avatar.xml | 193 + .../skins/xui/zh/panel_avatar_classified.xml | 11 +- .../indra/newview/skins/xui/zh/panel_chat_bar.xml | 13 +- .../newview/skins/xui/zh/panel_classified.xml | 4 +- linden/indra/newview/skins/xui/zh/panel_group.xml | 14 + .../newview/skins/xui/zh/panel_group_finder.xml | 9 + .../newview/skins/xui/zh/panel_group_general.xml | 74 + .../newview/skins/xui/zh/panel_group_invite.xml | 18 + .../skins/xui/zh/panel_group_land_money.xml | 82 + .../newview/skins/xui/zh/panel_group_notices.xml | 64 + .../newview/skins/xui/zh/panel_group_roles.xml | 153 + .../newview/skins/xui/zh/panel_group_voting.xml | 78 + .../newview/skins/xui/zh/panel_land_covenant.xml | 39 + .../newview/skins/xui/zh/panel_media_remote.xml | 14 +- .../newview/skins/xui/zh/panel_music_remote.xml | 14 +- .../newview/skins/xui/zh/panel_overlaybar.xml | 22 +- .../skins/xui/zh/panel_preferences_audio.xml | 55 + .../skins/xui/zh/panel_preferences_chat.xml | 54 + .../skins/xui/zh/panel_preferences_general.xml | 47 +- .../skins/xui/zh/panel_preferences_graphics1.xml | 32 +- .../skins/xui/zh/panel_preferences_graphics2.xml | 22 +- .../skins/xui/zh/panel_preferences_graphics3.xml | 33 +- .../newview/skins/xui/zh/panel_preferences_im.xml | 19 + .../skins/xui/zh/panel_preferences_input.xml | 22 +- .../skins/xui/zh/panel_preferences_popups.xml | 14 + .../newview/skins/xui/zh/panel_region_covenant.xml | 50 + .../newview/skins/xui/zh/panel_region_debug.xml | 14 +- .../newview/skins/xui/zh/panel_region_estate.xml | 9 +- .../newview/skins/xui/zh/panel_region_general.xml | 6 +- .../newview/skins/xui/zh/panel_region_terrain.xml | 6 +- .../newview/skins/xui/zh/panel_scrolling_param.xml | 12 + .../newview/skins/xui/zh/panel_settings_chat.xml | 6 +- .../newview/skins/xui/zh/panel_settings_web.xml | 2 +- .../newview/skins/xui/zh/panel_status_bar.xml | 34 +- .../indra/newview/skins/xui/zh/panel_toolbar.xml | 6 +- linden/indra/newview/skins/xui/zh/role_actions.xml | 183 + linden/indra/newview/skins/xui/zh/strings.xml | 2 + linden/indra/newview/skins/xui/zh/strings_long.xml | 2 + linden/indra/newview/skins/xui/zh/xui_version.xml | 4 + linden/indra/newview/viewer.cpp | 283 +- linden/indra/newview/viewer.h | 12 +- linden/indra/newview/viewer_manifest.py | 6 +- linden/indra/test/common.cpp | 173 + linden/indra/test/files.lst | 5 +- linden/indra/test/inventory.cpp | 1 + linden/indra/test/io.cpp | 129 +- linden/indra/test/llapp_tut.cpp | 1 + linden/indra/test/llbase64_tut.cpp | 1 + linden/indra/test/llblowfish_tut.cpp | 1 + linden/indra/test/llerror_tut.cpp | 1 + linden/indra/test/llhttpclient_tut.cpp | 3 +- linden/indra/test/llhttpnode_tut.cpp | 1 + linden/indra/test/lliohttpserver_tut.cpp | 30 +- linden/indra/test/llmessageconfig_tut.cpp | 227 + linden/indra/test/llmime_tut.cpp | 1 + linden/indra/test/llpipeutil.cpp | 1 + linden/indra/test/llpipeutil.h | 1 + linden/indra/test/llrandom_tut.cpp | 1 + linden/indra/test/llsd_message_system_tut.cpp | 144 - linden/indra/test/llsd_new_tut.cpp | 78 +- linden/indra/test/llsdmessagebuilder_tut.cpp | 279 + linden/indra/test/llsdmessagereader_tut.cpp | 320 + linden/indra/test/llsdserialize_tut.cpp | 25 +- linden/indra/test/llsdtraits.h | 78 + linden/indra/test/llservicebuilder_tut.cpp | 96 + linden/indra/test/lltiming_tut.cpp | 1 + linden/indra/test/lltut.cpp | 1 + linden/indra/test/lltut.h | 17 + linden/indra/test/lluri_tut.cpp | 12 +- linden/indra/test/lluserrelations_tut.cpp | 1 + linden/indra/test/math.cpp | 143 + linden/indra/test/reflection_tut.cpp | 1 + linden/indra/test/test.cpp | 24 +- linden/indra/test/test.vcproj | 15 +- linden/indra/test/test_llmanifest.py | 3 +- linden/indra/win_crash_logger/StdAfx.cpp | 1 + linden/indra/win_crash_logger/StdAfx.h | 1 + linden/indra/win_crash_logger/resource.h | 1 + linden/indra/win_crash_logger/win_crash_logger.cpp | 1 + linden/indra/win_crash_logger/win_crash_logger.h | 1 + .../indra/win_crash_logger/win_crash_logger.vcproj | 2 +- linden/indra/win_updater/updater.cpp | 46 +- 1805 files changed, 27080 insertions(+), 33540 deletions(-) delete mode 100644 linden/indra/llcommon/bitpack.cpp create mode 100644 linden/indra/llmessage/llhttpsender.cpp create mode 100644 linden/indra/llmessage/llhttpsender.h create mode 100644 linden/indra/llmessage/llmessagebuilder.cpp create mode 100644 linden/indra/llmessage/llmessagebuilder.h create mode 100644 linden/indra/llmessage/llmessageconfig.cpp create mode 100644 linden/indra/llmessage/llmessageconfig.h create mode 100644 linden/indra/llmessage/llmessagereader.cpp create mode 100644 linden/indra/llmessage/llmessagereader.h create mode 100644 linden/indra/llmessage/llmessagetemplate.cpp create mode 100644 linden/indra/llmessage/llmessagetemplate.h create mode 100644 linden/indra/llmessage/llmsgvariabletype.h create mode 100755 linden/indra/llmessage/llsdmessagebuilder.cpp create mode 100755 linden/indra/llmessage/llsdmessagebuilder.h create mode 100755 linden/indra/llmessage/llsdmessagereader.cpp create mode 100755 linden/indra/llmessage/llsdmessagereader.h delete mode 100644 linden/indra/llmessage/llsdmessagesystem.cpp delete mode 100644 linden/indra/llmessage/llsdmessagesystem.h create mode 100644 linden/indra/llmessage/llservicebuilder.cpp create mode 100644 linden/indra/llmessage/llservicebuilder.h create mode 100644 linden/indra/llmessage/lltemplatemessagebuilder.cpp create mode 100644 linden/indra/llmessage/lltemplatemessagebuilder.h create mode 100644 linden/indra/llmessage/lltemplatemessagereader.cpp create mode 100644 linden/indra/llmessage/lltemplatemessagereader.h delete mode 100644 linden/indra/llrender/text_out.cpp delete mode 100644 linden/indra/llrender/text_out.h create mode 100644 linden/indra/llui/llhtmlhelp.h create mode 100644 linden/indra/newview/app_settings/message.xml create mode 100644 linden/indra/newview/app_settings/shaders/class1/environment/glowF.glsl create mode 100644 linden/indra/newview/app_settings/shaders/class1/environment/glowV.glsl delete mode 100644 linden/indra/newview/character/avatar_eye.llm delete mode 100644 linden/indra/newview/character/avatar_eye_1.llm delete mode 100644 linden/indra/newview/character/avatar_eyelashes.llm delete mode 100644 linden/indra/newview/character/avatar_hair.llm delete mode 100644 linden/indra/newview/character/avatar_hair_1.llm delete mode 100644 linden/indra/newview/character/avatar_hair_2.llm delete mode 100644 linden/indra/newview/character/avatar_hair_3.llm delete mode 100644 linden/indra/newview/character/avatar_hair_4.llm delete mode 100644 linden/indra/newview/character/avatar_hair_5.llm delete mode 100644 linden/indra/newview/character/avatar_head.llm delete mode 100644 linden/indra/newview/character/avatar_head_1.llm delete mode 100644 linden/indra/newview/character/avatar_head_2.llm delete mode 100644 linden/indra/newview/character/avatar_head_3.llm delete mode 100644 linden/indra/newview/character/avatar_head_4.llm delete mode 100644 linden/indra/newview/character/avatar_lad.xml delete mode 100644 linden/indra/newview/character/avatar_lower_body.llm delete mode 100644 linden/indra/newview/character/avatar_lower_body_1.llm delete mode 100644 linden/indra/newview/character/avatar_lower_body_2.llm delete mode 100644 linden/indra/newview/character/avatar_lower_body_3.llm delete mode 100644 linden/indra/newview/character/avatar_lower_body_4.llm delete mode 100644 linden/indra/newview/character/avatar_skeleton.xml delete mode 100644 linden/indra/newview/character/avatar_skirt.llm delete mode 100644 linden/indra/newview/character/avatar_skirt_1.llm delete mode 100644 linden/indra/newview/character/avatar_skirt_2.llm delete mode 100644 linden/indra/newview/character/avatar_skirt_3.llm delete mode 100644 linden/indra/newview/character/avatar_skirt_4.llm delete mode 100644 linden/indra/newview/character/avatar_upper_body.llm delete mode 100644 linden/indra/newview/character/avatar_upper_body_1.llm delete mode 100644 linden/indra/newview/character/avatar_upper_body_2.llm delete mode 100644 linden/indra/newview/character/avatar_upper_body_3.llm delete mode 100644 linden/indra/newview/character/avatar_upper_body_4.llm delete mode 100644 linden/indra/newview/character/blush_alpha.tga delete mode 100644 linden/indra/newview/character/body_skingrain.tga delete mode 100644 linden/indra/newview/character/bodyfreckles_alpha.tga delete mode 100644 linden/indra/newview/character/bump_face_wrinkles.tga delete mode 100644 linden/indra/newview/character/bump_head_base.tga delete mode 100644 linden/indra/newview/character/bump_lowerbody_base.tga delete mode 100644 linden/indra/newview/character/bump_pants_wrinkles.tga delete mode 100644 linden/indra/newview/character/bump_shirt_wrinkles.tga delete mode 100644 linden/indra/newview/character/bump_upperbody_base.tga delete mode 100644 linden/indra/newview/character/eyebrows_alpha.tga delete mode 100644 linden/indra/newview/character/eyeliner_alpha.tga delete mode 100644 linden/indra/newview/character/eyeshadow_inner_alpha.tga delete mode 100644 linden/indra/newview/character/eyeshadow_outer_alpha.tga delete mode 100644 linden/indra/newview/character/eyewhite.tga delete mode 100644 linden/indra/newview/character/facehair_chincurtains_alpha.tga delete mode 100644 linden/indra/newview/character/facehair_moustache_alpha.tga delete mode 100644 linden/indra/newview/character/facehair_sideburns_alpha.tga delete mode 100644 linden/indra/newview/character/facehair_soulpatch_alpha.tga delete mode 100644 linden/indra/newview/character/freckles_alpha.tga delete mode 100644 linden/indra/newview/character/genepool.xml delete mode 100644 linden/indra/newview/character/glove_length_alpha.tga delete mode 100644 linden/indra/newview/character/gloves_fingers_alpha.tga delete mode 100644 linden/indra/newview/character/head_alpha.tga delete mode 100644 linden/indra/newview/character/head_color.tga delete mode 100644 linden/indra/newview/character/head_hair.tga delete mode 100644 linden/indra/newview/character/head_highlights_alpha.tga delete mode 100644 linden/indra/newview/character/head_shading_alpha.tga delete mode 100644 linden/indra/newview/character/head_skingrain.tga delete mode 100644 linden/indra/newview/character/jacket_length_lower_alpha.tga delete mode 100644 linden/indra/newview/character/jacket_length_upper_alpha.tga delete mode 100644 linden/indra/newview/character/jacket_open_lower_alpha.tga delete mode 100644 linden/indra/newview/character/jacket_open_upper_alpha.tga delete mode 100644 linden/indra/newview/character/lipgloss_alpha.tga delete mode 100644 linden/indra/newview/character/lips_mask.tga delete mode 100644 linden/indra/newview/character/lipstick_alpha.tga delete mode 100644 linden/indra/newview/character/lowerbody_color.tga delete mode 100644 linden/indra/newview/character/lowerbody_highlights_alpha.tga delete mode 100644 linden/indra/newview/character/lowerbody_shading_alpha.tga delete mode 100644 linden/indra/newview/character/nailpolish_alpha.tga delete mode 100644 linden/indra/newview/character/pants_length_alpha.tga delete mode 100644 linden/indra/newview/character/pants_waist_alpha.tga delete mode 100644 linden/indra/newview/character/rosyface_alpha.tga delete mode 100644 linden/indra/newview/character/rouge_alpha.tga delete mode 100644 linden/indra/newview/character/shirt_bottom_alpha.tga delete mode 100644 linden/indra/newview/character/shirt_collar_alpha.tga delete mode 100644 linden/indra/newview/character/shirt_collar_back_alpha.tga delete mode 100644 linden/indra/newview/character/shirt_sleeve_alpha.tga delete mode 100644 linden/indra/newview/character/shoe_height_alpha.tga delete mode 100644 linden/indra/newview/character/skirt_length_alpha.tga delete mode 100644 linden/indra/newview/character/skirt_slit_back_alpha.tga delete mode 100644 linden/indra/newview/character/skirt_slit_front_alpha.tga delete mode 100644 linden/indra/newview/character/skirt_slit_left_alpha.tga delete mode 100644 linden/indra/newview/character/skirt_slit_right_alpha.tga delete mode 100644 linden/indra/newview/character/underpants_trial_female.tga delete mode 100644 linden/indra/newview/character/underpants_trial_male.tga delete mode 100644 linden/indra/newview/character/undershirt_trial_female.tga delete mode 100644 linden/indra/newview/character/upperbody_color.tga delete mode 100644 linden/indra/newview/character/upperbody_highlights_alpha.tga delete mode 100644 linden/indra/newview/character/upperbody_shading_alpha.tga delete mode 100644 linden/indra/newview/character/upperbodyfreckles_alpha.tga delete mode 100644 linden/indra/newview/fonts/MtBdLfRg.ttf delete mode 100644 linden/indra/newview/fonts/MtBkLfRg.ttf delete mode 100644 linden/indra/newview/fonts/profontdoc.txt delete mode 100644 linden/indra/newview/fonts/profontwindows.ttf create mode 100644 linden/indra/newview/installers/windows/installer_template_multilang.nsi create mode 100644 linden/indra/newview/installers/windows/lang_de.nsi create mode 100644 linden/indra/newview/installers/windows/lang_en-us.nsi create mode 100644 linden/indra/newview/installers/windows/lang_ja.nsi create mode 100644 linden/indra/newview/installers/windows/lang_ko.nsi create mode 100644 linden/indra/newview/llcaphttpsender.cpp create mode 100644 linden/indra/newview/llcaphttpsender.h delete mode 100644 linden/indra/newview/llfloaterrate.cpp delete mode 100644 linden/indra/newview/llfloaterrate.h create mode 100644 linden/indra/newview/llglslshader.cpp create mode 100644 linden/indra/newview/llglslshader.h create mode 100644 linden/indra/newview/llviewergenericmessage.cpp create mode 100644 linden/indra/newview/llviewergenericmessage.h create mode 100644 linden/indra/newview/llviewerjoystick.cpp create mode 100644 linden/indra/newview/llviewerjoystick.h delete mode 100644 linden/indra/newview/llviewerreputation.cpp delete mode 100644 linden/indra/newview/llviewerreputation.h delete mode 100644 linden/indra/newview/res-sdl/arrow.BMP delete mode 100644 linden/indra/newview/res-sdl/arrowcop.BMP delete mode 100644 linden/indra/newview/res-sdl/arrowcopmulti.BMP delete mode 100644 linden/indra/newview/res-sdl/arrowdrag.BMP delete mode 100644 linden/indra/newview/res-sdl/circleandline.BMP delete mode 100644 linden/indra/newview/res-sdl/cross.BMP delete mode 100644 linden/indra/newview/res-sdl/hand.BMP delete mode 100644 linden/indra/newview/res-sdl/ibeam.BMP delete mode 100644 linden/indra/newview/res-sdl/ll_icon.BMP delete mode 100644 linden/indra/newview/res-sdl/llarrow.BMP delete mode 100644 linden/indra/newview/res-sdl/llarrowdrag.BMP delete mode 100644 linden/indra/newview/res-sdl/llarrowdragmulti.BMP delete mode 100644 linden/indra/newview/res-sdl/llarrowlocked.BMP delete mode 100644 linden/indra/newview/res-sdl/llgrablocked.BMP delete mode 100644 linden/indra/newview/res-sdl/llno.BMP delete mode 100644 linden/indra/newview/res-sdl/llnolocked.BMP delete mode 100644 linden/indra/newview/res-sdl/lltoolcamera.BMP delete mode 100644 linden/indra/newview/res-sdl/lltoolcreate.BMP delete mode 100644 linden/indra/newview/res-sdl/lltoolfocus.BMP delete mode 100644 linden/indra/newview/res-sdl/lltoolgrab.BMP delete mode 100644 linden/indra/newview/res-sdl/lltoolland.BMP delete mode 100644 linden/indra/newview/res-sdl/lltoolpan.BMP delete mode 100644 linden/indra/newview/res-sdl/lltoolpipette.BMP delete mode 100644 linden/indra/newview/res-sdl/lltoolrotate.BMP delete mode 100644 linden/indra/newview/res-sdl/lltoolscale.BMP delete mode 100644 linden/indra/newview/res-sdl/lltooltranslate.BMP delete mode 100644 linden/indra/newview/res-sdl/lltoolzoomin.BMP delete mode 100644 linden/indra/newview/res-sdl/lltoolzoomout.BMP delete mode 100644 linden/indra/newview/res-sdl/sizenesw.BMP delete mode 100644 linden/indra/newview/res-sdl/sizens.BMP delete mode 100644 linden/indra/newview/res-sdl/sizenwse.BMP delete mode 100644 linden/indra/newview/res-sdl/sizewe.BMP delete mode 100644 linden/indra/newview/res-sdl/toolbuy.BMP delete mode 100644 linden/indra/newview/res-sdl/toolopen.BMP delete mode 100644 linden/indra/newview/res-sdl/toolpay.BMP delete mode 100644 linden/indra/newview/res-sdl/toolpickobject.BMP delete mode 100644 linden/indra/newview/res-sdl/toolpickobject2.BMP delete mode 100644 linden/indra/newview/res-sdl/toolpickobject3.BMP delete mode 100644 linden/indra/newview/res-sdl/toolsit.BMP delete mode 100644 linden/indra/newview/res-sdl/wait.BMP delete mode 100644 linden/indra/newview/res-sdl/working.BMP delete mode 100644 linden/indra/newview/res/arrow.BMP delete mode 100644 linden/indra/newview/res/arrow.cur delete mode 100644 linden/indra/newview/res/arrowcop.cur delete mode 100644 linden/indra/newview/res/arrowcopmulti.cur delete mode 100644 linden/indra/newview/res/arrowdrag.BMP delete mode 100644 linden/indra/newview/res/arrowdrag.cur delete mode 100644 linden/indra/newview/res/bitmap2.bmp delete mode 100644 linden/indra/newview/res/circleandline.BMP delete mode 100644 linden/indra/newview/res/circleandline.cur delete mode 100644 linden/indra/newview/res/install_icon.BMP delete mode 100644 linden/indra/newview/res/install_icon.ico delete mode 100644 linden/indra/newview/res/ll_icon.BMP delete mode 100644 linden/indra/newview/res/ll_icon.ico delete mode 100644 linden/indra/newview/res/llarrow.BMP delete mode 100644 linden/indra/newview/res/llarrow.cur delete mode 100644 linden/indra/newview/res/llarrowdrag.BMP delete mode 100644 linden/indra/newview/res/llarrowdrag.cur delete mode 100644 linden/indra/newview/res/llarrowdragmulti.cur delete mode 100644 linden/indra/newview/res/llarrowlocked.BMP delete mode 100644 linden/indra/newview/res/llarrowlocked.cur delete mode 100644 linden/indra/newview/res/llgrablocked.BMP delete mode 100644 linden/indra/newview/res/llgrablocked.cur delete mode 100644 linden/indra/newview/res/llno.BMP delete mode 100644 linden/indra/newview/res/llno.cur delete mode 100644 linden/indra/newview/res/llnolocked.BMP delete mode 100644 linden/indra/newview/res/llnolocked.cur delete mode 100644 linden/indra/newview/res/lltoolcamera.BMP delete mode 100644 linden/indra/newview/res/lltoolcamera.cur delete mode 100644 linden/indra/newview/res/lltoolcreate.BMP delete mode 100644 linden/indra/newview/res/lltoolcreate.cur delete mode 100644 linden/indra/newview/res/lltoolfocus.BMP delete mode 100644 linden/indra/newview/res/lltoolfocus.cur delete mode 100644 linden/indra/newview/res/lltoolgrab.BMP delete mode 100644 linden/indra/newview/res/lltoolgrab.cur delete mode 100644 linden/indra/newview/res/lltoolland.BMP delete mode 100644 linden/indra/newview/res/lltoolland.cur delete mode 100644 linden/indra/newview/res/lltoolpan.BMP delete mode 100644 linden/indra/newview/res/lltoolpan.cur delete mode 100644 linden/indra/newview/res/lltoolpipette.cur delete mode 100644 linden/indra/newview/res/lltoolrotate.BMP delete mode 100644 linden/indra/newview/res/lltoolrotate.cur delete mode 100644 linden/indra/newview/res/lltoolscale.BMP delete mode 100644 linden/indra/newview/res/lltoolscale.cur delete mode 100644 linden/indra/newview/res/lltooltranslate.BMP delete mode 100644 linden/indra/newview/res/lltooltranslate.cur delete mode 100644 linden/indra/newview/res/lltoolzoomin.BMP delete mode 100644 linden/indra/newview/res/lltoolzoomin.cur delete mode 100644 linden/indra/newview/res/lltoolzoomout.BMP delete mode 100644 linden/indra/newview/res/lltoolzoomout.cur delete mode 100644 linden/indra/newview/res/loginbackground.bmp delete mode 100644 linden/indra/newview/res/toolbuy.cur delete mode 100644 linden/indra/newview/res/toolopen.cur delete mode 100644 linden/indra/newview/res/toolpay.cur delete mode 100644 linden/indra/newview/res/toolpickobject.BMP delete mode 100644 linden/indra/newview/res/toolpickobject.cur delete mode 100644 linden/indra/newview/res/toolpickobject2.BMP delete mode 100644 linden/indra/newview/res/toolpickobject2.cur delete mode 100644 linden/indra/newview/res/toolpickobject3.BMP delete mode 100644 linden/indra/newview/res/toolpickobject3.cur delete mode 100644 linden/indra/newview/res/toolpipette.cur delete mode 100644 linden/indra/newview/res/toolsit.cur delete mode 100644 linden/indra/newview/res/uninstall_icon.BMP delete mode 100644 linden/indra/newview/res/uninstall_icon.ico create mode 100644 linden/indra/newview/secondlife setup build uma.bat create mode 100644 linden/indra/newview/secondlife setup build vaak.bat create mode 100644 linden/indra/newview/secondlife setup build yami.bat create mode 100644 linden/indra/newview/skins/xui/en-us/floater_joystick.xml create mode 100644 linden/indra/newview/skins/xui/en-us/floater_lsl_guide.xml create mode 100644 linden/indra/newview/skins/xui/en-us/teleport_strings.xml create mode 100644 linden/indra/newview/skins/xui/zh/floater_account_history.xml create mode 100644 linden/indra/newview/skins/xui/zh/floater_god_tools.xml create mode 100644 linden/indra/newview/skins/xui/zh/floater_inventory_view_finder.xml create mode 100644 linden/indra/newview/skins/xui/zh/floater_preferences.xml create mode 100644 linden/indra/newview/skins/xui/zh/floater_rate.xml create mode 100644 linden/indra/newview/skins/xui/zh/floater_sell_land.xml create mode 100644 linden/indra/newview/skins/xui/zh/floater_settings_debug.xml create mode 100644 linden/indra/newview/skins/xui/zh/menu_pie_attachment.xml create mode 100644 linden/indra/newview/skins/xui/zh/menu_pie_avatar.xml create mode 100644 linden/indra/newview/skins/xui/zh/menu_pie_land.xml create mode 100644 linden/indra/newview/skins/xui/zh/menu_pie_object.xml create mode 100644 linden/indra/newview/skins/xui/zh/menu_pie_self.xml create mode 100644 linden/indra/newview/skins/xui/zh/menu_viewer.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_account_details.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_account_planning.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_account_transactions.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_avatar.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_group.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_group_finder.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_group_general.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_group_invite.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_group_land_money.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_group_notices.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_group_roles.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_group_voting.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_land_covenant.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_preferences_audio.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_preferences_chat.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_preferences_im.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_preferences_popups.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_region_covenant.xml create mode 100644 linden/indra/newview/skins/xui/zh/panel_scrolling_param.xml create mode 100644 linden/indra/newview/skins/xui/zh/role_actions.xml create mode 100644 linden/indra/newview/skins/xui/zh/strings.xml create mode 100644 linden/indra/newview/skins/xui/zh/strings_long.xml create mode 100644 linden/indra/newview/skins/xui/zh/xui_version.xml create mode 100644 linden/indra/test/llmessageconfig_tut.cpp delete mode 100644 linden/indra/test/llsd_message_system_tut.cpp create mode 100755 linden/indra/test/llsdmessagebuilder_tut.cpp create mode 100755 linden/indra/test/llsdmessagereader_tut.cpp create mode 100644 linden/indra/test/llsdtraits.h create mode 100644 linden/indra/test/llservicebuilder_tut.cpp (limited to 'linden/indra') diff --git a/linden/indra/SConstruct b/linden/indra/SConstruct index 66a0231..0174b2d 100644 --- a/linden/indra/SConstruct +++ b/linden/indra/SConstruct @@ -22,7 +22,7 @@ import glob platform = sys.platform if platform == 'linux2': - platform = 'linux' + platform = 'linux' ###################### # GET VERSION # @@ -46,562 +46,557 @@ pipe.close() ######################### opts = Options() -opts.Add(EnumOption('BUILD', 'Set build type', 'releasefordownload', - allowed_values=('debug', 'release', 'releasenoopt', 'releasefordownload'))) -opts.Add(EnumOption('ARCH', 'Set architecture', 'i686', - allowed_values=('i686', 'powerpc', 'x86_64', 'x86_64cross'))) -opts.Add(EnumOption('BTARGET', 'Set build target', 'server', - allowed_values=('client', 'server', 'all'))) -opts.Add(EnumOption('DISTCC', 'Enabled distcc', 'yes', - allowed_values=('yes', 'no'))) -opts.Add(EnumOption('MOZLIB', 'Enabled llmozlib/mozilla support', 'yes', - allowed_values=('yes', 'no'))) -opts.Add(EnumOption('COLORGCC', 'Enabled colorgcc', 'yes', - allowed_values=('yes', 'no'))) -opts.Add(EnumOption('GRID', 'Client package\'s default grid', 'default', - allowed_values=('default', 'aditi', 'agni', 'dmz', 'durga', 'firstlook', 'ganga', 'shakti', 'siva', 'soma', 'uma', 'vaak'))) -opts.Add(EnumOption('OPENSOURCE', 'Build using only non-proprietary dependencies', - 'yes',# OPENSOURCE: do not edit this line - allowed_values=('yes', 'no'))) -helpenv = Environment(options = opts) -Help(opts.GenerateHelpText(helpenv)) - -build_param = ARGUMENTS.get('BUILD', 'releasefordownload') -arch = ARGUMENTS.get('ARCH', 'i686') -target_param = ARGUMENTS.get('BTARGET', 'server') -enable_distcc = ARGUMENTS.get('DISTCC', 'yes') -enable_mozlib = ARGUMENTS.get('MOZLIB', 'yes') -enable_colorgcc = ARGUMENTS.get('COLORGCC', 'yes') -grid = ARGUMENTS.get('GRID', 'default') -# OPENSOURCE: do not edit the following line: -opensource = ARGUMENTS.get('OPENSOURCE', 'yes') +opts.AddOptions( + EnumOption('BUILD', 'Set build type', 'releasefordownload', + allowed_values=('debug', 'release', 'releasenoopt', 'releasefordownload')), + EnumOption('ARCH', 'Set architecture', 'i686', + allowed_values=('i686', 'powerpc', 'x86_64')), + EnumOption('BTARGET', 'Set build target', 'server', + allowed_values=('client', 'server', 'all')), + BoolOption('DISTCC', 'Enabled distcc', True), + BoolOption('MOZLIB', 'Enabled llmozlib/mozilla support', True), + BoolOption('COLORGCC', 'Enabled colorgcc', True), + EnumOption('GRID', 'Client package\'s default grid', 'default', + allowed_values=('default', 'aditi', 'agni', 'dmz', 'durga', 'firstlook', 'ganga', 'shakti', 'siva', 'soma', 'uma', 'vaak')), + BoolOption('OPENSOURCE', 'Build using only non-proprietary dependencies', True) # OPENSOURCE: do not edit this line +) +optenv = Environment(options = opts) +Help(opts.GenerateHelpText(optenv)) + +build_param = optenv['BUILD'] +arch = optenv['ARCH'] +target_param = optenv['BTARGET'] +enable_distcc = optenv['DISTCC'] +enable_mozlib = optenv['MOZLIB'] +enable_colorgcc = optenv['COLORGCC'] +grid = optenv['GRID'] +opensource = optenv['OPENSOURCE'] targets = [ target_param ] if target_param == 'all': - targets = [ 'client', 'server' ] + targets = [ 'client', 'server' ] ##################### # ITERATE TARGETS # ##################### for build_target in targets: - buildtype = build_param - if build_target == 'server' and buildtype == 'releasefordownload': - buildtype = 'release' - - system_str = arch + '-' + platform - - print 'Building ' + build_target + ' ' + version_major + '.' + version_minor + '.' + version_patch + '.' + version_build + ' on ' + system_str + ' (' + buildtype + ')' - - system_lib_dir = '../libraries/' + system_str - if build_target == 'client': - system_lib_dir += '/lib_release_client' - elif buildtype == 'debug': - system_lib_dir += '/lib_debug' - else: - system_lib_dir += '/lib_release' - - lib_dir = './lib_' + buildtype + '_' + build_target + '/' + system_str - - try: - build_dir_prefix = os.environ['TEMP_BUILD_DIR'] - except: - build_dir_prefix = '/tmp/' + os.environ['USER'] - - build_dir = build_dir_prefix + os.getcwd() + '/' + system_str + '-' + build_target + '-' + buildtype - - ### Base include directories ### - - include_dirs = Split(""" - ./llcommon ./llmath ./llwindow ./llaudio ./llcharacter - ./lldatabase ./llhavok ./llimage ./llinventory ./llmedia ./llmessage - ./llprimitive ./llrender ./llscene ./llui ./llvfs ./llwindow - ./llxml ./lscript - ../libraries/include - ../libraries/include/havok - """ + - '../libraries/' + system_str + '/include' ) - - client_external_libs = [] - system_link_flags = '' - - if platform != 'linux' and build_target == 'client' and enable_mozlib == 'yes': - - ### Mozilla include directories ### - - mozilla_dir = '../libraries/' + system_str + '/include/mozilla' - include_dirs += Split( - mozilla_dir + '/include/webbrwsr ' + - mozilla_dir + '/include/docshell ' + - mozilla_dir + '/include/dom ' + - mozilla_dir + '/include/xpcom ' + - mozilla_dir + '/include/widget ' + - mozilla_dir + '/include/gfx ' + - mozilla_dir + '/include/string ' + - mozilla_dir + '/include/uriloader ' + - mozilla_dir + '/include/view ' + - mozilla_dir + '/include/layout ' + - mozilla_dir + '/include/content ' + - mozilla_dir + '/include/locale ' + - mozilla_dir + '/include/profdirserviceprovider ' + - mozilla_dir + '/include/xulapp ' + - mozilla_dir + '/include/pref ' + - mozilla_dir + '/sdk/include') - - ############## - # CPP Flags # - ############## - - # Generic GCC flags - flags = '-g -pipe -Wall -Wno-trigraphs ' - - if opensource == 'yes': - flags += '-DLL_USE_KDU=0 ' - else: - flags += '-DLL_USE_KDU=1 ' - - if build_target == 'server': - # Server flags - flags += '-march=pentiumpro -D_GNU_SOURCE -ftemplate-depth-60 -DLL_MESA_HEADLESS=1 -DLL_MESA=1 ' - try: - server_cppflags = os.environ['SERVER_CPPFLAGS'] - except: - server_cppflags = '' - flags += server_cppflags + ' ' - else: - # Viewer flags - flags += '-falign-loops=16 -fno-math-errno -fexceptions -fsigned-char -fno-strict-aliasing -ffast-math ' - flags += '-DLL_MESA_HEADLESS=0 -DLL_MESA=0 ' - try: - client_cppflags = os.environ['CLIENT_CPPFLAGS'] - except: - client_cppflags = '' - flags += client_cppflags + ' ' - - if platform == 'linux': - # Linux-only flags - flags += '-DLL_LINUX=1 ' - if build_target == 'client': - flags += '-DAPPID=secondlife -DLL_SDL=1 ' - if arch == 'x86_64' or arch == 'x86_64cross': - flags += '-DLL_FMOD=0 ' - flags += '-DLL_X11=1 -DLL_GTK=1 ' - client_external_libs += [ 'gtk-x11-2.0', 'elfio' ] - include_dirs += [ '../libraries/' + system_str + '/include/gtk-2.0' ] - include_dirs += [ '../libraries/' + system_str + '/include/glib-2.0'] - include_dirs += [ '../libraries/' + system_str + '/include/pango-1.0' ] - include_dirs += [ '../libraries/' + system_str + '/include/atk-1.0' ] - include_dirs += [ '../libraries/' + system_str + '/include/ELFIO' ] - include_dirs += [ '../libraries/' + system_str + '/include/llfreetype2' ] - - # llmozlib stuff - if enable_mozlib == 'yes': - flags += '-DLL_LIBXUL_ENABLED=1 ' - client_external_libs += [ 'llmozlib' ] - client_external_libs += [ 'mozjs', 'nspr4', 'plc4', 'plds4', 'profdirserviceprovider_s', 'xpcom', 'xul' ] - else: - flags += '-DLL_LIBXUL_ENABLED=0 ' - else: - # Mac-only flags - flags += '-x c++ -arch ppc -pipe -Wno-trigraphs -fpascal-strings -faltivec -fasm-blocks -g -fmessage-length=0 -mtune=G4 -Wno-deprecated-declarations -Wno-invalid-offsetof -mmacosx-version-min=10.3 -DLL_DARWIN=1 -Wmost -Wno-sign-compare -Wno-switch -fpch-preprocess -F./newview/build/Deployment -fconstant-cfstrings -ffor-scope -Wno-reorder -isysroot /Developer/SDKs/MacOSX10.3.9.sdk ' - - ### Build type-specific flags ### - - debug_opts = flags + '-fno-inline -O0 -D_DEBUG -DLL_DEBUG=1 ' - release_opts = flags + '-O2 -DNDEBUG -DLL_RELEASE=1 ' - releasenoopt_opts = flags + '-O0 -DNDEBUG -DLL_RELEASE=1 ' - releasefordownload_opts = flags + '-O2 -DNDEBUG -DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 ' - - ################ - # ENVIRONMENT # - ################ - - gcc_bin = 'g++-3.4' - # If you strip more aggressively than -S then the quality of crash- - # logger backtraces deteriorates. - strip_cmd = 'strip -S -o $TARGET $SOURCE' - - # hidesyms_cmd is something which copies an executable while 'hiding' - # all of its exposed symbols except a very few desired ones. This is - # used mainly to hide the symbols of the many common libraries we - # static-link, which otherwise cause hard-to-trace fatal crashes due - # to clashes in the run-time symbol namespace. - if platform == 'linux': - exposed_symbols_file = 'newview/linux_tools/exposed-symbols.txt' - hidesyms_cmd = 'objcopy --keep-global-symbols ' + exposed_symbols_file + ' $SOURCE $TARGET' - else: - hidesyms_cmd = 'cp -f $SOURCE $TARGET' - - if build_target != 'client': - gcc_bin = 'g++-3.3' - - if arch == 'x86_64cross': - gcc_bin = '/opt/crosstool/gcc-4.0.2-glibc-2.3.6/x86_64-unknown-linux-gnu/bin/x86_64-unknown-linux-gnu-gcc' - strip_cmd = '/opt/crosstool/gcc-4.0.2-glibc-2.3.6/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/bin/strip -S -o $TARGET $SOURCE' - - compiler = gcc_bin - compiler_no_distcc = compiler - if enable_distcc == 'yes': - compiler = 'distcc ' + gcc_bin - - base_env = Environment(CXX = compiler, - CPPPATH = include_dirs, - LIBPATH = [lib_dir] + [system_lib_dir], - LINKFLAGS = system_link_flags + '--no-keep-memory --reduce-memory-overheads ' ) - - ### Environments for various build types ### - - env = base_env.Copy(CPPFLAGS = releasefordownload_opts) - - if buildtype == 'debug': - env = base_env.Copy(CPPFLAGS = debug_opts) - - if buildtype == 'release': - env = base_env.Copy(CPPFLAGS = release_opts) - - if buildtype == 'releasenoopt': - env = base_env.Copy(CPPFLAGS = releasenoopt_opts) - - # ccache needs this to be set - try: - env['ENV']['CCACHE_DIR'] = os.environ['CCACHE_DIR'] - except: - print "No CCACHE_DIR set." - - env_no_distcc = env.Copy(CXX = compiler_no_distcc) - - ### Distributed build hosts ### - - if enable_distcc == 'yes': - hosts = 'localhost/2 station9.lindenlab.com,lzo station7.lindenlab.com,lzo station6.lindenlab.com,lzo station11.lindenlab.com,lzo station5.lindenlab.com,lzo station15.lindenlab.com,lzo station10.lindenlab.com,lzo station13.lindenlab.com,lzo station12.lindenlab.com,lzo' - if arch == 'x86_64' or arch == 'x86_64cross': - hosts = 'localhost' - print "Distributing to hosts: " + hosts - env['ENV']['DISTCC_HOSTS'] = hosts - env['ENV']['USER'] = os.environ['USER'] - env['ENV']['HOME'] = os.environ['HOME'] - - if enable_colorgcc == 'yes': - env['ENV']['PATH'] = os.environ['PATH'] - env['ENV']['TERM'] = os.environ['TERM'] - env['ENV']['HOME'] = os.environ['HOME'] - - ### Configure lex and yacc ### - env.Append(YACCFLAGS = ["-v", "-d"]) - env.CFile(target=build_dir+'/lscript/lscript_compile/indra.l.cpp', source='lscript/lscript_compile/indra.l') - env.CFile(target=build_dir+'/lscript/lscript_compile/indra.y.c', source='lscript/lscript_compile/indra.y') - env.Command(build_dir+'/lscript/lscript_compile/indra.y.cpp',build_dir+'/lscript/lscript_compile/indra.y.c', - [Move('$TARGET','$SOURCE'),Delete(build_dir+'/lscript/lscript_compile/indra.y.output')]) - - ##################### - # HELPER FUNCTIONS # - ##################### - - ### Load a files.lst and files.PLATFORM.lst for each module ### - - def load_files(module, source_fname): - new_list = [] - try: - list_file = open('./' + module + '/' + source_fname, 'r') - list = Split(list_file.read()) - for x in list: - file = os.path.join(build_dir, x) - if x == 'newsim/lltask.cpp': - print 'Found lltask!' - obj = env_no_distcc.Object(file) - new_list.append(obj) - else: - new_list.append(file) - list_file.close() - except IOError, val: - print 'Error: unable to open file list',source_fname, - print 'for module', module + ":", val - return [] - - try: - platform_list_file = open('./' + module + '/files.' + platform + '.lst', 'r') - list = Split(platform_list_file.read()) - for x in list: - file = os.path.join(build_dir, x) - new_list.append(file) - platform_list_file.close() - except IOError: - return new_list - - return new_list - - ### Create a static library from the module ### - - def create_static_module_from_dir( - input_dir, - mod_name, - local_flags="", - source_files = 'files.lst', - extra_depends=None): - files_list = load_files(input_dir, source_files) - BuildDir(build_dir + '/' + input_dir, input_dir) - local_env = env.Copy(CPPFLAGS = env['CPPFLAGS'] + ' ' + local_flags) - if extra_depends: - for x in files_list: - Depends(local_env.Object(x), extra_depends) - tgt = local_env.StaticLibrary(lib_dir + '/' + mod_name, files_list) - Default(tgt) - - def create_static_module(module, local_flags="", source_files = 'files.lst', extra_depends=None): - create_static_module_from_dir(module, module, local_flags, source_files, extra_depends) - - def create_dynamic_module( - module, - local_flags="", - module_libs = None, - source_files = 'files.lst'): - files_list = load_files(module, source_files) - BuildDir(build_dir + '/' + module, module) - local_env = env.Copy(CPPFLAGS = env['CPPFLAGS'] + ' ' + local_flags) - tgt = local_env.SharedLibrary(lib_dir + '/' + module, files_list, LIBS = module_libs) - Default(tgt) - - ### Create an executable from the module ### - - def create_executable( - exec_file, module, module_libs, source_files = 'files.lst'): - files_list = load_files(module, source_files) - BuildDir(build_dir + '/' + module, module) - tgt = env.Program(exec_file, files_list, LIBS = module_libs) - Default(tgt) - - - #################### - # BUILD LIBRARIES # - #################### - - create_static_module('llcommon') - create_static_module('llmath') - create_static_module('llmessage') - create_static_module('llvfs') - create_static_module('llimage') - create_static_module('llinventory') - create_static_module('llcharacter') - create_static_module('llprimitive') - create_static_module('llrender') - create_static_module('llwindow') - create_static_module('llxml') - create_static_module('lscript', extra_depends=build_dir + '/lscript/lscript_compile/indra.y.h') - - net_external_libs = [ 'curl', 'cares', 'ssl', 'crypto', 'aprutil-1', 'apr-1' ] - common_external_libs = net_external_libs + [ 'xmlrpc', 'expat', 'z' ] - - if build_target == 'client': - if platform == 'linux': - ############################# - # BUILD LINUX_CRASH_LOGGER # - ############################# - output_crashlogger_bin = 'linux_crash_logger/linux-crash-logger-' + arch + '-bin' - external_libs = net_external_libs + [ 'db-4.2', 'gtk-x11-2.0' ] - external_libs.remove('cares') - internal_libs = [ 'llvfs', 'llmath', 'llcommon' ] - create_executable(output_crashlogger_bin + '-globalsyms', 'linux_crash_logger', internal_libs + external_libs) - env.Command(output_crashlogger_bin, output_crashlogger_bin + '-globalsyms', hidesyms_cmd) - - create_static_module('llaudio') - create_static_module('llmedia') - create_static_module('llui') - create_static_module('llimagej2coj') - - if opensource == 'no': - create_dynamic_module('llkdu', '', ['llimage', 'llvfs', 'llmath', 'llcommon', 'apr-1', 'kdu_v42R']) - - ################## - # BUILD NEWVIEW # - ################## - output_bin = 'newview/secondlife-' + arch + '-bin' - - external_libs = client_external_libs + common_external_libs + [ 'freetype', 'jpeg', 'SDL', 'GL', 'GLU', 'ogg', 'vorbisenc', 'vorbisfile', 'vorbis', 'db-4.2', 'openjpeg' ] - - if arch != 'x86_64' and arch != 'x86_64cross': - external_libs += [ 'fmod-3.75' ] - - external_libs.remove('cares') - - internal_libs = [ 'lscript', 'llwindow', 'llrender', 'llprimitive', - 'llmedia', 'llinventory', - 'llimage', 'llimagej2coj', - 'llcharacter', 'llaudio', 'llui', 'llxml', - 'llmessage', 'llvfs', 'llmath', 'llcommon' ] - - create_executable(output_bin + '-globalsyms', 'newview', internal_libs + external_libs) - env.Command(output_bin, output_bin + '-globalsyms', hidesyms_cmd) - Default(output_bin) - - if buildtype == 'releasefordownload': - - ####################### - # PACKAGE THE CLIENT # - ####################### - - if platform == 'linux': - env.Command(output_bin + '-stripped', output_bin, strip_cmd) - env.Command(output_crashlogger_bin + '-stripped', output_crashlogger_bin, strip_cmd) - product_name = 'SecondLife_' + arch + '_' + version_major + "_" + version_minor + "_" + version_patch + "_" + version_build - if grid not in ['default', 'agni']: - product_name += "_" + grid.upper() - package_name = product_name + '.tar.bz2' - cmd = 'rm -rf newview/%(pn)s* && newview/viewer_manifest.py --grid=%(grid)s --installer_name=%(pn)s --arch=%(arch)s' % { - 'pn': product_name, - 'grid':grid, - 'arch':arch} - env.Command('newview/' + package_name, 'newview/viewer_manifest.py', cmd) - Depends('newview/' + package_name, output_bin + '-stripped') - Depends('newview/' + package_name, output_crashlogger_bin + '-stripped') - Default('newview/' + package_name) - - elif build_target == 'server': - create_static_module('lldatabase') - create_static_module('llscene') - create_static_module('llhavok', '-fno-exceptions -fno-rtti') - create_static_module_from_dir('llkdu', 'llkdustatic') - - # This makes sure we only build the release llpython. The - # debug one is difficult to use. - if buildtype == 'release': - create_dynamic_module( - 'tools/llpython', - '-I/usr/include/python2.3', - ['llmessage', 'llvfs', 'llmath', 'llcommon', - 'boost_python-gcc', 'apr-1']) - env.Command('lib/python/indra/llpython.so', lib_dir + '/tools/libllpython.so', 'cp -u $SOURCE $TARGET') - Default('lib/python/indra/llpython.so') - - ################## - # BUILD SERVERS # - ################## - file_suffix = '' - if buildtype == 'debug': - file_suffix = '_debug' - - common_external_libs += [ 'pthread' ] - - # Chatter test application - external_libs = common_external_libs - internal_libs = [ 'llmessage', 'llvfs', 'llmath', 'llcommon' ] - create_executable('test_apps/chatter/chatter', 'test_apps/chatter', - internal_libs + external_libs) - - # Tool to buffer all of standard input to memory. - create_executable('tools/simbin2xml/buffer_file/buffer_file', - 'tools/simbin2xml/buffer_file', "") - - # Simstate binary to XML utility. - external_libs = common_external_libs - internal_libs = [ 'llxml', 'llcommon', 'llmath' ] - create_executable('tools/simbin2xml/simbin2xml', 'tools/simbin2xml', - internal_libs + external_libs) - - # Launcher - external_libs = common_external_libs - internal_libs = [ 'llmessage', 'llvfs', 'llmath', 'llcommon' ] - create_executable('launcher/launcher' + file_suffix, 'launcher', - internal_libs + external_libs) - - # Dataserver - Depends('dataserver/dataserver', 'launcher/launcher' + file_suffix) - external_libs = common_external_libs + ['boost_regex-gcc-mt', 'mysqlclient'] - internal_libs = [ 'llcharacter', 'lldatabase', 'llimage', 'llinventory', - 'llscene', 'llmessage', 'llvfs', 'llxml', 'llcommon', 'llmath' ] - create_executable('dataserver/dataserver' + file_suffix, 'dataserver', - internal_libs + external_libs) - - # Spaceserver - Depends('newspace/spaceserver', 'dataserver/dataserver' + file_suffix) - external_libs = common_external_libs + ['expat', 'aprutil-1', 'mysqlclient'] - internal_libs = ['llscene', 'lldatabase', 'llmessage', 'llvfs', - 'llmath', 'llcommon'] - create_executable('newspace/spaceserver' + file_suffix, 'newspace', - internal_libs + external_libs) - - # Userserver - Depends('userserver/userserver', 'newspace/spaceserver' + file_suffix) - external_libs = common_external_libs - internal_libs = ['llinventory', 'llscene', 'llmessage', 'llvfs', - 'llxml', 'llmath', 'llcommon'] - create_executable('userserver/userserver' + file_suffix, 'userserver', - internal_libs + external_libs) - - # Rpcserver - Depends('rpcserver/rpcserver', 'userserver/userserver' + file_suffix) - external_libs = common_external_libs + ['xmlrpc', 'expat', 'aprutil-1', - 'mysqlclient'] - internal_libs = ['llscene', 'llmessage', 'lldatabase', 'llvfs', - 'llmath', 'llcommon'] - create_executable('rpcserver/rpcserver' + file_suffix, 'rpcserver', - internal_libs + external_libs) - - # Mapserver - Depends('mapserver/mapserver', 'rpcserver/rpcserver' + file_suffix) - external_libs = common_external_libs + ['apr-1', 'aprutil-1', 'OSMesa16', 'kdu', - 'boost_regex-gcc-mt', 'iconv', 'jpeg', 'GL', - 'mysqlclient', 'pthread', 'dl'] - internal_libs = ['llrender', 'llwindow', 'llimage', 'lldatabase', 'llprimitive', 'llmessage', 'llkdustatic', - 'llxml', 'llvfs', 'llmath', 'llcommon'] - create_executable('mapserver/mapserver' + file_suffix, 'mapserver', - internal_libs + external_libs) - - # Simulator - Depends('newsim/simulator' + file_suffix, 'mapserver/mapserver' + file_suffix) - external_libs = common_external_libs + ['hkdynamics', 'hkgeometry', 'hkmath', 'hkbase', 'hkcollide', 'hkactions', 'apr-1', 'aprutil-1', 'boost_regex-gcc-mt', 'dl', 'kdu', 'mysqlclient', 'iconv'] - internal_libs = [ 'lscript', 'llprimitive', - 'llscene', 'llhavok', 'llinventory', 'llimage', - 'llcharacter', 'llxml', 'lldatabase', 'llkdustatic', - 'llmessage', 'llvfs', 'llmath', 'llcommon' ] - create_executable('newsim/simulator' + file_suffix, 'newsim', - internal_libs + external_libs) - - # texture upload verifier - external_libs = common_external_libs + [ 'kdu', 'dl' ] - internal_libs = [ - 'llimage', - 'llkdustatic', - 'llinventory', - 'llmessage', - 'llvfs', - 'llxml', - 'llcommon', - 'llmath' ] - create_executable( - 'web/doc/asset-upload/plugins/verify-texture', - 'web/doc/asset-upload/plugins', - internal_libs + external_libs, - 'verify-texture.lst') - - # notecard upload verifier - create_executable( - 'web/doc/asset-upload/plugins/verify-notecard', - 'web/doc/asset-upload/plugins', - internal_libs + external_libs, - 'verify-notecard.lst') - - # LSL compiler plugin for asset upload CGI. - external_libs = common_external_libs - internal_libs = ['lscript', 'llmath', 'llcommon'] - create_executable('web/doc/asset-upload/plugins/lsl_compiler/lslc' + file_suffix, 'web/doc/asset-upload/plugins/lsl_compiler/', internal_libs + external_libs); - - # Test - Depends('test/test', 'newsim/simulator' + file_suffix) - external_libs = common_external_libs + ['mysqlclient'] - internal_libs = [ 'lldatabase', 'llinventory', 'llmessage', 'llxml', - 'llvfs', 'llmath', 'llcommon' ] - test_executable = 'test/test' + file_suffix - create_executable(test_executable, 'test', - internal_libs + external_libs) - - # Run tests - test_results_file = 'test/test_results' + file_suffix + '.txt' - env.Command(test_results_file, - test_executable, - "$SOURCE 2>&1 | tee $TARGET") - Depends(test_results_file, test_executable) - Default(test_results_file) + buildtype = build_param + if build_target == 'server' and buildtype == 'releasefordownload': + buildtype = 'release' + + system_str = arch + '-' + platform + + print 'Building ' + build_target + ' ' + version_major + '.' + version_minor + '.' + version_patch + '.' + version_build + ' on ' + system_str + ' (' + buildtype + ')' + + system_lib_dir = '../libraries/' + system_str + if build_target == 'client': + system_lib_dir += '/lib_release_client' + elif buildtype == 'debug': + system_lib_dir += '/lib_debug' + else: + system_lib_dir += '/lib_release' + + lib_dir = './lib_' + buildtype + '_' + build_target + '/' + system_str + + try: + build_dir_prefix = os.environ['TEMP_BUILD_DIR'] + except: + build_dir_prefix = '/tmp/' + os.environ['USER'] + + build_dir = build_dir_prefix + os.getcwd() + '/' + system_str + '-' + build_target + '-' + buildtype + + ### Base include directories ### + + include_dirs = Split(""" + ./llcommon ./llmath ./llwindow ./llaudio ./llcharacter + ./lldatabase ./llhavok ./llimage ./llinventory ./llmedia ./llmessage + ./llprimitive ./llrender ./llscene ./llui ./llvfs ./llwindow + ./llxml ./lscript + ../libraries/include + ../libraries/include/havok + """ + + '../libraries/' + system_str + '/include' ) + + client_external_libs = [] + system_link_flags = '' + + if platform != 'linux' and build_target == 'client' and enable_mozlib: + + ### Mozilla include directories ### + + mozilla_dir = '../libraries/' + system_str + '/include/mozilla' + include_dirs += Split( + mozilla_dir + '/include/webbrwsr ' + + mozilla_dir + '/include/docshell ' + + mozilla_dir + '/include/dom ' + + mozilla_dir + '/include/xpcom ' + + mozilla_dir + '/include/widget ' + + mozilla_dir + '/include/gfx ' + + mozilla_dir + '/include/string ' + + mozilla_dir + '/include/uriloader ' + + mozilla_dir + '/include/view ' + + mozilla_dir + '/include/layout ' + + mozilla_dir + '/include/content ' + + mozilla_dir + '/include/locale ' + + mozilla_dir + '/include/profdirserviceprovider ' + + mozilla_dir + '/include/xulapp ' + + mozilla_dir + '/include/pref ' + + mozilla_dir + '/sdk/include') + + ############## + # CPP Flags # + ############## + + # Generic GCC flags + flags = '-g -pipe -Wall -Wno-trigraphs ' + + if opensource: + flags += '-DLL_USE_KDU=0 ' + else: + flags += '-DLL_USE_KDU=1 ' + + if build_target == 'server': + # Server flags + flags += '-march=pentiumpro -D_GNU_SOURCE -ftemplate-depth-60 -DLL_MESA_HEADLESS=1 -DLL_MESA=1 ' + try: + server_cppflags = os.environ['SERVER_CPPFLAGS'] + except: + server_cppflags = '' + flags += server_cppflags + ' ' + else: + # Viewer flags + flags += '-falign-loops=16 -fno-math-errno -fexceptions -fsigned-char -fno-strict-aliasing -ffast-math ' + flags += '-DLL_MESA_HEADLESS=0 -DLL_MESA=0 ' + try: + client_cppflags = os.environ['CLIENT_CPPFLAGS'] + except: + client_cppflags = '' + flags += client_cppflags + ' ' + + if platform == 'linux': + # Linux-only flags + flags += '-DLL_LINUX=1 ' + if build_target == 'client': + flags += '-DAPPID=secondlife -DLL_SDL=1 ' + if arch == 'x86_64' or arch == 'x86_64cross': + flags += '-DLL_FMOD=0 ' + flags += '-DLL_X11=1 -DLL_GTK=1 ' + client_external_libs += [ 'gtk-x11-2.0', 'elfio' ] + include_dirs += [ '../libraries/' + system_str + '/include/gtk-2.0' ] + include_dirs += [ '../libraries/' + system_str + '/include/glib-2.0'] + include_dirs += [ '../libraries/' + system_str + '/include/pango-1.0' ] + include_dirs += [ '../libraries/' + system_str + '/include/atk-1.0' ] + include_dirs += [ '../libraries/' + system_str + '/include/ELFIO' ] + include_dirs += [ '../libraries/' + system_str + '/include/llfreetype2' ] + + # llmozlib stuff + if enable_mozlib: + flags += '-DLL_LIBXUL_ENABLED=1 ' + client_external_libs += [ 'llmozlib' ] + client_external_libs += [ 'mozjs', 'nspr4', 'plc4', 'plds4', 'profdirserviceprovider_s', 'xpcom', 'xul' ] + else: + flags += '-DLL_LIBXUL_ENABLED=0 ' + else: + # Mac-only flags + flags += '-x c++ -arch ppc -pipe -Wno-trigraphs -fpascal-strings -faltivec -fasm-blocks -g -fmessage-length=0 -mtune=G4 -Wno-deprecated-declarations -Wno-invalid-offsetof -mmacosx-version-min=10.3 -DLL_DARWIN=1 -Wmost -Wno-sign-compare -Wno-switch -fpch-preprocess -F./newview/build/Deployment -fconstant-cfstrings -ffor-scope -Wno-reorder -isysroot /Developer/SDKs/MacOSX10.3.9.sdk ' + + ### Build type-specific flags ### + + debug_opts = flags + '-fno-inline -O0 -D_DEBUG -DLL_DEBUG=1 ' + release_opts = flags + '-O2 -DNDEBUG -DLL_RELEASE=1 ' + releasenoopt_opts = flags + '-O0 -DNDEBUG -DLL_RELEASE=1 ' + releasefordownload_opts = flags + '-O2 -DNDEBUG -DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 ' + + ################ + # ENVIRONMENT # + ################ + + gcc_bin = 'g++-3.4' + # If you strip more aggressively than -S then the quality of crash- + # logger backtraces deteriorates. + strip_cmd = 'strip -S -o $TARGET $SOURCE' + + # hidesyms_cmd is something which copies an executable while 'hiding' + # all of its exposed symbols except a very few desired ones. This is + # used mainly to hide the symbols of the many common libraries we + # static-link, which otherwise cause hard-to-trace fatal crashes due + # to clashes in the run-time symbol namespace. + if platform == 'linux': + exposed_symbols_file = 'newview/linux_tools/exposed-symbols.txt' + hidesyms_cmd = 'objcopy --keep-global-symbols ' + exposed_symbols_file + ' $SOURCE $TARGET' + else: + hidesyms_cmd = 'cp -f $SOURCE $TARGET' + + if build_target != 'client': + gcc_bin = 'g++-3.3' + + if arch == 'x86_64cross': + gcc_bin = '/opt/crosstool/gcc-4.0.2-glibc-2.3.6/x86_64-unknown-linux-gnu/bin/x86_64-unknown-linux-gnu-gcc' + strip_cmd = '/opt/crosstool/gcc-4.0.2-glibc-2.3.6/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/bin/strip -S -o $TARGET $SOURCE' + + compiler = gcc_bin + compiler_no_distcc = compiler + if enable_distcc: + compiler = 'distcc ' + gcc_bin + + base_env = Environment(CXX = compiler, + CPPPATH = include_dirs, + LIBPATH = [lib_dir] + [system_lib_dir], + LINKFLAGS = system_link_flags + '--no-keep-memory --reduce-memory-overheads ' ) + + ### Environments for various build types ### + + env = base_env.Copy(CPPFLAGS = releasefordownload_opts) + + if buildtype == 'debug': + env = base_env.Copy(CPPFLAGS = debug_opts) + + if buildtype == 'release': + env = base_env.Copy(CPPFLAGS = release_opts) + + if buildtype == 'releasenoopt': + env = base_env.Copy(CPPFLAGS = releasenoopt_opts) + + # ccache needs this to be set + try: + env['ENV']['CCACHE_DIR'] = os.environ['CCACHE_DIR'] + except: + print "No CCACHE_DIR set." + + env_no_distcc = env.Copy(CXX = compiler_no_distcc) + + ### Distributed build hosts ### + + if enable_distcc: + hosts = 'localhost/2 station9.lindenlab.com,lzo station7.lindenlab.com,lzo station6.lindenlab.com,lzo station11.lindenlab.com,lzo station5.lindenlab.com,lzo station15.lindenlab.com,lzo station10.lindenlab.com,lzo station13.lindenlab.com,lzo station12.lindenlab.com,lzo' + if arch == 'x86_64' or arch == 'x86_64cross': + hosts = 'localhost' + print "Distributing to hosts: " + hosts + env['ENV']['DISTCC_HOSTS'] = hosts + env['ENV']['USER'] = os.environ['USER'] + env['ENV']['HOME'] = os.environ['HOME'] + + if enable_colorgcc: + env['ENV']['PATH'] = os.environ['PATH'] + env['ENV']['TERM'] = os.environ['TERM'] + env['ENV']['HOME'] = os.environ['HOME'] + + ### Configure lex and yacc ### + env.Append(YACCFLAGS = ["-v", "-d"]) + env.CFile(target=build_dir+'/lscript/lscript_compile/indra.l.cpp', source='lscript/lscript_compile/indra.l') + env.CFile(target=build_dir+'/lscript/lscript_compile/indra.y.c', source='lscript/lscript_compile/indra.y') + env.Command(build_dir+'/lscript/lscript_compile/indra.y.cpp',build_dir+'/lscript/lscript_compile/indra.y.c', + [Move('$TARGET','$SOURCE'),Delete(build_dir+'/lscript/lscript_compile/indra.y.output')]) + + ##################### + # HELPER FUNCTIONS # + ##################### + + ### Load a files.lst and files.PLATFORM.lst for each module ### + + def load_files(module, source_fname): + new_list = [] + try: + list_file = open('./' + module + '/' + source_fname, 'r') + list = Split(list_file.read()) + for x in list: + file = os.path.join(build_dir, x) + if x == 'newsim/lltask.cpp': + print 'Found lltask!' + obj = env_no_distcc.Object(file) + new_list.append(obj) + else: + new_list.append(file) + list_file.close() + except IOError, val: + print 'Error: unable to open file list',source_fname, + print 'for module', module + ":", val + return [] + + try: + platform_list_file = open('./' + module + '/files.' + platform + '.lst', 'r') + list = Split(platform_list_file.read()) + for x in list: + file = os.path.join(build_dir, x) + new_list.append(file) + platform_list_file.close() + except IOError: + return new_list + + return new_list + + ### Create a static library from the module ### + + def create_static_module_from_dir( + input_dir, + mod_name, + local_flags="", + source_files = 'files.lst', + extra_depends=None): + files_list = load_files(input_dir, source_files) + BuildDir(build_dir + '/' + input_dir, input_dir) + local_env = env.Copy(CPPFLAGS = env['CPPFLAGS'] + ' ' + local_flags) + if extra_depends: + for x in files_list: + Depends(local_env.Object(x), extra_depends) + tgt = local_env.StaticLibrary(lib_dir + '/' + mod_name, files_list) + Default(tgt) + + def create_static_module(module, local_flags="", source_files = 'files.lst', extra_depends=None): + create_static_module_from_dir(module, module, local_flags, source_files, extra_depends) + + def create_dynamic_module( + module, + local_flags="", + module_libs = None, + source_files = 'files.lst'): + files_list = load_files(module, source_files) + BuildDir(build_dir + '/' + module, module) + local_env = env.Copy(CPPFLAGS = env['CPPFLAGS'] + ' ' + local_flags) + tgt = local_env.SharedLibrary(lib_dir + '/' + module, files_list, LIBS = module_libs) + Default(tgt) + + ### Create an executable from the module ### + + def create_executable( + exec_file, module, module_libs, source_files = 'files.lst'): + files_list = load_files(module, source_files) + BuildDir(build_dir + '/' + module, module) + tgt = env.Program(exec_file, files_list, LIBS = module_libs) + Default(tgt) + + + #################### + # BUILD LIBRARIES # + #################### + + create_static_module('llcommon') + create_static_module('llmath') + create_static_module('llmessage') + create_static_module('llvfs') + create_static_module('llimage') + create_static_module('llinventory') + create_static_module('llcharacter') + create_static_module('llprimitive') + create_static_module('llrender') + create_static_module('llwindow') + create_static_module('llxml') + create_static_module('lscript', extra_depends=build_dir + '/lscript/lscript_compile/indra.y.h') + + net_external_libs = [ 'curl', 'cares', 'ssl', 'crypto', 'expat', 'aprutil-1', 'apr-1' ] + common_external_libs = net_external_libs + [ 'xmlrpc', 'z' ] + + if build_target == 'client': + if platform == 'linux': + ############################# + # BUILD LINUX_CRASH_LOGGER # + ############################# + output_crashlogger_bin = 'linux_crash_logger/linux-crash-logger-' + arch + '-bin' + external_libs = net_external_libs + [ 'db-4.2', 'gtk-x11-2.0' ] + external_libs.remove('cares') + internal_libs = [ 'llvfs', 'llmath', 'llcommon' ] + create_executable(output_crashlogger_bin + '-globalsyms', 'linux_crash_logger', internal_libs + external_libs) + env.Command(output_crashlogger_bin, output_crashlogger_bin + '-globalsyms', hidesyms_cmd) + + create_static_module('llaudio') + create_static_module('llmedia') + create_static_module('llui') + create_static_module('llimagej2coj') + + if not opensource: + create_dynamic_module('llkdu', '', ['llimage', 'llvfs', 'llmath', 'llcommon', 'apr-1', 'kdu_v42R']) + + ################## + # BUILD NEWVIEW # + ################## + output_bin = 'newview/secondlife-' + arch + '-bin' + + external_libs = client_external_libs + common_external_libs + [ 'freetype', 'jpeg', 'SDL', 'GL', 'GLU', 'ogg', 'vorbisenc', 'vorbisfile', 'vorbis', 'db-4.2', 'openjpeg' ] + + if arch != 'x86_64' and arch != 'x86_64cross': + external_libs += [ 'fmod-3.75' ] + + external_libs.remove('cares') + + internal_libs = [ 'lscript', 'llwindow', 'llrender', 'llprimitive', + 'llmedia', 'llinventory', + 'llimage', 'llimagej2coj', + 'llcharacter', 'llaudio', 'llui', 'llxml', + 'llmessage', 'llvfs', 'llmath', 'llcommon' ] + + create_executable(output_bin + '-globalsyms', 'newview', internal_libs + external_libs) + env.Command(output_bin, output_bin + '-globalsyms', hidesyms_cmd) + Default(output_bin) + + if buildtype == 'releasefordownload': + + ####################### + # PACKAGE THE CLIENT # + ####################### + + if platform == 'linux': + env.Command(output_bin + '-stripped', output_bin, strip_cmd) + env.Command(output_crashlogger_bin + '-stripped', output_crashlogger_bin, strip_cmd) + product_name = 'SecondLife_' + arch + '_' + version_major + "_" + version_minor + "_" + version_patch + "_" + version_build + if grid not in ['default', 'agni']: + product_name += "_" + grid.upper() + package_name = product_name + '.tar.bz2' + cmd = 'rm -rf newview/%(pn)s* && newview/viewer_manifest.py --grid=%(grid)s --installer_name=%(pn)s --arch=%(arch)s' % { + 'pn': product_name, + 'grid':grid, + 'arch':arch} + env.Command('newview/' + package_name, 'newview/viewer_manifest.py', cmd) + Depends('newview/' + package_name, output_bin + '-stripped') + Depends('newview/' + package_name, output_crashlogger_bin + '-stripped') + Default('newview/' + package_name) + + elif build_target == 'server': + create_static_module('lldatabase') + create_static_module('llscene') + create_static_module('llhavok', '-fno-exceptions -fno-rtti') + create_static_module_from_dir('llkdu', 'llkdustatic') + + + ################## + # BUILD SERVERS # + ################## + file_suffix = '' + if buildtype == 'debug': + file_suffix = '_debug' + + common_external_libs += [ 'pthread' ] + + # Chatter test application + external_libs = common_external_libs + internal_libs = [ 'llmessage', 'llvfs', 'llmath', 'llcommon' ] + create_executable('test_apps/chatter/chatter', 'test_apps/chatter', + internal_libs + external_libs) + + # Tool to buffer all of standard input to memory. + create_executable('tools/simbin2xml/buffer_file/buffer_file', + 'tools/simbin2xml/buffer_file', "") + + # Simstate binary to XML utility. + external_libs = common_external_libs + internal_libs = [ 'llxml', 'llcommon', 'llmath' ] + create_executable('tools/simbin2xml/simbin2xml', 'tools/simbin2xml', + internal_libs + external_libs) + + # Launcher + external_libs = common_external_libs + internal_libs = [ 'llmessage', 'llvfs', 'llmath', 'llcommon' ] + create_executable('launcher/launcher' + file_suffix, 'launcher', + internal_libs + external_libs) + + # Dataserver + Depends('dataserver/dataserver', 'launcher/launcher' + file_suffix) + external_libs = common_external_libs + ['boost_regex-gcc-mt', 'mysqlclient'] + internal_libs = [ 'llcharacter', 'lldatabase', 'llimage', 'llinventory', + 'llscene', 'llmessage', 'llvfs', 'llxml', 'llcommon', 'llmath' ] + create_executable('dataserver/dataserver' + file_suffix, 'dataserver', + internal_libs + external_libs) + + # Spaceserver + Depends('newspace/spaceserver', 'dataserver/dataserver' + file_suffix) + external_libs = common_external_libs + ['mysqlclient'] + internal_libs = ['llscene', 'lldatabase', 'llmessage', 'llvfs', + 'llmath', 'llcommon'] + create_executable('newspace/spaceserver' + file_suffix, 'newspace', + internal_libs + external_libs) + + # Userserver + Depends('userserver/userserver', 'newspace/spaceserver' + file_suffix) + external_libs = common_external_libs + internal_libs = ['llinventory', 'llscene', 'llmessage', 'llvfs', + 'llxml', 'llmath', 'llcommon'] + create_executable('userserver/userserver' + file_suffix, 'userserver', + internal_libs + external_libs) + + # Rpcserver + Depends('rpcserver/rpcserver', 'userserver/userserver' + file_suffix) + external_libs = common_external_libs + ['xmlrpc', + 'mysqlclient'] + internal_libs = ['llscene', 'llmessage', 'lldatabase', 'llvfs', + 'llmath', 'llcommon'] + create_executable('rpcserver/rpcserver' + file_suffix, 'rpcserver', + internal_libs + external_libs) + + # Mapserver + Depends('mapserver/mapserver', 'rpcserver/rpcserver' + file_suffix) + external_libs = common_external_libs + ['OSMesa16', 'kdu', + 'boost_regex-gcc-mt', 'iconv', 'jpeg', 'GL', + 'mysqlclient', 'pthread', 'dl'] + internal_libs = ['llrender', 'llwindow', 'llimage', 'lldatabase', 'llprimitive', 'llmessage', 'llkdustatic', + 'llxml', 'llvfs', 'llmath', 'llcommon'] + create_executable('mapserver/mapserver' + file_suffix, 'mapserver', + internal_libs + external_libs) + + # Simulator + Depends('newsim/simulator' + file_suffix, 'mapserver/mapserver' + file_suffix) + external_libs = common_external_libs + ['hkdynamics', 'hkgeometry', 'hkmath', 'hkbase', 'hkcollide', 'hkactions', 'boost_regex-gcc-mt', 'dl', 'kdu', 'mysqlclient', 'iconv'] + internal_libs = [ 'lscript', 'llprimitive', + 'llscene', 'llhavok', 'llinventory', 'llimage', + 'llcharacter', 'llxml', 'lldatabase', 'llkdustatic', + 'llmessage', 'llvfs', 'llmath', 'llcommon' ] + create_executable('newsim/simulator' + file_suffix, 'newsim', + internal_libs + external_libs) + + # texture upload verifier + external_libs = common_external_libs + [ 'kdu', 'dl' ] + internal_libs = [ + 'llimage', + 'llkdustatic', + 'llinventory', + 'llmessage', + 'llvfs', + 'llxml', + 'llcommon', + 'llmath' ] + create_executable( + 'web/doc/asset-upload/plugins/verify-texture', + 'web/doc/asset-upload/plugins', + internal_libs + external_libs, + 'verify-texture.lst') + + # notecard upload verifier + create_executable( + 'web/doc/asset-upload/plugins/verify-notecard', + 'web/doc/asset-upload/plugins', + internal_libs + external_libs, + 'verify-notecard.lst') + + # LSL compiler plugin for asset upload CGI. + external_libs = common_external_libs + internal_libs = ['lscript', 'llmath', 'llcommon'] + create_executable('web/doc/asset-upload/plugins/lsl_compiler/lslc' + file_suffix, 'web/doc/asset-upload/plugins/lsl_compiler/', internal_libs + external_libs); + + # Test + Depends('test/test', 'newsim/simulator' + file_suffix) + external_libs = common_external_libs + ['mysqlclient'] + internal_libs = [ 'lldatabase', 'llinventory', 'llmessage', 'llxml', + 'llvfs', 'llmath', 'llcommon' ] + test_executable = 'test/test' + file_suffix + create_executable(test_executable, 'test', + internal_libs + external_libs) + + # Run tests + test_results_file = 'test/test_results' + file_suffix + '.txt' + env.Command(test_results_file, + test_executable, + "$SOURCE 2>&1 | tee $TARGET") + Depends(test_results_file, test_executable) + Default(test_results_file) + + test_script = 'test/test.py' + script_test_results = 'test/script_test_result' + file_suffix + '.txt' + env.Command(script_test_results, + test_script, + "$SOURCE 2>&1 | tee $TARGET") + + Depends(script_test_results, test_results_file) + Default(script_test_results) ######### # DONE # diff --git a/linden/indra/indra_complete/indra_complete.sln b/linden/indra/indra_complete/indra_complete.sln index c78dba2..5c5c0ca 100644 --- a/linden/indra/indra_complete/indra_complete.sln +++ b/linden/indra/indra_complete/indra_complete.sln @@ -97,6 +97,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lscript_compile", "..\lscri EndProjectSection EndProject ProjectSection(ProjectDependencies) = postProject + {AF2D801E-EEE7-4B52-A025-F8E648ADC34B} = {AF2D801E-EEE7-4B52-A025-F8E648ADC34B} {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} {FCC4483C-5B84-4944-B91F-4589A219BC0B} = {FCC4483C-5B84-4944-B91F-4589A219BC0B} {F882263E-4F2A-43D9-A45A-FA4C8EC66552} = {F882263E-4F2A-43D9-A45A-FA4C8EC66552} @@ -139,11 +140,15 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lscript_compile_fb", "..\ls EndProjectSection EndProject ProjectSection(ProjectDependencies) = postProject + {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} {44CE6D82-7320-4609-8FC3-5965C19F4808} = {44CE6D82-7320-4609-8FC3-5965C19F4808} + {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} EndProjectSection EndProject ProjectSection(ProjectDependencies) = postProject + {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} {F882263E-4F2A-43D9-A45A-FA4C8EC66552} = {F882263E-4F2A-43D9-A45A-FA4C8EC66552} + {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} EndProjectSection EndProject ProjectSection(ProjectDependencies) = postProject @@ -151,6 +156,7 @@ EndProject {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} + {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win_crash_logger", "..\win_crash_logger\win_crash_logger.vcproj", "{648685F3-8760-4CC5-BB2B-CAF9DECC25A4}" @@ -158,6 +164,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win_crash_logger", "..\win_ {B5B53617-416F-404A-BF10-22EBCCA0E4FB} = {B5B53617-416F-404A-BF10-22EBCCA0E4FB} {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} + {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59} {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} EndProjectSection @@ -179,6 +186,7 @@ EndProject {DE55D666-6A3D-476C-937F-109269B83681} = {DE55D666-6A3D-476C-937F-109269B83681} {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} + {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59} {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} EndProjectSection @@ -224,6 +232,11 @@ EndProject EndProjectSection EndProject ProjectSection(ProjectDependencies) = postProject + {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} + {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} + {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} + {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} + {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} EndProjectSection EndProject ProjectSection(ProjectDependencies) = postProject diff --git a/linden/indra/lib/python/indra/llmanifest.py b/linden/indra/lib/python/indra/llmanifest.py index 6697299..c49e39a 100644 --- a/linden/indra/lib/python/indra/llmanifest.py +++ b/linden/indra/lib/python/indra/llmanifest.py @@ -5,6 +5,7 @@ # # Copyright (c) 2006-2007, Linden Research, Inc. # +# Second Life Viewer Source Code # The source code in this file ("Source Code") is provided by Linden Lab # to you under the terms of the GNU General Public License, version 2.0 # ("GPL"), unless you have obtained a separate licensing agreement @@ -150,15 +151,15 @@ def main(argv=None, srctree='.', dsttree='./dst'): if(argv == None): argv = sys.argv - print "Source tree:", srctree - print "Destination tree:", dsttree - option_names = [arg['name'] + '=' for arg in ARGUMENTS] option_names.append('help') options, remainder = getopt.getopt(argv[1:], "", option_names) if len(remainder) >= 1: dsttree = remainder[0] + print "Source tree:", srctree + print "Destination tree:", dsttree + # convert options to a hash args = {} for opt in options: @@ -323,7 +324,7 @@ class LLManifest(object): def put_in_file(self, contents, dst): # write contents as dst - f = open(self.dst_path_of(dst), "wbU") + f = open(self.dst_path_of(dst), "wb") f.write(contents) f.close() @@ -480,6 +481,11 @@ class LLManifest(object): for f in list: if(os.path.exists(f)): return f + # didn't find it, return last item in list + if len(list) > 0: + return list[-1] + else: + return None def contents_of_tar(self, src_tar, dst_dir): """ Extracts the contents of the tarfile (specified @@ -509,7 +515,8 @@ class LLManifest(object): def check_file_exists(self, path): if(not os.path.exists(path) and not os.path.islink(path)): - raise RuntimeError, "Path " + path + " doesn't exist" + raise RuntimeError("Path %s doesn't exist" % ( + os.path.normpath(os.path.join(os.getcwd(), path)),)) wildcard_pattern = re.compile('\*') @@ -530,6 +537,8 @@ class LLManifest(object): def path(self, src, dst=None): print "Processing", src, "=>", dst + if src == None: + raise RuntimeError("No source file, dst is " + dst) if dst == None: dst = src dst = os.path.join(self.get_dst_prefix(), dst) diff --git a/linden/indra/linux_crash_logger/linux_crash_logger.cpp b/linden/indra/linux_crash_logger/linux_crash_logger.cpp index 196ff6e..b950753 100644 --- a/linden/indra/linux_crash_logger/linux_crash_logger.cpp +++ b/linden/indra/linux_crash_logger/linux_crash_logger.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llaudio/audioengine.cpp b/linden/indra/llaudio/audioengine.cpp index 46e621a..edfa123 100644 --- a/linden/indra/llaudio/audioengine.cpp +++ b/linden/indra/llaudio/audioengine.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -1656,7 +1657,7 @@ BOOL LLAudioData::load() char uuid_str[UUID_STR_LENGTH]; /*Flawfinder: ignore*/ char wav_path[MAX_PATH]; /*Flawfinder: ignore*/ mID.toString(uuid_str); - snprintf(wav_path, MAX_PATH, "%s.dsf",gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str).c_str()); /*Flawfinder: ignore*/ + snprintf(wav_path, MAX_PATH, "%s.dsf",gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str).c_str()); /* Flawfinder: ignore */ if (!mBufferp->loadWAV(wav_path)) { diff --git a/linden/indra/llaudio/audioengine.h b/linden/indra/llaudio/audioengine.h index 83f822b..5a0186c 100644 --- a/linden/indra/llaudio/audioengine.h +++ b/linden/indra/llaudio/audioengine.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llaudio/audioengine_fmod.cpp b/linden/indra/llaudio/audioengine_fmod.cpp index 2e8f45f..485b95b 100644 --- a/linden/indra/llaudio/audioengine_fmod.cpp +++ b/linden/indra/llaudio/audioengine_fmod.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llaudio/audioengine_fmod.h b/linden/indra/llaudio/audioengine_fmod.h index 9274b1b..6a40a12 100644 --- a/linden/indra/llaudio/audioengine_fmod.h +++ b/linden/indra/llaudio/audioengine_fmod.h @@ -5,6 +5,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llaudio/listener.cpp b/linden/indra/llaudio/listener.cpp index cff8e79..3860949 100644 --- a/linden/indra/llaudio/listener.cpp +++ b/linden/indra/llaudio/listener.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llaudio/listener.h b/linden/indra/llaudio/listener.h index bdc3ba2..5cf0ac6 100644 --- a/linden/indra/llaudio/listener.h +++ b/linden/indra/llaudio/listener.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llaudio/listener_ds3d.h b/linden/indra/llaudio/listener_ds3d.h index e62040c..4859513 100644 --- a/linden/indra/llaudio/listener_ds3d.h +++ b/linden/indra/llaudio/listener_ds3d.h @@ -5,6 +5,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llaudio/listener_fmod.cpp b/linden/indra/llaudio/listener_fmod.cpp index d4f57c0..36f9fcf 100644 --- a/linden/indra/llaudio/listener_fmod.cpp +++ b/linden/indra/llaudio/listener_fmod.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llaudio/listener_fmod.h b/linden/indra/llaudio/listener_fmod.h index 521cc16..e532371 100644 --- a/linden/indra/llaudio/listener_fmod.h +++ b/linden/indra/llaudio/listener_fmod.h @@ -5,6 +5,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llaudio/listener_openal.h b/linden/indra/llaudio/listener_openal.h index e87c504..480c3fa 100644 --- a/linden/indra/llaudio/listener_openal.h +++ b/linden/indra/llaudio/listener_openal.h @@ -5,6 +5,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llaudio/llaudiodecodemgr.cpp b/linden/indra/llaudio/llaudiodecodemgr.cpp index 832c314..0dbc64f 100644 --- a/linden/indra/llaudio/llaudiodecodemgr.cpp +++ b/linden/indra/llaudio/llaudiodecodemgr.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -589,7 +590,7 @@ void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs) timer.reset(); uuid.toString(uuid_str); - snprintf(d_path, LL_MAX_PATH, "%s.dsf", gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str).c_str()); /*Flawfinder: ignore*/ + snprintf(d_path, LL_MAX_PATH, "%s.dsf", gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str).c_str()); /* Flawfinder: ignore */ mCurrentDecodep = new LLVorbisDecodeState(uuid, d_path); if (!mCurrentDecodep->initDecode()) diff --git a/linden/indra/llaudio/llaudiodecodemgr.h b/linden/indra/llaudio/llaudiodecodemgr.h index aab7144..e01bb29 100644 --- a/linden/indra/llaudio/llaudiodecodemgr.h +++ b/linden/indra/llaudio/llaudiodecodemgr.h @@ -3,6 +3,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llaudio/vorbisdecode.cpp b/linden/indra/llaudio/vorbisdecode.cpp index 4308b71..bb7a73d 100644 --- a/linden/indra/llaudio/vorbisdecode.cpp +++ b/linden/indra/llaudio/vorbisdecode.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llaudio/vorbisdecode.h b/linden/indra/llaudio/vorbisdecode.h index e5f1b26..16ee4ae 100644 --- a/linden/indra/llaudio/vorbisdecode.h +++ b/linden/indra/llaudio/vorbisdecode.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llaudio/vorbisencode.cpp b/linden/indra/llaudio/vorbisencode.cpp index c8716cc..6a0ebac 100644 --- a/linden/indra/llaudio/vorbisencode.cpp +++ b/linden/indra/llaudio/vorbisencode.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llaudio/vorbisencode.h b/linden/indra/llaudio/vorbisencode.h index 3813c50..e7f76c3 100644 --- a/linden/indra/llaudio/vorbisencode.h +++ b/linden/indra/llaudio/vorbisencode.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llanimationstates.cpp b/linden/indra/llcharacter/llanimationstates.cpp index 8687dfb..95aa5d6 100644 --- a/linden/indra/llcharacter/llanimationstates.cpp +++ b/linden/indra/llcharacter/llanimationstates.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llanimationstates.h b/linden/indra/llcharacter/llanimationstates.h index 75e2f67..6a9f7a4 100644 --- a/linden/indra/llcharacter/llanimationstates.h +++ b/linden/indra/llcharacter/llanimationstates.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llbvhloader.cpp b/linden/indra/llcharacter/llbvhloader.cpp index 48b5e7c..9f7e901 100644 --- a/linden/indra/llcharacter/llbvhloader.cpp +++ b/linden/indra/llcharacter/llbvhloader.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -175,7 +176,7 @@ LLBVHLoader::Status LLBVHLoader::loadTranslationTable(const char *fileName) //-------------------------------------------------------------------- char path[LL_MAX_PATH]; /* Flawfinder: ignore */ - snprintf( path, sizeof(path), "%s",/* Flawfinder: ignore */ + snprintf( path, sizeof(path), "%s", /* Flawfinder: ignore */ gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,fileName).c_str()); diff --git a/linden/indra/llcharacter/llbvhloader.h b/linden/indra/llcharacter/llbvhloader.h index 0ae31ef..0a4f9a9 100644 --- a/linden/indra/llcharacter/llbvhloader.h +++ b/linden/indra/llcharacter/llbvhloader.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llcharacter.cpp b/linden/indra/llcharacter/llcharacter.cpp index 6e9327f..90a3cc6 100644 --- a/linden/indra/llcharacter/llcharacter.cpp +++ b/linden/indra/llcharacter/llcharacter.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llcharacter.h b/linden/indra/llcharacter/llcharacter.h index 6f4fe17..90824aa 100644 --- a/linden/indra/llcharacter/llcharacter.h +++ b/linden/indra/llcharacter/llcharacter.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -127,7 +128,7 @@ public: // updates all visual parameters for this character virtual void updateVisualParams(); - virtual void addDebugText( const char* text ) = 0; + virtual void addDebugText( const std::string& text ) = 0; virtual const LLUUID& getID() = 0; //------------------------------------------------------------------------- diff --git a/linden/indra/llcharacter/lleditingmotion.cpp b/linden/indra/llcharacter/lleditingmotion.cpp index 66608f8..08d7940 100644 --- a/linden/indra/llcharacter/lleditingmotion.cpp +++ b/linden/indra/llcharacter/lleditingmotion.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/lleditingmotion.h b/linden/indra/llcharacter/lleditingmotion.h index 37df991..6ca6765 100644 --- a/linden/indra/llcharacter/lleditingmotion.h +++ b/linden/indra/llcharacter/lleditingmotion.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llgesture.cpp b/linden/indra/llcharacter/llgesture.cpp index 944df78..231047d 100644 --- a/linden/indra/llcharacter/llgesture.cpp +++ b/linden/indra/llcharacter/llgesture.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llgesture.h b/linden/indra/llcharacter/llgesture.h index 5180be0..dc2b10c 100644 --- a/linden/indra/llcharacter/llgesture.h +++ b/linden/indra/llcharacter/llgesture.h @@ -5,6 +5,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llhandmotion.cpp b/linden/indra/llcharacter/llhandmotion.cpp index 12ef070..96b1dc7 100644 --- a/linden/indra/llcharacter/llhandmotion.cpp +++ b/linden/indra/llcharacter/llhandmotion.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llhandmotion.h b/linden/indra/llcharacter/llhandmotion.h index 3f3dac6..b909818 100644 --- a/linden/indra/llcharacter/llhandmotion.h +++ b/linden/indra/llcharacter/llhandmotion.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llheadrotmotion.cpp b/linden/indra/llcharacter/llheadrotmotion.cpp index 1d1771d..be0b55d 100644 --- a/linden/indra/llcharacter/llheadrotmotion.cpp +++ b/linden/indra/llcharacter/llheadrotmotion.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llheadrotmotion.h b/linden/indra/llcharacter/llheadrotmotion.h index 1412354..bdb82aa 100644 --- a/linden/indra/llcharacter/llheadrotmotion.h +++ b/linden/indra/llcharacter/llheadrotmotion.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/lljoint.cpp b/linden/indra/llcharacter/lljoint.cpp index 4102612..6141cc0 100644 --- a/linden/indra/llcharacter/lljoint.cpp +++ b/linden/indra/llcharacter/lljoint.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/lljoint.h b/linden/indra/llcharacter/lljoint.h index 352d222..f188968 100644 --- a/linden/indra/llcharacter/lljoint.h +++ b/linden/indra/llcharacter/lljoint.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/lljointsolverrp3.cpp b/linden/indra/llcharacter/lljointsolverrp3.cpp index 2221a53..9ecb31b 100644 --- a/linden/indra/llcharacter/lljointsolverrp3.cpp +++ b/linden/indra/llcharacter/lljointsolverrp3.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/lljointsolverrp3.h b/linden/indra/llcharacter/lljointsolverrp3.h index 7dd35eb..42f4912 100644 --- a/linden/indra/llcharacter/lljointsolverrp3.h +++ b/linden/indra/llcharacter/lljointsolverrp3.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/lljointstate.h b/linden/indra/llcharacter/lljointstate.h index 7fef28a..8b55410 100644 --- a/linden/indra/llcharacter/lljointstate.h +++ b/linden/indra/llcharacter/lljointstate.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llkeyframefallmotion.cpp b/linden/indra/llcharacter/llkeyframefallmotion.cpp index 2fca225..d539be6 100644 --- a/linden/indra/llcharacter/llkeyframefallmotion.cpp +++ b/linden/indra/llcharacter/llkeyframefallmotion.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llkeyframefallmotion.h b/linden/indra/llcharacter/llkeyframefallmotion.h index ddf4c45..b6a4e68 100644 --- a/linden/indra/llcharacter/llkeyframefallmotion.h +++ b/linden/indra/llcharacter/llkeyframefallmotion.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llkeyframemotion.cpp b/linden/indra/llcharacter/llkeyframemotion.cpp index d09de0e..94e45b6 100644 --- a/linden/indra/llcharacter/llkeyframemotion.cpp +++ b/linden/indra/llcharacter/llkeyframemotion.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -48,7 +49,7 @@ // Static Definitions //----------------------------------------------------------------------------- LLVFS* LLKeyframeMotion::sVFS = NULL; -LLKeyframeDataCache::LLKeyframeDataMap LLKeyframeDataCache::sKeyframeDataMap; +LLKeyframeDataCache::keyframe_data_map_t LLKeyframeDataCache::sKeyframeDataMap; //----------------------------------------------------------------------------- // Globals @@ -64,8 +65,20 @@ static F32 MIN_ACCELERATION_SQUARED = 0.0005f * 0.0005f; static F32 MAX_CONSTRAINTS = 10; //----------------------------------------------------------------------------- -// JointMotionList::dumpDiagInfo() +// JointMotionList //----------------------------------------------------------------------------- +LLKeyframeMotion::JointMotionList::JointMotionList() + : mNumJointMotions(0), + mJointMotionArray(NULL) +{ +} + +LLKeyframeMotion::JointMotionList::~JointMotionList() +{ + for_each(mConstraints.begin(), mConstraints.end(), DeletePointer()); + delete [] mJointMotionArray; +} + U32 LLKeyframeMotion::JointMotionList::dumpDiagInfo() { S32 total_size = sizeof(JointMotionList); @@ -434,7 +447,7 @@ LLKeyframeMotion::~LLKeyframeMotion() { delete [] mJointStates; } - mConstraints.deleteAllData(); + for_each(mConstraints.begin(), mConstraints.end(), DeletePointer()); } //----------------------------------------------------------------------------- @@ -569,8 +582,7 @@ LLMotion::LLMotionInitStatus LLKeyframeMotion::onInitialize(LLCharacter *charact BOOL LLKeyframeMotion::setupPose() { // add all valid joint states to the pose - U32 jm; - for (jm=0; jmmNumJointMotions; jm++) + for (U32 jm=0; jmmNumJointMotions; jm++) { if ( mJointStates[jm].getJoint() ) { @@ -579,16 +591,16 @@ BOOL LLKeyframeMotion::setupPose() } // initialize joint constraints - for (JointConstraintSharedData* shared_constraintp = mJointMotionList->mConstraints.getFirstData(); - shared_constraintp; - shared_constraintp = mJointMotionList->mConstraints.getNextData()) - { - JointConstraint* constraintp = new JointConstraint(shared_constraintp); - initializeConstraint(constraintp); - mConstraints.addData(constraintp); - } + for (JointMotionList::constraint_list_t::iterator iter = mJointMotionList->mConstraints.begin(); + iter != mJointMotionList->mConstraints.end(); ++iter) + { + JointConstraintSharedData* shared_constraintp = *iter; + JointConstraint* constraintp = new JointConstraint(shared_constraintp); + initializeConstraint(constraintp); + mConstraints.push_front(constraintp); + } - if (mJointMotionList->mConstraints.getLength()) + if (mJointMotionList->mConstraints.size()) { mPelvisp = mCharacter->getJoint("mPelvis"); if (!mPelvisp) @@ -711,21 +723,21 @@ void LLKeyframeMotion::applyConstraints(F32 time, U8* joint_mask) if (mCharacter->getSkeletonSerialNum() != mLastSkeletonSerialNum) { mLastSkeletonSerialNum = mCharacter->getSkeletonSerialNum(); - for (JointConstraint* constraintp = mConstraints.getFirstData(); - constraintp; - constraintp = mConstraints.getNextData()) - { - initializeConstraint(constraintp); - } + for (constraint_list_t::iterator iter = mConstraints.begin(); + iter != mConstraints.end(); ++iter) + { + JointConstraint* constraintp = *iter; + initializeConstraint(constraintp); + } } // apply constraints - for (JointConstraint* constraintp = mConstraints.getFirstData(); - constraintp; - constraintp = mConstraints.getNextData()) - { - applyConstraint(constraintp, time, joint_mask); - } + for (constraint_list_t::iterator iter = mConstraints.begin(); + iter != mConstraints.end(); ++iter) + { + JointConstraint* constraintp = *iter; + applyConstraint(constraintp, time, joint_mask); + } } //----------------------------------------------------------------------------- @@ -733,12 +745,12 @@ void LLKeyframeMotion::applyConstraints(F32 time, U8* joint_mask) //----------------------------------------------------------------------------- void LLKeyframeMotion::onDeactivate() { - for (JointConstraint* constraintp = mConstraints.getFirstData(); - constraintp; - constraintp = mConstraints.getNextData()) - { - deactivateConstraint(constraintp); - } + for (constraint_list_t::iterator iter = mConstraints.begin(); + iter != mConstraints.end(); ++iter) + { + JointConstraint* constraintp = *iter; + deactivateConstraint(constraintp); + } } //----------------------------------------------------------------------------- @@ -1605,7 +1617,7 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) return FALSE; } - mJointMotionList->mConstraints.addData(constraintp); + mJointMotionList->mConstraints.push_front(constraintp); constraintp->mJointStateIndices = new S32[constraintp->mChainLength + 1]; @@ -1713,10 +1725,19 @@ BOOL LLKeyframeMotion::serialize(LLDataPacker& dp) const } } - success &= dp.packS32(mJointMotionList->mConstraints.getLength(), "num_constraints"); - for (JointConstraintSharedData* shared_constraintp = mJointMotionList->mConstraints.getFirstData(); - shared_constraintp; - shared_constraintp = mJointMotionList->mConstraints.getNextData()) + success &= dp.packS32(mJointMotionList->mConstraints.size(), "num_constraints"); + for (JointMotionList::constraint_list_t::iterator iter = mJointMotionList->mConstraints.begin(); + iter != mJointMotionList->mConstraints.end(); ++iter) + { + JointConstraintSharedData* shared_constraintp = *iter; + success &= dp.packU8(shared_constraintp->mChainLength, "chain_length"); + success &= dp.packU8(shared_constraintp->mConstraintType, "constraint_type"); + char volume_name[16]; /* Flawfinder: ignore */ + snprintf(volume_name, sizeof(volume_name), "%s", /* Flawfinder: ignore */ + mCharacter->findCollisionVolume(shared_constraintp->mSourceConstraintVolume)->getName().c_str()); + success &= dp.packBinaryDataFixed((U8*)volume_name, 16, "source_volume"); + success &= dp.packVector3(shared_constraintp->mSourceConstraintOffset, "source_offset"); + if (shared_constraintp->mConstraintTargetType == TYPE_GROUND) { success &= dp.packU8(shared_constraintp->mChainLength, "chain_length"); success &= dp.packU8(shared_constraintp->mConstraintType, "constraint_type"); @@ -1731,7 +1752,7 @@ BOOL LLKeyframeMotion::serialize(LLDataPacker& dp) const } else { - snprintf(volume_name, sizeof(volume_name),"%s", /* Flawfinder: ignore */ + snprintf(volume_name, sizeof(volume_name),"%s", /* Flawfinder: ignore */ mCharacter->findCollisionVolume(shared_constraintp->mTargetConstraintVolume)->getName().c_str()); } success &= dp.packBinaryDataFixed((U8*)volume_name, 16, "target_volume"); @@ -1742,6 +1763,19 @@ BOOL LLKeyframeMotion::serialize(LLDataPacker& dp) const success &= dp.packF32(shared_constraintp->mEaseOutStartTime, "ease_out_start"); success &= dp.packF32(shared_constraintp->mEaseOutStopTime, "ease_out_stop"); } + else + { + snprintf(volume_name, sizeof(volume_name),"%s", /* Flawfinder: ignore */ + mCharacter->findCollisionVolume(shared_constraintp->mTargetConstraintVolume)->getName().c_str()); + } + success &= dp.packBinaryDataFixed((U8*)volume_name, 16, "target_volume"); + success &= dp.packVector3(shared_constraintp->mTargetConstraintOffset, "target_offset"); + success &= dp.packVector3(shared_constraintp->mTargetConstraintDir, "target_dir"); + success &= dp.packF32(shared_constraintp->mEaseInStartTime, "ease_in_start"); + success &= dp.packF32(shared_constraintp->mEaseInStopTime, "ease_in_stop"); + success &= dp.packF32(shared_constraintp->mEaseOutStartTime, "ease_out_start"); + success &= dp.packF32(shared_constraintp->mEaseOutStopTime, "ease_out_stop"); + } return success; } @@ -1832,7 +1866,8 @@ void LLKeyframeMotion::setEaseOut(F32 ease_in) //----------------------------------------------------------------------------- void LLKeyframeMotion::flushKeyframeCache() { - LLKeyframeDataCache::clear(); + // TODO: Make this safe to do +// LLKeyframeDataCache::clear(); } //----------------------------------------------------------------------------- @@ -2041,8 +2076,8 @@ void LLKeyframeDataCache::dumpDiagInfo() llinfos << "-----------------------------------------------------" << llendl; // print each loaded mesh, and it's memory usage - LLKeyframeDataMap::iterator map_it; - for (map_it = sKeyframeDataMap.begin(); map_it != sKeyframeDataMap.end(); ++map_it) + for (keyframe_data_map_t::iterator map_it = sKeyframeDataMap.begin(); + map_it != sKeyframeDataMap.end(); ++map_it) { U32 joint_motion_kb; @@ -2076,12 +2111,12 @@ void LLKeyframeDataCache::addKeyframeData(const LLUUID& id, LLKeyframeMotion::Jo //-------------------------------------------------------------------- void LLKeyframeDataCache::removeKeyframeData(const LLUUID& id) { - LLKeyframeMotion::JointMotionList* joint_motion_listp = getKeyframeData(id); - if (joint_motion_listp) + keyframe_data_map_t::iterator found_data = sKeyframeDataMap.find(id); + if (found_data != sKeyframeDataMap.end()) { - delete joint_motion_listp; + delete found_data->second; + sKeyframeDataMap.erase(found_data); } - sKeyframeDataMap.erase(id); } //-------------------------------------------------------------------- @@ -2089,7 +2124,7 @@ void LLKeyframeDataCache::removeKeyframeData(const LLUUID& id) //-------------------------------------------------------------------- LLKeyframeMotion::JointMotionList* LLKeyframeDataCache::getKeyframeData(const LLUUID& id) { - LLKeyframeDataMap::iterator found_data = sKeyframeDataMap.find(id); + keyframe_data_map_t::iterator found_data = sKeyframeDataMap.find(id); if (found_data == sKeyframeDataMap.end()) { return NULL; diff --git a/linden/indra/llcharacter/llkeyframemotion.h b/linden/indra/llcharacter/llkeyframemotion.h index c33df80..1e5cd62 100644 --- a/linden/indra/llcharacter/llkeyframemotion.h +++ b/linden/indra/llcharacter/llkeyframemotion.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -35,7 +36,6 @@ #include #include "llassetstorage.h" -#include "llassoclist.h" #include "llbboxlocal.h" #include "llhandmotion.h" #include "lljointstate.h" @@ -405,11 +405,12 @@ public: LLJoint::JointPriority mBasePriority; LLHandMotion::eHandPose mHandPose; LLJoint::JointPriority mMaxPriority; - LLLinkedList mConstraints; + typedef std::list constraint_list_t; + constraint_list_t mConstraints; LLBBoxLocal mPelvisBBox; public: - JointMotionList() : mNumJointMotions(0), mJointMotionArray(NULL) {}; - ~JointMotionList() { mConstraints.deleteAllData(); delete [] mJointMotionArray; } + JointMotionList(); + ~JointMotionList(); U32 dumpDiagInfo(); }; @@ -425,7 +426,8 @@ protected: LLJoint* mPelvisp; LLCharacter* mCharacter; std::string mEmoteName; - LLLinkedList mConstraints; + typedef std::list constraint_list_t; + constraint_list_t mConstraints; U32 mLastSkeletonSerialNum; F32 mLastUpdateTime; F32 mLastLoopedTime; @@ -439,8 +441,8 @@ public: LLKeyframeDataCache(){}; ~LLKeyframeDataCache(); - typedef std::map LLKeyframeDataMap; - static LLKeyframeDataMap sKeyframeDataMap; + typedef std::map keyframe_data_map_t; + static keyframe_data_map_t sKeyframeDataMap; static void addKeyframeData(const LLUUID& id, LLKeyframeMotion::JointMotionList*); static LLKeyframeMotion::JointMotionList* getKeyframeData(const LLUUID& id); diff --git a/linden/indra/llcharacter/llkeyframemotionparam.cpp b/linden/indra/llcharacter/llkeyframemotionparam.cpp index 93df410..5970909 100644 --- a/linden/indra/llcharacter/llkeyframemotionparam.cpp +++ b/linden/indra/llcharacter/llkeyframemotionparam.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -348,7 +349,7 @@ BOOL LLKeyframeMotionParam::loadMotions() // Load data into a buffer to be parsed. //------------------------------------------------------------------------- char path[LL_MAX_PATH]; /* Flawfinder: ignore */ - snprintf( path,sizeof(path), "%s_%s.llp", /* Flawfinder: ignore */ + snprintf( path,sizeof(path), "%s_%s.llp", gDirUtilp->getExpandedFilename(LL_PATH_MOTIONS,mCharacter->getAnimationPrefix()).c_str(), getName().c_str() ); diff --git a/linden/indra/llcharacter/llkeyframemotionparam.h b/linden/indra/llcharacter/llkeyframemotionparam.h index 33dd094..e0885c1 100644 --- a/linden/indra/llcharacter/llkeyframemotionparam.h +++ b/linden/indra/llcharacter/llkeyframemotionparam.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llkeyframestandmotion.cpp b/linden/indra/llcharacter/llkeyframestandmotion.cpp index 4fcb76c..9b423c5 100644 --- a/linden/indra/llcharacter/llkeyframestandmotion.cpp +++ b/linden/indra/llcharacter/llkeyframestandmotion.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llkeyframestandmotion.h b/linden/indra/llcharacter/llkeyframestandmotion.h index f569498..e7c54c5 100644 --- a/linden/indra/llcharacter/llkeyframestandmotion.h +++ b/linden/indra/llcharacter/llkeyframestandmotion.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llkeyframewalkmotion.cpp b/linden/indra/llcharacter/llkeyframewalkmotion.cpp index b1838d8..bf347a6 100644 --- a/linden/indra/llcharacter/llkeyframewalkmotion.cpp +++ b/linden/indra/llcharacter/llkeyframewalkmotion.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llkeyframewalkmotion.h b/linden/indra/llcharacter/llkeyframewalkmotion.h index 3367b64..d2c9cd8 100644 --- a/linden/indra/llcharacter/llkeyframewalkmotion.h +++ b/linden/indra/llcharacter/llkeyframewalkmotion.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llmotion.cpp b/linden/indra/llcharacter/llmotion.cpp index d2343ab..b13ea60 100644 --- a/linden/indra/llcharacter/llmotion.cpp +++ b/linden/indra/llcharacter/llmotion.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llmotion.h b/linden/indra/llcharacter/llmotion.h index 2e302cf..48d402a 100644 --- a/linden/indra/llcharacter/llmotion.h +++ b/linden/indra/llcharacter/llmotion.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llmotioncontroller.cpp b/linden/indra/llcharacter/llmotioncontroller.cpp index 3e1456b..5545841 100644 --- a/linden/indra/llcharacter/llmotioncontroller.cpp +++ b/linden/indra/llcharacter/llmotioncontroller.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -180,9 +181,9 @@ LLMotionController::~LLMotionController() //----------------------------------------------------------------------------- void LLMotionController::deleteAllMotions() { - mLoadingMotions.removeAllNodes(); + mLoadingMotions.clear(); mLoadedMotions.clear(); - mActiveMotions.removeAllNodes(); + mActiveMotions.clear(); for_each(mAllMotions.begin(), mAllMotions.end(), DeletePairedPointer()); mAllMotions.clear(); @@ -234,16 +235,16 @@ void LLMotionController::setTimeStep(F32 step) if (step != 0.f) { // make sure timestamps conform to new quantum - for( LLMotion* motionp = mActiveMotions.getFirstData(); - motionp != NULL; - motionp = mActiveMotions.getNextData() ) - { - motionp->mActivationTimestamp = (F32)llfloor(motionp->mActivationTimestamp / step) * step; - BOOL stopped = motionp->isStopped(); - motionp->setStopTime((F32)llfloor(motionp->getStopTime() / step) * step); - motionp->setStopped(stopped); - motionp->mSendStopTimestamp = (F32)llfloor(motionp->mSendStopTimestamp / step) * step; - } + for (motion_list_t::iterator iter = mActiveMotions.begin(); + iter != mActiveMotions.end(); ++iter) + { + LLMotion* motionp = *iter; + motionp->mActivationTimestamp = (F32)llfloor(motionp->mActivationTimestamp / step) * step; + BOOL stopped = motionp->isStopped(); + motionp->setStopTime((F32)llfloor(motionp->getStopTime() / step) * step); + motionp->setStopped(stopped); + motionp->mSendStopTimestamp = (F32)llfloor(motionp->mSendStopTimestamp / step) * step; + } } } @@ -257,23 +258,6 @@ void LLMotionController::setTimeFactor(F32 time_factor) } //----------------------------------------------------------------------------- -// getFirstActiveMotion() -//----------------------------------------------------------------------------- -LLMotion* LLMotionController::getFirstActiveMotion() -{ - return mActiveMotions.getFirstData(); -} - -//----------------------------------------------------------------------------- -// getNextActiveMotion() -//----------------------------------------------------------------------------- -LLMotion* LLMotionController::getNextActiveMotion() -{ - return mActiveMotions.getNextData(); -} - - -//----------------------------------------------------------------------------- // setCharacter() //----------------------------------------------------------------------------- void LLMotionController::setCharacter(LLCharacter *character) @@ -300,17 +284,9 @@ void LLMotionController::removeMotion( const LLUUID& id) { stopMotionLocally(id, TRUE); - mLoadingMotions.deleteData(motionp); - std::deque::iterator motion_it; - for (motion_it = mLoadedMotions.begin(); motion_it != mLoadedMotions.end(); ++motion_it) - { - if(*motion_it == motionp) - { - mLoadedMotions.erase(motion_it); - break; - } - } - mActiveMotions.deleteData(motionp); + mLoadingMotions.erase(motionp); + mLoadedMotions.remove(motionp); + mActiveMotions.remove(motionp); mAllMotions.erase(id); delete motionp; } @@ -351,7 +327,7 @@ LLMotion* LLMotionController::createMotion( const LLUUID &id ) delete motion; return NULL; case LLMotion::STATUS_HOLD: - mLoadingMotions.addData(motion); + mLoadingMotions.insert(motion); break; case LLMotion::STATUS_SUCCESS: // add motion to our list @@ -470,10 +446,11 @@ void LLMotionController::updateMotionsByType(LLMotion::LLMotionBlendType anim_ty memset(&last_joint_signature, 0, sizeof(U8) * LL_CHARACTER_MAX_JOINTS); // iterate through active motions in chronological order - for(LLMotion* motionp = mActiveMotions.getFirstData(); - motionp != NULL; - motionp = mActiveMotions.getNextData()) + for (motion_list_t::iterator iter = mActiveMotions.begin(); + iter != mActiveMotions.end(); ) { + motion_list_t::iterator curiter = iter++; + LLMotion* motionp = *curiter; if (motionp->getBlendType() != anim_type) { continue; @@ -487,9 +464,8 @@ void LLMotionController::updateMotionsByType(LLMotion::LLMotionBlendType anim_ty } else { - S32 i; // NUM_JOINT_SIGNATURE_STRIDES should be multiple of 4 - for (i = 0; i < NUM_JOINT_SIGNATURE_STRIDES; i++) + for (S32 i = 0; i < NUM_JOINT_SIGNATURE_STRIDES; i++) { U32 *current_signature = (U32*)&(mJointSignature[0][i * 4]); U32 test_signature = *(U32*)&(motionp->mJointSignature[0][i * 4]); @@ -745,16 +721,15 @@ void LLMotionController::updateMotion() } // query pending motions for completion - LLMotion* motionp; - - for ( motionp = mLoadingMotions.getFirstData(); - motionp != NULL; - motionp = mLoadingMotions.getNextData() ) + for (motion_set_t::iterator iter = mLoadingMotions.begin(); + iter != mLoadingMotions.end(); ) { + motion_set_t::iterator curiter = iter++; + LLMotion* motionp = *curiter; LLMotion::LLMotionInitStatus status = motionp->onInitialize(mCharacter); if (status == LLMotion::STATUS_SUCCESS) { - mLoadingMotions.removeCurrentData(); + mLoadingMotions.erase(curiter); // add motion to our loaded motion list addLoadedMotion(motionp); // this motion should be playing @@ -767,7 +742,7 @@ void LLMotionController::updateMotion() { llinfos << "Motion " << motionp->getID() << " init failed." << llendl; sRegistry.markBad(motionp->getID()); - mLoadingMotions.removeCurrentData(); + mLoadingMotions.erase(curiter); mAllMotions.erase(motionp->getID()); delete motionp; } @@ -804,7 +779,7 @@ void LLMotionController::updateMotion() //----------------------------------------------------------------------------- BOOL LLMotionController::activateMotion(LLMotion *motion, F32 time) { - if (mLoadingMotions.checkData(motion)) + if (mLoadingMotions.find(motion) != mLoadingMotions.end()) { // we want to start this motion, but we can't yet, so flag it as started motion->setStopped(FALSE); @@ -835,7 +810,8 @@ BOOL LLMotionController::activateMotion(LLMotion *motion, F32 time) motion->mSendStopTimestamp = F32_MAX; } - mActiveMotions.addData(motion); + mActiveMotions.remove(motion); // in case it is already in the active list + mActiveMotions.push_front(motion); motion->activate(); motion->onUpdate(0.f, mJointSignature[1]); @@ -849,7 +825,7 @@ BOOL LLMotionController::activateMotion(LLMotion *motion, F32 time) BOOL LLMotionController::deactivateMotion(LLMotion *motion) { motion->deactivate(); - mActiveMotions.removeData(motion); + mActiveMotions.remove(motion); return TRUE; } @@ -857,22 +833,17 @@ BOOL LLMotionController::deactivateMotion(LLMotion *motion) //----------------------------------------------------------------------------- // isMotionActive() //----------------------------------------------------------------------------- -BOOL LLMotionController::isMotionActive(LLMotion *motion) +bool LLMotionController::isMotionActive(LLMotion *motion) { - if (motion && motion->isActive()) - { - return TRUE; - } - - return FALSE; + return (motion && motion->isActive()); } //----------------------------------------------------------------------------- // isMotionLoading() //----------------------------------------------------------------------------- -BOOL LLMotionController::isMotionLoading(LLMotion* motion) +bool LLMotionController::isMotionLoading(LLMotion* motion) { - return mLoadingMotions.checkData(motion); + return (mLoadingMotions.find(motion) != mLoadingMotions.end()); } @@ -890,15 +861,15 @@ LLMotion *LLMotionController::findMotion(const LLUUID& id) //----------------------------------------------------------------------------- void LLMotionController::flushAllMotions() { - LLDynamicArray active_motions; - LLDynamicArray active_motion_times; - - for (LLMotion* motionp = mActiveMotions.getFirstData(); - motionp; - motionp = mActiveMotions.getNextData()) + std::vector > active_motions; + active_motions.reserve(mActiveMotions.size()); + for (motion_list_t::iterator iter = mActiveMotions.begin(); + iter != mActiveMotions.end(); ) { - active_motions.put(motionp->getID()); - active_motion_times.put(mTime - motionp->mActivationTimestamp); + motion_list_t::iterator curiter = iter++; + LLMotion* motionp = *curiter; + F32 dtime = mTime - motionp->mActivationTimestamp; + active_motions.push_back(std::make_pair(motionp->getID(),dtime)); motionp->deactivate(); } @@ -910,9 +881,10 @@ void LLMotionController::flushAllMotions() mCharacter->removeAnimationData("Hand Pose"); // restart motions - for (S32 i = 0; i < active_motions.count(); i++) + for (std::vector >::iterator iter = active_motions.begin(); + iter != active_motions.end(); ++iter) { - startMotion(active_motions[i], active_motion_times[i]); + startMotion(iter->first, iter->second); } } diff --git a/linden/indra/llcharacter/llmotioncontroller.h b/linden/indra/llcharacter/llmotioncontroller.h index c9ee7c4..e4c7b3f 100644 --- a/linden/indra/llcharacter/llmotioncontroller.h +++ b/linden/indra/llcharacter/llmotioncontroller.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -35,7 +36,6 @@ #include #include -#include "linked_lists.h" #include "lluuidhashmap.h" #include "llmotion.h" #include "llpose.h" @@ -109,6 +109,10 @@ protected: class LLMotionController { public: + typedef std::list motion_list_t; + typedef std::set motion_set_t; + +public: // Constructor LLMotionController(); @@ -164,12 +168,11 @@ public: void setTimeFactor(F32 time_factor); F32 getTimeFactor() { return mTimeFactor; } - LLMotion* getFirstActiveMotion(); - LLMotion* getNextActiveMotion(); + motion_list_t& getActiveMotions() { return mActiveMotions; } //protected: - BOOL isMotionActive( LLMotion *motion ); - BOOL isMotionLoading( LLMotion *motion ); + bool isMotionActive( LLMotion *motion ); + bool isMotionLoading( LLMotion *motion ); LLMotion *findMotion( const LLUUID& id ); protected: @@ -199,9 +202,9 @@ protected: std::map mAllMotions; - LLLinkedList mLoadingMotions; - std::deque mLoadedMotions; - LLLinkedList mActiveMotions; + motion_set_t mLoadingMotions; + motion_list_t mLoadedMotions; + motion_list_t mActiveMotions; LLFrameTimer mTimer; F32 mTime; diff --git a/linden/indra/llcharacter/llmultigesture.cpp b/linden/indra/llcharacter/llmultigesture.cpp index 80cbacb..0a4d99a 100644 --- a/linden/indra/llcharacter/llmultigesture.cpp +++ b/linden/indra/llcharacter/llmultigesture.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -469,7 +470,7 @@ std::string LLGestureStepWait::getLabel() const if (mFlags & WAIT_FLAG_TIME) { char buffer[64]; /* Flawfinder: ignore */ - snprintf(buffer, sizeof(buffer), "%.1f seconds", (double)mWaitSeconds); /* Flawfinder: ignore */ + snprintf(buffer, sizeof(buffer), "%.1f seconds", (double)mWaitSeconds); /* Flawfinder: ignore */ label += buffer; } else if (mFlags & WAIT_FLAG_ALL_ANIM) diff --git a/linden/indra/llcharacter/llmultigesture.h b/linden/indra/llcharacter/llmultigesture.h index aeb7c04..75e5db8 100644 --- a/linden/indra/llcharacter/llmultigesture.h +++ b/linden/indra/llcharacter/llmultigesture.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llpose.cpp b/linden/indra/llcharacter/llpose.cpp index ebf6a67..ccedc1e 100644 --- a/linden/indra/llcharacter/llpose.cpp +++ b/linden/indra/llcharacter/llpose.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -34,6 +35,7 @@ #include "llmotion.h" #include "llmath.h" +#include "llstl.h" //----------------------------------------------------------------------------- // Static @@ -457,7 +459,7 @@ LLPoseBlender::LLPoseBlender() LLPoseBlender::~LLPoseBlender() { - mJointStateBlenderPool.deleteAllData(); + for_each(mJointStateBlenderPool.begin(), mJointStateBlenderPool.end(), DeletePairedPointer()); } //----------------------------------------------------------------------------- @@ -471,15 +473,16 @@ BOOL LLPoseBlender::addMotion(LLMotion* motion) { LLJoint *jointp = jsp->getJoint(); LLJointStateBlender* joint_blender; - if (!mJointStateBlenderPool.checkData(jointp)) + if (mJointStateBlenderPool.find(jointp) == mJointStateBlenderPool.end()) { // this is the first time we are animating this joint // so create new jointblender and add it to our pool joint_blender = new LLJointStateBlender(); - mJointStateBlenderPool.addData(jointp, joint_blender); - } else + mJointStateBlenderPool[jointp] = joint_blender; + } + else { - joint_blender = mJointStateBlenderPool.getData(jointp); + joint_blender = mJointStateBlenderPool[jointp]; } if (jsp->getPriority() == LLJoint::USE_MOTION_PRIORITY) @@ -492,9 +495,9 @@ BOOL LLPoseBlender::addMotion(LLMotion* motion) } // add it to our list of active blenders - if(!mActiveBlenders.checkData(joint_blender)) + if (std::find(mActiveBlenders.begin(), mActiveBlenders.end(), joint_blender) == mActiveBlenders.end()) { - mActiveBlenders.addData(joint_blender); + mActiveBlenders.push_front(joint_blender); } } return TRUE; @@ -505,15 +508,15 @@ BOOL LLPoseBlender::addMotion(LLMotion* motion) //----------------------------------------------------------------------------- void LLPoseBlender::blendAndApply() { - for (LLJointStateBlender* jsbp = mActiveBlenders.getFirstData(); - jsbp; - jsbp = mActiveBlenders.getNextData()) + for (blender_list_t::iterator iter = mActiveBlenders.begin(); + iter != mActiveBlenders.end(); ++iter) { + LLJointStateBlender* jsbp = *iter; jsbp->blendJointStates(); } // we're done now so there are no more active blenders for this frame - mActiveBlenders.removeAllNodes(); + mActiveBlenders.clear(); } //----------------------------------------------------------------------------- @@ -521,10 +524,10 @@ void LLPoseBlender::blendAndApply() //----------------------------------------------------------------------------- void LLPoseBlender::blendAndCache(BOOL reset_cached_joints) { - for (LLJointStateBlender* jsbp = mActiveBlenders.getFirstData(); - jsbp; - jsbp = mActiveBlenders.getNextData()) + for (blender_list_t::iterator iter = mActiveBlenders.begin(); + iter != mActiveBlenders.end(); ++iter) { + LLJointStateBlender* jsbp = *iter; if (reset_cached_joints) { jsbp->resetCachedJoint(); @@ -538,10 +541,10 @@ void LLPoseBlender::blendAndCache(BOOL reset_cached_joints) //----------------------------------------------------------------------------- void LLPoseBlender::interpolate(F32 u) { - for (LLJointStateBlender* jsbp = mActiveBlenders.getFirstData(); - jsbp; - jsbp = mActiveBlenders.getNextData()) + for (blender_list_t::iterator iter = mActiveBlenders.begin(); + iter != mActiveBlenders.end(); ++iter) { + LLJointStateBlender* jsbp = *iter; jsbp->interpolate(u); } } @@ -551,13 +554,13 @@ void LLPoseBlender::interpolate(F32 u) //----------------------------------------------------------------------------- void LLPoseBlender::clearBlenders() { - for (LLJointStateBlender* jsbp = mActiveBlenders.getFirstData(); - jsbp; - jsbp = mActiveBlenders.getNextData()) + for (blender_list_t::iterator iter = mActiveBlenders.begin(); + iter != mActiveBlenders.end(); ++iter) { + LLJointStateBlender* jsbp = *iter; jsbp->clear(); } - mActiveBlenders.removeAllNodes(); + mActiveBlenders.clear(); } diff --git a/linden/indra/llcharacter/llpose.h b/linden/indra/llcharacter/llpose.h index 12d1640..f57f7de 100644 --- a/linden/indra/llcharacter/llpose.h +++ b/linden/indra/llcharacter/llpose.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -106,8 +107,10 @@ class LLMotion; class LLPoseBlender { protected: - LLMap mJointStateBlenderPool; - LLLinkedList mActiveBlenders; + typedef std::list blender_list_t; + typedef std::map blender_map_t; + blender_map_t mJointStateBlenderPool; + blender_list_t mActiveBlenders; S32 mNextPoseSlot; LLPose mBlendedPose; diff --git a/linden/indra/llcharacter/llstatemachine.cpp b/linden/indra/llcharacter/llstatemachine.cpp index 6920bcf..1ad81be 100644 --- a/linden/indra/llcharacter/llstatemachine.cpp +++ b/linden/indra/llcharacter/llstatemachine.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llstatemachine.h b/linden/indra/llcharacter/llstatemachine.h index 0f986bd..091662e 100644 --- a/linden/indra/llcharacter/llstatemachine.h +++ b/linden/indra/llcharacter/llstatemachine.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/lltargetingmotion.cpp b/linden/indra/llcharacter/lltargetingmotion.cpp index 799e4d0..9e8b8df 100644 --- a/linden/indra/llcharacter/lltargetingmotion.cpp +++ b/linden/indra/llcharacter/lltargetingmotion.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/lltargetingmotion.h b/linden/indra/llcharacter/lltargetingmotion.h index 9fd8391..a6a6b03 100644 --- a/linden/indra/llcharacter/lltargetingmotion.h +++ b/linden/indra/llcharacter/lltargetingmotion.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llvisualparam.cpp b/linden/indra/llcharacter/llvisualparam.cpp index ed8a034..de163eb 100644 --- a/linden/indra/llcharacter/llvisualparam.cpp +++ b/linden/indra/llcharacter/llvisualparam.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcharacter/llvisualparam.h b/linden/indra/llcharacter/llvisualparam.h index 74774b8..ec19fa0 100644 --- a/linden/indra/llcharacter/llvisualparam.h +++ b/linden/indra/llcharacter/llvisualparam.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/bitpack.cpp b/linden/indra/llcommon/bitpack.cpp deleted file mode 100644 index 813e09c..0000000 --- a/linden/indra/llcommon/bitpack.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/** - * @file bitpack.cpp - * @brief Convert data to packed bit stream - * - * Copyright (c) 2000-2007, Linden Research, Inc. - * - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlife.com/developers/opensource/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at http://secondlife.com/developers/opensource/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include "linden_common.h" - -#include "bitpack.h" - -#if 0 -#include -#include -#include "stdtypes.h" - -U8 gLoad, gUnLoad; -U32 gLoadSize, gUnLoadSize, gTotalBits; - -const U32 gMaxDataBits = 8; - -///////////////////////////////////////////////////////////////////////////////////////// -#if 0 -void bit_pack(U8 *outbase, U32 *outptr, U8 *total_data, U32 total_dsize) -{ - U32 max_data_bits = gMaxDataBits; - U32 load_size = gLoadSize, total_bits = gTotalBits; - U32 dsize; - - U8 data; - U8 load = gLoad; - - while (total_dsize > 0) - { - if (total_dsize > max_data_bits) - { - dsize = max_data_bits; - total_dsize -= max_data_bits; - } - else - { - dsize = total_dsize; - total_dsize = 0; - } - - data = *total_data++; - - data <<= (max_data_bits - dsize); - while (dsize > 0) - { - if (load_size == max_data_bits) - { - *(outbase + (*outptr)++) = load; - load_size = 0; - load = 0x00; - } - load <<= 1; - load |= (data >> (max_data_bits - 1)); - data <<= 1; - load_size++; - total_bits++; - dsize--; - } - } - - gLoad = load; - gLoadSize = load_size; - gTotalBits = total_bits; -} -#endif - -///////////////////////////////////////////////////////////////////////////////////////// - -void bit_pack_reset() -{ - gLoad = 0x0; - gLoadSize = 0; - gTotalBits = 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -void bit_pack_flush(U8 *outbase, U32 *outptr) -{ - if (gLoadSize) - { - gTotalBits += gLoadSize; - gLoad <<= (gMaxDataBits - gLoadSize); - outbase[(*outptr)++] = gLoad; - gLoadSize = 0; - } -} - -//////////////////////////////////////////////////////////////////////////////////////// -#if 0 -void bit_unpack(U8 *total_retval, U32 total_dsize, U8 *indata, U32 *inptr) -{ - U32 max_data_bits = gMaxDataBits; - U32 unload_size = gUnLoadSize; - U32 dsize; - U8 *retval; - U8 unload = gUnLoad; - - while (total_dsize > 0) - { - if (total_dsize > max_data_bits) - { - dsize = max_data_bits; - total_dsize -= max_data_bits; - } - else - { - dsize = total_dsize; - total_dsize = 0; - } - - retval = total_data++; - *retval = 0x00; - while (dsize > 0) - { - if (unload_size == 0) - { - unload = indata[(*inptr)++]; - unload_size = max_data_bits; - } - *retval <<= 1; - *retval |= (unload >> (max_data_bits - 1)); - unload_size--; - unload <<= 1; - dsize--; - } - } - - gUnLoad = unload; - gUnLoadSize = unload_size; -} -#endif - - -/////////////////////////////////////////////////////////////////////////////////////// - -void bit_unpack_reset() -{ - gUnLoad = 0; - gUnLoadSize = 0; -} -#endif diff --git a/linden/indra/llcommon/bitpack.h b/linden/indra/llcommon/bitpack.h index 9a32a07..89af101 100644 --- a/linden/indra/llcommon/bitpack.h +++ b/linden/indra/llcommon/bitpack.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/ctype_workaround.h b/linden/indra/llcommon/ctype_workaround.h index 08c44b1..20dd6c6 100644 --- a/linden/indra/llcommon/ctype_workaround.h +++ b/linden/indra/llcommon/ctype_workaround.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/doublelinkedlist.h b/linden/indra/llcommon/doublelinkedlist.h index 833e73c..81891b3 100644 --- a/linden/indra/llcommon/doublelinkedlist.h +++ b/linden/indra/llcommon/doublelinkedlist.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/files.lst b/linden/indra/llcommon/files.lst index 5fcb8c7..6a48752 100644 --- a/linden/indra/llcommon/files.lst +++ b/linden/indra/llcommon/files.lst @@ -1,4 +1,3 @@ -llcommon/bitpack.cpp llcommon/llapp.cpp llcommon/llapr.cpp llcommon/llassettype.cpp diff --git a/linden/indra/llcommon/imageids.h b/linden/indra/llcommon/imageids.h index d65b374..5c6ff08 100644 --- a/linden/indra/llcommon/imageids.h +++ b/linden/indra/llcommon/imageids.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/indra_constants.h b/linden/indra/llcommon/indra_constants.h index deb9c9d..9024b12 100644 --- a/linden/indra/llcommon/indra_constants.h +++ b/linden/indra/llcommon/indra_constants.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -31,10 +32,6 @@ #include "stdtypes.h" #include "lluuid.h" -// Viewer object cache version, change if object update -// format changes. JC -const U32 INDRA_OBJECT_CACHE_VERSION = 11; - // At 45 Hz collisions seem stable and objects seem // to settle down at a reasonable rate. // JC 3/18/2003 @@ -116,11 +113,11 @@ const U32 DEFAULT_USER_SERVER_PORT = 12036; const U32 DEFAULT_RPC_SERVER_PORT = 12037; const U32 DEFAULT_LOG_DATA_SERVER_PORT = 12039; const U32 DEFAULT_BACKBONE_PORT = 12040; -const U32 DEFAULT_CGI_SERVICES_PORT = 12045; const U32 DEFAULT_LOCAL_ASSET_PORT = 12041; //const U32 DEFAULT_BACKBONE_CAP_PORT = 12042; // Deprecated const U32 DEFAULT_CAP_PROXY_PORT = 12043; const U32 DEFAULT_INV_DATA_SERVER_PORT = 12044; +const U32 DEFAULT_CGI_SERVICES_PORT = 12045; // For automatic port discovery when running multiple viewers on one host const U32 PORT_DISCOVERY_RANGE_MIN = 13000; diff --git a/linden/indra/llcommon/linden_common.h b/linden/indra/llcommon/linden_common.h index b1c5f3b..5a6018a 100644 --- a/linden/indra/llcommon/linden_common.h +++ b/linden/indra/llcommon/linden_common.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/linked_lists.h b/linden/indra/llcommon/linked_lists.h index 4a1b163..ab4a622 100644 --- a/linden/indra/llcommon/linked_lists.h +++ b/linden/indra/llcommon/linked_lists.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llagentconstants.h b/linden/indra/llcommon/llagentconstants.h index fe51688..0e0fdb0 100644 --- a/linden/indra/llcommon/llagentconstants.h +++ b/linden/indra/llcommon/llagentconstants.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llapp.cpp b/linden/indra/llcommon/llapp.cpp index f48ff8f..5edcb3c 100644 --- a/linden/indra/llcommon/llapp.cpp +++ b/linden/indra/llcommon/llapp.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llapp.h b/linden/indra/llcommon/llapp.h index aef5cde..599bd48 100644 --- a/linden/indra/llcommon/llapp.h +++ b/linden/indra/llcommon/llapp.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llapr.cpp b/linden/indra/llcommon/llapr.cpp index 550a8d8..ee63497 100644 --- a/linden/indra/llcommon/llapr.cpp +++ b/linden/indra/llcommon/llapr.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llapr.h b/linden/indra/llcommon/llapr.h index be6fc6c..a36b177 100644 --- a/linden/indra/llcommon/llapr.h +++ b/linden/indra/llcommon/llapr.h @@ -6,6 +6,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llassettype.cpp b/linden/indra/llcommon/llassettype.cpp index df00af8..0bbef8c 100644 --- a/linden/indra/llcommon/llassettype.cpp +++ b/linden/indra/llcommon/llassettype.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llassettype.h b/linden/indra/llcommon/llassettype.h index da4cf0b..5fe6b16 100644 --- a/linden/indra/llcommon/llassettype.h +++ b/linden/indra/llcommon/llassettype.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llassoclist.h b/linden/indra/llcommon/llassoclist.h index d1d3eb8..417e347 100644 --- a/linden/indra/llcommon/llassoclist.h +++ b/linden/indra/llcommon/llassoclist.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llavatarconstants.h b/linden/indra/llcommon/llavatarconstants.h index 1eb5b05..3eedf4e 100644 --- a/linden/indra/llcommon/llavatarconstants.h +++ b/linden/indra/llcommon/llavatarconstants.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llbase32.h b/linden/indra/llcommon/llbase32.h index eaf3efc..198c5c6 100644 --- a/linden/indra/llcommon/llbase32.h +++ b/linden/indra/llcommon/llbase32.h @@ -1,10 +1,11 @@ -/** - * @file llbase32.h - * @brief base32 encoding that returns a std::string - * @author James Cook - * - * Copyright (c) 2007-2007, Linden Research, Inc. +/** + * @file llbase32.h + * @brief base32 encoding that returns a std::string + * @author James Cook + * + * Copyright (c) 2007-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -23,16 +24,16 @@ * * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef LLBASE32_H -#define LLBASE32_h - -class LLBase32 -{ -public: - static std::string encode(const U8* input, size_t input_size); -}; - -#endif + * COMPLETENESS OR PERFORMANCE. + */ + +#ifndef LLBASE32_H +#define LLBASE32_h + +class LLBase32 +{ +public: + static std::string encode(const U8* input, size_t input_size); +}; + +#endif diff --git a/linden/indra/llcommon/llbase64.cpp b/linden/indra/llcommon/llbase64.cpp index 0869d3f..18aefea 100644 --- a/linden/indra/llcommon/llbase64.cpp +++ b/linden/indra/llcommon/llbase64.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2007-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llbase64.h b/linden/indra/llcommon/llbase64.h index d8b4acc..995ac04 100644 --- a/linden/indra/llcommon/llbase64.h +++ b/linden/indra/llcommon/llbase64.h @@ -5,6 +5,7 @@ * * Copyright (c) 2007-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llboost.h b/linden/indra/llcommon/llboost.h index e572f6e..45d5eb2 100644 --- a/linden/indra/llcommon/llboost.h +++ b/linden/indra/llcommon/llboost.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llchat.h b/linden/indra/llcommon/llchat.h index aee9008..b1635a7 100644 --- a/linden/indra/llcommon/llchat.h +++ b/linden/indra/llcommon/llchat.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llclickaction.h b/linden/indra/llcommon/llclickaction.h index 03b8b85..e45ad90 100644 --- a/linden/indra/llcommon/llclickaction.h +++ b/linden/indra/llcommon/llclickaction.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llcommon.cpp b/linden/indra/llcommon/llcommon.cpp index 49675e1..993da7d 100644 --- a/linden/indra/llcommon/llcommon.cpp +++ b/linden/indra/llcommon/llcommon.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llcommon.h b/linden/indra/llcommon/llcommon.h index 8b57579..443870e 100644 --- a/linden/indra/llcommon/llcommon.h +++ b/linden/indra/llcommon/llcommon.h @@ -3,6 +3,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llcommon.vcproj b/linden/indra/llcommon/llcommon.vcproj index 403b8c5..ca91e18 100644 --- a/linden/indra/llcommon/llcommon.vcproj +++ b/linden/indra/llcommon/llcommon.vcproj @@ -155,9 +155,6 @@ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/linden/indra/llcommon/llcriticaldamp.cpp b/linden/indra/llcommon/llcriticaldamp.cpp index 2f83192..f574550 100644 --- a/linden/indra/llcommon/llcriticaldamp.cpp +++ b/linden/indra/llcommon/llcriticaldamp.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llcriticaldamp.h b/linden/indra/llcommon/llcriticaldamp.h index 670aa9f..6a35e5e 100644 --- a/linden/indra/llcommon/llcriticaldamp.h +++ b/linden/indra/llcommon/llcriticaldamp.h @@ -5,6 +5,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/lldarray.h b/linden/indra/llcommon/lldarray.h index 24e8543..291da19 100644 --- a/linden/indra/llcommon/lldarray.h +++ b/linden/indra/llcommon/lldarray.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/lldarrayptr.h b/linden/indra/llcommon/lldarrayptr.h index 18e1e93..308101c 100644 --- a/linden/indra/llcommon/lldarrayptr.h +++ b/linden/indra/llcommon/lldarrayptr.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/lldate.cpp b/linden/indra/llcommon/lldate.cpp index 211d350..ccc314d 100644 --- a/linden/indra/llcommon/lldate.cpp +++ b/linden/indra/llcommon/lldate.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/lldate.h b/linden/indra/llcommon/lldate.h index 8fb6d67..f8bd625 100644 --- a/linden/indra/llcommon/lldate.h +++ b/linden/indra/llcommon/lldate.h @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/lldefs.h b/linden/indra/llcommon/lldefs.h index c0435fb..a3651ff 100644 --- a/linden/indra/llcommon/lldefs.h +++ b/linden/indra/llcommon/lldefs.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/lldepthstack.h b/linden/indra/llcommon/lldepthstack.h index 0011f30..f3ea709 100644 --- a/linden/indra/llcommon/lldepthstack.h +++ b/linden/indra/llcommon/lldepthstack.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/lldlinked.h b/linden/indra/llcommon/lldlinked.h index 488ef1e..0e39f69 100644 --- a/linden/indra/llcommon/lldlinked.h +++ b/linden/indra/llcommon/lldlinked.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/lldqueueptr.h b/linden/indra/llcommon/lldqueueptr.h index 4d8a5ca..aca73d9 100644 --- a/linden/indra/llcommon/lldqueueptr.h +++ b/linden/indra/llcommon/lldqueueptr.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llendianswizzle.h b/linden/indra/llcommon/llendianswizzle.h index 34a530c..d06af70 100644 --- a/linden/indra/llcommon/llendianswizzle.h +++ b/linden/indra/llcommon/llendianswizzle.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llenum.h b/linden/indra/llcommon/llenum.h index 1dde5f8..310ccd2 100644 --- a/linden/indra/llcommon/llenum.h +++ b/linden/indra/llcommon/llenum.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llerror.cpp b/linden/indra/llcommon/llerror.cpp index 57e098e..9bcb415 100644 --- a/linden/indra/llcommon/llerror.cpp +++ b/linden/indra/llcommon/llerror.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -514,7 +515,11 @@ namespace LLError { void initForServer(const std::string& identity) { - std::string dir = LLApp::instance()->getOption("configdir"); + std::string dir = "/opt/linden/etc"; + if (LLApp::instance()) + { + dir = LLApp::instance()->getOption("configdir").asString(); + } commonInit(dir); #if !LL_WINDOWS addRecorder(new RecordToSyslog(identity)); diff --git a/linden/indra/llcommon/llerror.h b/linden/indra/llcommon/llerror.h index 1285491..9c8d018 100644 --- a/linden/indra/llcommon/llerror.h +++ b/linden/indra/llcommon/llerror.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llerrorcontrol.h b/linden/indra/llcommon/llerrorcontrol.h index f2c8755..c09a180 100644 --- a/linden/indra/llcommon/llerrorcontrol.h +++ b/linden/indra/llcommon/llerrorcontrol.h @@ -5,6 +5,7 @@ * * Copyright (c) 2007-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llerrorlegacy.h b/linden/indra/llcommon/llerrorlegacy.h index 5438a21..1671d0f 100644 --- a/linden/indra/llcommon/llerrorlegacy.h +++ b/linden/indra/llcommon/llerrorlegacy.h @@ -5,6 +5,7 @@ * * Copyright (c) 2007-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llerrorthread.cpp b/linden/indra/llcommon/llerrorthread.cpp index b9bb605..5f7d448 100644 --- a/linden/indra/llcommon/llerrorthread.cpp +++ b/linden/indra/llcommon/llerrorthread.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llerrorthread.h b/linden/indra/llcommon/llerrorthread.h index b2eda32..61bcf4c 100644 --- a/linden/indra/llcommon/llerrorthread.h +++ b/linden/indra/llcommon/llerrorthread.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llevent.cpp b/linden/indra/llcommon/llevent.cpp index bbb37c5..a6c4ef0 100644 --- a/linden/indra/llcommon/llevent.cpp +++ b/linden/indra/llcommon/llevent.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llevent.h b/linden/indra/llcommon/llevent.h index bcb6ee9..18b0596 100644 --- a/linden/indra/llcommon/llevent.h +++ b/linden/indra/llcommon/llevent.h @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/lleventemitter.h b/linden/indra/llcommon/lleventemitter.h index ddaaca5..6390d34 100644 --- a/linden/indra/llcommon/lleventemitter.h +++ b/linden/indra/llcommon/lleventemitter.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llfasttimer.cpp b/linden/indra/llcommon/llfasttimer.cpp index 61b6df2..2b1d58f 100644 --- a/linden/indra/llcommon/llfasttimer.cpp +++ b/linden/indra/llcommon/llfasttimer.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llfasttimer.h b/linden/indra/llcommon/llfasttimer.h index 47634ac..4182500 100644 --- a/linden/indra/llcommon/llfasttimer.h +++ b/linden/indra/llcommon/llfasttimer.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llfile.cpp b/linden/indra/llcommon/llfile.cpp index feac28f..4520fd1 100644 --- a/linden/indra/llcommon/llfile.cpp +++ b/linden/indra/llcommon/llfile.cpp @@ -7,6 +7,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llfile.h b/linden/indra/llcommon/llfile.h index 5034cf7..9e1a98a 100644 --- a/linden/indra/llcommon/llfile.h +++ b/linden/indra/llcommon/llfile.h @@ -7,6 +7,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llfixedbuffer.cpp b/linden/indra/llcommon/llfixedbuffer.cpp index 795273b..397fcfd 100644 --- a/linden/indra/llcommon/llfixedbuffer.cpp +++ b/linden/indra/llcommon/llfixedbuffer.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llfixedbuffer.h b/linden/indra/llcommon/llfixedbuffer.h index 1501250..fbf2338 100644 --- a/linden/indra/llcommon/llfixedbuffer.h +++ b/linden/indra/llcommon/llfixedbuffer.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llformat.cpp b/linden/indra/llcommon/llformat.cpp index f088bc6..6a5b531 100644 --- a/linden/indra/llcommon/llformat.cpp +++ b/linden/indra/llcommon/llformat.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2007-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llformat.h b/linden/indra/llcommon/llformat.h index 135f9d2..b338591 100644 --- a/linden/indra/llcommon/llformat.h +++ b/linden/indra/llcommon/llformat.h @@ -5,6 +5,7 @@ * * Copyright (c) 2007-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llframetimer.cpp b/linden/indra/llcommon/llframetimer.cpp index d41f904..5ae4a6b 100644 --- a/linden/indra/llcommon/llframetimer.cpp +++ b/linden/indra/llcommon/llframetimer.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -52,6 +53,50 @@ void LLFrameTimer::updateFrameTime() sFrameCount++; } +void LLFrameTimer::start() +{ + reset(); + mStarted = TRUE; +} + +void LLFrameTimer::stop() +{ + mStarted = FALSE; +} + +void LLFrameTimer::reset() +{ + mStartTime = sFrameTime; + mExpiry = sFrameTime; +} + +// Don't combine pause/unpause with start/stop +// Useage: +// LLFrameTime foo; // starts automatically +// foo.unpause(); // noop but safe +// foo.pause(); // pauses timer +// foo.unpause() // unpauses +// F32 elapsed = foo.getElapsedTimeF32() // does not include time between pause() and unpause() +// Note: elapsed would also be valid with no unpause() call (= time run until pause() called) +void LLFrameTimer::pause() +{ + if (mStarted) + mStartTime = sFrameTime - mStartTime; // save dtime + mStarted = FALSE; +} + +void LLFrameTimer::unpause() +{ + if (!mStarted) + mStartTime = sFrameTime - mStartTime; // restore dtime + mStarted = TRUE; +} + +void LLFrameTimer::setTimerExpirySec(F32 expiration) +{ + mExpiry = expiration + mStartTime; +} + void LLFrameTimer::setExpiryAt(F64 seconds_since_epoch) { mStartTime = sFrameTime; diff --git a/linden/indra/llcommon/llframetimer.h b/linden/indra/llcommon/llframetimer.h index 007fe7d..0366e09 100644 --- a/linden/indra/llcommon/llframetimer.h +++ b/linden/indra/llcommon/llframetimer.h @@ -5,6 +5,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -63,8 +64,7 @@ public: return sTotalSeconds; } - // Call this method once per frame to update the current frame - // time. + // Call this method once per frame to update the current frame time. static void updateFrameTime(); static S32 getFrameCount() { return sFrameCount; } @@ -72,10 +72,12 @@ public: static F32 getFrameDeltaTimeF32(); // MANIPULATORS - void start() { reset(); mStarted = TRUE; } - void stop() { mStarted = FALSE; } - void reset() { mStartTime = sFrameTime; mExpiry = sFrameTime; } - void setTimerExpirySec(F32 expiration) { mExpiry = expiration + mStartTime; } + void start(); + void stop(); + void reset(); + void pause(); + void unpause(); + void setTimerExpirySec(F32 expiration); void setExpiryAt(F64 seconds_since_epoch); BOOL checkExpirationAndReset(F32 expiration); F32 getElapsedTimeAndResetF32() { F32 t = F32(sFrameTime - mStartTime); reset(); return t; } @@ -85,7 +87,7 @@ public: // ACCESSORS BOOL hasExpired() const { return (sFrameTime >= mExpiry); } F32 getTimeToExpireF32() const { return (F32)(mExpiry - sFrameTime); } - F32 getElapsedTimeF32() const { return (F32)(sFrameTime - mStartTime); } + F32 getElapsedTimeF32() const { return mStarted ? (F32)(sFrameTime - mStartTime) : (F32)mStartTime; } BOOL getStarted() const { return mStarted; } // return the seconds since epoch when this timer will expire. diff --git a/linden/indra/llcommon/llhash.h b/linden/indra/llcommon/llhash.h index bfe5397..c3c4ec9 100644 --- a/linden/indra/llcommon/llhash.h +++ b/linden/indra/llcommon/llhash.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llindexedqueue.h b/linden/indra/llcommon/llindexedqueue.h index 040de84..13e9f7a 100644 --- a/linden/indra/llcommon/llindexedqueue.h +++ b/linden/indra/llcommon/llindexedqueue.h @@ -5,6 +5,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/lllinkedqueue.h b/linden/indra/llcommon/lllinkedqueue.h index 699667a..9ce5a1b 100644 --- a/linden/indra/llcommon/lllinkedqueue.h +++ b/linden/indra/llcommon/lllinkedqueue.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llliveappconfig.cpp b/linden/indra/llcommon/llliveappconfig.cpp index bcffa7c..7923126 100644 --- a/linden/indra/llcommon/llliveappconfig.cpp +++ b/linden/indra/llcommon/llliveappconfig.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llliveappconfig.h b/linden/indra/llcommon/llliveappconfig.h index 822410f..f5c73d0 100644 --- a/linden/indra/llcommon/llliveappconfig.h +++ b/linden/indra/llcommon/llliveappconfig.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/lllivefile.cpp b/linden/indra/llcommon/lllivefile.cpp index d289671..f116a2a 100644 --- a/linden/indra/llcommon/lllivefile.cpp +++ b/linden/indra/llcommon/lllivefile.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/lllivefile.h b/linden/indra/llcommon/lllivefile.h index fbf2bdf..d8381bf 100644 --- a/linden/indra/llcommon/lllivefile.h +++ b/linden/indra/llcommon/lllivefile.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/lllocalidhashmap.h b/linden/indra/llcommon/lllocalidhashmap.h index e1d3445..aae0bd9 100644 --- a/linden/indra/llcommon/lllocalidhashmap.h +++ b/linden/indra/llcommon/lllocalidhashmap.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/lllslconstants.h b/linden/indra/llcommon/lllslconstants.h index 08c63e3..59d1cc8 100644 --- a/linden/indra/llcommon/lllslconstants.h +++ b/linden/indra/llcommon/lllslconstants.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llmap.h b/linden/indra/llcommon/llmap.h index 2bda851..65e3da7 100644 --- a/linden/indra/llcommon/llmap.h +++ b/linden/indra/llcommon/llmap.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llmemory.cpp b/linden/indra/llcommon/llmemory.cpp index 8528433..284c8e7 100644 --- a/linden/indra/llcommon/llmemory.cpp +++ b/linden/indra/llcommon/llmemory.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -30,11 +31,6 @@ #include "llmemory.h" #include "llmemtype.h" -// not defining nullfunc will currently crash when trying to use a LLHandle -template< typename _Ty > - const typename LLHandle< _Ty >::NullFunc - LLHandle< _Ty >::sNullFunc = LLHandle< _Ty >::defaultNullFunc; - //---------------------------------------------------------------------------- //static diff --git a/linden/indra/llcommon/llmemory.h b/linden/indra/llcommon/llmemory.h index 7a7996b..b6f42e3 100644 --- a/linden/indra/llcommon/llmemory.h +++ b/linden/indra/llcommon/llmemory.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -193,6 +194,14 @@ public: } return *this; } + + // Just exchange the pointers, which will not change the reference counts. + static void swap(LLPointer& a, LLPointer& b) + { + Type* temp = a.mPointer; + a.mPointer = b.mPointer; + b.mPointer = temp; + } protected: void ref() @@ -239,29 +248,28 @@ class LLHandle { public: LLHandle() : - mPointer(sNullFunc()) + mPointer(NULL) { - ref(); } LLHandle(Type* ptr) : - mPointer(nonNull(ptr)) + mPointer(NULL) { - ref(); + assign(ptr); } LLHandle(const LLHandle& ptr) : - mPointer(ptr.mPointer) + mPointer(NULL) { - ref(); + assign(ptr.mPointer); } // support conversion up the type hierarchy. See Item 45 in Effective C++, 3rd Ed. template LLHandle(const LLHandle& ptr) : - mPointer(ptr.get()) + mPointer(NULL) { - ref(); + assign(ptr.get()); } ~LLHandle() @@ -269,47 +277,39 @@ public: unref(); } + const Type* operator->() const { return nonNull(mPointer); } + Type* operator->() { return nonNull(mPointer); } + Type* get() const { return mPointer; } - const Type* operator->() const { return mPointer; } - Type* operator->() { return mPointer; } - const Type& operator*() const { return *mPointer; } - Type& operator*() { return *mPointer; } + // we disallow these operations as they expose our null objects to direct manipulation + // and bypass the reference counting semantics + //const Type& operator*() const { return *nonNull(mPointer); } + //Type& operator*() { return *nonNull(mPointer); } - operator BOOL() const { return (mPointer != sNullFunc()); } - operator bool() const { return (mPointer != sNullFunc()); } - bool operator!() const { return (mPointer == sNullFunc()); } - bool isNull() const { return (mPointer == sNullFunc()); } - bool notNull() const { return (mPointer != sNullFunc()); } + operator BOOL() const { return mPointer != NULL; } + operator bool() const { return mPointer != NULL; } + bool operator!() const { return mPointer == NULL; } + bool isNull() const { return mPointer == NULL; } + bool notNull() const { return mPointer != NULL; } operator Type*() const { return mPointer; } operator const Type*() const { return mPointer; } - bool operator !=(Type* ptr) const { return (mPointer != nonNull(ptr)); } - bool operator ==(Type* ptr) const { return (mPointer == nonNull(ptr)); } + bool operator !=(Type* ptr) const { return (mPointer != ptr); } + bool operator ==(Type* ptr) const { return (mPointer == ptr); } bool operator ==(const LLHandle& ptr) const { return (mPointer == ptr.mPointer); } bool operator < (const LLHandle& ptr) const { return (mPointer < ptr.mPointer); } bool operator > (const LLHandle& ptr) const { return (mPointer > ptr.mPointer); } LLHandle& operator =(Type* ptr) { - if( mPointer != ptr ) - { - unref(); - mPointer = nonNull(ptr); - ref(); - } - + assign(ptr); return *this; } LLHandle& operator =(const LLHandle& ptr) { - if( mPointer != ptr.mPointer ) - { - unref(); - mPointer = ptr.mPointer; - ref(); - } + assign(ptr.mPointer); return *this; } @@ -317,12 +317,7 @@ public: template LLHandle& operator =(const LLHandle& ptr) { - if( mPointer != ptr.get() ) - { - unref(); - mPointer = ptr.get(); - ref(); - } + assign(ptr.get()); return *this; } @@ -344,9 +339,9 @@ protected: if (mPointer) { Type *tempp = mPointer; - mPointer = sNullFunc(); + mPointer = NULL; tempp->unref(); - if (mPointer != sNullFunc()) + if (mPointer != NULL) { llwarns << "Unreference did assignment to non-NULL because of destructor" << llendl; unref(); @@ -354,19 +349,22 @@ protected: } } - static Type* nonNull(Type* ptr) + void assign(Type* ptr) { - return ptr == NULL ? sNullFunc() : ptr; + if( mPointer != ptr ) + { + unref(); + mPointer = ptr; + ref(); + } } - static Type* defaultNullFunc() + static Type* nonNull(Type* ptr) { - llerrs << "No null value provided for LLHandle" << llendl; - return NULL; + return ptr == NULL ? sNullFunc() : ptr; } protected: - Type* mPointer; }; diff --git a/linden/indra/llcommon/llmemorystream.cpp b/linden/indra/llcommon/llmemorystream.cpp index ca3311d..ac9e61c 100644 --- a/linden/indra/llcommon/llmemorystream.cpp +++ b/linden/indra/llcommon/llmemorystream.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llmemorystream.h b/linden/indra/llcommon/llmemorystream.h index 4210eb9..f00bc28 100644 --- a/linden/indra/llcommon/llmemorystream.h +++ b/linden/indra/llcommon/llmemorystream.h @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llmemtype.h b/linden/indra/llcommon/llmemtype.h index 0af1ed3..501b5f5 100644 --- a/linden/indra/llcommon/llmemtype.h +++ b/linden/indra/llcommon/llmemtype.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llmortician.cpp b/linden/indra/llcommon/llmortician.cpp index d76359d..ec1383f 100644 --- a/linden/indra/llcommon/llmortician.cpp +++ b/linden/indra/llcommon/llmortician.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llmortician.h b/linden/indra/llcommon/llmortician.h index c3e4b05..353f263 100644 --- a/linden/indra/llcommon/llmortician.h +++ b/linden/indra/llcommon/llmortician.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llnametable.h b/linden/indra/llcommon/llnametable.h index 80b9be4..c3bdfbd 100644 --- a/linden/indra/llcommon/llnametable.h +++ b/linden/indra/llcommon/llnametable.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llpagemem.h b/linden/indra/llcommon/llpagemem.h index 7081251..f3d6061 100644 --- a/linden/indra/llcommon/llpagemem.h +++ b/linden/indra/llcommon/llpagemem.h @@ -3,6 +3,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llpreprocessor.h b/linden/indra/llcommon/llpreprocessor.h index 9db0108..495b9e8 100644 --- a/linden/indra/llcommon/llpreprocessor.h +++ b/linden/indra/llcommon/llpreprocessor.h @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -41,6 +42,13 @@ #define LL_BIG_ENDIAN 1 #endif +// Per-compiler switches +#ifdef __GNUC__ +#define LL_FORCE_INLINE inline __attribute__((always_inline)) +#else +#define LL_FORCE_INLINE __forceinline +#endif + // Per-OS feature switches. #if LL_DARWIN @@ -81,9 +89,9 @@ #endif // Deal with the differeneces on Windows -#if defined(LL_WINDOWS) -#define snprintf _snprintf /*Flawfinder: ignore*/ -#endif // LL_WINDOWS +#if LL_WINDOWS +#define snprintf safe_snprintf /* Flawfinder: ignore */ +#endif // LL_WINDOWS // Static linking with apr on windows needs to be declared. #ifdef LL_WINDOWS diff --git a/linden/indra/llcommon/llpriqueuemap.h b/linden/indra/llcommon/llpriqueuemap.h index 20cbc6b..deda338 100644 --- a/linden/indra/llcommon/llpriqueuemap.h +++ b/linden/indra/llcommon/llpriqueuemap.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llprocessor.cpp b/linden/indra/llcommon/llprocessor.cpp index 3408cb1..d269e35 100644 --- a/linden/indra/llcommon/llprocessor.cpp +++ b/linden/indra/llcommon/llprocessor.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -103,6 +104,7 @@ static void _Delay(unsigned int ms) CProcessor::CProcessor() { uqwFrequency = 0; + strCPUName[0] = 0; memset(&CPUInfo, 0, sizeof(CPUInfo)); } @@ -245,77 +247,44 @@ bool CProcessor::AnalyzeIntelProcessor() CPUInfo.uiType = (eaxreg >> 12) & 0x3; CPUInfo.uiBrandID = ebxreg & 0xF; - // Now we can translate the type number to a more understandable string format - switch (CPUInfo.uiType) + static const char* INTEL_BRAND[] = { - case 0: // Type = 0: Original OEM processor - strcpy(CPUInfo.strType, "Original OEM"); /* Flawfinder: ignore */ - strcpy(strCPUName, CPUInfo.strType); /* Flawfinder: ignore */ - strcat(strCPUName, " "); /* Flawfinder: ignore */ - break; - case 1: // Type = 1: Overdrive processor - strcpy(CPUInfo.strType, "Overdrive"); /* Flawfinder: ignore */ - strcpy(strCPUName, CPUInfo.strType); /* Flawfinder: ignore */ - strcat(strCPUName, " "); /* Flawfinder: ignore */ - break; - case 2: // Type = 2: Dual-capable processor - strcpy(CPUInfo.strType, "Dual-capable"); /* Flawfinder: ignore */ - strcpy(strCPUName, CPUInfo.strType); /* Flawfinder: ignore */ - strcat(strCPUName, " "); /* Flawfinder: ignore */ - break; - case 3: // Type = 3: Reserved for future use - strcpy(CPUInfo.strType, "Reserved"); /* Flawfinder: ignore */ - break; - default: // This should be never called, cause we just mask 2 bits --> [0..3] - strcpy(CPUInfo.strType, "Unknown"); /* Flawfinder: ignore */ - break; - } - - // Then we translate the brand id: - switch (CPUInfo.uiBrandID) + /* 0x00 */ "", + /* 0x01 */ "0.18 micron Intel Celeron", + /* 0x02 */ "0.18 micron Intel Pentium III", + /* 0x03 */ "0.13 micron Intel Celeron", + /* 0x04 */ "0.13 micron Intel Pentium III", + /* 0x05 */ "", + /* 0x06 */ "0.13 micron Intel Pentium III mobile", + /* 0x07 */ "0.13 micron Intel Celeron mobile", + /* 0x08 */ "0.18 micron Intel Pentium 4", + /* 0x09 */ "0.13 micron Intel Pentium 4", + /* 0x0A */ "0.13 micron Intel Pentium 4", + /* 0x0B */ "0.13 micron Intel Pentium 4 Xeon", + /* 0x0C */ "", + /* 0x0D */ "", + /* 0x0E */ "0.18 micron Intel Pentium 4 Xeon", + /* 0x0F */ "", + /* 0x10 */ "", + /* 0x11 */ "", + /* 0x12 */ "Intel Celeron M", + /* 0x13 */ "mobile Intel Celeron", + /* 0x14 */ "Intel Celeron", + /* 0x15 */ "mobile Intel", + /* 0x16 */ "Intel Pentium M", + /* 0x17 */ "mobile Intel Celeron", + }; + + // Only override the brand if we have it in the lookup table. We should + // already have a string here from GetCPUInfo(). JC + if (CPUInfo.uiBrandID < sizeof(INTEL_BRAND)) { - case 0: // Brand id = 0: Brand id not supported on this processor - strcpy(CPUInfo.strBrandID, "Not supported"); /* Flawfinder: ignore */ - break; - case 1: // Brand id = 1: Intel Celeron (0.18 micron) processor - strcpy(CPUInfo.strBrandID, "0.18 micron Intel Celeron"); /* Flawfinder: ignore */ - break; - case 2: // Brand id = 2: Intel Pentium III (0.18 micron) processor - strcpy(CPUInfo.strBrandID, "0.18 micron Intel Pentium III"); /* Flawfinder: ignore */ - break; - case 3: // Brand id = 3: Model dependent - if (CPUInfo.uiModel == 6) // If the cpu model is Celeron (well, I'm NOT SURE!!!) - strcpy(CPUInfo.strBrandID, "0.13 micron Intel Celeron"); /* Flawfinder: ignore */ - else - strcpy(CPUInfo.strBrandID, "0.18 micron Intel Pentium III Xeon"); /* Flawfinder: ignore */ - break; - case 4: // Brand id = 4: Intel Pentium III Tualatin (0.13 micron) processor - strcpy(CPUInfo.strBrandID, "0.13 micron Intel Pentium III"); /* Flawfinder: ignore */ - break; - case 6: // Brand id = 6: Intel Pentium III mobile (0.13 micron) processor - strcpy(CPUInfo.strBrandID, "0.13 micron Intel Pentium III mobile"); /* Flawfinder: ignore */ - break; - case 7: // Brand id = 7: Intel Celeron mobile (0.13 micron) processor - strcpy(CPUInfo.strBrandID, "0.13 micron Intel Celeron mobile"); /* Flawfinder: ignore */ - break; - case 8: // Brand id = 8: Intel Pentium 4 Willamette (0.18 micron) processor - strcpy(CPUInfo.strBrandID, "0.18 micron Intel Pentium 4"); /* Flawfinder: ignore */ - break; - case 9: // Brand id = 9: Intel Pentium 4 Northwood (0.13 micron) processor - strcpy(CPUInfo.strBrandID, "0.13 micron Intel Pentium 4"); /* Flawfinder: ignore */ - break; - case 0xA: // Brand id = 0xA: Intel Pentium 4 Northwood (0.13 micron processor) - strcpy(CPUInfo.strBrandID, "0.13 micron Intel Pentium 4"); /* Flawfinder: ignore */ - break; // No idea, where the difference to id=9 is - case 0xB: // Brand id = 0xB: Intel Pentium 4 Northwood Xeon (0.13 micron processor) - strcpy(CPUInfo.strBrandID, "0.13 micron Intel Pentium 4 Xeon"); /* Flawfinder: ignore */ - break; - case 0xE: // Brand id = 0xE: Intel Pentium 4 Willamette Xeon (0.18 micron processor) - strcpy(CPUInfo.strBrandID, "0.18 micron Intel Pentium 4 Xeon"); /* Flawfinder: ignore */ - break; - default: // Should be never called, but sure is sure - strcpy(CPUInfo.strBrandID, "Unknown"); /* Flawfinder: ignore */ - break; + strcpy(CPUInfo.strBrandID, INTEL_BRAND[CPUInfo.uiBrandID]); + + if (CPUInfo.uiBrandID == 3 && CPUInfo.uiModel == 6) + { + strcpy(CPUInfo.strBrandID, "0.18 micron Intel Pentium III Xeon"); + } } // Then we translate the cpu family @@ -617,7 +586,7 @@ bool CProcessor::AnalyzeIntelProcessor() else { // If there's no serial number support we just put "No serial number" - snprintf( /* Flawfinder: ignore */ + snprintf( /* Flawfinder: ignore */ CPUInfo.strProcessorSerial, sizeof(CPUInfo.strProcessorSerial), "No Processor Serial Number"); @@ -667,33 +636,6 @@ bool CProcessor::AnalyzeAMDProcessor() CPUInfo.uiFamily = (eaxreg >> 8) & 0xF; CPUInfo.uiType = (eaxreg >> 12) & 0x3; - // After that, we translate the processor type (see CProcessor::AnalyzeIntelProcessor() - // for further comments on this) - switch (CPUInfo.uiType) - { - case 0: - strcpy(CPUInfo.strType, "Original OEM"); /* Flawfinder: ignore */ - strcpy(strCPUName, CPUInfo.strType); /* Flawfinder: ignore */ - strcat(strCPUName, " "); /*Flawfinder: ignore*/ - break; - case 1: - strcpy(CPUInfo.strType, "Overdrive"); /* Flawfinder: ignore */ - strcpy(strCPUName, CPUInfo.strType); /* Flawfinder: ignore */ - strcat(strCPUName, " "); /*Flawfinder: ignore*/ - break; - case 2: - strcpy(CPUInfo.strType, "Dual-capable"); /* Flawfinder: ignore */ - strcpy(strCPUName, CPUInfo.strType); /* Flawfinder: ignore */ - strcat(strCPUName, " "); /*Flawfinder: ignore*/ - break; - case 3: - strcpy(CPUInfo.strType, "Reserved"); /* Flawfinder: ignore */ - break; - default: - strcpy(CPUInfo.strType, "Unknown"); /* Flawfinder: ignore */ - break; - } - // Now we check if the processor supports the brand id string extended CPUID level if (CPUInfo.MaxSupportedExtendedLevel >= 0x80000004) { @@ -728,7 +670,7 @@ bool CProcessor::AnalyzeAMDProcessor() else { // Or just tell there is no brand id string support - strcpy(CPUInfo.strBrandID, "Not supported"); /* Flawfinder: ignore */ + strcpy(CPUInfo.strBrandID, ""); /* Flawfinder: ignore */ } // After that we translate the processor family @@ -993,7 +935,7 @@ bool CProcessor::AnalyzeAMDProcessor() if ((ecxreg >> 24) > 0) { CPUInfo._L1.Data.bPresent = true; - snprintf(CPUInfo._L1.Data.strSize, sizeof(CPUInfo._L1.Data.strSize), "%d KB", ecxreg >> 24); /*Flawfinder: ignore*/ + snprintf(CPUInfo._L1.Data.strSize, sizeof(CPUInfo._L1.Data.strSize), "%d KB", ecxreg >> 24); /* Flawfinder: ignore */ CPUInfo._L1.Data.uiAssociativeWays = (ecxreg >> 15) & 0xFF; CPUInfo._L1.Data.uiLineSize = ecxreg & 0xFF; } @@ -1001,7 +943,7 @@ bool CProcessor::AnalyzeAMDProcessor() if ((edxreg >> 24) > 0) { CPUInfo._L1.Instruction.bPresent = true; - snprintf(CPUInfo._L1.Instruction.strSize, sizeof(CPUInfo._L1.Instruction.strSize), "%d KB", edxreg >> 24); /*Flawfinder: ignore*/ + snprintf(CPUInfo._L1.Instruction.strSize, sizeof(CPUInfo._L1.Instruction.strSize), "%d KB", edxreg >> 24); /* Flawfinder: ignore */ CPUInfo._L1.Instruction.uiAssociativeWays = (edxreg >> 15) & 0xFF; CPUInfo._L1.Instruction.uiLineSize = edxreg & 0xFF; } @@ -1025,7 +967,7 @@ bool CProcessor::AnalyzeAMDProcessor() if (((ecxreg >> 12) & 0xF) > 0) { CPUInfo._L2.bPresent = true; - snprintf(CPUInfo._L2.strSize, sizeof(CPUInfo._L2.strSize), "%d KB", ecxreg >> 16); /*Flawfinder: ignore*/ + snprintf(CPUInfo._L2.strSize, sizeof(CPUInfo._L2.strSize), "%d KB", ecxreg >> 16); /* Flawfinder: ignore */ switch ((ecxreg >> 12) & 0xF) { case 1: @@ -1118,29 +1060,9 @@ bool CProcessor::AnalyzeUnknownProcessor() strcpy(CPUInfo.strProcessorSerial, "Unknown / Not supported"); /*Flawfinder: ignore*/ // For the family, model and brand id we can only print the numeric value - snprintf(CPUInfo.strBrandID, sizeof(CPUInfo.strBrandID), "Brand-ID number %d", CPUInfo.uiBrandID); /*Flawfinder: ignore*/ - snprintf(CPUInfo.strFamily, sizeof(CPUInfo.strFamily), "Family number %d", CPUInfo.uiFamily); /*Flawfinder: ignore*/ - snprintf(CPUInfo.strModel, sizeof(CPUInfo.strModel), "Model number %d", CPUInfo.uiModel); /*Flawfinder: ignore*/ - - // Nevertheless we can determine the processor type - switch (CPUInfo.uiType) - { - case 0: - strcpy(CPUInfo.strType, "Original OEM"); /*Flawfinder: ignore*/ - break; - case 1: - strcpy(CPUInfo.strType, "Overdrive"); /*Flawfinder: ignore*/ - break; - case 2: - strcpy(CPUInfo.strType, "Dual-capable"); /*Flawfinder: ignore*/ - break; - case 3: - strcpy(CPUInfo.strType, "Reserved"); /*Flawfinder: ignore*/ - break; - default: - strcpy(CPUInfo.strType, "Unknown"); /*Flawfinder: ignore*/ - break; - } + snprintf(CPUInfo.strBrandID, sizeof(CPUInfo.strBrandID), "Brand-ID number %d", CPUInfo.uiBrandID); /* Flawfinder: ignore */ + snprintf(CPUInfo.strFamily, sizeof(CPUInfo.strFamily), "Family number %d", CPUInfo.uiFamily); /* Flawfinder: ignore */ + snprintf(CPUInfo.strModel, sizeof(CPUInfo.strModel), "Model number %d", CPUInfo.uiModel); /* Flawfinder: ignore */ // And thats it return true; @@ -1653,6 +1575,8 @@ const ProcessorInfo *CProcessor::GetCPUInfo() *((unsigned long *) CPUInfo.strVendor) = ebxreg; *((unsigned long *) (CPUInfo.strVendor+4)) = edxreg; *((unsigned long *) (CPUInfo.strVendor+8)) = ecxreg; + // Null terminate for string comparisons below. + CPUInfo.strVendor[12] = 0; // We can also read the max. supported standard CPUID level CPUInfo.MaxSupportedLevel = eaxreg & 0xFFFF; @@ -1668,22 +1592,52 @@ const ProcessorInfo *CProcessor::GetCPUInfo() CPUInfo.MaxSupportedExtendedLevel = eaxreg; // Then we switch to the specific processor vendors - switch (ebxreg) + // See http://www.sandpile.org/ia32/cpuid.htm + if (!strcmp(CPUInfo.strVendor, "GenuineIntel")) { - case 0x756E6547: // GenuineIntel - AnalyzeIntelProcessor(); - break; - case 0x68747541: // AuthenticAMD - AnalyzeAMDProcessor(); - break; - case 0x69727943: // CyrixInstead - // I really do not know anyone owning such a piece of crab - // So we analyze it as an unknown processor *ggggg* - default: - AnalyzeUnknownProcessor(); - break; + AnalyzeIntelProcessor(); + } + else if (!strcmp(CPUInfo.strVendor, "AuthenticAMD")) + { + AnalyzeAMDProcessor(); + } + else if (!strcmp(CPUInfo.strVendor, "UMC UMC UMC")) + { + AnalyzeUnknownProcessor(); + } + else if (!strcmp(CPUInfo.strVendor, "CyrixInstead")) + { + AnalyzeUnknownProcessor(); + } + else if (!strcmp(CPUInfo.strVendor, "NexGenDriven")) + { + AnalyzeUnknownProcessor(); + } + else if (!strcmp(CPUInfo.strVendor, "CentaurHauls")) + { + AnalyzeUnknownProcessor(); + } + else if (!strcmp(CPUInfo.strVendor, "RiseRiseRise")) + { + AnalyzeUnknownProcessor(); + } + else if (!strcmp(CPUInfo.strVendor, "SiS SiS SiS")) + { + AnalyzeUnknownProcessor(); + } + else if (!strcmp(CPUInfo.strVendor, "GenuineTMx86")) + { + // Transmeta + AnalyzeUnknownProcessor(); + } + else if (!strcmp(CPUInfo.strVendor, "Geode by NSC")) + { + AnalyzeUnknownProcessor(); + } + else + { + AnalyzeUnknownProcessor(); } - #endif // After all we return the class CPUInfo member var return (&CPUInfo); @@ -1767,6 +1721,7 @@ void CProcessor::TranslateProcessorConfiguration() CProcessor::CProcessor() { uqwFrequency = 0; + strCPUName[0] = 0; memset(&CPUInfo, 0, sizeof(CPUInfo)); } @@ -1970,7 +1925,7 @@ const ProcessorInfo *CProcessor::GetCPUInfo() if(l1dcachesize != 0) { CPUInfo._L1.Data.bPresent = true; - snprintf(CPUInfo._L1.Data.strSize, sizeof(CPUInfo._L1.Data.strSize), "%d KB", l1dcachesize / 1024); /* Flawfinder: ignore */ + snprintf(CPUInfo._L1.Data.strSize, sizeof(CPUInfo._L1.Data.strSize), "%d KB", l1dcachesize / 1024); /* Flawfinder: ignore */ // CPUInfo._L1.Data.uiAssociativeWays = ???; CPUInfo._L1.Data.uiLineSize = cachelinesize; } @@ -1978,7 +1933,7 @@ const ProcessorInfo *CProcessor::GetCPUInfo() if(l1icachesize != 0) { CPUInfo._L1.Instruction.bPresent = true; - snprintf(CPUInfo._L1.Instruction.strSize, sizeof(CPUInfo._L1.Instruction.strSize), "%d KB", l1icachesize / 1024); /* Flawfinder: ignore */ + snprintf(CPUInfo._L1.Instruction.strSize, sizeof(CPUInfo._L1.Instruction.strSize), "%d KB", l1icachesize / 1024); /* Flawfinder: ignore */ // CPUInfo._L1.Instruction.uiAssociativeWays = ???; CPUInfo._L1.Instruction.uiLineSize = cachelinesize; } @@ -1986,7 +1941,7 @@ const ProcessorInfo *CProcessor::GetCPUInfo() if(l2cachesize != 0) { CPUInfo._L2.bPresent = true; - snprintf(CPUInfo._L2.strSize, sizeof(CPUInfo._L2.strSize), "%d KB", l2cachesize / 1024); /* Flawfinder: ignore */ + snprintf(CPUInfo._L2.strSize, sizeof(CPUInfo._L2.strSize), "%d KB", l2cachesize / 1024); /* Flawfinder: ignore */ // CPUInfo._L2.uiAssociativeWays = ???; CPUInfo._L2.uiLineSize = cachelinesize; } @@ -1994,7 +1949,7 @@ const ProcessorInfo *CProcessor::GetCPUInfo() if(l3cachesize != 0) { CPUInfo._L2.bPresent = true; - snprintf(CPUInfo._L2.strSize, sizeof(CPUInfo._L2.strSize), "%d KB", l3cachesize / 1024); /* Flawfinder: ignore */ + snprintf(CPUInfo._L2.strSize, sizeof(CPUInfo._L2.strSize), "%d KB", l3cachesize / 1024); /* Flawfinder: ignore */ // CPUInfo._L2.uiAssociativeWays = ???; CPUInfo._L2.uiLineSize = cachelinesize; } diff --git a/linden/indra/llcommon/llprocessor.h b/linden/indra/llcommon/llprocessor.h index cbadb42..fd9a5da 100644 --- a/linden/indra/llcommon/llprocessor.h +++ b/linden/indra/llcommon/llprocessor.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llptrskiplist.h b/linden/indra/llcommon/llptrskiplist.h index df56556..f695f88 100644 --- a/linden/indra/llcommon/llptrskiplist.h +++ b/linden/indra/llcommon/llptrskiplist.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llptrskipmap.h b/linden/indra/llcommon/llptrskipmap.h index c4e131f..e2fdc7f 100644 --- a/linden/indra/llcommon/llptrskipmap.h +++ b/linden/indra/llcommon/llptrskipmap.h @@ -5,6 +5,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llqueuedthread.cpp b/linden/indra/llcommon/llqueuedthread.cpp index 2e4324b..7eaaf68 100644 --- a/linden/indra/llcommon/llqueuedthread.cpp +++ b/linden/indra/llcommon/llqueuedthread.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llqueuedthread.h b/linden/indra/llcommon/llqueuedthread.h index 7231285..18a44c5 100644 --- a/linden/indra/llcommon/llqueuedthread.h +++ b/linden/indra/llcommon/llqueuedthread.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llrun.cpp b/linden/indra/llcommon/llrun.cpp index 6cdae74..131030e 100644 --- a/linden/indra/llcommon/llrun.cpp +++ b/linden/indra/llcommon/llrun.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llrun.h b/linden/indra/llcommon/llrun.h index 696a226..649c7b0 100644 --- a/linden/indra/llcommon/llrun.h +++ b/linden/indra/llcommon/llrun.h @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llsd.cpp b/linden/indra/llcommon/llsd.cpp index 342e356..376a0de 100644 --- a/linden/indra/llcommon/llsd.cpp +++ b/linden/indra/llcommon/llsd.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llsd.h b/linden/indra/llcommon/llsd.h index 625b480..bd24ecf 100644 --- a/linden/indra/llcommon/llsd.h +++ b/linden/indra/llcommon/llsd.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llsdserialize.cpp b/linden/indra/llcommon/llsdserialize.cpp index 653fc66..d262ca1 100644 --- a/linden/indra/llcommon/llsdserialize.cpp +++ b/linden/indra/llcommon/llsdserialize.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llsdserialize.h b/linden/indra/llcommon/llsdserialize.h index 76c65c2..4a73b60 100644 --- a/linden/indra/llcommon/llsdserialize.h +++ b/linden/indra/llcommon/llsdserialize.h @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llsdserialize_xml.cpp b/linden/indra/llcommon/llsdserialize_xml.cpp index bb36fa7..04cdd57 100644 --- a/linden/indra/llcommon/llsdserialize_xml.cpp +++ b/linden/indra/llcommon/llsdserialize_xml.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -253,7 +254,7 @@ public: Impl(); ~Impl(); - LLSD parse(std::istream& input); + S32 parse(std::istream& input, LLSD& data); void parsePart(const char *buf, int len); @@ -355,7 +356,7 @@ static unsigned get_till_eol(std::istream& input, char *buf, unsigned bufsize) return count; } -LLSD LLSDXMLParser::Impl::parse(std::istream& input) +S32 LLSDXMLParser::Impl::parse(std::istream& input, LLSD& data) { reset(); XML_Status status; @@ -399,11 +400,13 @@ LLSD LLSDXMLParser::Impl::parse(std::istream& input) { ((char*) buffer)[count? count - 1 : 0] = '\0'; llinfos << "LLSDXMLParser::Impl::parse: XML_STATUS_ERROR parsing:" << (char*) buffer << llendl; - return LLSD(); + data = LLSD(); + return -1; } clear_eol(input); - return mResult; + data = mResult; + return 1; } void LLSDXMLParser::Impl::reset() @@ -722,6 +725,5 @@ void LLSDXMLParser::parsePart(const char *buf, int len) // virtual S32 LLSDXMLParser::parse(std::istream& input, LLSD& data) const { - data = impl.parse(input); - return 0; + return impl.parse(input, data); } diff --git a/linden/indra/llcommon/llsdserialize_xml.h b/linden/indra/llcommon/llsdserialize_xml.h index 0450acb..0546ea4 100644 --- a/linden/indra/llcommon/llsdserialize_xml.h +++ b/linden/indra/llcommon/llsdserialize_xml.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llsdutil.cpp b/linden/indra/llcommon/llsdutil.cpp index 0f295a1..d30afc7 100644 --- a/linden/indra/llcommon/llsdutil.cpp +++ b/linden/indra/llcommon/llsdutil.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -40,7 +41,7 @@ # include #endif - +#include "llsdserialize.h" // vector3 LLSD ll_sd_from_vector3(const LLVector3& vec) @@ -61,6 +62,27 @@ LLVector3 ll_vector3_from_sd(const LLSD& sd, S32 start_index) return rv; } +// vector4 +LLSD ll_sd_from_vector4(const LLVector4& vec) +{ + LLSD rv; + rv.append((F64)vec.mV[VX]); + rv.append((F64)vec.mV[VY]); + rv.append((F64)vec.mV[VZ]); + rv.append((F64)vec.mV[VW]); + return rv; +} + +LLVector4 ll_vector4_from_sd(const LLSD& sd, S32 start_index) +{ + LLVector4 rv; + rv.mV[VX] = (F32)sd[start_index].asReal(); + rv.mV[VY] = (F32)sd[++start_index].asReal(); + rv.mV[VZ] = (F32)sd[++start_index].asReal(); + rv.mV[VW] = (F32)sd[++start_index].asReal(); + return rv; +} + // vector3d LLSD ll_sd_from_vector3d(const LLVector3d& vec) { @@ -227,9 +249,39 @@ U32 ll_ipaddr_from_sd(const LLSD& sd) LLSD ll_string_from_binary(const LLSD& sd) { std::vector value = sd.asBinary(); - char* c_str = new char[value.size() + 1]; - memcpy(c_str, &value[0], value.size()); - c_str[value.size()] = '\0'; + std::string str; + str.resize(value.size()); + memcpy(&str[0], &value[0], value.size()); + return str; +} - return c_str; +// Converts an LLSD string to an LLSD binary +LLSD ll_binary_from_string(const LLSD& sd) +{ + std::vector binary_value; + + LLString string_value = sd.asString(); + const char* string_p = string_value.c_str(); + while (*string_p) + { + binary_value.push_back(*string_p); + string_p++; + } + + binary_value.push_back('\0'); + + return binary_value; +} + +char* ll_print_sd(const LLSD& sd) +{ + const U32 bufferSize = 10 * 1024; + static char buffer[bufferSize]; + std::ostringstream stream; + //stream.rdbuf()->pubsetbuf(buffer, bufferSize); + stream << LLSDOStreamer(sd); + stream << std::ends; + strncpy(buffer, stream.str().c_str(), bufferSize); + buffer[bufferSize - 1] = '\0'; + return buffer; } diff --git a/linden/indra/llcommon/llsdutil.h b/linden/indra/llcommon/llsdutil.h index ca6b76f..6344c50 100644 --- a/linden/indra/llcommon/llsdutil.h +++ b/linden/indra/llcommon/llsdutil.h @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -32,6 +33,7 @@ #include "llsd.h" #include "../llmath/v3math.h" +#include "../llmath/v4math.h" #include "../llmath/v3dmath.h" #include "../llmath/v2math.h" #include "../llmath/llquaternion.h" @@ -42,6 +44,10 @@ LLSD ll_sd_from_vector3(const LLVector3& vec); LLVector3 ll_vector3_from_sd(const LLSD& sd, S32 start_index = 0); +// vector4 +LLSD ll_sd_from_vector4(const LLVector4& vec); +LLVector4 ll_vector4_from_sd(const LLSD& sd, S32 start_index = 0); + // vector3d (double) LLSD ll_sd_from_vector3d(const LLVector3d& vec); LLVector3d ll_vector3d_from_sd(const LLSD& sd, S32 start_index = 0); @@ -73,4 +79,10 @@ U32 ll_ipaddr_from_sd(const LLSD& sd); // Binary to string LLSD ll_string_from_binary(const LLSD& sd); +//String to binary +LLSD ll_binary_from_string(const LLSD& sd); + +// Serializes sd to static buffer and returns pointer, useful for gdb debugging. +char* ll_print_sd(const LLSD& sd); + #endif // LL_LLSDUTIL_H diff --git a/linden/indra/llcommon/llsecondlifeurls.cpp b/linden/indra/llcommon/llsecondlifeurls.cpp index 4372373..53a1906 100644 --- a/linden/indra/llcommon/llsecondlifeurls.cpp +++ b/linden/indra/llcommon/llsecondlifeurls.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llsecondlifeurls.h b/linden/indra/llcommon/llsecondlifeurls.h index 1f7d359..d4d296b 100644 --- a/linden/indra/llcommon/llsecondlifeurls.h +++ b/linden/indra/llcommon/llsecondlifeurls.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llsimplehash.h b/linden/indra/llcommon/llsimplehash.h index 259f140..4e0d5ea 100644 --- a/linden/indra/llcommon/llsimplehash.h +++ b/linden/indra/llcommon/llsimplehash.h @@ -3,6 +3,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llskiplist.h b/linden/indra/llcommon/llskiplist.h index bd28cea..be3385d 100644 --- a/linden/indra/llcommon/llskiplist.h +++ b/linden/indra/llcommon/llskiplist.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llskipmap.h b/linden/indra/llcommon/llskipmap.h index 85a84e5..c2c0092 100644 --- a/linden/indra/llcommon/llskipmap.h +++ b/linden/indra/llcommon/llskipmap.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llstack.h b/linden/indra/llcommon/llstack.h index b3bb81f..36c2e1e 100644 --- a/linden/indra/llcommon/llstack.h +++ b/linden/indra/llcommon/llstack.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llstat.cpp b/linden/indra/llcommon/llstat.cpp index 61893e2..4e43923 100644 --- a/linden/indra/llcommon/llstat.cpp +++ b/linden/indra/llcommon/llstat.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -118,8 +119,9 @@ void LLStatAccum::impl::sum(F64 value, U64 when) } if (when < mLastTime) { - llwarns << "LLStatAccum::sum clock has gone backwards from " - << mLastTime << " to " << when << ", resetting" << llendl; + // JAMESDEBUG spams on Athlon + //llwarns << "LLStatAccum::sum clock has gone backwards from " + // << mLastTime << " to " << when << ", resetting" << llendl; reset(when); return; diff --git a/linden/indra/llcommon/llstat.h b/linden/indra/llcommon/llstat.h index 09b6028..9266b60 100644 --- a/linden/indra/llcommon/llstat.h +++ b/linden/indra/llcommon/llstat.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llstatenums.h b/linden/indra/llcommon/llstatenums.h index 6860ca0..fc618df 100644 --- a/linden/indra/llcommon/llstatenums.h +++ b/linden/indra/llcommon/llstatenums.h @@ -3,6 +3,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llstl.h b/linden/indra/llcommon/llstl.h index ae0dc25..06980a1 100644 --- a/linden/indra/llcommon/llstl.h +++ b/linden/indra/llcommon/llstl.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llstreamtools.cpp b/linden/indra/llcommon/llstreamtools.cpp index 2c78e05..d70fa60 100644 --- a/linden/indra/llcommon/llstreamtools.cpp +++ b/linden/indra/llcommon/llstreamtools.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llstreamtools.h b/linden/indra/llcommon/llstreamtools.h index cd92911..c339dde 100644 --- a/linden/indra/llcommon/llstreamtools.h +++ b/linden/indra/llcommon/llstreamtools.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llstrider.h b/linden/indra/llcommon/llstrider.h index efc2ae4..707d10e 100644 --- a/linden/indra/llcommon/llstrider.h +++ b/linden/indra/llcommon/llstrider.h @@ -3,6 +3,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llstring.cpp b/linden/indra/llcommon/llstring.cpp index c9f684f..22d7b47 100644 --- a/linden/indra/llcommon/llstring.cpp +++ b/linden/indra/llcommon/llstring.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -673,6 +674,33 @@ std::string mbcsstring_makeASCII(const std::string& wstr) return out_str; } +#if LL_WINDOWS +/* If the size of the passed in buffer is not large enough to hold the string, + * two bad things happen: + * 1. resulting formatted string is NOT null terminated + * 2. Depending on the platform, the return value could be a) the required + * size of the buffer to copy the entire formatted string or b) -1. + * On Windows with VS.Net 2003, it returns -1 e.g. + * + * safe_snprintf always adds a NULL terminator so that the caller does not + * need to check for return value or need to add the NULL terminator. + * It does not, however change the return value - to let the caller know + * that the passed in buffer size was not large enough to hold the formatted string. + * + */ +int safe_snprintf(char *str, size_t size, const char *format, ...) +{ + va_list args; + va_start(args, format); + + int num_written = _vsnprintf(str, size, format, args); /* Flawfinder: ignore */ + va_end(args); + + str[size-1] = '\0'; // always null terminate + return num_written; +} +#endif // LL_WINDOWS + S32 LLStringOps::collate(const llwchar* a, const llwchar* b) { #if LL_WINDOWS diff --git a/linden/indra/llcommon/llstring.h b/linden/indra/llcommon/llstring.h index 0485a1e..d901e61 100644 --- a/linden/indra/llcommon/llstring.h +++ b/linden/indra/llcommon/llstring.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -38,6 +39,7 @@ #include #include #include +#include /* for vsnprintf */ #if LL_LINUX #include #include @@ -464,6 +466,9 @@ std::ostream& operator<<(std::ostream &s, const LLStringBase &str) std::ostream& operator<<(std::ostream &s, const LLWString &wstr); +#if LL_WINDOWS +int safe_snprintf(char *str, size_t size, const char *format, ...); +#endif // LL_WINDOWS /** * Many of the 'strip' and 'replace' methods of LLStringBase need diff --git a/linden/indra/llcommon/llstringtable.cpp b/linden/indra/llcommon/llstringtable.cpp index 4a76ed6..30db4f7 100644 --- a/linden/indra/llcommon/llstringtable.cpp +++ b/linden/indra/llcommon/llstringtable.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llstringtable.h b/linden/indra/llcommon/llstringtable.h index ddfef88..337d937 100644 --- a/linden/indra/llcommon/llstringtable.h +++ b/linden/indra/llcommon/llstringtable.h @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llsys.cpp b/linden/indra/llcommon/llsys.cpp index 906bc65..48f2474 100644 --- a/linden/indra/llcommon/llsys.cpp +++ b/linden/indra/llcommon/llsys.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -31,6 +32,7 @@ #include #include + #include "processor.h" #if LL_WINDOWS @@ -143,7 +145,7 @@ LLOSInfo::LLOSInfo() : } else { - snprintf( /* Flawfinder: ignore */ + snprintf( /* Flawfinder: ignore */ tmp, sizeof(tmp), "%s (Build %d)", @@ -308,50 +310,28 @@ LLCPUInfo::LLCPUInfo() mFamily.assign( info->strFamily ); } + std::string LLCPUInfo::getCPUString() const { - std::string cpu_string; - #if LL_WINDOWS || LL_DARWIN - // gather machine information. - char proc_buf[CPUINFO_BUFFER_SIZE]; /* Flawfinder: ignore */ - CProcessor proc; - if(proc.CPUInfoToText(proc_buf, CPUINFO_BUFFER_SIZE)) - { - cpu_string.append(proc_buf); - } -#else - cpu_string.append("Can't get CPU information"); -#endif - - return cpu_string; -} - -std::string LLCPUInfo::getCPUStringTerse() const -{ - std::string cpu_string; + std::ostringstream out; -#if LL_WINDOWS || LL_DARWIN CProcessor proc; - const ProcessorInfo *info = proc.GetCPUInfo(); - - cpu_string.append(info->strBrandID); + (void) proc.GetCPUInfo(); + out << proc.strCPUName << " "; - F64 freq = (F64)(S64)proc.GetCPUFrequency(50) / 1000000.f; + F32 freq = (F32)(proc.GetCPUFrequency(50) / 1000000.0); // cpu speed is often way wrong, do a sanity check - if (freq < 10000.f && freq > 200.f ) + if (200.f < freq && freq < 10000.f) { - char tmp[MAX_STRING]; /* Flawfinder: ignore */ - snprintf(tmp, sizeof(tmp), " (%.0f Mhz)", freq); /* Flawfinder: ignore */ - - cpu_string.append(tmp); + out << "(" << (S32)(freq) << " MHz)"; } + + return out.str(); #else - cpu_string.append("Can't get terse CPU information"); + return "Can't get terse CPU information"; #endif - - return cpu_string; } void LLCPUInfo::stream(std::ostream& s) const diff --git a/linden/indra/llcommon/llsys.h b/linden/indra/llcommon/llsys.h index 7753adb..2047d9a 100644 --- a/linden/indra/llcommon/llsys.h +++ b/linden/indra/llcommon/llsys.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -70,7 +71,6 @@ public: void stream(std::ostream& s) const; std::string getCPUString() const; - std::string getCPUStringTerse() const; BOOL hasSSE() const { return mHasSSE; } BOOL hasSSE2() const { return mHasSSE2; } diff --git a/linden/indra/llcommon/llthread.cpp b/linden/indra/llcommon/llthread.cpp index d6b52f7..0f833ab 100644 --- a/linden/indra/llcommon/llthread.cpp +++ b/linden/indra/llcommon/llthread.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llthread.h b/linden/indra/llcommon/llthread.h index cdf1d33..adb04a5 100644 --- a/linden/indra/llcommon/llthread.h +++ b/linden/indra/llcommon/llthread.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/lltimer.cpp b/linden/indra/llcommon/lltimer.cpp index 07bd543..21fbf0e 100644 --- a/linden/indra/llcommon/lltimer.cpp +++ b/linden/indra/llcommon/lltimer.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/lltimer.h b/linden/indra/llcommon/lltimer.h index caac16f..94dcbb9 100644 --- a/linden/indra/llcommon/lltimer.h +++ b/linden/indra/llcommon/lltimer.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/lluri.cpp b/linden/indra/llcommon/lluri.cpp index bc3540e..f85f294 100644 --- a/linden/indra/llcommon/lluri.cpp +++ b/linden/indra/llcommon/lluri.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -214,6 +215,19 @@ LLURI LLURI::buildHTTP(const std::string& prefix, result.mEscapedPath += "/" + escapePathComponent(it->asString()); } } + else if(path.isString()) + { + result.mEscapedPath += "/" + escapePathComponent(path.asString()); + } + else if(path.isUndefined()) + { + // do nothing + } + else + { + llwarns << "Valid path arguments to buildHTTP are array, string, or undef, you passed type" + << path.type() << llendl; + } result.mEscapedOpaque = "//" + result.mEscapedAuthority + result.mEscapedPath; return result; @@ -284,19 +298,7 @@ namespace { } } - -// static -LLURI LLURI::buildAgentPresenceURI(const LLUUID& agent_id, LLApp* app) -{ - return buildBackboneURL(app, "agent", agent_id.asString(), "presence"); -} - -// static -LLURI LLURI::buildBulkAgentPresenceURI(LLApp* app) -{ - return buildBackboneURL(app, "agent", "presence"); -} - +#if LL_ENABLE_JANKY_DEPRECATED_WEB_SERVICE_CALLS // static LLURI LLURI::buildBulkAgentNamesURI(LLApp* app) { @@ -321,25 +323,6 @@ LLURI LLURI::buildAgentSessionURI(const LLUUID& agent_id, LLApp* app) } // static -LLURI LLURI::buildInventoryHostURI(const LLUUID& agent_id, LLApp* app) -{ - std::string host = "localhost:12040"; - - if (app) - { - host = app->getOption("backbone-host-port").asString(); - } - - LLSD path = LLSD::emptyArray(); - path.append("agent"); - path.append(agent_id); - path.append("inventory"); - path.append("host"); - - return buildHTTP(host, path); -} - -// static LLURI LLURI::buildAgentNameURI(const LLUUID& agent_id, LLApp* app) { std::string host = "localhost:12040"; @@ -367,6 +350,7 @@ LLURI LLURI::buildAgentLoginInfoURI(const LLUUID& agent_id, const std::string& d return buildHTTP(dataserver, path); } +#endif // LL_ENABLE_JANKY_DEPRECATED_WEB_SERVICE_CALLS std::string LLURI::asString() const { diff --git a/linden/indra/llcommon/lluri.h b/linden/indra/llcommon/lluri.h index 60b3d48..77de595 100644 --- a/linden/indra/llcommon/lluri.h +++ b/linden/indra/llcommon/lluri.h @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -96,13 +97,12 @@ public: static std::string unescape(const std::string& str); // Functions for building specific URIs for web services - static LLURI buildAgentPresenceURI(const LLUUID& agent_id, LLApp* app); - static LLURI buildBulkAgentPresenceURI(LLApp* app); - static LLURI buildBulkAgentNamesURI(LLApp* app); - static LLURI buildAgentSessionURI(const LLUUID& agent_id, LLApp* app); - static LLURI buildAgentLoginInfoURI(const LLUUID& agent_id, const std::string& dataserver); - static LLURI buildInventoryHostURI(const LLUUID& agent_id, LLApp* app); - static LLURI buildAgentNameURI(const LLUUID& agent_id, LLApp* app); + // *NOTE: DEPRECATED. use the service builder instead. + //static LLURI buildBulkAgentNamesURI(LLApp* app); + //static LLURI buildAgentSessionURI(const LLUUID& agent_id, LLApp* app); + //static LLURI buildAgentLoginInfoURI(const LLUUID& agent_id, const std::string& dataserver); + //static LLURI buildAgentNameURI(const LLUUID& agent_id, LLApp* app); + private: std::string mScheme; std::string mEscapedOpaque; diff --git a/linden/indra/llcommon/lluuidhashmap.h b/linden/indra/llcommon/lluuidhashmap.h index 44cd925..77609e0 100644 --- a/linden/indra/llcommon/lluuidhashmap.h +++ b/linden/indra/llcommon/lluuidhashmap.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -225,7 +226,7 @@ inline S32 LLUUIDHashMap::getLength() const S32 bin; for (bin = 0; bin < 256; bin++) { - LLUUIDHashNode* nodep = &mNodes[bin]; + LLUUIDHashNode* nodep = (LLUUIDHashNode*) &mNodes[bin]; while (nodep) { count += nodep->mCount; @@ -440,6 +441,7 @@ public: ~LLUUIDHashMapIter(); + inline void reset(); inline void first(); inline void next(); inline BOOL done() const; @@ -479,10 +481,17 @@ LLUUIDHashMapIter::LLUUIDHashMapIter(LLUUIDHashMap LLUUIDHashMapIter::~LLUUIDHashMapIter() { + reset(); +} + +template +inline void LLUUIDHashMapIter::reset() +{ if (mCurHashNodep) { // We're partway through an iteration, we can clean up now mHashMapp->mIterCount--; + mCurHashNodep = NULL; } } diff --git a/linden/indra/llcommon/llversion.h b/linden/indra/llcommon/llversion.h index a3e5152..426eff0 100644 --- a/linden/indra/llcommon/llversion.h +++ b/linden/indra/llcommon/llversion.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -28,14 +29,9 @@ #ifndef LL_LLVERSION_H #define LL_LLVERSION_H -// Branch "release" - -// MUST ALSO change version number in secondlife setup.nsi const S32 LL_VERSION_MAJOR = 1; -const S32 LL_VERSION_MINOR = 14; +const S32 LL_VERSION_MINOR = 15; const S32 LL_VERSION_PATCH = 0; -const S32 LL_VERSION_BUILD = 0; - - +const S32 LL_VERSION_BUILD = 2; #endif diff --git a/linden/indra/llcommon/llworkerthread.cpp b/linden/indra/llcommon/llworkerthread.cpp index 4f99393..aa0bedf 100644 --- a/linden/indra/llcommon/llworkerthread.cpp +++ b/linden/indra/llcommon/llworkerthread.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/llworkerthread.h b/linden/indra/llcommon/llworkerthread.h index 17b7e7b..278f8e0 100644 --- a/linden/indra/llcommon/llworkerthread.h +++ b/linden/indra/llcommon/llworkerthread.h @@ -3,6 +3,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -90,7 +91,7 @@ public: handle_t addWorkRequest(LLWorkerClass* workerclass, S32 param, U32 priority = PRIORITY_NORMAL); void deleteWorker(LLWorkerClass* workerclass); // schedule for deletion - S32 getNumDeletes() { return mDeleteList.size(); } // debug + S32 getNumDeletes() { return (S32)mDeleteList.size(); } // debug }; //============================================================================ diff --git a/linden/indra/llcommon/metaclass.cpp b/linden/indra/llcommon/metaclass.cpp index f83a044..251795e 100644 --- a/linden/indra/llcommon/metaclass.cpp +++ b/linden/indra/llcommon/metaclass.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/metaclass.h b/linden/indra/llcommon/metaclass.h index 091f83c..1e255b0 100644 --- a/linden/indra/llcommon/metaclass.h +++ b/linden/indra/llcommon/metaclass.h @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/metaclasst.h b/linden/indra/llcommon/metaclasst.h index 81748b9..5a110ba 100644 --- a/linden/indra/llcommon/metaclasst.h +++ b/linden/indra/llcommon/metaclasst.h @@ -3,6 +3,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/metaproperty.cpp b/linden/indra/llcommon/metaproperty.cpp index 312dd9d..23ed7d9 100644 --- a/linden/indra/llcommon/metaproperty.cpp +++ b/linden/indra/llcommon/metaproperty.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/metaproperty.h b/linden/indra/llcommon/metaproperty.h index 08e9c59..d8272fe 100644 --- a/linden/indra/llcommon/metaproperty.h +++ b/linden/indra/llcommon/metaproperty.h @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/metapropertyt.h b/linden/indra/llcommon/metapropertyt.h index 6633975..1b444bd 100644 --- a/linden/indra/llcommon/metapropertyt.h +++ b/linden/indra/llcommon/metapropertyt.h @@ -3,6 +3,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/processor.h b/linden/indra/llcommon/processor.h index 6a2cdcb..367d540 100644 --- a/linden/indra/llcommon/processor.h +++ b/linden/indra/llcommon/processor.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007 Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/reflective.cpp b/linden/indra/llcommon/reflective.cpp index 5c6eff7..7c07d88 100644 --- a/linden/indra/llcommon/reflective.cpp +++ b/linden/indra/llcommon/reflective.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/reflective.h b/linden/indra/llcommon/reflective.h index ca698b1..10cecb0 100644 --- a/linden/indra/llcommon/reflective.h +++ b/linden/indra/llcommon/reflective.h @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/reflectivet.h b/linden/indra/llcommon/reflectivet.h index 698f057..e81d76a 100644 --- a/linden/indra/llcommon/reflectivet.h +++ b/linden/indra/llcommon/reflectivet.h @@ -3,6 +3,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/roles_constants.h b/linden/indra/llcommon/roles_constants.h index c30048c..3c885ab 100644 --- a/linden/indra/llcommon/roles_constants.h +++ b/linden/indra/llcommon/roles_constants.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/stdenums.h b/linden/indra/llcommon/stdenums.h index edd9048..b910570 100644 --- a/linden/indra/llcommon/stdenums.h +++ b/linden/indra/llcommon/stdenums.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/stdtypes.h b/linden/indra/llcommon/stdtypes.h index 43f180c..16b57fa 100644 --- a/linden/indra/llcommon/stdtypes.h +++ b/linden/indra/llcommon/stdtypes.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/string_table.h b/linden/indra/llcommon/string_table.h index 3af586d..790741d 100644 --- a/linden/indra/llcommon/string_table.h +++ b/linden/indra/llcommon/string_table.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007 Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/timer.h b/linden/indra/llcommon/timer.h index 06c9013..31e6db6 100644 --- a/linden/indra/llcommon/timer.h +++ b/linden/indra/llcommon/timer.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007 Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/timing.cpp b/linden/indra/llcommon/timing.cpp index 0915c85..342bf19 100644 --- a/linden/indra/llcommon/timing.cpp +++ b/linden/indra/llcommon/timing.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007 Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/timing.h b/linden/indra/llcommon/timing.h index e6cc2d1..662d22b 100644 --- a/linden/indra/llcommon/timing.h +++ b/linden/indra/llcommon/timing.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/u64.cpp b/linden/indra/llcommon/u64.cpp index 744e0ab..204c6c8 100644 --- a/linden/indra/llcommon/u64.cpp +++ b/linden/indra/llcommon/u64.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llcommon/u64.h b/linden/indra/llcommon/u64.h index e2a751e..da83e28 100644 --- a/linden/indra/llcommon/u64.h +++ b/linden/indra/llcommon/u64.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llimage/llimage.cpp b/linden/indra/llimage/llimage.cpp index eb4ff46..a7d8bdd 100644 --- a/linden/indra/llimage/llimage.cpp +++ b/linden/indra/llimage/llimage.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llimage/llimage.h b/linden/indra/llimage/llimage.h index ef5496e..489fb27 100644 --- a/linden/indra/llimage/llimage.h +++ b/linden/indra/llimage/llimage.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llimage/llimagebmp.cpp b/linden/indra/llimage/llimagebmp.cpp index e8cada5..eaed63d 100644 --- a/linden/indra/llimage/llimagebmp.cpp +++ b/linden/indra/llimage/llimagebmp.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llimage/llimagebmp.h b/linden/indra/llimage/llimagebmp.h index 43724f2..556b4a2 100644 --- a/linden/indra/llimage/llimagebmp.h +++ b/linden/indra/llimage/llimagebmp.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llimage/llimagedxt.cpp b/linden/indra/llimage/llimagedxt.cpp index 6676366..22d7557 100644 --- a/linden/indra/llimage/llimagedxt.cpp +++ b/linden/indra/llimage/llimagedxt.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -295,7 +296,10 @@ BOOL LLImageDXT::getMipData(LLPointer& raw, S32 discard) llerrs << "Request for invalid discard level" << llendl; } U8* data = getData() + getMipOffset(discard); - S32 width, height; + // I'm not sure these are the correct initial values for height and width, + // but previously they were being used uninitialized. JC + S32 width = raw->getWidth(); + S32 height = raw->getHeight(); calcDiscardWidthHeight(discard, mFileFormat, width, height); raw = new LLImageRaw(data, width, height, getComponents()); return TRUE; diff --git a/linden/indra/llimage/llimagedxt.h b/linden/indra/llimage/llimagedxt.h index 936258a..c52c866 100644 --- a/linden/indra/llimage/llimagedxt.h +++ b/linden/indra/llimage/llimagedxt.h @@ -3,6 +3,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llimage/llimagej2c.cpp b/linden/indra/llimage/llimagej2c.cpp index 51d9522..b116027 100644 --- a/linden/indra/llimage/llimagej2c.cpp +++ b/linden/indra/llimage/llimagej2c.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llimage/llimagej2c.h b/linden/indra/llimage/llimagej2c.h index 24a1429..63ebe38 100644 --- a/linden/indra/llimage/llimagej2c.h +++ b/linden/indra/llimage/llimagej2c.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llimage/llimagejpeg.cpp b/linden/indra/llimage/llimagejpeg.cpp index fdfcc16..4ceecdf 100644 --- a/linden/indra/llimage/llimagejpeg.cpp +++ b/linden/indra/llimage/llimagejpeg.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llimage/llimagejpeg.h b/linden/indra/llimage/llimagejpeg.h index 8f8e7bb..aca780d 100644 --- a/linden/indra/llimage/llimagejpeg.h +++ b/linden/indra/llimage/llimagejpeg.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -33,7 +34,6 @@ #include "llimage.h" extern "C" { -#include "jpeglib/jinclude.h" #include "jpeglib/jpeglib.h" #include "jpeglib/jerror.h" } diff --git a/linden/indra/llimage/llimagetga.cpp b/linden/indra/llimage/llimagetga.cpp index d5d60de..39da50a 100644 --- a/linden/indra/llimage/llimagetga.cpp +++ b/linden/indra/llimage/llimagetga.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llimage/llimagetga.h b/linden/indra/llimage/llimagetga.h index 9575b4d..d4d56d0 100644 --- a/linden/indra/llimage/llimagetga.h +++ b/linden/indra/llimage/llimagetga.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llimage/llimageworker.cpp b/linden/indra/llimage/llimageworker.cpp index 4550848..c28f80c 100644 --- a/linden/indra/llimage/llimageworker.cpp +++ b/linden/indra/llimage/llimageworker.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llimage/llimageworker.h b/linden/indra/llimage/llimageworker.h index a39d21a..8026cbb 100644 --- a/linden/indra/llimage/llimageworker.h +++ b/linden/indra/llimage/llimageworker.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llimage/llmapimagetype.h b/linden/indra/llimage/llmapimagetype.h index 1f83b71..690d3ec 100644 --- a/linden/indra/llimage/llmapimagetype.h +++ b/linden/indra/llimage/llmapimagetype.h @@ -3,6 +3,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llimagej2coj/llimagej2coj.cpp b/linden/indra/llimagej2coj/llimagej2coj.cpp index 307f952..9366a62 100644 --- a/linden/indra/llimagej2coj/llimagej2coj.cpp +++ b/linden/indra/llimagej2coj/llimagej2coj.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -49,22 +50,23 @@ void fallbackDestroyLLImageJ2CImpl(LLImageJ2CImpl* impl) /** sample error callback expecting a FILE* client object */ -void error_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); +void error_callback(const char* msg, void*) +{ + lldebugs << "LLImageJ2CImpl error_callback: " << msg << llendl; } /** sample warning callback expecting a FILE* client object */ -void warning_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); +void warning_callback(const char* msg, void*) +{ + lldebugs << "LLImageJ2CImpl warning_callback: " << msg << llendl; } /** sample debug callback expecting no client object */ -void info_callback(const char *msg, void *client_data) { - fprintf(stdout, "[INFO] %s", msg); +void info_callback(const char* msg, void*) +{ + lldebugs << "LLImageJ2CImpl info_callback: " << msg << llendl; } @@ -289,9 +291,10 @@ BOOL LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, con /* encode the image */ bool bSuccess = opj_encode(cinfo, cio, image, parameters.index); - if (!bSuccess) { + if (!bSuccess) + { opj_cio_close(cio); - fprintf(stderr, "failed to encode image\n"); + llinfos << "Failed to encode image." << llendl; return FALSE; } codestream_length = cio_tell(cio); diff --git a/linden/indra/llimagej2coj/llimagej2coj.h b/linden/indra/llimagej2coj/llimagej2coj.h index c3e3d52..822ebc2 100644 --- a/linden/indra/llimagej2coj/llimagej2coj.h +++ b/linden/indra/llimagej2coj/llimagej2coj.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llinventory/llcategory.cpp b/linden/indra/llinventory/llcategory.cpp index e27733c..93f86f9 100644 --- a/linden/indra/llinventory/llcategory.cpp +++ b/linden/indra/llinventory/llcategory.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llinventory/llcategory.h b/linden/indra/llinventory/llcategory.h index f566987..ed28a7f 100644 --- a/linden/indra/llinventory/llcategory.h +++ b/linden/indra/llinventory/llcategory.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llinventory/lleconomy.cpp b/linden/indra/llinventory/lleconomy.cpp index 2337a3e..837acfe 100644 --- a/linden/indra/llinventory/lleconomy.cpp +++ b/linden/indra/llinventory/lleconomy.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -170,6 +171,11 @@ void LLRegionEconomy::processEconomyData(LLMessageSystem *msg, void** user_data) void LLRegionEconomy::processEconomyDataRequest(LLMessageSystem *msg, void **user_data) { LLRegionEconomy *this_ptr = (LLRegionEconomy*)user_data; + if (!this_ptr->hasData()) + { + llwarns << "Dropping EconomyDataRequest, because EconomyData message " + << "has not been processed" << llendl; + } msg->newMessageFast(_PREHASH_EconomyData); msg->nextBlockFast(_PREHASH_Info); diff --git a/linden/indra/llinventory/lleconomy.h b/linden/indra/llinventory/lleconomy.h index 7690142..b381663 100644 --- a/linden/indra/llinventory/lleconomy.h +++ b/linden/indra/llinventory/lleconomy.h @@ -3,6 +3,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llinventory/llinventory.cpp b/linden/indra/llinventory/llinventory.cpp index c5be7f7..85fc47f 100644 --- a/linden/indra/llinventory/llinventory.cpp +++ b/linden/indra/llinventory/llinventory.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -1101,7 +1102,7 @@ BOOL LLInventoryItem::exportLegacyStream(std::ostream& output_stream, BOOL inclu if(inv_type_str) output_stream << "\t\tinv_type\t" << inv_type_str << "\n"; char buffer[32]; /* Flawfinder: ignore */ - snprintf(buffer, sizeof(buffer), "\t\tflags\t%08x\n", mFlags); /* Flawfinder: ignore */ + snprintf(buffer, sizeof(buffer), "\t\tflags\t%08x\n", mFlags); /* Flawfinder: ignore */ output_stream << buffer; mSaleInfo.exportLegacyStream(output_stream); output_stream << "\t\tname\t" << mName.c_str() << "|\n"; @@ -1791,7 +1792,17 @@ LLPointer ll_create_item_from_sd(const LLSD& sd_item) rv->rename(sd_item[INV_NAME_LABEL].asString()); rv->setType( LLAssetType::lookup(sd_item[INV_ASSET_TYPE_LABEL].asString().c_str())); - rv->setAssetUUID(sd_item[INV_ASSET_ID_LABEL].asUUID()); + if (sd_item.has("shadow_id")) + { + LLUUID asset_id = sd_item["shadow_id"]; + LLXORCipher cipher(MAGIC_ID.mData, UUID_BYTES); + cipher.decrypt(asset_id.mData, UUID_BYTES); + rv->setAssetUUID(asset_id); + } + if (sd_item.has(INV_ASSET_ID_LABEL)) + { + rv->setAssetUUID(sd_item[INV_ASSET_ID_LABEL].asUUID()); + } rv->setDescription(sd_item[INV_DESC_LABEL].asString()); rv->setSaleInfo(ll_sale_info_from_sd(sd_item[INV_SALE_INFO_LABEL])); rv->setPermissions(ll_permissions_from_sd(sd_item[INV_PERMISSIONS_LABEL])); diff --git a/linden/indra/llinventory/llinventory.h b/linden/indra/llinventory/llinventory.h index fc135de..6e64412 100644 --- a/linden/indra/llinventory/llinventory.h +++ b/linden/indra/llinventory/llinventory.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -214,6 +215,10 @@ public: II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE = 0x080000, II_FLAGS_OBJECT_PERM_OVERWRITE_NEXT_OWNER = 0x100000, + // flag to indicate whether an object that is returned is composed + // of muiltiple items or not. + II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS = 0x200000, + // wearables use the low order byte of flags to store the // EWearableType enumeration found in newview/llwearable.h }; diff --git a/linden/indra/llinventory/lllandmark.cpp b/linden/indra/llinventory/lllandmark.cpp index c153d68..ae7a991 100644 --- a/linden/indra/llinventory/lllandmark.cpp +++ b/linden/indra/llinventory/lllandmark.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llinventory/lllandmark.h b/linden/indra/llinventory/lllandmark.h index eea0600..69c377a 100644 --- a/linden/indra/llinventory/lllandmark.h +++ b/linden/indra/llinventory/lllandmark.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llinventory/llnotecard.cpp b/linden/indra/llinventory/llnotecard.cpp index d40cabb..47dd690 100644 --- a/linden/indra/llinventory/llnotecard.cpp +++ b/linden/indra/llinventory/llnotecard.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llinventory/llnotecard.h b/linden/indra/llinventory/llnotecard.h index 511d779..3d89c7a 100644 --- a/linden/indra/llinventory/llnotecard.h +++ b/linden/indra/llinventory/llnotecard.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llinventory/llparcel.cpp b/linden/indra/llinventory/llparcel.cpp index b4faf7c..c37a4d6 100644 --- a/linden/indra/llinventory/llparcel.cpp +++ b/linden/indra/llinventory/llparcel.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -192,7 +193,6 @@ void LLParcel::init(const LLUUID &owner_id, mRecordTransaction = FALSE; mAuctionID = 0; - mIsReservedForNewbie = FALSE; mInEscrow = false; mParcelFlags = PF_DEFAULT; @@ -652,10 +652,6 @@ BOOL LLParcel::importStream(std::istream& input_stream) { LLString::convertToU32(value, mAuctionID); } - else if("reserved_newbie" == keyword) - { - LLString::convertToBOOL(value, mIsReservedForNewbie); - } else if ("allow_modify" == keyword) { LLString::convertToU32(value, setting); @@ -1090,10 +1086,6 @@ BOOL LLParcel::exportStream(std::ostream& output_stream) { output_stream << "\t\t auction_id " << mAuctionID << "\n"; } - if(mIsReservedForNewbie) - { - output_stream << "\t\t reserved_newbie " << mIsReservedForNewbie << "\n"; - } output_stream << "\t\t allow_modify " << getAllowModify() << "\n"; output_stream << "\t\t allow_group_modify " << getAllowGroupModify() << "\n"; @@ -1634,7 +1626,6 @@ void LLParcel::expireSale(U32& type, U8& flags, LLUUID& from_id, LLUUID& to_id) setSellWithObjects(FALSE); type = TRANS_LAND_RELEASE; mStatus = OS_NONE; - mIsReservedForNewbie = FALSE; flags = pack_transaction_flags(mGroupOwned, FALSE); mAuthBuyerID.setNull(); from_id = mOwnerID; @@ -1652,7 +1643,6 @@ void LLParcel::completeSale(U32& type, U8& flags, flags = pack_transaction_flags(mGroupOwned, mGroupOwned); to_id = mOwnerID; mAuthBuyerID.setNull(); - mIsReservedForNewbie = FALSE; // Purchased parcels are assumed to no longer be for sale. // Otherwise someone can snipe the sale. @@ -1685,7 +1675,6 @@ void LLParcel::clearSale() setPreviousOwnerID(LLUUID::null); setPreviouslyGroupOwned(FALSE); setSellWithObjects(FALSE); - mIsReservedForNewbie = FALSE; } BOOL LLParcel::isPublic() const @@ -1719,7 +1708,6 @@ void LLParcel::clearParcel() setUserLookAt(LLVector3::x_axis); setLandingType(L_LANDING_POINT); setAuctionID(0); - setReservedForNewbie(FALSE); setGroupID(LLUUID::null); setPassPrice(0); setPassHours(0.f); diff --git a/linden/indra/llinventory/llparcel.h b/linden/indra/llinventory/llparcel.h index 54936e2..29e393a 100644 --- a/linden/indra/llinventory/llparcel.h +++ b/linden/indra/llinventory/llparcel.h @@ -3,6 +3,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -209,7 +210,6 @@ public: void setLandingType(const ELandingType type) { mLandingType = type; } void setAuctionID(U32 auction_id) { mAuctionID = auction_id;} - void setReservedForNewbie(BOOL reserve) { mIsReservedForNewbie = reserve; } void setAllParcelFlags(U32 flags) { mParcelFlags = flags; } void setParcelFlag(U32 flag, BOOL b); @@ -290,7 +290,6 @@ public: BOOL getIsGroupOwned() const { return mGroupOwned; } U32 getAuctionID() { return mAuctionID; } - BOOL getReservedForNewbie() { return mIsReservedForNewbie; } bool isInEscrow() const { return mInEscrow; } BOOL isPublic() const; @@ -537,9 +536,6 @@ protected: // the parcel. U32 mAuctionID; - // This value is TRUE if the land is reserved for a newbie. - BOOL mIsReservedForNewbie; - // value used to temporarily lock attempts to purchase the parcel. bool mInEscrow; diff --git a/linden/indra/llinventory/llparcelflags.h b/linden/indra/llinventory/llparcelflags.h index 66158d8..17d9151 100644 --- a/linden/indra/llinventory/llparcelflags.h +++ b/linden/indra/llinventory/llparcelflags.h @@ -3,6 +3,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llinventory/llpermissions.cpp b/linden/indra/llinventory/llpermissions.cpp index 0788ec6..86ab57c 100644 --- a/linden/indra/llinventory/llpermissions.cpp +++ b/linden/indra/llinventory/llpermissions.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -757,15 +758,15 @@ BOOL LLPermissions::exportLegacyStream(std::ostream& output_stream) const output_stream << "\t{\n"; char buffer[256]; /* Flawfinder: ignore */ - snprintf(buffer, sizeof(buffer), "\t\tbase_mask\t%08x\n", mMaskBase); /* Flawfinder: ignore */ + snprintf(buffer, sizeof(buffer), "\t\tbase_mask\t%08x\n", mMaskBase); /* Flawfinder: ignore */ output_stream << buffer; - snprintf(buffer, sizeof(buffer), "\t\towner_mask\t%08x\n", mMaskOwner); /* Flawfinder: ignore */ + snprintf(buffer, sizeof(buffer), "\t\towner_mask\t%08x\n", mMaskOwner); /* Flawfinder: ignore */ output_stream << buffer; - snprintf(buffer, sizeof(buffer), "\t\tgroup_mask\t%08x\n", mMaskGroup); /* Flawfinder: ignore */ + snprintf(buffer, sizeof(buffer), "\t\tgroup_mask\t%08x\n", mMaskGroup); /* Flawfinder: ignore */ output_stream << buffer; - snprintf(buffer, sizeof(buffer), "\t\teveryone_mask\t%08x\n", mMaskEveryone); /* Flawfinder: ignore */ + snprintf(buffer, sizeof(buffer), "\t\teveryone_mask\t%08x\n", mMaskEveryone); /* Flawfinder: ignore */ output_stream << buffer; - snprintf(buffer, sizeof(buffer), "\t\tnext_owner_mask\t%08x\n", mMaskNextOwner); /* Flawfinder: ignore */ + snprintf(buffer, sizeof(buffer), "\t\tnext_owner_mask\t%08x\n", mMaskNextOwner); /* Flawfinder: ignore */ output_stream << buffer; mCreator.toString(uuid_str); diff --git a/linden/indra/llinventory/llpermissions.h b/linden/indra/llinventory/llpermissions.h index d8a6b0a..608f4b2 100644 --- a/linden/indra/llinventory/llpermissions.h +++ b/linden/indra/llinventory/llpermissions.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llinventory/llpermissionsflags.h b/linden/indra/llinventory/llpermissionsflags.h index 2af16fb..72778be 100644 --- a/linden/indra/llinventory/llpermissionsflags.h +++ b/linden/indra/llinventory/llpermissionsflags.h @@ -3,6 +3,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llinventory/llsaleinfo.cpp b/linden/indra/llinventory/llsaleinfo.cpp index 28801e5..9364529 100644 --- a/linden/indra/llinventory/llsaleinfo.cpp +++ b/linden/indra/llinventory/llsaleinfo.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llinventory/llsaleinfo.h b/linden/indra/llinventory/llsaleinfo.h index 5e80108..fd6429e 100644 --- a/linden/indra/llinventory/llsaleinfo.h +++ b/linden/indra/llinventory/llsaleinfo.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llinventory/lltransactionflags.cpp b/linden/indra/llinventory/lltransactionflags.cpp index 16d6101..ffd3271 100644 --- a/linden/indra/llinventory/lltransactionflags.cpp +++ b/linden/indra/llinventory/lltransactionflags.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llinventory/lltransactionflags.h b/linden/indra/llinventory/lltransactionflags.h index ed47995..3675074 100644 --- a/linden/indra/llinventory/lltransactionflags.h +++ b/linden/indra/llinventory/lltransactionflags.h @@ -3,6 +3,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llinventory/lltransactiontypes.h b/linden/indra/llinventory/lltransactiontypes.h index 345fe89..49ba6aa 100644 --- a/linden/indra/llinventory/lltransactiontypes.h +++ b/linden/indra/llinventory/lltransactiontypes.h @@ -3,6 +3,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llinventory/lluserrelations.cpp b/linden/indra/llinventory/lluserrelations.cpp index e9248c3..fc8e510 100644 --- a/linden/indra/llinventory/lluserrelations.cpp +++ b/linden/indra/llinventory/lluserrelations.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llinventory/lluserrelations.h b/linden/indra/llinventory/lluserrelations.h index 9363ab5..430dc43 100644 --- a/linden/indra/llinventory/lluserrelations.h +++ b/linden/indra/llinventory/lluserrelations.h @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/camera.h b/linden/indra/llmath/camera.h index e9963e9..3aa86d5 100644 --- a/linden/indra/llmath/camera.h +++ b/linden/indra/llmath/camera.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007 Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/coordframe.h b/linden/indra/llmath/coordframe.h index 81d630e..611387d 100644 --- a/linden/indra/llmath/coordframe.h +++ b/linden/indra/llmath/coordframe.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007 Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/llbboxlocal.cpp b/linden/indra/llmath/llbboxlocal.cpp index b197241..505c7e6 100644 --- a/linden/indra/llmath/llbboxlocal.cpp +++ b/linden/indra/llmath/llbboxlocal.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/llbboxlocal.h b/linden/indra/llmath/llbboxlocal.h index cb71a4f..4fdc01f 100644 --- a/linden/indra/llmath/llbboxlocal.h +++ b/linden/indra/llmath/llbboxlocal.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/llcamera.cpp b/linden/indra/llmath/llcamera.cpp index bc13c90..2197066 100644 --- a/linden/indra/llmath/llcamera.cpp +++ b/linden/indra/llmath/llcamera.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/llcamera.h b/linden/indra/llmath/llcamera.h index 82b6130..b5f78f4 100644 --- a/linden/indra/llmath/llcamera.h +++ b/linden/indra/llmath/llcamera.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/llcoord.h b/linden/indra/llmath/llcoord.h index 6aa6b64..a1ed130 100644 --- a/linden/indra/llmath/llcoord.h +++ b/linden/indra/llmath/llcoord.h @@ -3,6 +3,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/llcoordframe.cpp b/linden/indra/llmath/llcoordframe.cpp index c7d18bb..1650dd2 100644 --- a/linden/indra/llmath/llcoordframe.cpp +++ b/linden/indra/llmath/llcoordframe.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/llcoordframe.h b/linden/indra/llmath/llcoordframe.h index d15f3e5..2777cbe 100644 --- a/linden/indra/llmath/llcoordframe.h +++ b/linden/indra/llmath/llcoordframe.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/llcrc.cpp b/linden/indra/llmath/llcrc.cpp index 1c0aa5d..cc0f955 100644 --- a/linden/indra/llmath/llcrc.cpp +++ b/linden/indra/llmath/llcrc.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/llcrc.h b/linden/indra/llmath/llcrc.h index 7c267d6..06ddac2 100644 --- a/linden/indra/llmath/llcrc.h +++ b/linden/indra/llmath/llcrc.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/llinterp.h b/linden/indra/llmath/llinterp.h index 3cc0b18..724fb31 100644 --- a/linden/indra/llmath/llinterp.h +++ b/linden/indra/llmath/llinterp.h @@ -3,6 +3,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/llmath.h b/linden/indra/llmath/llmath.h index 7009557..dbd825d 100644 --- a/linden/indra/llmath/llmath.h +++ b/linden/indra/llmath/llmath.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/llmath.vcproj b/linden/indra/llmath/llmath.vcproj index 82feb25..4876065 100644 --- a/linden/indra/llmath/llmath.vcproj +++ b/linden/indra/llmath/llmath.vcproj @@ -224,9 +224,6 @@ Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> - - + + 0.01f) + if (t_fraction > 0.0001f) { LLVector3 new_pt = lerp(pt1, pt2, t_fraction); F32 pt_x = new_pt.mV[VX]; diff --git a/linden/indra/llmath/llvolume.h b/linden/indra/llmath/llvolume.h index 91f7c9b..7137346 100644 --- a/linden/indra/llmath/llvolume.h +++ b/linden/indra/llmath/llvolume.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -61,12 +62,12 @@ const S32 MAX_LOD = 3; const F32 MIN_VOLUME_PROFILE_WIDTH = 0.05f; const F32 MIN_VOLUME_PATH_WIDTH = 0.05f; -const F32 CUT_QUANTA = 0.005f; -const F32 SCALE_QUANTA = 0.01f; -const F32 SHEAR_QUANTA = 0.01f; -const F32 TAPER_QUANTA = 0.01f; -const F32 REV_QUANTA = 0.015f; - +const F32 CUT_QUANTA = 0.00002f; +const F32 SCALE_QUANTA = 0.01f; +const F32 SHEAR_QUANTA = 0.01f; +const F32 TAPER_QUANTA = 0.01f; +const F32 REV_QUANTA = 0.015f; +const F32 HOLLOW_QUANTA = 0.00002f; //============================================================================ @@ -184,7 +185,7 @@ public: { } - LLProfileParams(U8 curve, U8 begin, U8 end, U8 hollow) + LLProfileParams(U8 curve, U16 begin, U16 end, U16 hollow) { mCurveType = curve; F32 temp_f32 = begin * CUT_QUANTA; @@ -199,7 +200,7 @@ public: temp_f32 = 1.f; } mEnd = 1.f - temp_f32; - temp_f32 = hollow * SCALE_QUANTA; + temp_f32 = hollow * HOLLOW_QUANTA; if (temp_f32 > 1.f) { temp_f32 = 1.f; @@ -229,9 +230,9 @@ public: const U8& getCurveType () const { return mCurveType; } void setCurveType(const U32 type) { mCurveType = type;} - void setBegin(const F32 begin) { mBegin = (begin >= 1.0f) ? 0.0f : ((int) (begin * 1000))/1000.0f;} - void setEnd(const F32 end) { mEnd = (end <= 0.0f) ? 1.0f : ((int) (end * 1000))/1000.0f;} - void setHollow(const F32 hollow) { mHollow = ((int) (hollow * 1000))/1000.0f;} + void setBegin(const F32 begin) { mBegin = (begin >= 1.0f) ? 0.0f : ((int) (begin * 100000))/100000.0f;} + void setEnd(const F32 end) { mEnd = (end <= 0.0f) ? 1.0f : ((int) (end * 100000))/100000.0f;} + void setHollow(const F32 hollow) { mHollow = ((int) (hollow * 100000))/100000.0f;} friend std::ostream& operator<<(std::ostream &s, const LLProfileParams &profile_params); @@ -315,11 +316,11 @@ public: mTaper.setVec(tx,ty); } - LLPathParams(U8 curve, U8 begin, U8 end, U8 scx, U8 scy, U8 shx, U8 shy, U8 twistend, U8 twistbegin, U8 radiusoffset, U8 tx, U8 ty, U8 revolutions, U8 skew) + LLPathParams(U8 curve, U16 begin, U16 end, U8 scx, U8 scy, U8 shx, U8 shy, U8 twistend, U8 twistbegin, U8 radiusoffset, U8 tx, U8 ty, U8 revolutions, U8 skew) { mCurveType = curve; - mBegin = (F32)(begin * SCALE_QUANTA); - mEnd = (F32)(100.f - end) * SCALE_QUANTA; + mBegin = (F32)(begin * CUT_QUANTA); + mEnd = (F32)(100.f - end) * CUT_QUANTA; if (mEnd > 1.f) mEnd = 1.f; mScale.setVec((F32) (200 - scx) * SCALE_QUANTA,(F32) (200 - scy) * SCALE_QUANTA); diff --git a/linden/indra/llmath/llvolumemgr.cpp b/linden/indra/llmath/llvolumemgr.cpp index 2aa480c..eac407f 100644 --- a/linden/indra/llmath/llvolumemgr.cpp +++ b/linden/indra/llmath/llvolumemgr.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -297,7 +298,7 @@ F32 LLVolumeLODGroup::dump() } usage = usage / (F32)NUM_LODS; - snprintf(dump_str, sizeof(dump_str), "%.3f %d %d %d %d", usage, mAccessCount[0], mAccessCount[1], mAccessCount[2], mAccessCount[3]); /* Flawfinder: ignore */ + snprintf(dump_str, sizeof(dump_str), "%.3f %d %d %d %d", usage, mAccessCount[0], mAccessCount[1], mAccessCount[2], mAccessCount[3]); /* Flawfinder: ignore */ llinfos << dump_str << llendl; return usage; diff --git a/linden/indra/llmath/llvolumemgr.h b/linden/indra/llmath/llvolumemgr.h index 9cb1f63..aa00c4e 100644 --- a/linden/indra/llmath/llvolumemgr.h +++ b/linden/indra/llmath/llvolumemgr.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/m3math.cpp b/linden/indra/llmath/m3math.cpp index 4d93af6..09a18d2 100644 --- a/linden/indra/llmath/m3math.cpp +++ b/linden/indra/llmath/m3math.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/m3math.h b/linden/indra/llmath/m3math.h index 494856a..94c9b65 100644 --- a/linden/indra/llmath/m3math.h +++ b/linden/indra/llmath/m3math.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/m4math.cpp b/linden/indra/llmath/m4math.cpp index ee7e6f3..b6d91a1 100644 --- a/linden/indra/llmath/m4math.cpp +++ b/linden/indra/llmath/m4math.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -673,31 +674,55 @@ LLVector4 operator*(const LLMatrix4 &a, const LLVector4 &b) } */ +// Operates "to the left" on row-vector a +// +// This used to be in the header file but was not actually inlined in practice. +// When avatar vertex programs are off, this function is a hot spot in profiles +// due to software skinning in LLViewerJointMesh::updateGeometry(). JC +LLVector3 operator*(const LLVector3 &a, const LLMatrix4 &b) +{ + // This is better than making a temporary LLVector3. This eliminates an + // unnecessary LLVector3() constructor and also helps the compiler to + // realize that the output floats do not alias the input floats, hence + // eliminating redundant loads of a.mV[0], etc. JC + return LLVector3(a.mV[VX] * b.mMatrix[VX][VX] + + a.mV[VY] * b.mMatrix[VY][VX] + + a.mV[VZ] * b.mMatrix[VZ][VX] + + b.mMatrix[VW][VX], + + a.mV[VX] * b.mMatrix[VX][VY] + + a.mV[VY] * b.mMatrix[VY][VY] + + a.mV[VZ] * b.mMatrix[VZ][VY] + + b.mMatrix[VW][VY], + + a.mV[VX] * b.mMatrix[VX][VZ] + + a.mV[VY] * b.mMatrix[VY][VZ] + + a.mV[VZ] * b.mMatrix[VZ][VZ] + + b.mMatrix[VW][VZ]); +} LLVector4 operator*(const LLVector4 &a, const LLMatrix4 &b) { // Operate "to the left" on row-vector a - LLVector4 vec; - vec.mV[VX] = a.mV[VX] * b.mMatrix[VX][VX] + - a.mV[VY] * b.mMatrix[VY][VX] + - a.mV[VZ] * b.mMatrix[VZ][VX] + - a.mV[VW] * b.mMatrix[VW][VX]; - - vec.mV[VY] = a.mV[VX] * b.mMatrix[VX][VY] + - a.mV[VY] * b.mMatrix[VY][VY] + - a.mV[VZ] * b.mMatrix[VZ][VY] + - a.mV[VW] * b.mMatrix[VW][VY]; - - vec.mV[VZ] = a.mV[VX] * b.mMatrix[VX][VZ] + - a.mV[VY] * b.mMatrix[VY][VZ] + - a.mV[VZ] * b.mMatrix[VZ][VZ] + - a.mV[VW] * b.mMatrix[VW][VZ]; - - vec.mV[VW] = a.mV[VX] * b.mMatrix[VX][VW] + - a.mV[VY] * b.mMatrix[VY][VW] + - a.mV[VZ] * b.mMatrix[VZ][VW] + - a.mV[VW] * b.mMatrix[VW][VW]; - return vec; + return LLVector4(a.mV[VX] * b.mMatrix[VX][VX] + + a.mV[VY] * b.mMatrix[VY][VX] + + a.mV[VZ] * b.mMatrix[VZ][VX] + + a.mV[VW] * b.mMatrix[VW][VX], + + a.mV[VX] * b.mMatrix[VX][VY] + + a.mV[VY] * b.mMatrix[VY][VY] + + a.mV[VZ] * b.mMatrix[VZ][VY] + + a.mV[VW] * b.mMatrix[VW][VY], + + a.mV[VX] * b.mMatrix[VX][VZ] + + a.mV[VY] * b.mMatrix[VY][VZ] + + a.mV[VZ] * b.mMatrix[VZ][VZ] + + a.mV[VW] * b.mMatrix[VW][VZ], + + a.mV[VX] * b.mMatrix[VX][VW] + + a.mV[VY] * b.mMatrix[VY][VW] + + a.mV[VZ] * b.mMatrix[VZ][VW] + + a.mV[VW] * b.mMatrix[VW][VW]); } LLVector4 rotate_vector(const LLVector4 &a, const LLMatrix4 &b) diff --git a/linden/indra/llmath/m4math.h b/linden/indra/llmath/m4math.h index 7de29ed..24f9f86 100644 --- a/linden/indra/llmath/m4math.h +++ b/linden/indra/llmath/m4math.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -266,27 +267,6 @@ inline const LLMatrix4& LLMatrix4::identity() return (*this); } -inline LLVector3 operator*(const LLVector3 &a, const LLMatrix4 &b) -{ - // Converts a to LLVector4 and applies full transformation - // Operates "to the left" on row-vector a - LLVector3 vec; - vec.mV[VX] = a.mV[VX] * b.mMatrix[VX][VX] + - a.mV[VY] * b.mMatrix[VY][VX] + - a.mV[VZ] * b.mMatrix[VZ][VX] + - b.mMatrix[VW][VX]; - - vec.mV[VY] = a.mV[VX] * b.mMatrix[VX][VY] + - a.mV[VY] * b.mMatrix[VY][VY] + - a.mV[VZ] * b.mMatrix[VZ][VY] + - b.mMatrix[VW][VY]; - - vec.mV[VZ] = a.mV[VX] * b.mMatrix[VX][VZ] + - a.mV[VY] * b.mMatrix[VY][VZ] + - a.mV[VZ] * b.mMatrix[VZ][VZ] + - b.mMatrix[VW][VZ]; - return vec; -} /* inline LLMatrix4 operator*(const LLMatrix4 &a, const LLMatrix4 &b) diff --git a/linden/indra/llmath/raytrace.cpp b/linden/indra/llmath/raytrace.cpp index 64bf616..634542d 100644 --- a/linden/indra/llmath/raytrace.cpp +++ b/linden/indra/llmath/raytrace.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/raytrace.h b/linden/indra/llmath/raytrace.h index 58cca69..f68002f 100644 --- a/linden/indra/llmath/raytrace.h +++ b/linden/indra/llmath/raytrace.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/v2math.cpp b/linden/indra/llmath/v2math.cpp index cee0f73..e41227b 100644 --- a/linden/indra/llmath/v2math.cpp +++ b/linden/indra/llmath/v2math.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/v2math.h b/linden/indra/llmath/v2math.h index c978fc0..bcfe016 100644 --- a/linden/indra/llmath/v2math.h +++ b/linden/indra/llmath/v2math.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/v3color.cpp b/linden/indra/llmath/v3color.cpp index 9428093..5464a0b 100644 --- a/linden/indra/llmath/v3color.cpp +++ b/linden/indra/llmath/v3color.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -61,3 +62,52 @@ std::ostream& operator<<(std::ostream& s, const LLColor3 &a) s << "{ " << a.mV[VX] << ", " << a.mV[VY] << ", " << a.mV[VZ] << " }"; return s; } + +void LLColor3::calcHSL(F32* hue, F32* saturation, F32* luminance) const +{ + F32 var_R = mV[VRED]; + F32 var_G = mV[VGREEN]; + F32 var_B = mV[VBLUE]; + + F32 var_Min = ( var_R < ( var_G < var_B ? var_G : var_B ) ? var_R : ( var_G < var_B ? var_G : var_B ) ); + F32 var_Max = ( var_R > ( var_G > var_B ? var_G : var_B ) ? var_R : ( var_G > var_B ? var_G : var_B ) ); + + F32 del_Max = var_Max - var_Min; + + F32 L = ( var_Max + var_Min ) / 2.0f; + F32 H = 0.0f; + F32 S = 0.0f; + + if ( del_Max == 0.0f ) + { + H = 0.0f; + S = 0.0f; + } + else + { + if ( L < 0.5 ) + S = del_Max / ( var_Max + var_Min ); + else + S = del_Max / ( 2.0f - var_Max - var_Min ); + + F32 del_R = ( ( ( var_Max - var_R ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; + F32 del_G = ( ( ( var_Max - var_G ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; + F32 del_B = ( ( ( var_Max - var_B ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; + + if ( var_R >= var_Max ) + H = del_B - del_G; + else + if ( var_G >= var_Max ) + H = ( 1.0f / 3.0f ) + del_R - del_B; + else + if ( var_B >= var_Max ) + H = ( 2.0f / 3.0f ) + del_G - del_R; + + if ( H < 0.0f ) H += 1.0f; + if ( H > 1.0f ) H -= 1.0f; + } + + if (hue) *hue = H; + if (saturation) *saturation = S; + if (luminance) *luminance = L; +} \ No newline at end of file diff --git a/linden/indra/llmath/v3color.h b/linden/indra/llmath/v3color.h index 06a94db..8f9224d 100644 --- a/linden/indra/llmath/v3color.h +++ b/linden/indra/llmath/v3color.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -71,6 +72,8 @@ public: mV[1] = (F32) sd[1].asReal();; mV[2] = (F32) sd[2].asReal();; } + + void calcHSL(F32* hue, F32* saturation, F32* luminance) const; const LLColor3& setToBlack(); // Clears LLColor3 to (0, 0, 0) const LLColor3& setToWhite(); // Zero LLColor3 to (0, 0, 0) diff --git a/linden/indra/llmath/v3dmath.cpp b/linden/indra/llmath/v3dmath.cpp index 5d3aad0..059f9c6 100644 --- a/linden/indra/llmath/v3dmath.cpp +++ b/linden/indra/llmath/v3dmath.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/v3dmath.h b/linden/indra/llmath/v3dmath.h index da13cc3..c101cc8 100644 --- a/linden/indra/llmath/v3dmath.h +++ b/linden/indra/llmath/v3dmath.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/v3math.cpp b/linden/indra/llmath/v3math.cpp index a97b6d8..f42fe1c 100644 --- a/linden/indra/llmath/v3math.cpp +++ b/linden/indra/llmath/v3math.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/v3math.h b/linden/indra/llmath/v3math.h index e7134eb..bf211e2 100644 --- a/linden/indra/llmath/v3math.h +++ b/linden/indra/llmath/v3math.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/v4color.cpp b/linden/indra/llmath/v4color.cpp index 2732a60..281e5f1 100644 --- a/linden/indra/llmath/v4color.cpp +++ b/linden/indra/llmath/v4color.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -224,6 +225,55 @@ LLColor4 vec3to4(const LLColor3 &vec) return temp; } +void LLColor4::calcHSL(F32* hue, F32* saturation, F32* luminance) const +{ + F32 var_R = mV[VRED]; + F32 var_G = mV[VGREEN]; + F32 var_B = mV[VBLUE]; + + F32 var_Min = ( var_R < ( var_G < var_B ? var_G : var_B ) ? var_R : ( var_G < var_B ? var_G : var_B ) ); + F32 var_Max = ( var_R > ( var_G > var_B ? var_G : var_B ) ? var_R : ( var_G > var_B ? var_G : var_B ) ); + + F32 del_Max = var_Max - var_Min; + + F32 L = ( var_Max + var_Min ) / 2.0f; + F32 H = 0.0f; + F32 S = 0.0f; + + if ( del_Max == 0.0f ) + { + H = 0.0f; + S = 0.0f; + } + else + { + if ( L < 0.5 ) + S = del_Max / ( var_Max + var_Min ); + else + S = del_Max / ( 2.0f - var_Max - var_Min ); + + F32 del_R = ( ( ( var_Max - var_R ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; + F32 del_G = ( ( ( var_Max - var_G ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; + F32 del_B = ( ( ( var_Max - var_B ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; + + if ( var_R >= var_Max ) + H = del_B - del_G; + else + if ( var_G >= var_Max ) + H = ( 1.0f / 3.0f ) + del_R - del_B; + else + if ( var_B >= var_Max ) + H = ( 2.0f / 3.0f ) + del_G - del_R; + + if ( H < 0.0f ) H += 1.0f; + if ( H > 1.0f ) H -= 1.0f; + } + + if (hue) *hue = H; + if (saturation) *saturation = S; + if (luminance) *luminance = L; +} + // static BOOL LLColor4::parseColor(const char* buf, LLColor4* color) { diff --git a/linden/indra/llmath/v4color.h b/linden/indra/llmath/v4color.h index d4130d6..d79b6c8 100644 --- a/linden/indra/llmath/v4color.h +++ b/linden/indra/llmath/v4color.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -73,6 +74,8 @@ class LLColor4 mV[3] = (F32) sd[3].asReal(); } + void calcHSL(F32* hue, F32* saturation, F32* luminance) const; + const LLColor4& setToBlack(); // zero LLColor4 to (0, 0, 0, 1) const LLColor4& setToWhite(); // zero LLColor4 to (0, 0, 0, 1) diff --git a/linden/indra/llmath/v4coloru.cpp b/linden/indra/llmath/v4coloru.cpp index 848a082..90399b5 100644 --- a/linden/indra/llmath/v4coloru.cpp +++ b/linden/indra/llmath/v4coloru.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/v4coloru.h b/linden/indra/llmath/v4coloru.h index a5124d0..08e723a 100644 --- a/linden/indra/llmath/v4coloru.h +++ b/linden/indra/llmath/v4coloru.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/v4math.cpp b/linden/indra/llmath/v4math.cpp index a4af47d..fa52d95 100644 --- a/linden/indra/llmath/v4math.cpp +++ b/linden/indra/llmath/v4math.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/v4math.h b/linden/indra/llmath/v4math.h index f768ba7..f3c2ccc 100644 --- a/linden/indra/llmath/v4math.h +++ b/linden/indra/llmath/v4math.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -45,7 +46,8 @@ class LLVector4 public: F32 mV[LENGTHOFVECTOR4]; LLVector4(); // Initializes LLVector4 to (0, 0, 0, 1) - explicit LLVector4(const F32 *vec); // Initializes LLVector4 to (vec[0]. vec[1], vec[2], 1) + explicit LLVector4(const F32 *vec); // Initializes LLVector4 to (vec[0]. vec[1], vec[2], vec[3]) + explicit LLVector4(const F64 *vec); // Initialized LLVector4 to ((F32) vec[0], (F32) vec[1], (F32) vec[3], (F32) vec[4]); explicit LLVector4(const LLVector3 &vec); // Initializes LLVector4 to (vec, 1) explicit LLVector4(const LLVector3 &vec, F32 w); // Initializes LLVector4 to (vec, w) LLVector4(F32 x, F32 y, F32 z); // Initializes LLVector4 to (x. y, z, 1) @@ -155,6 +157,14 @@ inline LLVector4::LLVector4(const F32 *vec) mV[VW] = vec[VW]; } +inline LLVector4::LLVector4(const F64 *vec) +{ + mV[VX] = (F32) vec[VX]; + mV[VY] = (F32) vec[VY]; + mV[VZ] = (F32) vec[VZ]; + mV[VW] = (F32) vec[VW]; +} + inline LLVector4::LLVector4(const LLVector3 &vec) { mV[VX] = vec.mV[VX]; diff --git a/linden/indra/llmath/xform.cpp b/linden/indra/llmath/xform.cpp index fc2e060..71c2755 100644 --- a/linden/indra/llmath/xform.cpp +++ b/linden/indra/llmath/xform.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmath/xform.h b/linden/indra/llmath/xform.h index af28e43..605b1b5 100644 --- a/linden/indra/llmath/xform.h +++ b/linden/indra/llmath/xform.h @@ -3,6 +3,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmedia/llmediabase.cpp b/linden/indra/llmedia/llmediabase.cpp index a27fd34..7abf960 100644 --- a/linden/indra/llmedia/llmediabase.cpp +++ b/linden/indra/llmedia/llmediabase.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmedia/llmediabase.h b/linden/indra/llmedia/llmediabase.h index cf16947..f78c7ad 100644 --- a/linden/indra/llmedia/llmediabase.h +++ b/linden/indra/llmedia/llmediabase.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmedia/llmediaemitter.h b/linden/indra/llmedia/llmediaemitter.h index fc68303..0560f16 100644 --- a/linden/indra/llmedia/llmediaemitter.h +++ b/linden/indra/llmedia/llmediaemitter.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmedia/llmediaemitterevents.h b/linden/indra/llmedia/llmediaemitterevents.h index 1a2eb17..632f863 100644 --- a/linden/indra/llmedia/llmediaemitterevents.h +++ b/linden/indra/llmedia/llmediaemitterevents.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmedia/llmediaengine.cpp b/linden/indra/llmedia/llmediaengine.cpp index c8a21ba..34f63b7 100644 --- a/linden/indra/llmedia/llmediaengine.cpp +++ b/linden/indra/llmedia/llmediaengine.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmedia/llmediaengine.h b/linden/indra/llmedia/llmediaengine.h index 0d0db58..775837b 100644 --- a/linden/indra/llmedia/llmediaengine.h +++ b/linden/indra/llmedia/llmediaengine.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmedia/llmediaimplquicktime.cpp b/linden/indra/llmedia/llmediaimplquicktime.cpp index 6489f66..6028d51 100644 --- a/linden/indra/llmedia/llmediaimplquicktime.cpp +++ b/linden/indra/llmedia/llmediaimplquicktime.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmedia/llmediaimplquicktime.h b/linden/indra/llmedia/llmediaimplquicktime.h index 9eb3a04..d564d3a 100644 --- a/linden/indra/llmedia/llmediaimplquicktime.h +++ b/linden/indra/llmedia/llmediaimplquicktime.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmedia/llmediamoviebase.cpp b/linden/indra/llmedia/llmediamoviebase.cpp index b24e7ab..46b76b0 100644 --- a/linden/indra/llmedia/llmediamoviebase.cpp +++ b/linden/indra/llmedia/llmediamoviebase.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmedia/llmediamoviebase.h b/linden/indra/llmedia/llmediamoviebase.h index e9617c0..91c21d8 100644 --- a/linden/indra/llmedia/llmediamoviebase.h +++ b/linden/indra/llmedia/llmediamoviebase.h @@ -5,6 +5,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmedia/llmediaobservers.h b/linden/indra/llmedia/llmediaobservers.h index a604989..c45005d 100644 --- a/linden/indra/llmedia/llmediaobservers.h +++ b/linden/indra/llmedia/llmediaobservers.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/files.lst b/linden/indra/llmessage/files.lst index 2ff3771..456dffe 100644 --- a/linden/indra/llmessage/files.lst +++ b/linden/indra/llmessage/files.lst @@ -14,6 +14,7 @@ llmessage/llhost.cpp llmessage/llhttpassetstorage.cpp llmessage/llhttpclient.cpp llmessage/llhttpnode.cpp +llmessage/llhttpsender.cpp llmessage/llinstantmessage.cpp llmessage/lliobuffer.cpp llmessage/lliohttpserver.cpp @@ -22,6 +23,10 @@ llmessage/lliosocket.cpp llmessage/llioutil.cpp llmessage/lllogtextmessage.cpp llmessage/llmail.cpp +llmessage/llmessagebuilder.cpp +llmessage/llmessageconfig.cpp +llmessage/llmessagereader.cpp +llmessage/llmessagetemplate.cpp llmessage/llmessagethrottle.cpp llmessage/llmime.cpp llmessage/llnamevalue.cpp @@ -32,10 +37,14 @@ llmessage/llpartdata.cpp llmessage/llpumpio.cpp llmessage/llsdappservices.cpp llmessage/llsdhttpserver.cpp -llmessage/llsdmessagesystem.cpp +llmessage/llsdmessagereader.cpp +llmessage/llsdmessagebuilder.cpp llmessage/llsdrpcclient.cpp llmessage/llsdrpcserver.cpp llmessage/llservice.cpp +llmessage/llservicebuilder.cpp +llmessage/lltemplatemessagebuilder.cpp +llmessage/lltemplatemessagereader.cpp llmessage/llthrottle.cpp llmessage/lltransfermanager.cpp llmessage/lltransfersourceasset.cpp diff --git a/linden/indra/llmessage/llassetstorage.cpp b/linden/indra/llmessage/llassetstorage.cpp index a8cd0e5..4f4fc0c 100644 --- a/linden/indra/llmessage/llassetstorage.cpp +++ b/linden/indra/llmessage/llassetstorage.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -434,20 +435,21 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, vo if (callback == tmp->mDownCallback && user_data == tmp->mUserData) { // this is a duplicate from the same subsystem - throw it away - llinfos << "Discarding duplicate request for UUID " << uuid << llendl; + llwarns << "Discarding duplicate request for asset " << uuid + << "." << LLAssetType::lookup(type) << llendl; return; } - else - { - llinfos << "Adding additional non-duplicate request for UUID " << uuid << llendl; - } // this is a duplicate request // queue the request, but don't actually ask for it again duplicate = TRUE; - break; } } + if (duplicate) + { + llinfos << "Adding additional non-duplicate request for asset " << uuid + << "." << LLAssetType::lookup(type) << llendl; + } // This can be overridden by subclasses _queueDataRequest(uuid, type, callback, user_data, duplicate, is_priority); @@ -1272,7 +1274,7 @@ void LLAssetStorage::legacyGetDataCallback(LLVFS *vfs, const LLUUID &uuid, LLAss char uuid_str[UUID_STR_LENGTH]; /* Flawfinder: ignore */ uuid.toString(uuid_str); - snprintf(filename,sizeof(filename),"%s.%s",gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str).c_str(),LLAssetType::lookup(type)); /* Flawfinder: ignore */ + snprintf(filename,sizeof(filename),"%s.%s",gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str).c_str(),LLAssetType::lookup(type)); /* Flawfinder: ignore */ FILE* fp = LLFile::fopen(filename, "wb"); /* Flawfinder: ignore */ if (fp) diff --git a/linden/indra/llmessage/llassetstorage.h b/linden/indra/llmessage/llassetstorage.h index 639ab59..3c7a709 100644 --- a/linden/indra/llmessage/llassetstorage.h +++ b/linden/indra/llmessage/llassetstorage.h @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llblowfishcipher.cpp b/linden/indra/llmessage/llblowfishcipher.cpp index f9a68ab..1772078 100644 --- a/linden/indra/llmessage/llblowfishcipher.cpp +++ b/linden/indra/llmessage/llblowfishcipher.cpp @@ -7,6 +7,7 @@ * * Copyright (c) 2007-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -84,27 +85,33 @@ U32 LLBlowfishCipher::encrypt(const U8* src, U32 src_len, U8* dst, U32 dst_len) << " iv_len " << iv_length << llendl; - int output_len = 0; - if (!EVP_EncryptUpdate(&context, - dst, - &output_len, - src, - src_len)) - { - llwarns << "LLBlowfishCipher::encrypt EVP_EncryptUpdate failure" << llendl; - return 0; - } - - // There may be some final data left to encrypt if the input is - // not an exact multiple of the block size. - int temp_len = 0; - if (!EVP_EncryptFinal_ex(&context, (unsigned char*)(dst + output_len), &temp_len)) - { - llwarns << "LLBlowfishCipher::encrypt EVP_EncryptFinal failure" << llendl; - return 0; - } - output_len += temp_len; - return output_len; + int output_len = 0; + int temp_len = 0; + if (!EVP_EncryptUpdate(&context, + dst, + &output_len, + src, + src_len)) + { + llwarns << "LLBlowfishCipher::encrypt EVP_EncryptUpdate failure" << llendl; + goto ERROR; + } + + // There may be some final data left to encrypt if the input is + // not an exact multiple of the block size. + if (!EVP_EncryptFinal_ex(&context, (unsigned char*)(dst + output_len), &temp_len)) + { + llwarns << "LLBlowfishCipher::encrypt EVP_EncryptFinal failure" << llendl; + goto ERROR; + } + output_len += temp_len; + + EVP_CIPHER_CTX_cleanup(&context); + return output_len; + +ERROR: + EVP_CIPHER_CTX_cleanup(&context); + return 0; } // virtual diff --git a/linden/indra/llmessage/llblowfishcipher.h b/linden/indra/llmessage/llblowfishcipher.h index 2557598..0ba1473 100644 --- a/linden/indra/llmessage/llblowfishcipher.h +++ b/linden/indra/llmessage/llblowfishcipher.h @@ -7,6 +7,7 @@ * * Copyright (c) 2007-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llbuffer.cpp b/linden/indra/llmessage/llbuffer.cpp index 3dd34a0..ad822bc 100644 --- a/linden/indra/llmessage/llbuffer.cpp +++ b/linden/indra/llmessage/llbuffer.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -84,24 +85,44 @@ S32 LLSegment::size() const return mSize; } +bool LLSegment::operator==(const LLSegment& rhs) const +{ + if((mData != rhs.mData)||(mSize != rhs.mSize)||(mChannel != rhs.mChannel)) + { + return false; + } + return true; +} /** * LLHeapBuffer */ -LLHeapBuffer::LLHeapBuffer() +LLHeapBuffer::LLHeapBuffer() : + mBuffer(NULL), + mSize(0), + mNextFree(NULL), + mReclaimedBytes(0) { LLMemType m1(LLMemType::MTYPE_IO_BUFFER); const S32 DEFAULT_HEAP_BUFFER_SIZE = 16384; allocate(DEFAULT_HEAP_BUFFER_SIZE); } -LLHeapBuffer::LLHeapBuffer(S32 size) +LLHeapBuffer::LLHeapBuffer(S32 size) : + mBuffer(NULL), + mSize(0), + mNextFree(NULL), + mReclaimedBytes(0) { LLMemType m1(LLMemType::MTYPE_IO_BUFFER); allocate(size); } -LLHeapBuffer::LLHeapBuffer(const U8* src, S32 len) +LLHeapBuffer::LLHeapBuffer(const U8* src, S32 len) : + mBuffer(NULL), + mSize(0), + mNextFree(NULL), + mReclaimedBytes(0) { LLMemType m1(LLMemType::MTYPE_IO_BUFFER); if((len > 0) && src) @@ -112,12 +133,6 @@ LLHeapBuffer::LLHeapBuffer(const U8* src, S32 len) memcpy(mBuffer, src, len); /*Flawfinder: ignore*/ } } - else - { - mBuffer = NULL; - mSize = 0; - mNextFree = NULL; - } } // virtual @@ -130,11 +145,10 @@ LLHeapBuffer::~LLHeapBuffer() mNextFree = NULL; } -// virtual -//S32 LLHeapBuffer::bytesLeft() const -//{ -// return (mSize - (mNextFree - mBuffer)); -//} +S32 LLHeapBuffer::bytesLeft() const +{ + return (mSize - (mNextFree - mBuffer)); +} // virtual bool LLHeapBuffer::createSegment( @@ -158,9 +172,47 @@ bool LLHeapBuffer::createSegment( return true; } +// virtual +bool LLHeapBuffer::reclaimSegment(const LLSegment& segment) +{ + if(containsSegment(segment)) + { + mReclaimedBytes += segment.size(); + if(mReclaimedBytes == mSize) + { + // We have reclaimed all of the memory from this + // buffer. Therefore, we can reset the mNextFree to the + // start of the buffer, and reset the reclaimed bytes. + mReclaimedBytes = 0; + mNextFree = mBuffer; + } + else if(mReclaimedBytes > mSize) + { + llwarns << "LLHeapBuffer reclaimed more memory than allocated." + << " This is probably programmer error." << llendl; + } + return true; + } + return false; +} + +// virtual +bool LLHeapBuffer::containsSegment(const LLSegment& segment) const +{ + // *NOTE: this check is fairly simple because heap buffers are + // simple contiguous chunks of heap memory. + if((mBuffer > segment.data()) + || ((mBuffer + mSize) < (segment.data() + segment.size()))) + { + return false; + } + return true; +} + void LLHeapBuffer::allocate(S32 size) { LLMemType m1(LLMemType::MTYPE_IO_BUFFER); + mReclaimedBytes = 0; mBuffer = new U8[size]; if(mBuffer) { @@ -199,6 +251,18 @@ LLChannelDescriptors LLBufferArray::nextChannel() return rv; } +S32 LLBufferArray::capacity() const +{ + S32 total = 0; + const_buffer_iterator_t iter = mBuffers.begin(); + const_buffer_iterator_t end = mBuffers.end(); + for(; iter != end; ++iter) + { + total += (*iter)->capacity(); + } + return total; +} + bool LLBufferArray::append(S32 channel, const U8* src, S32 len) { LLMemType m1(LLMemType::MTYPE_IO_BUFFER); @@ -703,14 +767,31 @@ LLBufferArray::segment_iterator_t LLBufferArray::makeSegment( return send; } -bool LLBufferArray::eraseSegment(const segment_iterator_t& iter) +bool LLBufferArray::eraseSegment(const segment_iterator_t& erase_iter) { LLMemType m1(LLMemType::MTYPE_IO_BUFFER); - // *FIX: in theory, we could reclaim the memory. We are leaking a - // bit of buffered memory into an unusable but still referenced - // location. - (void)mSegments.erase(iter); - return true; + + // Find out which buffer contains the segment, and if it is found, + // ask it to reclaim the memory. + bool rv = false; + LLSegment segment(*erase_iter); + buffer_iterator_t iter = mBuffers.begin(); + buffer_iterator_t end = mBuffers.end(); + for(; iter != end; ++iter) + { + // We can safely call reclaimSegment on every buffer, and once + // it returns true, the segment was found. + if((*iter)->reclaimSegment(segment)) + { + rv = true; + break; + } + } + + // No need to get the return value since we are not interested in + // the interator retured by the call. + (void)mSegments.erase(erase_iter); + return rv; } diff --git a/linden/indra/llmessage/llbuffer.h b/linden/indra/llmessage/llbuffer.h index cd76c90..badbc9f 100644 --- a/linden/indra/llmessage/llbuffer.h +++ b/linden/indra/llmessage/llbuffer.h @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -32,7 +33,7 @@ /** * Declaration of classes used for minimizing calls to new[], - * memcpy(), and delete[]. Typically, you would create an LLHeapArray, + * memcpy(), and delete[]. Typically, you would create an LLBufferArray, * feed it data, modify and add segments as you process it, and feed * it to a sink. */ @@ -108,6 +109,16 @@ public: */ S32 size() const; + /** + * @brief Check if two segments are the same. + * + * Two segments are considered equal if they are on the same + * channel and cover the exact same address range. + * @param rhs the segment to compare with this segment. + * @return Returns true if they are equal. + */ + bool operator==(const LLSegment& rhs) const; + protected: S32 mChannel; U8* mData; @@ -145,6 +156,35 @@ public: * @return Returns true if a segment was found. */ virtual bool createSegment(S32 channel, S32 size, LLSegment& segment) = 0; + + /** + * @brief Reclaim a segment from this buffer. + * + * This method is called on a buffer object when a caller is done + * with a contiguous segment of memory inside this buffer. Since + * segments can be cut arbitrarily outside of the control of the + * buffer, this segment may not match any segment returned from + * createSegment(). + * @param segment The contiguous buffer segment to reclaim. + * @return Returns true if the call was successful. + */ + virtual bool reclaimSegment(const LLSegment& segment) = 0; + + /** + * @brief Test if a segment is inside this buffer. + * + * @param segment The contiguous buffer segment to test. + * @return Returns true if the segment is in the bufffer. + */ + virtual bool containsSegment(const LLSegment& segment) const = 0; + + /** + * @brief Return the current number of bytes allocated. + * + * This was implemented as a debugging tool, and it is not + * necessarily a good idea to use it for anything else. + */ + virtual S32 capacity() const = 0; }; /** @@ -186,9 +226,11 @@ public: /** * @brief Get the number of bytes left in the buffer. * + * Note that this is not a virtual function, and only available in + * the LLHeapBuffer as a debugging aid. * @return Returns the number of bytes left. */ - //virtual S32 bytesLeft() const; + S32 bytesLeft() const; /** * @brief Generate a segment for this buffer. @@ -205,10 +247,40 @@ public: */ virtual bool createSegment(S32 channel, S32 size, LLSegment& segment); + /** + * @brief reclaim a segment from this buffer. + * + * This method is called on a buffer object when a caller is done + * with a contiguous segment of memory inside this buffer. Since + * segments can be cut arbitrarily outside of the control of the + * buffer, this segment may not match any segment returned from + * createSegment(). + * This call will fail if the segment passed in is note completely + * inside the buffer, eg, if the segment starts before this buffer + * in memory or ends after it. + * @param segment The contiguous buffer segment to reclaim. + * @return Returns true if the call was successful. + */ + virtual bool reclaimSegment(const LLSegment& segment); + + /** + * @brief Test if a segment is inside this buffer. + * + * @param segment The contiguous buffer segment to test. + * @return Returns true if the segment is in the bufffer. + */ + virtual bool containsSegment(const LLSegment& segment) const; + + /** + * @brief Return the current number of bytes allocated. + */ + virtual S32 capacity() const { return mSize; } + protected: U8* mBuffer; S32 mSize; U8* mNextFree; + S32 mReclaimedBytes; private: /** @@ -223,13 +295,14 @@ private: * @brief Class to represent scattered memory buffers and in-order segments * of that buffered data. * - * NOTE: This class needs to have an iovec interface + * *NOTE: This class needs to have an iovec interface */ class LLBufferArray { public: typedef std::vector buffer_list_t; typedef buffer_list_t::iterator buffer_iterator_t; + typedef buffer_list_t::const_iterator const_buffer_iterator_t; typedef std::list segment_list_t; typedef segment_list_t::const_iterator const_segment_iterator_t; typedef segment_list_t::iterator segment_iterator_t; @@ -260,11 +333,16 @@ public: */ LLChannelDescriptors nextChannel(); //@} - + /* @name Data methods */ //@{ + /** + * @brief Return the sum of all allocated bytes. + */ + S32 capacity() const; + // These methods will be useful once there is any kind of buffer // besides a heap buffer. //bool append(EBufferChannel channel, LLBuffer* data); @@ -294,7 +372,6 @@ public: * new segment is created and put in the front of the array. This * object will internally allocate new buffers if necessary. * @param channel The channel for this data - * @param src The start of memory for the data to be copied * @param len The number of bytes of data to copy * @return Returns true if the method worked. @@ -378,7 +455,7 @@ public: bool takeContents(LLBufferArray& source); //@} - /* @name Segment methods + /* @name Segment methods */ //@{ /** @@ -468,7 +545,7 @@ public: * endSegment() on failure. */ segment_iterator_t makeSegment(S32 channel, S32 length); - + /** * @brief Erase the segment if it is in the buffer array. * diff --git a/linden/indra/llmessage/llbufferstream.cpp b/linden/indra/llmessage/llbufferstream.cpp index 7d899d6..4a4d892 100644 --- a/linden/indra/llmessage/llbufferstream.cpp +++ b/linden/indra/llmessage/llbufferstream.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -62,34 +63,64 @@ int LLBufferStreamBuf::underflow() { return EOF; } - LLSegment segment; - LLBufferArray::segment_iterator_t it; - U8* last_pos = (U8*)gptr(); - if(last_pos) --last_pos; - - LLBufferArray::segment_iterator_t end = mBuffer->endSegment(); - // Get iterator to full segment containing last_pos - // and construct sub-segment starting at last_pos. - // Note: segment may != *it at this point - it = mBuffer->constructSegmentAfter(last_pos, segment); - if(it == end) + LLBufferArray::segment_iterator_t iter; + LLBufferArray::segment_iterator_t end = mBuffer->endSegment(); + U8* last_pos = (U8*)gptr(); + LLSegment segment; + if(last_pos) + { + // Back up into a piece of memory we know that we have + // allocated so that calls for the next segment based on + // 'after' will succeed. + --last_pos; + iter = mBuffer->splitAfter(last_pos); + if(iter != end) + { + // We need to clear the read segment just in case we have + // an early exit in the function and never collect the + // next segment. Calling eraseSegment() with the same + // segment twice is just like double deleting -- nothing + // good comes from it. + mBuffer->eraseSegment(iter++); + if(iter != end) segment = (*iter); + } + else + { + // This should never really happen, but somehow, the + // istream is telling the buf that it just finished + // reading memory that is not in the buf. I think this + // would only happen if there were a bug in the c++ stream + // class. Just bail. + // *TODO: can we set the fail bit on the stream somehow? + return EOF; + } + } + else + { + // Get iterator to full segment containing last_pos + // and construct sub-segment starting at last_pos. + // Note: segment may != *it at this point + iter = mBuffer->constructSegmentAfter(last_pos, segment); + } + if(iter == end) { return EOF; } - + // Iterate through segments to find a non-empty segment on input channel. while((!segment.isOnChannel(mChannels.in()) || (segment.size() == 0))) { - ++it; - if(it == end) + ++iter; + if(iter == end) { return EOF; } - segment = *it; + segment = *(iter); } - + + // set up the stream to read from the next segment. char* start = (char*)segment.data(); setg(start, start, start + segment.size()); return *gptr(); @@ -144,12 +175,43 @@ int LLBufferStreamBuf::sync() return return_value; } + // This chunk of code is not necessary because typically, users of + // the stream will read until EOF. Therefore, underflow was called + // and the segment was discarded before the sync() was called in + // the destructor. Theoretically, we could keep some more data + // around and detect the rare case where an istream was deleted + // before reading to the end, but that will only leave behind some + // unavailable but still referenced memory. Also, if another + // istream is constructed, it will re-read that segment, and then + // discard it. + //U8* last_pos = (U8*)gptr(); + //if(last_pos) + //{ + // // Looks like we read something. Discard what we have read. + // // gptr() actually returns the currrent position, but we call + // // it last_pos because of how it is used in the split call + // // below. + // --last_pos; + // LLBufferArray::segment_iterator_t iter; + // iter = mBuffer->splitAfter(last_pos); + // if(iter != mBuffer->endSegment()) + // { + // // We need to clear the read segment just in case we have + // // an early exit in the function and never collect the + // // next segment. Calling eraseSegment() with the same + // // segment twice is just like double deleting -- nothing + // // good comes from it. + // mBuffer->eraseSegment(iter); + // } + //} + // set the put pointer so that we force an overflow on the next // write. U8* address = (U8*)pptr(); setp(NULL, NULL); - // *NOTE: I bet we could just --address. Need to think about that. + // *NOTE: I bet we could just --address if address is not NULL. + // Need to think about that. address = mBuffer->seek(mChannels.out(), address, -1); if(address) { diff --git a/linden/indra/llmessage/llbufferstream.h b/linden/indra/llmessage/llbufferstream.h index 0a4ad40..5447a80 100644 --- a/linden/indra/llmessage/llbufferstream.h +++ b/linden/indra/llmessage/llbufferstream.h @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llcachename.cpp b/linden/indra/llmessage/llcachename.cpp index e92c72f..5df62b3 100644 --- a/linden/indra/llmessage/llcachename.cpp +++ b/linden/indra/llmessage/llcachename.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llcachename.h b/linden/indra/llmessage/llcachename.h index 9987f11..9009b1f 100644 --- a/linden/indra/llmessage/llcachename.h +++ b/linden/indra/llmessage/llcachename.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llcallbacklisth.h b/linden/indra/llmessage/llcallbacklisth.h index d1cacbd..74dbcc8 100644 --- a/linden/indra/llmessage/llcallbacklisth.h +++ b/linden/indra/llmessage/llcallbacklisth.h @@ -5,6 +5,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llchainio.cpp b/linden/indra/llmessage/llchainio.cpp index 2ca53e0..47352d1 100644 --- a/linden/indra/llmessage/llchainio.cpp +++ b/linden/indra/llmessage/llchainio.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llchainio.h b/linden/indra/llmessage/llchainio.h index c65b3c2..ef2747a 100644 --- a/linden/indra/llmessage/llchainio.h +++ b/linden/indra/llmessage/llchainio.h @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llcipher.h b/linden/indra/llmessage/llcipher.h index c1f88ff..1860277 100644 --- a/linden/indra/llmessage/llcipher.h +++ b/linden/indra/llmessage/llcipher.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llcircuit.cpp b/linden/indra/llmessage/llcircuit.cpp index d73cc22..5e93e0a 100644 --- a/linden/indra/llmessage/llcircuit.cpp +++ b/linden/indra/llmessage/llcircuit.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llcircuit.h b/linden/indra/llmessage/llcircuit.h index 8021685..e3a5779 100644 --- a/linden/indra/llmessage/llcircuit.h +++ b/linden/indra/llmessage/llcircuit.h @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llclassifiedflags.cpp b/linden/indra/llmessage/llclassifiedflags.cpp index 3422802..ed595b1 100644 --- a/linden/indra/llmessage/llclassifiedflags.cpp +++ b/linden/indra/llmessage/llclassifiedflags.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llclassifiedflags.h b/linden/indra/llmessage/llclassifiedflags.h index 7c448a3..a2a93d8 100644 --- a/linden/indra/llmessage/llclassifiedflags.h +++ b/linden/indra/llmessage/llclassifiedflags.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -41,6 +42,8 @@ const U8 CLASSIFIED_QUERY_FILTER_MATURE = 1 << 1; const U8 CLASSIFIED_QUERY_FILTER_ENABLED = 1 << 2; const U8 CLASSIFIED_QUERY_FILTER_PRICE = 1 << 3; +const S32 MAX_CLASSIFIEDS = 100; + ClassifiedFlags pack_classified_flags(BOOL is_mature, BOOL auto_renew); bool is_cf_mature(ClassifiedFlags flags); //bool is_cf_enabled(ClassifiedFlags flags); diff --git a/linden/indra/llmessage/lldatapacker.cpp b/linden/indra/llmessage/lldatapacker.cpp index d4c8704..2448c40 100644 --- a/linden/indra/llmessage/lldatapacker.cpp +++ b/linden/indra/llmessage/lldatapacker.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -557,7 +558,7 @@ void LLDataPackerBinaryBuffer::dumpBufferToLog() S32 cur_line = 0; for (i = 0; i < mBufferSize; i++) { - snprintf(line_buffer + cur_line_pos*3, sizeof(line_buffer) - cur_line_pos*3, "%02x ", mBufferp[i]); /*Flawfinder: ignore*/ + snprintf(line_buffer + cur_line_pos*3, sizeof(line_buffer) - cur_line_pos*3, "%02x ", mBufferp[i]); /* Flawfinder: ignore */ cur_line_pos++; if (cur_line_pos >= 16) { @@ -582,7 +583,7 @@ BOOL LLDataPackerAsciiBuffer::packString(const char *value, const char *name) int numCopied = 0; if (mWriteEnabled) { - numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%s\n", value); /*Flawfinder: ignore*/ + numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%s\n", value); /* Flawfinder: ignore */ } else { @@ -591,14 +592,15 @@ BOOL LLDataPackerAsciiBuffer::packString(const char *value, const char *name) // snprintf returns number of bytes that would have been written // had the output not being truncated. In that case, it will - // return >= passed in size value. so a check needs to be added + // return either -1 or value >= passed in size value . So a check needs to be added // to detect truncation, and if there is any, only account for the // actual number of bytes written..and not what could have been // written. - if (numCopied > getBufferSize()-getCurrentSize()) + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { // *NOTE: I believe we need to mark a failure bit at this point. numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::packString: string truncated: " << value << llendl; } mCurBufferp += numCopied; return success; @@ -626,7 +628,7 @@ BOOL LLDataPackerAsciiBuffer::packBinaryData(const U8 *value, S32 size, const ch int numCopied = 0; if (mWriteEnabled) { - numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%010d ", size); /*Flawfinder: ignore*/ + numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%010d ", size); /* Flawfinder: ignore */ // snprintf returns number of bytes that would have been // written had the output not being truncated. In that case, @@ -634,9 +636,10 @@ BOOL LLDataPackerAsciiBuffer::packBinaryData(const U8 *value, S32 size, const ch // to be added to detect truncation, and if there is any, only // account for the actual number of bytes written..and not // what could have been written. - if (numCopied > getBufferSize()-getCurrentSize()) + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::packBinaryData: number truncated: " << size << llendl; } mCurBufferp += numCopied; @@ -645,10 +648,11 @@ BOOL LLDataPackerAsciiBuffer::packBinaryData(const U8 *value, S32 size, const ch BOOL bBufferFull = FALSE; for (i = 0; i < size && !bBufferFull; i++) { - numCopied = snprintf(mCurBufferp, getBufferSize()-getCurrentSize(), "%02x ", value[i]); /* Flawfinder: ignore */ - if (numCopied > getBufferSize()-getCurrentSize()) + numCopied = snprintf(mCurBufferp, getBufferSize()-getCurrentSize(), "%02x ", value[i]); /* Flawfinder: ignore */ + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::packBinaryData: data truncated: " << llendl; bBufferFull = TRUE; } mCurBufferp += numCopied; @@ -656,10 +660,11 @@ BOOL LLDataPackerAsciiBuffer::packBinaryData(const U8 *value, S32 size, const ch if (!bBufferFull) { - numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(), "\n"); /* Flawfinder: ignore */ - if (numCopied > getBufferSize()-getCurrentSize()) + numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(), "\n"); /* Flawfinder: ignore */ + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::packBinaryData: newline truncated: " << llendl; } mCurBufferp += numCopied; } @@ -717,10 +722,11 @@ BOOL LLDataPackerAsciiBuffer::packBinaryDataFixed(const U8 *value, S32 size, con BOOL bBufferFull = FALSE; for (i = 0; i < size && !bBufferFull; i++) { - numCopied = snprintf(mCurBufferp, getBufferSize()-getCurrentSize(), "%02x ", value[i]); /* Flawfinder: ignore */ - if (numCopied > getBufferSize()-getCurrentSize()) + numCopied = snprintf(mCurBufferp, getBufferSize()-getCurrentSize(), "%02x ", value[i]); /* Flawfinder: ignore */ + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::packBinaryDataFixed: data truncated: " << llendl; bBufferFull = TRUE; } mCurBufferp += numCopied; @@ -728,10 +734,11 @@ BOOL LLDataPackerAsciiBuffer::packBinaryDataFixed(const U8 *value, S32 size, con } if (!bBufferFull) { - numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(), "\n"); /* Flawfinder: ignore */ - if (numCopied > getBufferSize()-getCurrentSize()) + numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(), "\n"); /* Flawfinder: ignore */ + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::packBinaryDataFixed: newline truncated: " << llendl; } mCurBufferp += numCopied; @@ -781,21 +788,24 @@ BOOL LLDataPackerAsciiBuffer::packU8(const U8 value, const char *name) int numCopied = 0; if (mWriteEnabled) { - numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%d\n", value); /*Flawfinder: ignore*/ + numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%d\n", value); /* Flawfinder: ignore */ } else { // just do the write to a temp buffer to get the length - numCopied = snprintf(DUMMY_BUFFER, sizeof(DUMMY_BUFFER), "%d\n", value); /* Flawfinder: ignore */ + numCopied = snprintf(DUMMY_BUFFER, sizeof(DUMMY_BUFFER), "%d\n", value); /* Flawfinder: ignore */ } - // snprintf returns number of bytes that would have been written had the - // output not being truncated. In that case, it will retuen >= passed in size value. - // so a check needs to be added to detect truncation, and if there is any, - // only account for the actual number of bytes written..and not what could have been written. - if (numCopied > getBufferSize()-getCurrentSize()) + // snprintf returns number of bytes that would have been written + // had the output not being truncated. In that case, it will + // return either -1 or value >= passed in size value . So a check needs to be added + // to detect truncation, and if there is any, only account for the + // actual number of bytes written..and not what could have been + // written. + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::packU8: val truncated: " << llendl; } mCurBufferp += numCopied; @@ -826,20 +836,23 @@ BOOL LLDataPackerAsciiBuffer::packU16(const U16 value, const char *name) int numCopied = 0; if (mWriteEnabled) { - numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%d\n", value); /*Flawfinder: ignore*/ + numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%d\n", value); /* Flawfinder: ignore */ } else { - numCopied = snprintf(DUMMY_BUFFER, sizeof(DUMMY_BUFFER), "%d\n", value); /* Flawfinder: ignore */ + numCopied = snprintf(DUMMY_BUFFER, sizeof(DUMMY_BUFFER), "%d\n", value); /* Flawfinder: ignore */ } - // snprintf returns number of bytes that would have been written had the - // output not being truncated. In that case, it will retuen >= passed in size value. - // so a check needs to be added to detect truncation, and if there is any, - // only account for the actual number of bytes written..and not what could have been written. - if (numCopied > getBufferSize()-getCurrentSize()) + // snprintf returns number of bytes that would have been written + // had the output not being truncated. In that case, it will + // return either -1 or value >= passed in size value . So a check needs to be added + // to detect truncation, and if there is any, only account for the + // actual number of bytes written..and not what could have been + // written. + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::packU16: val truncated: " << llendl; } mCurBufferp += numCopied; @@ -871,19 +884,22 @@ BOOL LLDataPackerAsciiBuffer::packU32(const U32 value, const char *name) int numCopied = 0; if (mWriteEnabled) { - numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%u\n", value); /* Flawfinder: ignore */ + numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%u\n", value); /* Flawfinder: ignore */ } else { - numCopied = snprintf(DUMMY_BUFFER, sizeof(DUMMY_BUFFER), "%u\n", value); /* Flawfinder: ignore */ + numCopied = snprintf(DUMMY_BUFFER, sizeof(DUMMY_BUFFER), "%u\n", value); /* Flawfinder: ignore */ } - // snprintf returns number of bytes that would have been written had the - // output not being truncated. In that case, it will retuen >= passed in size value. - // so a check needs to be added to detect truncation, and if there is any, - // only account for the actual number of bytes written..and not what could have been written. - if (numCopied > getBufferSize()-getCurrentSize()) + // snprintf returns number of bytes that would have been written + // had the output not being truncated. In that case, it will + // return either -1 or value >= passed in size value . So a check needs to be added + // to detect truncation, and if there is any, only account for the + // actual number of bytes written..and not what could have been + // written. + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::packU32: val truncated: " << llendl; } mCurBufferp += numCopied; @@ -912,19 +928,22 @@ BOOL LLDataPackerAsciiBuffer::packS32(const S32 value, const char *name) int numCopied = 0; if (mWriteEnabled) { - numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%d\n", value); /* Flawfinder: ignore */ + numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%d\n", value); /* Flawfinder: ignore */ } else { numCopied = snprintf(DUMMY_BUFFER, sizeof(DUMMY_BUFFER), "%d\n", value); /* Flawfinder: ignore */ } - // snprintf returns number of bytes that would have been written had the - // output not being truncated. In that case, it will retuen >= passed in size value. - // so a check needs to be added to detect truncation, and if there is any, - // only account for the actual number of bytes written..and not what could have been written. - if (numCopied > getBufferSize()-getCurrentSize()) + // snprintf returns number of bytes that would have been written + // had the output not being truncated. In that case, it will + // return either -1 or value >= passed in size value . So a check needs to be added + // to detect truncation, and if there is any, only account for the + // actual number of bytes written..and not what could have been + // written. + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::packS32: val truncated: " << llendl; } mCurBufferp += numCopied; @@ -953,19 +972,22 @@ BOOL LLDataPackerAsciiBuffer::packF32(const F32 value, const char *name) int numCopied = 0; if (mWriteEnabled) { - numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%g\n", value); /* Flawfinder: ignore */ + numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%g\n", value); /* Flawfinder: ignore */ } else { - numCopied = snprintf(DUMMY_BUFFER, sizeof(DUMMY_BUFFER), "%g\n", value); /* Flawfinder: ignore */ + numCopied = snprintf(DUMMY_BUFFER, sizeof(DUMMY_BUFFER), "%g\n", value); /* Flawfinder: ignore */ } - // snprintf returns number of bytes that would have been written had the - // output not being truncated. In that case, it will retuen >= passed in size value. - // so a check needs to be added to detect truncation, and if there is any, - // only account for the actual number of bytes written..and not what could have been written. - if (numCopied > getBufferSize()-getCurrentSize()) + // snprintf returns number of bytes that would have been written + // had the output not being truncated. In that case, it will + // return either -1 or value >= passed in size value . So a check needs to be added + // to detect truncation, and if there is any, only account for the + // actual number of bytes written..and not what could have been + // written. + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::packF32: val truncated: " << llendl; } mCurBufferp += numCopied; @@ -994,19 +1016,22 @@ BOOL LLDataPackerAsciiBuffer::packColor4(const LLColor4 &value, const char *name int numCopied = 0; if (mWriteEnabled) { - numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%g %g %g %g\n", value.mV[0], value.mV[1], value.mV[2], value.mV[3]); /* Flawfinder: ignore */ + numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%g %g %g %g\n", value.mV[0], value.mV[1], value.mV[2], value.mV[3]); /* Flawfinder: ignore */ } else { numCopied = snprintf(DUMMY_BUFFER,sizeof(DUMMY_BUFFER),"%g %g %g %g\n", value.mV[0], value.mV[1], value.mV[2], value.mV[3]); /* Flawfinder: ignore */ } - // snprintf returns number of bytes that would have been written had the - // output not being truncated. In that case, it will retuen >= passed in size value. - // so a check needs to be added to detect truncation, and if there is any, - // only account for the actual number of bytes written..and not what could have been written. - if (numCopied > getBufferSize()-getCurrentSize()) + // snprintf returns number of bytes that would have been written + // had the output not being truncated. In that case, it will + // return either -1 or value >= passed in size value . So a check needs to be added + // to detect truncation, and if there is any, only account for the + // actual number of bytes written..and not what could have been + // written. + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::packColor4: truncated: " << llendl; } mCurBufferp += numCopied; @@ -1034,19 +1059,22 @@ BOOL LLDataPackerAsciiBuffer::packColor4U(const LLColor4U &value, const char *na int numCopied = 0; if (mWriteEnabled) { - numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%d %d %d %d\n", value.mV[0], value.mV[1], value.mV[2], value.mV[3]); /* Flawfinder: ignore */ + numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%d %d %d %d\n", value.mV[0], value.mV[1], value.mV[2], value.mV[3]); /* Flawfinder: ignore */ } else { numCopied = snprintf(DUMMY_BUFFER,sizeof(DUMMY_BUFFER),"%d %d %d %d\n", value.mV[0], value.mV[1], value.mV[2], value.mV[3]); /* Flawfinder: ignore */ } - // snprintf returns number of bytes that would have been written had the - // output not being truncated. In that case, it will retuen >= passed in size value. - // so a check needs to be added to detect truncation, and if there is any, - // only account for the actual number of bytes written..and not what could have been written. - if (numCopied > getBufferSize()-getCurrentSize()) + // snprintf returns number of bytes that would have been written + // had the output not being truncated. In that case, it will + // return either -1 or value >= passed in size value . So a check needs to be added + // to detect truncation, and if there is any, only account for the + // actual number of bytes written..and not what could have been + // written. + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::packColor4U: truncated: " << llendl; } mCurBufferp += numCopied; @@ -1085,15 +1113,18 @@ BOOL LLDataPackerAsciiBuffer::packVector2(const LLVector2 &value, const char *na } else { - numCopied = snprintf(DUMMY_BUFFER,sizeof(DUMMY_BUFFER),"%g %g\n", value.mV[0], value.mV[1]); /* Flawfinder: ignore */ + numCopied = snprintf(DUMMY_BUFFER,sizeof(DUMMY_BUFFER),"%g %g\n", value.mV[0], value.mV[1]); /* Flawfinder: ignore */ } - // snprintf returns number of bytes that would have been written had the - // output not being truncated. In that case, it will retuen >= passed in size value. - // so a check needs to be added to detect truncation, and if there is any, - // only account for the actual number of bytes written..and not what could have been written. - if (numCopied > getBufferSize()-getCurrentSize()) + // snprintf returns number of bytes that would have been written + // had the output not being truncated. In that case, it will + // return either -1 or value >= passed in size value . So a check needs to be added + // to detect truncation, and if there is any, only account for the + // actual number of bytes written..and not what could have been + // written. + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::packVector2: truncated: " << llendl; } mCurBufferp += numCopied; @@ -1128,13 +1159,16 @@ BOOL LLDataPackerAsciiBuffer::packVector3(const LLVector3 &value, const char *na { numCopied = snprintf(DUMMY_BUFFER,sizeof(DUMMY_BUFFER),"%g %g %g\n", value.mV[0], value.mV[1], value.mV[2]); /* Flawfinder: ignore */ } - // snprintf returns number of bytes that would have been written had the - // output not being truncated. In that case, it will retuen >= passed in size value. - // so a check needs to be added to detect truncation, and if there is any, - // only account for the actual number of bytes written..and not what could have been written. - if (numCopied > getBufferSize()-getCurrentSize()) + // snprintf returns number of bytes that would have been written + // had the output not being truncated. In that case, it will + // return either -1 or value >= passed in size value . So a check needs to be added + // to detect truncation, and if there is any, only account for the + // actual number of bytes written..and not what could have been + // written. + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::packVector3: truncated: " << llendl; } mCurBufferp += numCopied; @@ -1168,13 +1202,16 @@ BOOL LLDataPackerAsciiBuffer::packVector4(const LLVector4 &value, const char *na { numCopied = snprintf(DUMMY_BUFFER,sizeof(DUMMY_BUFFER),"%g %g %g %g\n", value.mV[0], value.mV[1], value.mV[2], value.mV[3]); /* Flawfinder: ignore */ } - // snprintf returns number of bytes that would have been written had the - // output not being truncated. In that case, it will retuen >= passed in size value. - // so a check needs to be added to detect truncation, and if there is any, - // only account for the actual number of bytes written..and not what could have been written. - if (numCopied > getBufferSize()-getCurrentSize()) + // snprintf returns number of bytes that would have been written + // had the output not being truncated. In that case, it will + // return either -1 or value >= passed in size value . So a check needs to be added + // to detect truncation, and if there is any, only account for the + // actual number of bytes written..and not what could have been + // written. + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::packVector4: truncated: " << llendl; } mCurBufferp += numCopied; @@ -1212,13 +1249,16 @@ BOOL LLDataPackerAsciiBuffer::packUUID(const LLUUID &value, const char *name) { numCopied = 64 + 1; // UUID + newline } - // snprintf returns number of bytes that would have been written had the - // output not being truncated. In that case, it will retuen >= passed in size value. - // so a check needs to be added to detect truncation, and if there is any, - // only account for the actual number of bytes written..and not what could have been written. - if (numCopied > getBufferSize()-getCurrentSize()) + // snprintf returns number of bytes that would have been written + // had the output not being truncated. In that case, it will + // return either -1 or value >= passed in size value . So a check needs to be added + // to detect truncation, and if there is any, only account for the + // actual number of bytes written..and not what could have been + // written. + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::packUUID: truncated: " << llendl; success = FALSE; } mCurBufferp += numCopied; @@ -1254,21 +1294,26 @@ void LLDataPackerAsciiBuffer::writeIndentedName(const char *name) int numCopied = 0; if (mWriteEnabled) { - numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%s\t", name); /* Flawfinder: ignore */ + numCopied = snprintf(mCurBufferp,getBufferSize()-getCurrentSize(),"%s\t", name); /* Flawfinder: ignore */ } else { numCopied = (S32)strlen(name) + 1; /* Flawfinder: ignore */ //name + tab } - // snprintf returns number of bytes that would have been written had the - // output not being truncated. In that case, it will retuen >= passed in size value. - // so a check needs to be added to detect truncation, and if there is any, - // only account for the actual number of bytes written..and not what could have been written. - if (numCopied > getBufferSize()-getCurrentSize()) + // snprintf returns number of bytes that would have been written + // had the output not being truncated. In that case, it will + // return either -1 or value >= passed in size value . So a check needs to be added + // to detect truncation, and if there is any, only account for the + // actual number of bytes written..and not what could have been + // written. + if (numCopied < 0 || numCopied > getBufferSize()-getCurrentSize()) { numCopied = getBufferSize()-getCurrentSize(); + llwarns << "LLDataPackerAsciiBuffer::writeIndentedName: truncated: " << llendl; } + + mCurBufferp += numCopied; } } @@ -1424,7 +1469,7 @@ BOOL LLDataPackerAsciiFile::packBinaryDataFixed(const U8 *value, S32 size, const S32 i; for (i = 0; i < size; i++) { - snprintf(buffer, sizeof(buffer), "%02x ", value[i]); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "%02x ", value[i]); /* Flawfinder: ignore */ *mOutputStream << buffer; } *mOutputStream << "\n"; diff --git a/linden/indra/llmessage/lldatapacker.h b/linden/indra/llmessage/lldatapacker.h index 4e0b4cd..700f8fb 100644 --- a/linden/indra/llmessage/lldatapacker.h +++ b/linden/indra/llmessage/lldatapacker.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lldbstrings.h b/linden/indra/llmessage/lldbstrings.h index 122e45b..dd249b1 100644 --- a/linden/indra/llmessage/lldbstrings.h +++ b/linden/indra/llmessage/lldbstrings.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lldispatcher.cpp b/linden/indra/llmessage/lldispatcher.cpp index 7ba9f44..2e775f9 100644 --- a/linden/indra/llmessage/lldispatcher.cpp +++ b/linden/indra/llmessage/lldispatcher.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lldispatcher.h b/linden/indra/llmessage/lldispatcher.h index 2a103f0..374ee0d 100644 --- a/linden/indra/llmessage/lldispatcher.h +++ b/linden/indra/llmessage/lldispatcher.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lleventflags.h b/linden/indra/llmessage/lleventflags.h index 755e5a9..f6b89e3 100644 --- a/linden/indra/llmessage/lleventflags.h +++ b/linden/indra/llmessage/lleventflags.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llfiltersd2xmlrpc.cpp b/linden/indra/llmessage/llfiltersd2xmlrpc.cpp index 63913d5..34a4621 100644 --- a/linden/indra/llmessage/llfiltersd2xmlrpc.cpp +++ b/linden/indra/llmessage/llfiltersd2xmlrpc.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llfiltersd2xmlrpc.h b/linden/indra/llmessage/llfiltersd2xmlrpc.h index 622ab90..8b2f066 100644 --- a/linden/indra/llmessage/llfiltersd2xmlrpc.h +++ b/linden/indra/llmessage/llfiltersd2xmlrpc.h @@ -5,6 +5,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llfollowcamparams.h b/linden/indra/llmessage/llfollowcamparams.h index aa14ab2..0979474 100644 --- a/linden/indra/llmessage/llfollowcamparams.h +++ b/linden/indra/llmessage/llfollowcamparams.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llhost.cpp b/linden/indra/llmessage/llhost.cpp index c1ca4b0..50ef301 100644 --- a/linden/indra/llmessage/llhost.cpp +++ b/linden/indra/llmessage/llhost.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -47,7 +48,7 @@ LLHost LLHost::invalid(INVALID_PORT,INVALID_HOST_IP_ADDRESS); LLHost::LLHost(const std::string& ip_and_port) { std::string::size_type colon_index = ip_and_port.find(":"); - if (colon_index != std::string::npos) + if (colon_index == std::string::npos) { mIP = ip_string_to_u32(ip_and_port.c_str()); mPort = 0; @@ -70,7 +71,7 @@ void LLHost::getString(char* buffer, S32 length) const return; } - snprintf(buffer, length, "%s:%u", u32_to_ip_string(mIP), mPort); /*Flawfinder: ignore*/ + snprintf(buffer, length, "%s:%u", u32_to_ip_string(mIP), mPort); /* Flawfinder: ignore */ } void LLHost::getIPString(char* buffer, S32 length) const @@ -81,7 +82,7 @@ void LLHost::getIPString(char* buffer, S32 length) const return; } - snprintf(buffer, length, "%s", u32_to_ip_string(mIP)); /*Flawfinder: ignore*/ + snprintf(buffer, length, "%s", u32_to_ip_string(mIP)); /* Flawfinder: ignore */ } diff --git a/linden/indra/llmessage/llhost.h b/linden/indra/llmessage/llhost.h index 894e2de..5b477e0 100644 --- a/linden/indra/llmessage/llhost.h +++ b/linden/indra/llmessage/llhost.h @@ -5,6 +5,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llhttpassetstorage.cpp b/linden/indra/llmessage/llhttpassetstorage.cpp index 6c57499..8e328ce 100644 --- a/linden/indra/llmessage/llhttpassetstorage.cpp +++ b/linden/indra/llmessage/llhttpassetstorage.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -38,7 +39,7 @@ #include "zlib/zlib.h" -const U32 MAX_RUNNING_REQUESTS = 4; +const U32 MAX_RUNNING_REQUESTS = 1; const F32 MAX_PROCESSING_TIME = 0.005f; const S32 CURL_XFER_BUFFER_SIZE = 65536; // Try for 30 minutes for now. @@ -77,6 +78,7 @@ public: virtual ~LLHTTPAssetRequest(); void setupCurlHandle(); + void cleanupCurlHandle(); void prepareCompressedUpload(); void finishCompressedUpload(); @@ -140,16 +142,7 @@ LLHTTPAssetRequest::~LLHTTPAssetRequest() if (mCurlHandle) { curl_multi_remove_handle(mCurlMultiHandle, mCurlHandle); - curl_easy_cleanup(mCurlHandle); - if (mAssetStoragep) - { - // Terminating a request. Thus upload or download is no longer pending. - mAssetStoragep->removeRunningRequest(mRequestType, this); - } - else - { - llerrs << "LLHTTPAssetRequest::~LLHTTPAssetRequest - No asset storage associated with this request!" << llendl; - } + cleanupCurlHandle(); } if (mHTTPHeaders) { @@ -274,6 +267,21 @@ void LLHTTPAssetRequest::setupCurlHandle() } } +void LLHTTPAssetRequest::cleanupCurlHandle() +{ + curl_easy_cleanup(mCurlHandle); + if (mAssetStoragep) + { + // Terminating a request. Thus upload or download is no longer pending. + mAssetStoragep->removeRunningRequest(mRequestType, this); + } + else + { + llerrs << "LLHTTPAssetRequest::~LLHTTPAssetRequest - No asset storage associated with this request!" << llendl; + } + mCurlHandle = NULL; +} + void LLHTTPAssetRequest::prepareCompressedUpload() { mZStream.next_in = Z_NULL; @@ -682,7 +690,7 @@ void LLHTTPAssetStorage::checkForTimeouts() { CURLMcode mcode; LLAssetRequest *req; - while (req = findNextRequest(mPendingDownloads, mRunningDownloads)) + while ( (req = findNextRequest(mPendingDownloads, mRunningDownloads)) ) { // Setup this curl download request // We need to generate a new request here @@ -691,7 +699,7 @@ void LLHTTPAssetStorage::checkForTimeouts() char uuid_str[UUID_STR_LENGTH]; /*Flawfinder: ignore*/ req->getUUID().toString(uuid_str); std::string base_url = getBaseURL(req->getUUID(), req->getType()); - snprintf(tmp_url, sizeof(tmp_url), "%s/%36s.%s", base_url.c_str() , uuid_str, LLAssetType::lookup(req->getType())); /*Flawfinder: ignore*/ + snprintf(tmp_url, sizeof(tmp_url), "%s/%36s.%s", base_url.c_str() , uuid_str, LLAssetType::lookup(req->getType())); /* Flawfinder: ignore */ LLHTTPAssetRequest *new_req = new LLHTTPAssetRequest(this, req->getUUID(), req->getType(), RT_DOWNLOAD, tmp_url, mCurlMultiHandle); @@ -708,7 +716,8 @@ void LLHTTPAssetStorage::checkForTimeouts() { // Failure. Deleting the pending request will remove it from the running // queue, and push it to the end of the pending queue. - deletePendingRequest(RT_DOWNLOAD, req->getType(), req->getUUID()); + new_req->cleanupCurlHandle(); + deletePendingRequest(RT_DOWNLOAD, new_req->getType(), new_req->getUUID()); break; } else @@ -717,7 +726,7 @@ void LLHTTPAssetStorage::checkForTimeouts() } } - while (req = findNextRequest(mPendingUploads, mRunningUploads)) + while ( (req = findNextRequest(mPendingUploads, mRunningUploads)) ) { // setup this curl upload request @@ -726,7 +735,7 @@ void LLHTTPAssetStorage::checkForTimeouts() char tmp_url[MAX_STRING];/*Flawfinder: ignore*/ char uuid_str[UUID_STR_LENGTH];/*Flawfinder: ignore*/ req->getUUID().toString(uuid_str); - snprintf(tmp_url, sizeof(tmp_url), /*Flawfinder: ignore*/ + snprintf(tmp_url, sizeof(tmp_url), /* Flawfinder: ignore */ do_compress ? "%s/%s.%s.gz" : "%s/%s.%s", mBaseURL.c_str(), uuid_str, LLAssetType::lookup(req->getType())); @@ -761,7 +770,8 @@ void LLHTTPAssetStorage::checkForTimeouts() { // Failure. Deleting the pending request will remove it from the running // queue, and push it to the end of the pending queue. - deletePendingRequest(RT_UPLOAD, req->getType(), req->getUUID()); + new_req->cleanupCurlHandle(); + deletePendingRequest(RT_UPLOAD, new_req->getType(), new_req->getUUID()); break; } else @@ -771,7 +781,7 @@ void LLHTTPAssetStorage::checkForTimeouts() // Pending upload will have been flagged by the request } - while (req = findNextRequest(mPendingLocalUploads, mRunningLocalUploads)) + while ( (req = findNextRequest(mPendingLocalUploads, mRunningLocalUploads)) ) { // setup this curl upload request LLVFile file(mVFS, req->getUUID(), req->getType()); @@ -781,7 +791,7 @@ void LLHTTPAssetStorage::checkForTimeouts() req->getUUID().toString(uuid_str); // KLW - All temporary uploads are saved locally "http://localhost:12041/asset" - snprintf(tmp_url, sizeof(tmp_url), "%s/%36s.%s", mLocalBaseURL.c_str(), uuid_str, LLAssetType::lookup(req->getType())); /*Flawfinder: ignore*/ + snprintf(tmp_url, sizeof(tmp_url), "%s/%36s.%s", mLocalBaseURL.c_str(), uuid_str, LLAssetType::lookup(req->getType())); /* Flawfinder: ignore */ LLHTTPAssetRequest *new_req = new LLHTTPAssetRequest(this, req->getUUID(), req->getType(), RT_LOCALUPLOAD, tmp_url, mCurlMultiHandle); @@ -800,7 +810,8 @@ void LLHTTPAssetStorage::checkForTimeouts() { // Failure. Deleting the pending request will remove it from the running // queue, and push it to the end of the pending queue. - deletePendingRequest(RT_LOCALUPLOAD, req->getType(), req->getUUID()); + new_req->cleanupCurlHandle(); + deletePendingRequest(RT_LOCALUPLOAD, new_req->getType(), new_req->getUUID()); break; } else diff --git a/linden/indra/llmessage/llhttpassetstorage.h b/linden/indra/llmessage/llhttpassetstorage.h index d98af45..b5ab56b 100644 --- a/linden/indra/llmessage/llhttpassetstorage.h +++ b/linden/indra/llmessage/llhttpassetstorage.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llhttpclient.cpp b/linden/indra/llmessage/llhttpclient.cpp index 3755ae0..1d38a13 100644 --- a/linden/indra/llmessage/llhttpclient.cpp +++ b/linden/indra/llmessage/llhttpclient.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -37,9 +38,10 @@ #include "llvfile.h" #include "llvfs.h" +#include "message.h" #include -static const F32 HTTP_REQUEST_EXPIRY_SECS = 60.0f; +const F32 HTTP_REQUEST_EXPIRY_SECS = 60.0f; static std::string gCABundle; @@ -111,6 +113,14 @@ namespace if (200 <= mStatus && mStatus < 300) { LLSDSerialize::fromXML(content, istr); +/* + const S32 parseError = -1; + if(LLSDSerialize::fromXML(content, istr) == parseError) + { + mStatus = 498; + mReason = "Client Parse Error"; + } +*/ } if (mResponder.get()) @@ -233,7 +243,7 @@ namespace } static void request(const std::string& url, LLURLRequest::ERequestAction method, - Injector* body_injector, LLHTTPClient::ResponderPtr responder) + Injector* body_injector, LLHTTPClient::ResponderPtr responder, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS) { if (!LLHTTPClient::hasPump()) { @@ -251,19 +261,26 @@ static void request(const std::string& url, LLURLRequest::ERequestAction method, } req->setCallback(new LLHTTPClientURLAdaptor(responder)); + if (method == LLURLRequest::HTTP_POST && gMessageSystem) { + req->addHeader(llformat("X-SecondLife-UDP-Listen-Port: %d", + gMessageSystem->mPort).c_str()); + } + if (method == LLURLRequest::HTTP_PUT || method == LLURLRequest::HTTP_POST) { - req->addHeader(llformat("Content-Type: %s", body_injector->contentType()).c_str()); - chain.push_back(LLIOPipe::ptr_t(body_injector)); + req->addHeader(llformat("Content-Type: %s", + body_injector->contentType()).c_str()); + + chain.push_back(LLIOPipe::ptr_t(body_injector)); } chain.push_back(LLIOPipe::ptr_t(req)); - theClientPump->addChain(chain, HTTP_REQUEST_EXPIRY_SECS); + theClientPump->addChain(chain, timeout); } -void LLHTTPClient::get(const std::string& url, ResponderPtr responder) +void LLHTTPClient::get(const std::string& url, ResponderPtr responder, const F32 timeout) { - request(url, LLURLRequest::HTTP_GET, NULL, responder); + request(url, LLURLRequest::HTTP_GET, NULL, responder, timeout); } // A simple class for managing data returned from a curl http request. @@ -312,6 +329,14 @@ LLSD LLHTTPClient::blockingGet(const std::string& url) LLHTTPBuffer http_buffer; + // Without this timeout, blockingGet() calls have been observed to take + // up to 90 seconds to complete. Users of blockingGet() already must + // check the HTTP return code for validity, so this will not introduce + // new errors. A 5 second timeout will succeed > 95% of the time (and + // probably > 99% of the time) based on my statistics. JC + curl_easy_setopt(curlp, CURLOPT_NOSIGNAL, 1); // don't use SIGALRM for timeouts + curl_easy_setopt(curlp, CURLOPT_TIMEOUT, 5); // seconds + curl_easy_setopt(curlp, CURLOPT_WRITEFUNCTION, LLHTTPBuffer::curl_write); curl_easy_setopt(curlp, CURLOPT_WRITEDATA, &http_buffer); curl_easy_setopt(curlp, CURLOPT_URL, url.c_str()); @@ -344,36 +369,36 @@ LLSD LLHTTPClient::blockingGet(const std::string& url) return response; } -void LLHTTPClient::put(const std::string& url, const LLSD& body, ResponderPtr responder) +void LLHTTPClient::put(const std::string& url, const LLSD& body, ResponderPtr responder, const F32 timeout) { - request(url, LLURLRequest::HTTP_PUT, new LLSDInjector(body), responder); + request(url, LLURLRequest::HTTP_PUT, new LLSDInjector(body), responder, timeout); } -void LLHTTPClient::post(const std::string& url, const LLSD& body, ResponderPtr responder) +void LLHTTPClient::post(const std::string& url, const LLSD& body, ResponderPtr responder, const F32 timeout) { - request(url, LLURLRequest::HTTP_POST, new LLSDInjector(body), responder); + request(url, LLURLRequest::HTTP_POST, new LLSDInjector(body), responder, timeout); } -void LLHTTPClient::post(const std::string& url, const U8* data, S32 size, ResponderPtr responder) +void LLHTTPClient::post(const std::string& url, const U8* data, S32 size, ResponderPtr responder, const F32 timeout) { - request(url, LLURLRequest::HTTP_POST, new RawInjector(data, size), responder); + request(url, LLURLRequest::HTTP_POST, new RawInjector(data, size), responder, timeout); } -void LLHTTPClient::del(const std::string& url, ResponderPtr responder) +void LLHTTPClient::del(const std::string& url, ResponderPtr responder, const F32 timeout) { - request(url, LLURLRequest::HTTP_DELETE, NULL, responder); + request(url, LLURLRequest::HTTP_DELETE, NULL, responder, timeout); } #if 1 -void LLHTTPClient::postFile(const std::string& url, const std::string& filename, ResponderPtr responder) +void LLHTTPClient::postFile(const std::string& url, const std::string& filename, ResponderPtr responder, const F32 timeout) { - request(url, LLURLRequest::HTTP_POST, new FileInjector(filename), responder); + request(url, LLURLRequest::HTTP_POST, new FileInjector(filename), responder, timeout); } void LLHTTPClient::postFile(const std::string& url, const LLUUID& uuid, - LLAssetType::EType asset_type, ResponderPtr responder) + LLAssetType::EType asset_type, ResponderPtr responder, const F32 timeout) { - request(url, LLURLRequest::HTTP_POST, new VFileInjector(uuid, asset_type), responder); + request(url, LLURLRequest::HTTP_POST, new VFileInjector(uuid, asset_type), responder, timeout); } #endif @@ -401,7 +426,7 @@ namespace boost void intrusive_ptr_release(LLHTTPClient::Responder* p) { - if(0 == --p->mReferenceCount) + if(p && 0 == --p->mReferenceCount) { delete p; } diff --git a/linden/indra/llmessage/llhttpclient.h b/linden/indra/llmessage/llhttpclient.h index 93859eb..136577c 100644 --- a/linden/indra/llmessage/llhttpclient.h +++ b/linden/indra/llmessage/llhttpclient.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -38,6 +39,8 @@ #include "llassettype.h" +extern const F32 HTTP_REQUEST_EXPIRY_SECS; + class LLUUID; class LLPumpIO; class LLSD; @@ -69,19 +72,19 @@ public: typedef boost::intrusive_ptr ResponderPtr; - static void get(const std::string& url, ResponderPtr); - static void put(const std::string& url, const LLSD& body, ResponderPtr); + static void get(const std::string& url, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); + static void put(const std::string& url, const LLSD& body, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); ///< non-blocking - static void post(const std::string& url, const LLSD& body, ResponderPtr); - static void post(const std::string& url, const U8* data, S32 size, ResponderPtr responder); - static void postFile(const std::string& url, const std::string& filename, ResponderPtr); + static void post(const std::string& url, const LLSD& body, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); + static void post(const std::string& url, const U8* data, S32 size, ResponderPtr responder, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); + static void postFile(const std::string& url, const std::string& filename, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); static void postFile(const std::string& url, const LLUUID& uuid, - LLAssetType::EType asset_type, ResponderPtr responder); + LLAssetType::EType asset_type, ResponderPtr responder, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); // Blocking HTTP get that returns an LLSD map of status and body. static LLSD blockingGet(const std::string& url); - static void del(const std::string& url, ResponderPtr); + static void del(const std::string& url, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); ///< sends a DELETE method, but we can't call it delete in c++ diff --git a/linden/indra/llmessage/llhttpnode.cpp b/linden/indra/llmessage/llhttpnode.cpp index e997415..97064a1 100644 --- a/linden/indra/llmessage/llhttpnode.cpp +++ b/linden/indra/llmessage/llhttpnode.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llhttpnode.h b/linden/indra/llmessage/llhttpnode.h index bbce091..ae64a63 100644 --- a/linden/indra/llmessage/llhttpnode.h +++ b/linden/indra/llmessage/llhttpnode.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llhttpsender.cpp b/linden/indra/llmessage/llhttpsender.cpp new file mode 100644 index 0000000..f96e6d2 --- /dev/null +++ b/linden/indra/llmessage/llhttpsender.cpp @@ -0,0 +1,90 @@ +/** + * @file llhttpsender.cpp + * @brief Abstracts details of sending messages via HTTP. + * + * Copyright (c) 2007-2007, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + */ + +#include "linden_common.h" + +#include "llhttpsender.h" + +#include +#include + +#include "llhost.h" +#include "llsd.h" + +namespace +{ + typedef std::map SenderMap; + static SenderMap senderMap; +} + +//virtual +LLHTTPSender::~LLHTTPSender() +{ +} + +//virtual +void LLHTTPSender::send(const LLHost& host, const char* name, + const LLSD& body, + LLHTTPClient::ResponderPtr response) const +{ + // Default implementation inserts sender, message and sends HTTP POST + std::ostringstream stream; + stream << "http://" << host << "/trusted-message/" << name; + llinfos << "LLHTTPSender::send: POST to " << stream.str() << llendl; + LLHTTPClient::post(stream.str(), body, response); +} + +//static +void LLHTTPSender::setSender(const LLHost& host, LLHTTPSender* sender) +{ + llinfos << "LLHTTPSender::setSender " << host << llendl; + senderMap[host] = sender; +} + +//static +const LLHTTPSender& LLHTTPSender::getSender(const LLHost& host) +{ + static LLHTTPSender defaultSender; + SenderMap::const_iterator iter = senderMap.find(host); + if(iter == senderMap.end()) + { + return defaultSender; + } + return *(iter->second); +} + +//static +void LLHTTPSender::clearSender(const LLHost& host) +{ + SenderMap::iterator iter = senderMap.find(host); + if(iter != senderMap.end()) + { + delete iter->second; + senderMap.erase(iter); + } +} diff --git a/linden/indra/llmessage/llhttpsender.h b/linden/indra/llmessage/llhttpsender.h new file mode 100644 index 0000000..650a0e9 --- /dev/null +++ b/linden/indra/llmessage/llhttpsender.h @@ -0,0 +1,58 @@ +/** + * @file llhttpsender.h + * @brief Abstracts details of sending messages via HTTP. + * + * Copyright (c) 2007-2007, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + */ + +#ifndef LL_HTTP_SENDER_H +#define LL_HTTP_SENDER_H + +#include "llhttpclient.h" + +class LLHost; +class LLSD; + +class LLHTTPSender +{ + public: + + virtual ~LLHTTPSender(); + + /** @brief Send message to host with body, call response when done */ + virtual void send(const LLHost& host, + const char* message, const LLSD& body, + LLHTTPClient::ResponderPtr response) const; + + /** @brief Set sender for host, takes ownership of sender. */ + static void setSender(const LLHost& host, LLHTTPSender* sender); + + /** @brief Get sender for host, retains ownership of returned sender. */ + static const LLHTTPSender& getSender(const LLHost& host); + + /** @brief Clear sender for host. */ + static void clearSender(const LLHost& host); +}; + +#endif // LL_HTTP_SENDER_H diff --git a/linden/indra/llmessage/llinstantmessage.cpp b/linden/indra/llmessage/llinstantmessage.cpp index 6f6e022..0ba7629 100644 --- a/linden/indra/llmessage/llinstantmessage.cpp +++ b/linden/indra/llmessage/llinstantmessage.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -35,6 +36,7 @@ #include "lluuid.h" #include "llsd.h" #include "llsdserialize.h" +#include "llsdutil.h" #include "llmemory.h" #include "message.h" @@ -226,8 +228,21 @@ void pack_instant_message_block( S32 bytes_left = MTUBYTES; if(message) { - char buffer[MTUBYTES]; /*Flawfinder: ignore*/ - bytes_left -= snprintf(buffer, MTUBYTES, "%s", message); /*Flawfinder: ignore*/ + char buffer[MTUBYTES]; + int num_written = snprintf(buffer, MTUBYTES, "%s", message); /* Flawfinder: ignore */ + // snprintf returns number of bytes that would have been written + // had the output not being truncated. In that case, it will + // return either -1 or value >= passed in size value . So a check needs to be added + // to detect truncation, and if there is any, only account for the + // actual number of bytes written..and not what could have been + // written. + if (num_written < 0 || num_written >= MTUBYTES) + { + num_written = MTUBYTES - 1; + llwarns << "pack_instant_message_block: message truncated: " << message << llendl; + } + + bytes_left -= num_written; bytes_left = llmax(0, bytes_left); msg->addStringFast(_PREHASH_Message, buffer); } @@ -296,6 +311,35 @@ void LLIMInfo::unpackMessageBlock(LLMessageSystem* msg) } } +LLSD im_info_to_llsd(LLPointer im_info) +{ + LLSD param_version; + param_version["version"] = 1; + LLSD param_message; + param_message["from_id"] = im_info->mFromID; + param_message["from_group"] = im_info->mFromGroup; + param_message["to_id"] = im_info->mToID; + param_message["from_name"] = im_info->mName; + param_message["message"] = im_info->mMessage; + param_message["type"] = (S32)im_info->mIMType; + param_message["id"] = im_info->mID; + param_message["timestamp"] = (S32)im_info->mTimeStamp; + param_message["offline"] = (S32)im_info->mOffline; + param_message["parent_estate_id"] = (S32)im_info->mParentEstateID; + param_message["region_id"] = im_info->mRegionID; + param_message["position"] = ll_sd_from_vector3(im_info->mPosition); + if (im_info->mData) param_message["data"] = im_info->mData; + LLSD param_agent; + param_agent["agent_id"] = im_info->mFromID; + + LLSD params; + params.append(param_version); + params.append(param_message); + params.append(param_agent); + + return params; +} + LLPointer LLIMInfo::clone() { return new LLIMInfo( diff --git a/linden/indra/llmessage/llinstantmessage.h b/linden/indra/llmessage/llinstantmessage.h index a7074a2..0b2de19 100644 --- a/linden/indra/llmessage/llinstantmessage.h +++ b/linden/indra/llmessage/llinstantmessage.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -93,17 +94,19 @@ enum EInstantMessage // communicate with each other. // - // Start a session, or add users to a session. + // Add users to a session. IM_SESSION_ADD = 13, - // Start a session, but don't prune offline users - IM_SESSION_OFFLINE_ADD = 14, + // IM sent automatically on call for help, + // sets up a way for each Helper reached to teleport to the + // helpee + IM_SESSION_911_SEND = 14, // start a session with your gruop IM_SESSION_GROUP_START = 15, // start a session without a calling card (finder or objects) - IM_SESSION_CARDLESS_START = 16, + IM_SESSION_CONFERENCE_START = 16, // send a message to a session. IM_SESSION_SEND = 17, @@ -142,9 +145,9 @@ enum EInstantMessage // Binary bucket contains the name of the session. IM_SESSION_911_START = 29, - // IM sent automatically on call for help, - // sends a lure to each Helper reached - IM_LURE_911 = 30, + // IM for requesting to teleport to the creator + // of a livehelp session (assuming they are verified first) + IM_TELEPORT_911 = 30, // a message generated by a script which we don't want to // be sent through e-mail. Similar to IM_FROM_TASK, but @@ -285,6 +288,7 @@ public: S32 mTTL; }; +LLSD im_info_to_llsd(LLPointer im_info); void pack_instant_message( LLMessageSystem* msgsystem, diff --git a/linden/indra/llmessage/llinvite.h b/linden/indra/llmessage/llinvite.h index ac54058..d3774c4 100644 --- a/linden/indra/llmessage/llinvite.h +++ b/linden/indra/llmessage/llinvite.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lliobuffer.cpp b/linden/indra/llmessage/lliobuffer.cpp index 506bd76..7dea578 100644 --- a/linden/indra/llmessage/lliobuffer.cpp +++ b/linden/indra/llmessage/lliobuffer.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lliobuffer.h b/linden/indra/llmessage/lliobuffer.h index 59d7074..ac24576 100644 --- a/linden/indra/llmessage/lliobuffer.h +++ b/linden/indra/llmessage/lliobuffer.h @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lliohttpserver.cpp b/linden/indra/llmessage/lliohttpserver.cpp index 25c1aef..9ea7272 100644 --- a/linden/indra/llmessage/lliohttpserver.cpp +++ b/linden/indra/llmessage/lliohttpserver.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -46,6 +47,8 @@ #include "llsdserialize_xml.h" #include "llstl.h" +#include + static const char HTTP_VERSION_STR[] = "HTTP/1.0"; static const std::string CONTEXT_REQUEST("request"); static const std::string HTTP_VERB_GET("GET"); @@ -393,7 +396,7 @@ LLIOPipe::EStatus LLHTTPResponseHeader::process_impl( class LLHTTPResponder : public LLIOPipe { public: - LLHTTPResponder(const LLHTTPNode& tree); + LLHTTPResponder(const LLHTTPNode& tree, const LLSD& ctx); ~LLHTTPResponder(); protected: @@ -454,6 +457,7 @@ protected: STATE_SHORT_CIRCUIT }; + LLSD mBuildContext; EState mState; U8* mLastRead; std::string mVerb; @@ -462,12 +466,14 @@ protected: std::string mQuery; std::string mVersion; S32 mContentLength; + LLSD mHeaders; // handle the urls const LLHTTPNode& mRootNode; }; -LLHTTPResponder::LLHTTPResponder(const LLHTTPNode& tree) : +LLHTTPResponder::LLHTTPResponder(const LLHTTPNode& tree, const LLSD& ctx) : + mBuildContext(ctx), mState(STATE_NOTHING), mLastRead(NULL), mContentLength(0), @@ -655,6 +661,11 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl( lldebugs << "Content-Length: " << value << llendl; mContentLength = atoi(value.c_str()); } + else + { + LLString::trimTail(value); + mHeaders[name] = value; + } } } } @@ -720,6 +731,11 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl( chain.push_back(LLIOPipe::ptr_t(new LLIOFlush)); context[CONTEXT_REQUEST]["path"] = mPath; context[CONTEXT_REQUEST]["query-string"] = mQuery; + context[CONTEXT_REQUEST]["remote-host"] + = mBuildContext["remote-host"]; + context[CONTEXT_REQUEST]["remote-port"] + = mBuildContext["remote-port"]; + context[CONTEXT_REQUEST]["headers"] = mHeaders; const LLChainIOFactory* protocolHandler = node->getProtocolHandler(); @@ -804,9 +820,10 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl( -void LLCreateHTTPPipe(LLPumpIO::chain_t& chain, const LLHTTPNode& root) +void LLCreateHTTPPipe(LLPumpIO::chain_t& chain, + const LLHTTPNode& root, const LLSD& ctx) { - chain.push_back(LLIOPipe::ptr_t(new LLHTTPResponder(root))); + chain.push_back(LLIOPipe::ptr_t(new LLHTTPResponder(root, ctx))); } @@ -815,7 +832,7 @@ class LLHTTPResponseFactory : public LLChainIOFactory public: bool build(LLPumpIO::chain_t& chain, LLSD ctx) const { - LLCreateHTTPPipe(chain, mTree); + LLCreateHTTPPipe(chain, mTree, ctx); return true; } diff --git a/linden/indra/llmessage/lliohttpserver.h b/linden/indra/llmessage/lliohttpserver.h index efbd7db..64dce63 100644 --- a/linden/indra/llmessage/lliohttpserver.h +++ b/linden/indra/llmessage/lliohttpserver.h @@ -5,6 +5,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -50,7 +51,8 @@ LLHTTPNode& LLCreateHTTPServer(apr_pool_t* pool, LLPumpIO& pump, U16 port); * for example), use the helper templates below. */ -void LLCreateHTTPPipe(LLPumpIO::chain_t& chain, const LLHTTPNode& root); +void LLCreateHTTPPipe(LLPumpIO::chain_t& chain, + const LLHTTPNode& root, const LLSD& ctx); /**< Create a pipe on the chain that handles HTTP requests. * The requests are served by the node tree given at root. * diff --git a/linden/indra/llmessage/lliopipe.cpp b/linden/indra/llmessage/lliopipe.cpp index 86a36d8..a37b046 100644 --- a/linden/indra/llmessage/lliopipe.cpp +++ b/linden/indra/llmessage/lliopipe.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lliopipe.h b/linden/indra/llmessage/lliopipe.h index f419703..38a98a6 100644 --- a/linden/indra/llmessage/lliopipe.h +++ b/linden/indra/llmessage/lliopipe.h @@ -6,6 +6,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -256,7 +257,7 @@ namespace boost } inline void intrusive_ptr_release(LLIOPipe* p) { - if(0 == --p->mReferenceCount) + if(p && 0 == --p->mReferenceCount) { delete p; } diff --git a/linden/indra/llmessage/lliosocket.cpp b/linden/indra/llmessage/lliosocket.cpp index 628f884..af22180 100644 --- a/linden/indra/llmessage/lliosocket.cpp +++ b/linden/indra/llmessage/lliosocket.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -538,9 +539,20 @@ LLIOPipe::EStatus LLIOServerSocket::process_impl( if(llsocket) { PUMP_DEBUG; + + apr_sockaddr_t* remote_addr; + apr_socket_addr_get(&remote_addr, APR_REMOTE, socket); + + char* remote_host_string; + apr_sockaddr_ip_get(&remote_host_string, remote_addr); + + LLSD context; + context["remote-host"] = remote_host_string; + context["remote-port"] = remote_addr->port; + LLPumpIO::chain_t chain; chain.push_back(LLIOPipe::ptr_t(new LLIOSocketReader(llsocket))); - if(mReactor->build(chain, LLSD())) + if(mReactor->build(chain, context)) { chain.push_back(LLIOPipe::ptr_t(new LLIOSocketWriter(llsocket))); pump->addChain(chain, mResponseTimeout); diff --git a/linden/indra/llmessage/lliosocket.h b/linden/indra/llmessage/lliosocket.h index f994404..0f5eae8 100644 --- a/linden/indra/llmessage/lliosocket.h +++ b/linden/indra/llmessage/lliosocket.h @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llioutil.cpp b/linden/indra/llmessage/llioutil.cpp index 76eeb02..21e36fa 100644 --- a/linden/indra/llmessage/llioutil.cpp +++ b/linden/indra/llmessage/llioutil.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llioutil.h b/linden/indra/llmessage/llioutil.h index 54b3d39..27cd39a 100644 --- a/linden/indra/llmessage/llioutil.h +++ b/linden/indra/llmessage/llioutil.h @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llloginflags.h b/linden/indra/llmessage/llloginflags.h index b518849..7725419 100644 --- a/linden/indra/llmessage/llloginflags.h +++ b/linden/indra/llmessage/llloginflags.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lllogtextmessage.cpp b/linden/indra/llmessage/lllogtextmessage.cpp index 06cc9c8..06c88b9 100644 --- a/linden/indra/llmessage/lllogtextmessage.cpp +++ b/linden/indra/llmessage/lllogtextmessage.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lllogtextmessage.h b/linden/indra/llmessage/lllogtextmessage.h index 2413376..89fb90c 100644 --- a/linden/indra/llmessage/lllogtextmessage.h +++ b/linden/indra/llmessage/lllogtextmessage.h @@ -7,6 +7,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llmail.cpp b/linden/indra/llmessage/llmail.cpp index aea3689..793cb19 100644 --- a/linden/indra/llmessage/llmail.cpp +++ b/linden/indra/llmessage/llmail.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llmail.h b/linden/indra/llmessage/llmail.h index b1dc3b5..26aaa3a 100644 --- a/linden/indra/llmessage/llmail.h +++ b/linden/indra/llmessage/llmail.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llmessage.vcproj b/linden/indra/llmessage/llmessage.vcproj index 11f4dbf..ac16f52 100644 --- a/linden/indra/llmessage/llmessage.vcproj +++ b/linden/indra/llmessage/llmessage.vcproj @@ -201,6 +201,9 @@ RelativePath=".\llhttpnode.cpp"> + + + + + + + + + + + RelativePath=".\llsdmessagebuilder.cpp"> + + @@ -267,6 +285,15 @@ RelativePath=".\llservice.cpp"> + + + + + + + + + + + + + RelativePath=".\llsdmessagebuilder.h"> + + @@ -497,12 +536,21 @@ RelativePath=".\llservice.h"> + + + + + + + +#include "stdtypes.h" + +class LLMsgData; +class LLQuaternion; +class LLSD; +class LLUUID; +class LLVector3; +class LLVector3d; +class LLVector4; + +class LLMessageBuilder +{ +public: + + //CLASS_LOG_TYPE(LLMessageBuilder); + + virtual ~LLMessageBuilder(); + virtual void newMessage(const char *name) = 0; + + virtual void nextBlock(const char* blockname) = 0; + virtual BOOL removeLastBlock() = 0; // TODO: babbage: remove this horror + + /** All add* methods expect pointers to canonical strings. */ + virtual void addBinaryData(const char *varname, const void *data, + S32 size) = 0; + virtual void addBOOL(const char* varname, BOOL b) = 0; + virtual void addS8(const char *varname, S8 s) = 0; + virtual void addU8(const char *varname, U8 u) = 0; + virtual void addS16(const char *varname, S16 i) = 0; + virtual void addU16(const char *varname, U16 i) = 0; + virtual void addF32(const char *varname, F32 f) = 0; + virtual void addS32(const char *varname, S32 s) = 0; + virtual void addU32(const char *varname, U32 u) = 0; + virtual void addU64(const char *varname, U64 lu) = 0; + virtual void addF64(const char *varname, F64 d) = 0; + virtual void addVector3(const char *varname, const LLVector3& vec) = 0; + virtual void addVector4(const char *varname, const LLVector4& vec) = 0; + virtual void addVector3d(const char *varname, const LLVector3d& vec) = 0; + virtual void addQuat(const char *varname, const LLQuaternion& quat) = 0; + virtual void addUUID(const char *varname, const LLUUID& uuid) = 0; + virtual void addIPAddr(const char *varname, const U32 ip) = 0; + virtual void addIPPort(const char *varname, const U16 port) = 0; + virtual void addString(const char* varname, const char* s) = 0; + virtual void addString(const char* varname, const std::string& s) = 0; + + virtual BOOL isMessageFull(const char* blockname) const = 0; + virtual void compressMessage(U8*& buf_ptr, U32& buffer_length) = 0; + virtual S32 getMessageSize() = 0; + + virtual BOOL isBuilt() const = 0; + virtual BOOL isClear() const = 0; + virtual U32 buildMessage(U8* buffer, U32 buffer_size) = 0; + /**< Return built message size */ + virtual void clearMessage() = 0; + + // TODO: babbage: remove this horror + virtual void setBuilt(BOOL b) = 0; + + virtual const char* getMessageName() const = 0; + + virtual void copyFromMessageData(const LLMsgData& data) = 0; + virtual void copyFromLLSD(const LLSD& data) = 0; +}; + +#endif // LL_LLMESSAGEBUILDER_H diff --git a/linden/indra/llmessage/llmessageconfig.cpp b/linden/indra/llmessage/llmessageconfig.cpp new file mode 100644 index 0000000..a0566ea --- /dev/null +++ b/linden/indra/llmessage/llmessageconfig.cpp @@ -0,0 +1,230 @@ +/** + * @file llmessageconfig.cpp + * @brief Live file handling for messaging + * + * Copyright (c) 2000-2007, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + */ + +#include "linden_common.h" + +#include "llmessageconfig.h" +#include "llfile.h" +#include "lllivefile.h" +#include "llsd.h" +#include "llsdserialize.h" + +static const char messageConfigFileName[] = "message.xml"; +static const F32 messageConfigRefreshRate = 5.0; // seconds +static std::string sServerName = ""; +static std::string sConfigDir = ""; + +class LLMessageConfigFile : public LLLiveFile +{ +private: + LLMessageConfigFile() + : LLLiveFile(fileName(), messageConfigRefreshRate), + mChanged(false) + { } + + static std::string fileName(); + +public: + static LLMessageConfigFile& instance(); + // return the singleton configuration file + +protected: + /* virtual */ void loadFile(); + void loadServerDefaults(const LLSD& data); + void loadMessages(const LLSD& data); + +public: + bool mChanged; + + std::string mServerDefault; + LLSD mMessages; +}; + +std::string LLMessageConfigFile::fileName() +{ + std::ostringstream ostr; + ostr << sConfigDir//gAppSimp->getOption("configdir").asString() + << "/" << messageConfigFileName; + return ostr.str(); +} + +LLMessageConfigFile& LLMessageConfigFile::instance() +{ + static LLMessageConfigFile the_file; + the_file.checkAndReload(); + return the_file; +} + +// virtual +void LLMessageConfigFile::loadFile() +{ + LLSD data; + { + llifstream file(filename().c_str()); + if (file.is_open()) + { + llinfos << "Loading message.xml file at " << fileName() << llendl; + LLSDSerialize::fromXML(data, file); + } + + if (data.isUndefined()) + { + llinfos << "LLMessageConfigFile::loadFile: file missing," + " ill-formed, or simply undefined; not changing the" + " file" << llendl; + return; + } + } + loadServerDefaults(data); + loadMessages(data); +} + +void LLMessageConfigFile::loadServerDefaults(const LLSD& data) +{ + mServerDefault = data["serverDefaults"][sServerName].asString(); + lldebugs << "loading default " << mServerDefault << llendl; +} + +void LLMessageConfigFile::loadMessages(const LLSD& data) +{ + mMessages = data["messages"]; + std::ostringstream out; + LLSDXMLFormatter *formatter = new LLSDXMLFormatter; + formatter->format(mMessages, out); + lldebugs << "loading ... " << out.str() + << " LLMessageConfigFile::loadMessages loaded " + << mMessages.size() << " messages" << llendl; +} + + +//--------------------------------------------------------------- +// LLMessageConfig +//--------------------------------------------------------------- + +//static +void LLMessageConfig::initClass(const std::string& server_name, + const std::string& config_dir) +{ + sServerName = server_name; + sConfigDir = config_dir; + (void) LLMessageConfigFile::instance(); + llinfos << "LLMessageConfig::intiClass config file " + << config_dir << "/" << messageConfigFileName << llendl; +} + +//static +bool LLMessageConfig::isServerDefaultBuilderLLSD() +{ + if (sServerName.empty()) + { + llerrs << "LLMessageConfig::isServerDefaultBuilderLLSD() before" + << " LLMessageConfig::initClass()" << llendl; + } + LLMessageConfigFile& file = LLMessageConfigFile::instance(); + return (file.mServerDefault == "llsd"); +} + +//static +bool LLMessageConfig::isServerDefaultBuilderTemplate() +{ + if (sServerName.empty()) + { + llerrs << "LLMessageConfig::isServerDefaultBuilderTemplate() before" + << " LLMessageConfig::initClass()" << llendl; + } + LLMessageConfigFile& file = LLMessageConfigFile::instance(); + return (file.mServerDefault == "template"); +} + +//static +bool LLMessageConfig::isMessageBuiltLLSD(const std::string& msg_name) +{ + if (sServerName.empty()) + { + llerrs << "LLMessageConfig::isMessageBuiltLLSD(name) before" + << " LLMessageConfig::initClass()" << llendl; + } + LLMessageConfigFile& file = LLMessageConfigFile::instance(); + LLSD config = file.mMessages[msg_name]; + if (!config.has("builder")) + { + return isServerDefaultBuilderLLSD(); + } + return (config["builder"].asString() == "llsd"); +} + +//static +bool LLMessageConfig::isMessageBuiltTemplate(const std::string& msg_name) +{ + if (sServerName.empty()) + { + llerrs << "LLMessageConfig::isMessageBuiltTemplate(name) before" + << " LLMessageConfig::initClass()" << llendl; + } + LLMessageConfigFile& file = LLMessageConfigFile::instance(); + LLSD config = file.mMessages[msg_name]; + if (!config.has("builder")) + { + return isServerDefaultBuilderTemplate(); + } + return (config["builder"].asString() == "template"); +} + +//static +bool LLMessageConfig::isMessageTrusted(const std::string& msg_name) +{ + if (sServerName.empty()) + { + llerrs << "LLMessageConfig::isMessageTrusted(name) before" + << " LLMessageConfig::initClass()" << llendl; + } + LLMessageConfigFile& file = LLMessageConfigFile::instance(); + LLSD config = file.mMessages[msg_name]; + if (!config.has("trusted-sender")) + { + return false; + } + return config["trusted-sender"].asBoolean(); +} + +//static +bool LLMessageConfig::isValidUntrustedMessage(const std::string& msg_name) +{ + if (sServerName.empty()) + { + llerrs << "LLMessageConfig::isMessageTrusted(name) before" + << " LLMessageConfig::initClass()" << llendl; + } + LLMessageConfigFile& file = LLMessageConfigFile::instance(); + LLSD config = file.mMessages[msg_name]; + if (!config.has("trusted-sender")) + { + return false; + } + return !(config["trusted-sender"].asBoolean()); +} diff --git a/linden/indra/llmessage/llmessageconfig.h b/linden/indra/llmessage/llmessageconfig.h new file mode 100644 index 0000000..1664ce6 --- /dev/null +++ b/linden/indra/llmessage/llmessageconfig.h @@ -0,0 +1,51 @@ +/** + * @file llmessageconfig.h + * @brief Live file handling for messaging + * + * Copyright (c) 2000-2007, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + */ + +#ifndef LL_MESSAGECONFIG_H +#define LL_MESSAGECONFIG_H + +#include + +class LLMessageConfig +{ +public: + static void initClass(const std::string& server_name, + const std::string& config_dir); + // force loading of config file during startup process + // so it can be used for startup features + + static bool isServerDefaultBuilderLLSD(); + static bool isServerDefaultBuilderTemplate(); + + // For individual messages + static bool isMessageBuiltLLSD(const std::string& msg_name); + static bool isMessageBuiltTemplate(const std::string& msg_name); + static bool isMessageTrusted(const std::string& msg_name); + static bool isValidUntrustedMessage(const std::string& msg_name); +}; +#endif // LL_MESSAGECONFIG_H diff --git a/linden/indra/llmessage/llmessagereader.cpp b/linden/indra/llmessage/llmessagereader.cpp new file mode 100644 index 0000000..4824480 --- /dev/null +++ b/linden/indra/llmessage/llmessagereader.cpp @@ -0,0 +1,35 @@ +#include "llmessagereader.h" + +static BOOL sTimeDecodes = FALSE; + +static F32 sTimeDecodesSpamThreshold = 0.05f; + +//virtual +LLMessageReader::~LLMessageReader() +{ + // even abstract base classes need a concrete destructor +} + +//static +void LLMessageReader::setTimeDecodes(BOOL b) +{ + sTimeDecodes = b; +} + +//static +void LLMessageReader::setTimeDecodesSpamThreshold(F32 seconds) +{ + sTimeDecodesSpamThreshold = seconds; +} + +//static +BOOL LLMessageReader::getTimeDecodes() +{ + return sTimeDecodes; +} + +//static +F32 LLMessageReader::getTimeDecodesSpamThreshold() +{ + return sTimeDecodesSpamThreshold; +} diff --git a/linden/indra/llmessage/llmessagereader.h b/linden/indra/llmessage/llmessagereader.h new file mode 100644 index 0000000..33ce928 --- /dev/null +++ b/linden/indra/llmessage/llmessagereader.h @@ -0,0 +1,59 @@ +#ifndef LL_LLMESSAGEREADER_H +#define LL_LLMESSAGEREADER_H + +#include "stdtypes.h" + +class LLHost; +class LLMessageBuilder; +class LLMsgData; +class LLQuaternion; +class LLUUID; +class LLVector3; +class LLVector3d; +class LLVector4; + +class LLMessageReader +{ + public: + + virtual ~LLMessageReader(); + + /** All get* methods expect pointers to canonical strings. */ + virtual void getBinaryData(const char *blockname, const char *varname, void *datap, S32 size, S32 blocknum = 0, S32 max_size = S32_MAX) = 0; + virtual void getBOOL(const char *block, const char *var, BOOL &data, S32 blocknum = 0) = 0; + virtual void getS8(const char *block, const char *var, S8 &data, S32 blocknum = 0) = 0; + virtual void getU8(const char *block, const char *var, U8 &data, S32 blocknum = 0) = 0; + virtual void getS16(const char *block, const char *var, S16 &data, S32 blocknum = 0) = 0; + virtual void getU16(const char *block, const char *var, U16 &data, S32 blocknum = 0) = 0; + virtual void getS32(const char *block, const char *var, S32 &data, S32 blocknum = 0) = 0; + virtual void getF32(const char *block, const char *var, F32 &data, S32 blocknum = 0) = 0; + virtual void getU32(const char *block, const char *var, U32 &data, S32 blocknum = 0) = 0; + virtual void getU64(const char *block, const char *var, U64 &data, S32 blocknum = 0) = 0; + virtual void getF64(const char *block, const char *var, F64 &data, S32 blocknum = 0) = 0; + virtual void getVector3(const char *block, const char *var, LLVector3 &vec, S32 blocknum = 0) = 0; + virtual void getVector4(const char *block, const char *var, LLVector4 &vec, S32 blocknum = 0) = 0; + virtual void getVector3d(const char *block, const char *var, LLVector3d &vec, S32 blocknum = 0) = 0; + virtual void getQuat(const char *block, const char *var, LLQuaternion &q, S32 blocknum = 0) = 0; + virtual void getUUID(const char *block, const char *var, LLUUID &uuid, S32 blocknum = 0) = 0; + virtual void getIPAddr(const char *block, const char *var, U32 &ip, S32 blocknum = 0) = 0; + virtual void getIPPort(const char *block, const char *var, U16 &port, S32 blocknum = 0) = 0; + virtual void getString(const char *block, const char *var, S32 buffer_size, char *buffer, S32 blocknum = 0) = 0; + + virtual S32 getNumberOfBlocks(const char *blockname) = 0; + virtual S32 getSize(const char *blockname, const char *varname) = 0; + virtual S32 getSize(const char *blockname, S32 blocknum, const char *varname) = 0; + + virtual void clearMessage() = 0; + + virtual const char* getMessageName() const = 0; + virtual S32 getMessageSize() const = 0; + + virtual void copyToBuilder(LLMessageBuilder&) const = 0; + + static void setTimeDecodes(BOOL b); + static BOOL getTimeDecodes(); + static void setTimeDecodesSpamThreshold(F32 seconds); + static F32 getTimeDecodesSpamThreshold(); +}; + +#endif // LL_LLMESSAGEREADER_H diff --git a/linden/indra/llmessage/llmessagetemplate.cpp b/linden/indra/llmessage/llmessagetemplate.cpp new file mode 100644 index 0000000..026843d --- /dev/null +++ b/linden/indra/llmessage/llmessagetemplate.cpp @@ -0,0 +1,146 @@ +#include "linden_common.h" + +#include "llmessagetemplate.h" + +#include "message.h" + +void LLMsgVarData::addData(const void *data, S32 size, EMsgVariableType type, S32 data_size) +{ + mSize = size; + mDataSize = data_size; + if ( (type != MVT_VARIABLE) && (type != MVT_FIXED) + && (mType != MVT_VARIABLE) && (mType != MVT_FIXED)) + { + if (mType != type) + { + llwarns << "Type mismatch in LLMsgVarData::addData for " << mName + << llendl; + } + } + if(size) + { + delete mData; // Delete it if it already exists + mData = new U8[size]; + htonmemcpy(mData, data, mType, size); + } +} + +void LLMsgData::addDataFast(char *blockname, char *varname, const void *data, S32 size, EMsgVariableType type, S32 data_size) +{ + // remember that if the blocknumber is > 0 then the number is appended to the name + char *namep = (char *)blockname; + LLMsgBlkData* block_data = mMemberBlocks[namep]; + if (block_data->mBlockNumber) + { + namep += block_data->mBlockNumber; + block_data->addData(varname, data, size, type, data_size); + } + else + { + block_data->addData(varname, data, size, type, data_size); + } +} + +// LLMessageVariable functions and friends + +std::ostream& operator<<(std::ostream& s, LLMessageVariable &msg) +{ + s << "\t\t" << msg.mName << " ("; + switch (msg.mType) + { + case MVT_FIXED: + s << "Fixed, " << msg.mSize << " bytes total)\n"; + break; + case MVT_VARIABLE: + s << "Variable, " << msg.mSize << " bytes of size info)\n"; + break; + default: + s << "Unknown\n"; + break; + } + return s; +} + +// LLMessageBlock functions and friends + +std::ostream& operator<<(std::ostream& s, LLMessageBlock &msg) +{ + s << "\t" << msg.mName << " ("; + switch (msg.mType) + { + case MBT_SINGLE: + s << "Fixed"; + break; + case MBT_MULTIPLE: + s << "Multiple - " << msg.mNumber << " copies"; + break; + case MBT_VARIABLE: + s << "Variable"; + break; + default: + s << "Unknown"; + break; + } + if (msg.mTotalSize != -1) + { + s << ", " << msg.mTotalSize << " bytes each, " << msg.mNumber*msg.mTotalSize << " bytes total)\n"; + } + else + { + s << ")\n"; + } + + + for (LLMessageBlock::message_variable_map_t::iterator iter = msg.mMemberVariables.begin(); + iter != msg.mMemberVariables.end(); iter++) + { + LLMessageVariable& ci = *(iter->second); + s << ci; + } + + return s; +} + +// LLMessageTemplate functions and friends + +std::ostream& operator<<(std::ostream& s, LLMessageTemplate &msg) +{ + switch (msg.mFrequency) + { + case MFT_HIGH: + s << "========================================\n" << "Message #" << msg.mMessageNumber << "\n" << msg.mName << " ("; + s << "High"; + break; + case MFT_MEDIUM: + s << "========================================\n" << "Message #"; + s << (msg.mMessageNumber & 0xFF) << "\n" << msg.mName << " ("; + s << "Medium"; + break; + case MFT_LOW: + s << "========================================\n" << "Message #"; + s << (msg.mMessageNumber & 0xFFFF) << "\n" << msg.mName << " ("; + s << "Low"; + break; + default: + s << "Unknown"; + break; + } + + if (msg.mTotalSize != -1) + { + s << ", " << msg.mTotalSize << " bytes total)\n"; + } + else + { + s << ")\n"; + } + + for (LLMessageTemplate::message_block_map_t::iterator iter = msg.mMemberBlocks.begin(); + iter != msg.mMemberBlocks.end(); iter++) + { + LLMessageBlock* ci = iter->second; + s << *ci; + } + + return s; +} diff --git a/linden/indra/llmessage/llmessagetemplate.h b/linden/indra/llmessage/llmessagetemplate.h new file mode 100644 index 0000000..8847ddc --- /dev/null +++ b/linden/indra/llmessage/llmessagetemplate.h @@ -0,0 +1,356 @@ +#ifndef LL_LLMESSAGETEMPLATE_H +#define LL_LLMESSAGETEMPLATE_H + +#include "lldarray.h" +#include "message.h" // TODO: babbage: Remove... +#include "llstl.h" + +class LLMsgVarData +{ +public: + LLMsgVarData() : mName(NULL), mSize(-1), mDataSize(-1), mData(NULL), mType(MVT_U8) + { + } + + LLMsgVarData(const char *name, EMsgVariableType type) : mSize(-1), mDataSize(-1), mData(NULL), mType(type) + { + mName = (char *)name; + } + + ~LLMsgVarData() + { + // copy constructor just copies the mData pointer, so only delete mData explicitly + } + + void deleteData() + { + delete[] mData; + mData = NULL; + } + + void addData(const void *indata, S32 size, EMsgVariableType type, S32 data_size = -1); + + char *getName() const { return mName; } + S32 getSize() const { return mSize; } + void *getData() { return (void*)mData; } + const void *getData() const { return (const void*)mData; } + S32 getDataSize() const { return mDataSize; } + EMsgVariableType getType() const { return mType; } + +protected: + char *mName; + S32 mSize; + S32 mDataSize; + + U8 *mData; + EMsgVariableType mType; +}; + +class LLMsgBlkData +{ +public: + LLMsgBlkData(const char *name, S32 blocknum) : mOffset(-1), mBlockNumber(blocknum), mTotalSize(-1) + { + mName = (char *)name; + } + + ~LLMsgBlkData() + { + for (msg_var_data_map_t::iterator iter = mMemberVarData.begin(); + iter != mMemberVarData.end(); iter++) + { + iter->deleteData(); + } + } + + void addVariable(const char *name, EMsgVariableType type) + { + LLMsgVarData tmp(name,type); + mMemberVarData[name] = tmp; + } + + void addData(char *name, const void *data, S32 size, EMsgVariableType type, S32 data_size = -1) + { + LLMsgVarData* temp = &mMemberVarData[name]; // creates a new entry if one doesn't exist + temp->addData(data, size, type, data_size); + } + + S32 mOffset; + S32 mBlockNumber; + typedef LLDynamicArrayIndexed msg_var_data_map_t; + msg_var_data_map_t mMemberVarData; + char *mName; + S32 mTotalSize; +}; + +class LLMsgData +{ +public: + LLMsgData(const char *name) : mTotalSize(-1) + { + mName = (char *)name; + } + ~LLMsgData() + { + for_each(mMemberBlocks.begin(), mMemberBlocks.end(), DeletePairedPointer()); + } + + void addBlock(LLMsgBlkData *blockp) + { + mMemberBlocks[blockp->mName] = blockp; + } + + void addDataFast(char *blockname, char *varname, const void *data, S32 size, EMsgVariableType type, S32 data_size = -1); + +public: + S32 mOffset; + typedef std::map msg_blk_data_map_t; + msg_blk_data_map_t mMemberBlocks; + char *mName; + S32 mTotalSize; +}; + +// LLMessage* classes store the template of messages +class LLMessageVariable +{ +public: + LLMessageVariable() : mName(NULL), mType(MVT_NULL), mSize(-1) + { + } + + LLMessageVariable(char *name) : mType(MVT_NULL), mSize(-1) + { + mName = name; + } + + LLMessageVariable(char *name, const EMsgVariableType type, const S32 size) : mType(type), mSize(size) + { + mName = gMessageStringTable.getString(name); + } + + ~LLMessageVariable() {} + + friend std::ostream& operator<<(std::ostream& s, LLMessageVariable &msg); + + EMsgVariableType getType() const { return mType; } + S32 getSize() const { return mSize; } + char *getName() const { return mName; } +protected: + char *mName; + EMsgVariableType mType; + S32 mSize; +}; + + +typedef enum e_message_block_type +{ + MBT_NULL, + MBT_SINGLE, + MBT_MULTIPLE, + MBT_VARIABLE, + MBT_EOF +} EMsgBlockType; + +class LLMessageBlock +{ +public: + LLMessageBlock(char *name, EMsgBlockType type, S32 number = 1) : mType(type), mNumber(number), mTotalSize(0) + { + mName = gMessageStringTable.getString(name); + } + + ~LLMessageBlock() + { + for_each(mMemberVariables.begin(), mMemberVariables.end(), DeletePairedPointer()); + } + + void addVariable(char *name, const EMsgVariableType type, const S32 size) + { + LLMessageVariable** varp = &mMemberVariables[name]; + if (*varp != NULL) + { + llerrs << name << " has already been used as a variable name!" << llendl; + } + *varp = new LLMessageVariable(name, type, size); + if (((*varp)->getType() != MVT_VARIABLE) + &&(mTotalSize != -1)) + { + mTotalSize += (*varp)->getSize(); + } + else + { + mTotalSize = -1; + } + } + + EMsgVariableType getVariableType(char *name) + { + return (mMemberVariables[name])->getType(); + } + + S32 getVariableSize(char *name) + { + return (mMemberVariables[name])->getSize(); + } + + friend std::ostream& operator<<(std::ostream& s, LLMessageBlock &msg); + + typedef std::map message_variable_map_t; + message_variable_map_t mMemberVariables; + char *mName; + EMsgBlockType mType; + S32 mNumber; + S32 mTotalSize; +}; + + +enum EMsgFrequency +{ + MFT_NULL = 0, // value is size of message number in bytes + MFT_HIGH = 1, + MFT_MEDIUM = 2, + MFT_LOW = 4 +}; + +typedef enum e_message_trust +{ + MT_TRUST, + MT_NOTRUST +} EMsgTrust; + +enum EMsgEncoding +{ + ME_UNENCODED, + ME_ZEROCODED +}; + +class LLMessageTemplate +{ +public: + LLMessageTemplate(const char *name, U32 message_number, EMsgFrequency freq) + : + //mMemberBlocks(), + mName(NULL), + mFrequency(freq), + mTrust(MT_NOTRUST), + mEncoding(ME_ZEROCODED), + mMessageNumber(message_number), + mTotalSize(0), + mReceiveCount(0), + mReceiveBytes(0), + mReceiveInvalid(0), + mDecodeTimeThisFrame(0.f), + mTotalDecoded(0), + mTotalDecodeTime(0.f), + mMaxDecodeTimePerMsg(0.f), + mBanFromTrusted(false), + mBanFromUntrusted(false), + mHandlerFunc(NULL), + mUserData(NULL) + { + mName = gMessageStringTable.getString(name); + } + + ~LLMessageTemplate() + { + for_each(mMemberBlocks.begin(), mMemberBlocks.end(), DeletePairedPointer()); + } + + void addBlock(LLMessageBlock *blockp) + { + LLMessageBlock** member_blockp = &mMemberBlocks[blockp->mName]; + if (*member_blockp != NULL) + { + llerrs << "Block " << blockp->mName + << "has already been used as a block name!" << llendl; + } + *member_blockp = blockp; + if ( (mTotalSize != -1) + &&(blockp->mTotalSize != -1) + &&( (blockp->mType == MBT_SINGLE) + ||(blockp->mType == MBT_MULTIPLE))) + { + mTotalSize += blockp->mNumber*blockp->mTotalSize; + } + else + { + mTotalSize = -1; + } + } + + LLMessageBlock *getBlock(char *name) + { + return mMemberBlocks[name]; + } + + // Trusted messages can only be recieved on trusted circuits. + void setTrust(EMsgTrust t) + { + mTrust = t; + } + + EMsgTrust getTrust(void) + { + return mTrust; + } + + // controls for how the message should be encoded + void setEncoding(EMsgEncoding e) + { + mEncoding = e; + } + EMsgEncoding getEncoding() + { + return mEncoding; + } + + void setHandlerFunc(void (*handler_func)(LLMessageSystem *msgsystem, void **user_data), void **user_data) + { + mHandlerFunc = handler_func; + mUserData = user_data; + } + + BOOL callHandlerFunc(LLMessageSystem *msgsystem) + { + if (mHandlerFunc) + { + mHandlerFunc(msgsystem, mUserData); + return TRUE; + } + return FALSE; + } + + bool isBanned(bool trustedSource) + { + return trustedSource ? mBanFromTrusted : mBanFromUntrusted; + } + + friend std::ostream& operator<<(std::ostream& s, LLMessageTemplate &msg); + +public: + typedef std::map message_block_map_t; + message_block_map_t mMemberBlocks; + char *mName; + EMsgFrequency mFrequency; + EMsgTrust mTrust; + EMsgEncoding mEncoding; + U32 mMessageNumber; + S32 mTotalSize; + U32 mReceiveCount; // how many of this template have been received since last reset + U32 mReceiveBytes; // How many bytes received + U32 mReceiveInvalid; // How many "invalid" packets + F32 mDecodeTimeThisFrame; // Total seconds spent decoding this frame + U32 mTotalDecoded; // Total messages successfully decoded + F32 mTotalDecodeTime; // Total time successfully decoding messages + F32 mMaxDecodeTimePerMsg; + + bool mBanFromTrusted; + bool mBanFromUntrusted; + +private: + // message handler function (this is set by each application) + void (*mHandlerFunc)(LLMessageSystem *msgsystem, void **user_data); + void **mUserData; +}; + +#endif // LL_LLMESSAGETEMPLATE_H diff --git a/linden/indra/llmessage/llmessagethrottle.cpp b/linden/indra/llmessage/llmessagethrottle.cpp index 309a1d9..07c22a5 100644 --- a/linden/indra/llmessage/llmessagethrottle.cpp +++ b/linden/indra/llmessage/llmessagethrottle.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llmessagethrottle.h b/linden/indra/llmessage/llmessagethrottle.h index 80d4ca3..522358c 100644 --- a/linden/indra/llmessage/llmessagethrottle.h +++ b/linden/indra/llmessage/llmessagethrottle.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llmime.cpp b/linden/indra/llmessage/llmime.cpp index 2786ea8..6938ed7 100644 --- a/linden/indra/llmessage/llmime.cpp +++ b/linden/indra/llmessage/llmime.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llmime.h b/linden/indra/llmessage/llmime.h index 7cb2b74..307a33d 100644 --- a/linden/indra/llmessage/llmime.h +++ b/linden/indra/llmessage/llmime.h @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llmsgvariabletype.h b/linden/indra/llmessage/llmsgvariabletype.h new file mode 100644 index 0000000..360d949 --- /dev/null +++ b/linden/indra/llmessage/llmsgvariabletype.h @@ -0,0 +1,33 @@ +#ifndef LL_LLMSGVARIABLETYPE_H +#define LL_LLMSGVARIABLETYPE_H + +typedef enum e_message_variable_type +{ + MVT_NULL, + MVT_FIXED, + MVT_VARIABLE, + MVT_U8, + MVT_U16, + MVT_U32, + MVT_U64, + MVT_S8, + MVT_S16, + MVT_S32, + MVT_S64, + MVT_F32, + MVT_F64, + MVT_LLVector3, + MVT_LLVector3d, + MVT_LLVector4, + MVT_LLQuaternion, + MVT_LLUUID, + MVT_BOOL, + MVT_IP_ADDR, + MVT_IP_PORT, + MVT_U16Vec3, + MVT_U16Quat, + MVT_S16Array, + MVT_EOL +} EMsgVariableType; + +#endif // LL_LLMSGVARIABLETYPE_H diff --git a/linden/indra/llmessage/llnamevalue.cpp b/linden/indra/llmessage/llnamevalue.cpp index 1304923..6e449ed 100644 --- a/linden/indra/llmessage/llnamevalue.cpp +++ b/linden/indra/llmessage/llnamevalue.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llnamevalue.h b/linden/indra/llmessage/llnamevalue.h index 89fe71b..fe733fa 100644 --- a/linden/indra/llmessage/llnamevalue.h +++ b/linden/indra/llmessage/llnamevalue.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llnullcipher.cpp b/linden/indra/llmessage/llnullcipher.cpp index ad2b25f..eddadeb 100644 --- a/linden/indra/llmessage/llnullcipher.cpp +++ b/linden/indra/llmessage/llnullcipher.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llnullcipher.h b/linden/indra/llmessage/llnullcipher.h index 75d022d..2e41063 100644 --- a/linden/indra/llmessage/llnullcipher.h +++ b/linden/indra/llmessage/llnullcipher.h @@ -3,6 +3,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llpacketack.h b/linden/indra/llmessage/llpacketack.h index e8d598a..c86fb0f 100644 --- a/linden/indra/llmessage/llpacketack.h +++ b/linden/indra/llmessage/llpacketack.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -63,6 +64,14 @@ public: public: LLReliablePacketParams() { + clear(); + }; + + ~LLReliablePacketParams() { }; + + void clear() + { + mHost.invalidate(); mRetries = 0; mPingBasedRetry = TRUE; mTimeout = 0.f; @@ -71,8 +80,6 @@ public: mMessageName = NULL; }; - ~LLReliablePacketParams() { }; - void set ( const LLHost &host, S32 retries, BOOL ping_based_retry, F32 timeout, void (*callback)(void **,S32), void **callback_data, char *name ) @@ -136,7 +143,13 @@ public: } }; - ~LLReliablePacket(){ delete [] mBuffer; }; + + ~LLReliablePacket() + { + mCallback = NULL; + delete [] mBuffer; + mBuffer = NULL; + }; friend class LLCircuitData; protected: diff --git a/linden/indra/llmessage/llpacketbuffer.cpp b/linden/indra/llmessage/llpacketbuffer.cpp index 855fb40..69144f5 100644 --- a/linden/indra/llmessage/llpacketbuffer.cpp +++ b/linden/indra/llmessage/llpacketbuffer.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llpacketbuffer.h b/linden/indra/llmessage/llpacketbuffer.h index 613418a..17fe446 100644 --- a/linden/indra/llmessage/llpacketbuffer.h +++ b/linden/indra/llmessage/llpacketbuffer.h @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llpacketring.cpp b/linden/indra/llmessage/llpacketring.cpp index a2e6eb9..e07c754 100644 --- a/linden/indra/llmessage/llpacketring.cpp +++ b/linden/indra/llmessage/llpacketring.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llpacketring.h b/linden/indra/llmessage/llpacketring.h index 27b830e..1a0c0c6 100644 --- a/linden/indra/llmessage/llpacketring.h +++ b/linden/indra/llmessage/llpacketring.h @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llpartdata.cpp b/linden/indra/llmessage/llpartdata.cpp index de0cb13..f46481e 100644 --- a/linden/indra/llmessage/llpartdata.cpp +++ b/linden/indra/llmessage/llpartdata.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llpartdata.h b/linden/indra/llmessage/llpartdata.h index 55d22d5..3177e84 100644 --- a/linden/indra/llmessage/llpartdata.h +++ b/linden/indra/llmessage/llpartdata.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llpumpio.cpp b/linden/indra/llmessage/llpumpio.cpp index 4ce15b9..e76f3ea 100644 --- a/linden/indra/llmessage/llpumpio.cpp +++ b/linden/indra/llmessage/llpumpio.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -333,6 +334,12 @@ bool LLPumpIO::copyCurrentLinkInfo(links_t& links) const void LLPumpIO::pump() { + pump(DEFAULT_POLL_TIMEOUT); +} + +//timeout is in microseconds +void LLPumpIO::pump(const S32& poll_timeout) +{ LLMemType m1(LLMemType::MTYPE_IO_PUMP); LLFastTimer t1(LLFastTimer::FTM_PUMP); //llinfos << "LLPumpIO::pump()" << llendl; @@ -414,7 +421,7 @@ void LLPumpIO::pump() S32 count = 0; S32 client_id = 0; const apr_pollfd_t* poll_fd = NULL; - apr_pollset_poll(mPollset, DEFAULT_POLL_TIMEOUT, &count, &poll_fd); + apr_pollset_poll(mPollset, poll_timeout, &count, &poll_fd); PUMP_DEBUG; for(S32 i = 0; i < count; ++i) { diff --git a/linden/indra/llmessage/llpumpio.h b/linden/indra/llmessage/llpumpio.h index d90d6b0..0f2bd48 100644 --- a/linden/indra/llmessage/llpumpio.h +++ b/linden/indra/llmessage/llpumpio.h @@ -6,6 +6,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -246,6 +247,7 @@ public: * chain has a file descriptor ready, process() will * be called for all pipes which have requested it. */ + void pump(const S32& poll_timeout); void pump(); /** diff --git a/linden/indra/llmessage/llqueryflags.h b/linden/indra/llmessage/llqueryflags.h index 69ba95a..9143995 100644 --- a/linden/indra/llmessage/llqueryflags.h +++ b/linden/indra/llmessage/llqueryflags.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -57,6 +58,9 @@ const U32 DFQ_NAME_SORT = 0x1 << 19; const U32 DFQ_LIMIT_BY_PRICE = 0x1 << 20; const U32 DFQ_LIMIT_BY_AREA = 0x1 << 21; +const U32 DFQ_FILTER_MATURE = 0x1 << 22; +const U32 DFQ_PG_PARCELS_ONLY = 0x1 << 23; + // Sell Type flags const U32 ST_AUCTION = 0x1 << 1; const U32 ST_NEWBIE = 0x1 << 2; diff --git a/linden/indra/llmessage/llregionflags.h b/linden/indra/llmessage/llregionflags.h index 6a8f72a..6a23544 100644 --- a/linden/indra/llmessage/llregionflags.h +++ b/linden/indra/llmessage/llregionflags.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llregionhandle.h b/linden/indra/llmessage/llregionhandle.h index d943374..ad4cf61 100644 --- a/linden/indra/llmessage/llregionhandle.h +++ b/linden/indra/llmessage/llregionhandle.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llsdappservices.cpp b/linden/indra/llmessage/llsdappservices.cpp index 8574f87..ae1505b 100644 --- a/linden/indra/llmessage/llsdappservices.cpp +++ b/linden/indra/llmessage/llsdappservices.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llsdappservices.h b/linden/indra/llmessage/llsdappservices.h index 8e6e868..0075b2e 100644 --- a/linden/indra/llmessage/llsdappservices.h +++ b/linden/indra/llmessage/llsdappservices.h @@ -6,6 +6,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llsdhttpserver.cpp b/linden/indra/llmessage/llsdhttpserver.cpp index 4054680..8ca7f14 100644 --- a/linden/indra/llmessage/llsdhttpserver.cpp +++ b/linden/indra/llmessage/llsdhttpserver.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llsdhttpserver.h b/linden/indra/llmessage/llsdhttpserver.h index 904852f..b6904f3 100644 --- a/linden/indra/llmessage/llsdhttpserver.h +++ b/linden/indra/llmessage/llsdhttpserver.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llsdmessagebuilder.cpp b/linden/indra/llmessage/llsdmessagebuilder.cpp new file mode 100755 index 0000000..b7deb48 --- /dev/null +++ b/linden/indra/llmessage/llsdmessagebuilder.cpp @@ -0,0 +1,281 @@ +#include "linden_common.h" + +#include "llsdmessagebuilder.h" + +#include "llmessagetemplate.h" +#include "llquaternion.h" +#include "llsdutil.h" +#include "llsdserialize.h" +#include "u64.h" +#include "v3dmath.h" +#include "v3math.h" +#include "v4math.h" + +LLSDMessageBuilder::LLSDMessageBuilder() : + mCurrentMessage(LLSD::emptyMap()), + mCurrentBlock(NULL), + mCurrentMessageName(""), + mCurrentBlockName(""), + mbSBuilt(FALSE), + mbSClear(TRUE) +{ +} + +//virtual +LLSDMessageBuilder::~LLSDMessageBuilder() +{ +} + + +// virtual +void LLSDMessageBuilder::newMessage(const char *name) +{ + mbSBuilt = FALSE; + mbSClear = FALSE; + + mCurrentMessage = LLSD::emptyMap(); + mCurrentMessageName = (char *)name; +} + +// virtual +void LLSDMessageBuilder::clearMessage() +{ + mbSBuilt = FALSE; + mbSClear = TRUE; + + mCurrentMessage = LLSD::emptyMap(); + mCurrentMessageName = ""; +} + +// virtual +void LLSDMessageBuilder::nextBlock(const char* blockname) +{ + LLSD& block = mCurrentMessage[blockname]; + if(block.isUndefined()) + { + block[0] = LLSD::emptyMap(); + mCurrentBlock = &(block[0]); + } + else if(block.isArray()) + { + block[block.size()] = LLSD::emptyMap(); + mCurrentBlock = &(block[block.size() - 1]); + } + else + { + llerrs << "existing block not array" << llendl; + } +} + +// TODO: Remove this horror... +BOOL LLSDMessageBuilder::removeLastBlock() +{ + /* TODO: finish implementing this */ + return FALSE; +} + +void LLSDMessageBuilder::addBinaryData(const char *varname, + const void *data, S32 size) +{ + std::vector v; + v.resize(size); + memcpy(&(v[0]), reinterpret_cast(data), size); + (*mCurrentBlock)[varname] = v; +} + +void LLSDMessageBuilder::addS8(const char *varname, S8 v) +{ + (*mCurrentBlock)[varname] = v; +} + +void LLSDMessageBuilder::addU8(const char *varname, U8 v) +{ + (*mCurrentBlock)[varname] = v; +} + +void LLSDMessageBuilder::addS16(const char *varname, S16 v) +{ + (*mCurrentBlock)[varname] = v; +} + +void LLSDMessageBuilder::addU16(const char *varname, U16 v) +{ + (*mCurrentBlock)[varname] = v; +} + +void LLSDMessageBuilder::addF32(const char *varname, F32 v) +{ + (*mCurrentBlock)[varname] = v; +} + +void LLSDMessageBuilder::addS32(const char *varname, S32 v) +{ + (*mCurrentBlock)[varname] = v; +} + +void LLSDMessageBuilder::addU32(const char *varname, U32 v) +{ + (*mCurrentBlock)[varname] = ll_sd_from_U32(v); +} + +void LLSDMessageBuilder::addU64(const char *varname, U64 v) +{ + (*mCurrentBlock)[varname] = ll_sd_from_U64(v); +} + +void LLSDMessageBuilder::addF64(const char *varname, F64 v) +{ + (*mCurrentBlock)[varname] = v; +} + +void LLSDMessageBuilder::addIPAddr(const char *varname, U32 v) +{ + (*mCurrentBlock)[varname] = ll_sd_from_ipaddr(v); +} + +void LLSDMessageBuilder::addIPPort(const char *varname, U16 v) +{ + (*mCurrentBlock)[varname] = v; +} + +void LLSDMessageBuilder::addBOOL(const char* varname, BOOL v) +{ + (*mCurrentBlock)[varname] = (v == TRUE); +} + +void LLSDMessageBuilder::addString(const char* varname, const char* v) +{ + if (v) + (*mCurrentBlock)[varname] = v; /* Flawfinder: ignore */ + else + (*mCurrentBlock)[varname] = ""; +} + +void LLSDMessageBuilder::addString(const char* varname, const std::string& v) +{ + if (v.size()) + (*mCurrentBlock)[varname] = v; + else + (*mCurrentBlock)[varname] = ""; +} + +void LLSDMessageBuilder::addVector3(const char *varname, const LLVector3& v) +{ + (*mCurrentBlock)[varname] = ll_sd_from_vector3(v); +} + +void LLSDMessageBuilder::addVector4(const char *varname, const LLVector4& v) +{ + (*mCurrentBlock)[varname] = ll_sd_from_vector4(v); +} + +void LLSDMessageBuilder::addVector3d(const char *varname, const LLVector3d& v) +{ + (*mCurrentBlock)[varname] = ll_sd_from_vector3d(v); +} + +void LLSDMessageBuilder::addQuat(const char *varname, const LLQuaternion& v) +{ + (*mCurrentBlock)[varname] = ll_sd_from_quaternion(v); +} + +void LLSDMessageBuilder::addUUID(const char *varname, const LLUUID& v) +{ + (*mCurrentBlock)[varname] = v; +} + +void LLSDMessageBuilder::compressMessage(U8*& buf_ptr, U32& buffer_length) +{ +} + +BOOL LLSDMessageBuilder::isMessageFull(const char* blockname) const +{ + return FALSE; +} + +// make sure that all the desired data is in place and then copy the data +// into MAX_BUFFER_SIZEd buffer +U32 LLSDMessageBuilder::buildMessage(U8* buffer, U32 buffer_size) +{ + return 0; +} + +void LLSDMessageBuilder::copyFromMessageData(const LLMsgData& data) +{ + // copy the blocks + // counting variables used to encode multiple block info + S32 block_count = 0; + char *block_name = NULL; + + // loop through msg blocks to loop through variables, totalling up size + // data and filling the new (send) message + LLMsgData::msg_blk_data_map_t::const_iterator iter = + data.mMemberBlocks.begin(); + LLMsgData::msg_blk_data_map_t::const_iterator end = + data.mMemberBlocks.end(); + for(; iter != end; ++iter) + { + const LLMsgBlkData* mbci = iter->second; + if(!mbci) continue; + + // do we need to encode a block code? + if (block_count == 0) + { + block_count = mbci->mBlockNumber; + block_name = (char *)mbci->mName; + } + + // counting down mutliple blocks + block_count--; + + nextBlock(block_name); + + // now loop through the variables + LLMsgBlkData::msg_var_data_map_t::const_iterator dit = mbci->mMemberVarData.begin(); + LLMsgBlkData::msg_var_data_map_t::const_iterator dend = mbci->mMemberVarData.end(); + + for(; dit != dend; ++dit) + { + //const LLMsgVarData& mvci = *dit; + + // TODO: Copy mvci data in to block: + // (*mCurrentBlock)[varname] = v; + } + } +} + +//virtual +void LLSDMessageBuilder::copyFromLLSD(const LLSD& msg) +{ + mCurrentMessage = msg; + llinfos << LLSDXMLStreamer(mCurrentMessage) << llendl; +} + +const LLSD& LLSDMessageBuilder::getMessage() const +{ + return mCurrentMessage; +} + +//virtual +void LLSDMessageBuilder::setBuilt(BOOL b) { mbSBuilt = b; } + +//virtual +BOOL LLSDMessageBuilder::isBuilt() const {return mbSBuilt;} + +//virtual +BOOL LLSDMessageBuilder::isClear() const {return mbSClear;} + +//virtual +S32 LLSDMessageBuilder::getMessageSize() +{ + // babbage: size is unknown as message stored as LLSD. + // return non-zero if pending data, as send can be skipped for 0 size. + // return 1 to encourage senders checking size against splitting message. + return mCurrentMessage.size()? 1 : 0; +} + +//virtual +const char* LLSDMessageBuilder::getMessageName() const +{ + return mCurrentMessageName.c_str(); +} diff --git a/linden/indra/llmessage/llsdmessagebuilder.h b/linden/indra/llmessage/llsdmessagebuilder.h new file mode 100755 index 0000000..f04194d --- /dev/null +++ b/linden/indra/llmessage/llsdmessagebuilder.h @@ -0,0 +1,98 @@ +#ifndef LL_LLSDMESSAGEBUILDER_H +#define LL_LLSDMESSAGEBUILDER_H + +#include + +#include "llmessagebuilder.h" +#include "llmsgvariabletype.h" +#include "llsd.h" + +class LLMessageTemplate; +class LLMsgData; + +class LLSDMessageBuilder : public LLMessageBuilder +{ +public: + + //CLASS_LOG_TYPE(LLSDMessageBuilder); + + LLSDMessageBuilder(); + virtual ~LLSDMessageBuilder(); + + virtual void newMessage(const char *name); + + virtual void nextBlock(const char* blockname); + virtual BOOL removeLastBlock(); // TODO: babbage: remove this horror... + + /** All add* methods expect pointers to canonical varname strings. */ + virtual void addBinaryData(const char *varname, const void *data, + S32 size); + virtual void addBOOL(const char* varname, BOOL b); + virtual void addS8(const char *varname, S8 s); + virtual void addU8(const char *varname, U8 u); + virtual void addS16(const char *varname, S16 i); + virtual void addU16(const char *varname, U16 i); + virtual void addF32(const char *varname, F32 f); + virtual void addS32(const char *varname, S32 s); + virtual void addU32(const char *varname, U32 u); + virtual void addU64(const char *varname, U64 lu); + virtual void addF64(const char *varname, F64 d); + virtual void addVector3(const char *varname, const LLVector3& vec); + virtual void addVector4(const char *varname, const LLVector4& vec); + virtual void addVector3d(const char *varname, const LLVector3d& vec); + virtual void addQuat(const char *varname, const LLQuaternion& quat); + virtual void addUUID(const char *varname, const LLUUID& uuid); + virtual void addIPAddr(const char *varname, const U32 ip); + virtual void addIPPort(const char *varname, const U16 port); + virtual void addString(const char* varname, const char* s); + virtual void addString(const char* varname, const std::string& s); + + virtual BOOL isMessageFull(const char* blockname) const; + virtual void compressMessage(U8*& buf_ptr, U32& buffer_length); + + virtual BOOL isBuilt() const; + virtual BOOL isClear() const; + virtual U32 buildMessage(U8* buffer, U32 buffer_size); + /**< Return built message size */ + + virtual void clearMessage(); + + // TODO: babbage: remove this horror. + virtual void setBuilt(BOOL b); + + virtual S32 getMessageSize(); + virtual const char* getMessageName() const; + + virtual void copyFromMessageData(const LLMsgData& data); + + virtual void copyFromLLSD(const LLSD& msg); + + const LLSD& getMessage() const; +private: + + /* mCurrentMessage is of the following format: + mCurrentMessage = { 'block_name1' : [ { 'block1_field1' : 'b1f1_data', + 'block1_field2' : 'b1f2_data', + ... + 'block1_fieldn' : 'b1fn_data'}, + { 'block2_field1' : 'b2f1_data', + 'block2_field2' : 'b2f2_data', + ... + 'block2_fieldn' : 'b2fn_data'}, + ... + { 'blockm_field1' : 'bmf1_data', + 'blockm_field2' : 'bmf2_data', + ... + 'blockm_fieldn' : 'bmfn_data'} ], + 'block_name2' : ..., + ... + 'block_namem' } */ + LLSD mCurrentMessage; + LLSD* mCurrentBlock; + std::string mCurrentMessageName; + std::string mCurrentBlockName; + BOOL mbSBuilt; + BOOL mbSClear; +}; + +#endif // LL_LLSDMESSAGEBUILDER_H diff --git a/linden/indra/llmessage/llsdmessagereader.cpp b/linden/indra/llmessage/llsdmessagereader.cpp new file mode 100755 index 0000000..6312bee --- /dev/null +++ b/linden/indra/llmessage/llsdmessagereader.cpp @@ -0,0 +1,264 @@ +#include "llsdmessagereader.h" +#include "llsdutil.h" +#include "llmessagebuilder.h" +#include "llsdmessagebuilder.h" + +LLSDMessageReader::LLSDMessageReader() +{ +} + +//virtual +LLSDMessageReader::~LLSDMessageReader() +{ +} + + +LLSD getLLSD(const LLSD& input, const char* block, const char* var, S32 blocknum) +{ + if(input[block].isArray()) + { + return input[block][blocknum][var]; + } + return LLSD(); +} + +//virtual +void LLSDMessageReader::getBinaryData(const char *block, const char *var, + void *datap, S32 size, S32 blocknum, + S32 max_size) +{ + std::vector data = getLLSD(mMessage, block, var, blocknum); + S32 data_size = (S32)data.size(); + + if (size && data_size != size) + { + return; + } + + if (max_size < data_size) + { + data_size = max_size; + } + + memcpy(datap, &(data[0]), data_size); +} + +//virtual +void LLSDMessageReader::getBOOL(const char *block, const char *var, + BOOL &data, + S32 blocknum) +{ + data = getLLSD(mMessage, block, var, blocknum); +} + +//virtual +void LLSDMessageReader::getS8(const char *block, const char *var, S8 &data, + S32 blocknum) +{ + data = getLLSD(mMessage, block, var, blocknum).asInteger(); +} + +//virtual +void LLSDMessageReader::getU8(const char *block, const char *var, U8 &data, + S32 blocknum) +{ + data = getLLSD(mMessage, block, var, blocknum).asInteger(); +} + +//virtual +void LLSDMessageReader::getS16(const char *block, const char *var, S16 &data, + S32 blocknum) +{ + data = getLLSD(mMessage, block, var, blocknum).asInteger(); +} + +//virtual +void LLSDMessageReader::getU16(const char *block, const char *var, U16 &data, + S32 blocknum) +{ + data = getLLSD(mMessage, block, var, blocknum).asInteger(); +} + +//virtual +void LLSDMessageReader::getS32(const char *block, const char *var, S32 &data, + S32 blocknum) +{ + data = getLLSD(mMessage, block, var, blocknum); +} + +//virtual +void LLSDMessageReader::getF32(const char *block, const char *var, F32 &data, + S32 blocknum) +{ + data = (F32)getLLSD(mMessage, block, var, blocknum).asReal(); +} + +//virtual +void LLSDMessageReader::getU32(const char *block, const char *var, U32 &data, + S32 blocknum) +{ + data = ll_U32_from_sd(getLLSD(mMessage, block, var, blocknum)); +} + +//virtual +void LLSDMessageReader::getU64(const char *block, const char *var, + U64 &data, S32 blocknum) +{ + data = ll_U64_from_sd(getLLSD(mMessage, block, var, blocknum)); +} + +//virtual +void LLSDMessageReader::getF64(const char *block, const char *var, + F64 &data, S32 blocknum) +{ + data = getLLSD(mMessage, block, var, blocknum); +} + +//virtual +void LLSDMessageReader::getVector3(const char *block, const char *var, + LLVector3 &vec, S32 blocknum) +{ + vec = ll_vector3_from_sd(getLLSD(mMessage, block, var, blocknum)); +} + +//virtual +void LLSDMessageReader::getVector4(const char *block, const char *var, + LLVector4 &vec, S32 blocknum) +{ + vec = ll_vector4_from_sd(getLLSD(mMessage, block, var, blocknum)); +} + +//virtual +void LLSDMessageReader::getVector3d(const char *block, const char *var, + LLVector3d &vec, S32 blocknum) +{ + vec = ll_vector3d_from_sd(getLLSD(mMessage, block, var, blocknum)); +} + +//virtual +void LLSDMessageReader::getQuat(const char *block, const char *var, + LLQuaternion &q, S32 blocknum) +{ + q = ll_quaternion_from_sd(getLLSD(mMessage, block, var, blocknum)); +} + +//virtual +void LLSDMessageReader::getUUID(const char *block, const char *var, + LLUUID &uuid, S32 blocknum) +{ + uuid = getLLSD(mMessage, block, var, blocknum); +} + +//virtual +void LLSDMessageReader::getIPAddr(const char *block, const char *var, + U32 &ip, S32 blocknum) +{ + ip = ll_ipaddr_from_sd(getLLSD(mMessage, block, var, blocknum)); +} + +//virtual +void LLSDMessageReader::getIPPort(const char *block, const char *var, + U16 &port, S32 blocknum) +{ + port = getLLSD(mMessage, block, var, blocknum).asInteger(); +} + +//virtual +void LLSDMessageReader::getString(const char *block, const char *var, + S32 buffer_size, char *buffer, S32 blocknum) +{ + std::string data = getLLSD(mMessage, block, var, blocknum); + + S32 data_size = data.size(); + if (data_size >= buffer_size) + { + data_size = buffer_size - 1; + } + memcpy(buffer, data.data(), data_size); + buffer[data_size] = '\0'; +} + + +//virtual +S32 LLSDMessageReader::getNumberOfBlocks(const char *blockname) +{ + return mMessage[blockname].size(); +} + +S32 getElementSize(const LLSD& llsd) +{ + LLSD::Type type = llsd.type(); + switch(type) + { + case LLSD::TypeBoolean: + return sizeof(bool); + case LLSD::TypeInteger: + return sizeof(S32); + case LLSD::TypeReal: + return sizeof(F64); + case LLSD::TypeString: + return llsd.asString().size(); + case LLSD::TypeUUID: + return sizeof(LLUUID); + case LLSD::TypeDate: + return sizeof(LLDate); + case LLSD::TypeURI: + return sizeof(LLURI); + case LLSD::TypeBinary: + { + std::vector data = llsd; + return data.size() * sizeof(U8); + } + case LLSD::TypeMap: + case LLSD::TypeArray: + case LLSD::TypeUndefined: + return 0; + } + return 0; +} + +//virtual +//Mainly used to find size of binary block of data +S32 LLSDMessageReader::getSize(const char *blockname, const char *varname) +{ + return getElementSize(mMessage[blockname][0][varname]); +} + + +//virtual +S32 LLSDMessageReader::getSize(const char *blockname, S32 blocknum, + const char *varname) +{ + return getElementSize(mMessage[blockname][blocknum][varname]); +} + +//virtual +void LLSDMessageReader::clearMessage() +{ + mMessage = LLSD(); +} + +//virtual +const char* LLSDMessageReader::getMessageName() const +{ + return mMessageName.c_str(); +} + +// virtual +S32 LLSDMessageReader::getMessageSize() const +{ + return 0; +} + +//virtual +void LLSDMessageReader::copyToBuilder(LLMessageBuilder& builder) const +{ + builder.copyFromLLSD(mMessage); +} + +void LLSDMessageReader::setMessage(const std::string& name, const LLSD& message) +{ + mMessageName = name; + // TODO: Validate + mMessage = message; +} diff --git a/linden/indra/llmessage/llsdmessagereader.h b/linden/indra/llmessage/llsdmessagereader.h new file mode 100755 index 0000000..5785194 --- /dev/null +++ b/linden/indra/llmessage/llsdmessagereader.h @@ -0,0 +1,79 @@ +#ifndef LL_LLSDMESSAGEREADER_H +#define LL_LLSDMESSAGEREADER_H + +#include "llmessagereader.h" +#include "llsd.h" + +#include + +class LLMessageTemplate; +class LLMsgData; + +class LLSDMessageReader : public LLMessageReader +{ +public: + + LLSDMessageReader(); + virtual ~LLSDMessageReader(); + + /** All get* methods expect pointers to canonical strings. */ + virtual void getBinaryData(const char *block, const char *var, + void *datap, S32 size, S32 blocknum = 0, + S32 max_size = S32_MAX); + virtual void getBOOL(const char *block, const char *var, BOOL &data, + S32 blocknum = 0); + virtual void getS8(const char *block, const char *var, S8 &data, + S32 blocknum = 0); + virtual void getU8(const char *block, const char *var, U8 &data, + S32 blocknum = 0); + virtual void getS16(const char *block, const char *var, S16 &data, + S32 blocknum = 0); + virtual void getU16(const char *block, const char *var, U16 &data, + S32 blocknum = 0); + virtual void getS32(const char *block, const char *var, S32 &data, + S32 blocknum = 0); + virtual void getF32(const char *block, const char *var, F32 &data, + S32 blocknum = 0); + virtual void getU32(const char *block, const char *var, U32 &data, + S32 blocknum = 0); + virtual void getU64(const char *block, const char *var, U64 &data, + S32 blocknum = 0); + virtual void getF64(const char *block, const char *var, F64 &data, + S32 blocknum = 0); + virtual void getVector3(const char *block, const char *var, + LLVector3 &vec, S32 blocknum = 0); + virtual void getVector4(const char *block, const char *var, + LLVector4 &vec, S32 blocknum = 0); + virtual void getVector3d(const char *block, const char *var, + LLVector3d &vec, S32 blocknum = 0); + virtual void getQuat(const char *block, const char *var, LLQuaternion &q, + S32 blocknum = 0); + virtual void getUUID(const char *block, const char *var, LLUUID &uuid, + S32 blocknum = 0); + virtual void getIPAddr(const char *block, const char *var, U32 &ip, + S32 blocknum = 0); + virtual void getIPPort(const char *block, const char *var, U16 &port, + S32 blocknum = 0); + virtual void getString(const char *block, const char *var, + S32 buffer_size, char *buffer, S32 blocknum = 0); + + virtual S32 getNumberOfBlocks(const char *blockname); + virtual S32 getSize(const char *blockname, const char *varname); + virtual S32 getSize(const char *blockname, S32 blocknum, + const char *varname); + + virtual void clearMessage(); + + virtual const char* getMessageName() const; + virtual S32 getMessageSize() const; + + virtual void copyToBuilder(LLMessageBuilder&) const; + + void setMessage(const std::string& name, const LLSD& msg); + +private: + std::string mMessageName; + LLSD mMessage; +}; + +#endif // LL_LLSDMESSAGEREADER_H diff --git a/linden/indra/llmessage/llsdmessagesystem.cpp b/linden/indra/llmessage/llsdmessagesystem.cpp deleted file mode 100644 index 66382ea..0000000 --- a/linden/indra/llmessage/llsdmessagesystem.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/** - * @file llsdmessagesystem.cpp - * @brief LLSDMessageSystem class implementation - * - * Copyright (c) 2001-2007, Linden Research, Inc. - * - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlife.com/developers/opensource/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at http://secondlife.com/developers/opensource/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include "linden_common.h" -#include "llsdmessagesystem.h" - -#include "llhttpnode.h" -#include "llsdutil.h" - -LLSDMessageSystem::LLSDMessageSystem() : mMsg(* new LLMessageSystem()) -{ -} - -LLSDMessageSystem::LLSDMessageSystem(LLMessageSystem& delegateSystem) : mMsg(delegateSystem) -{ -} - -LLSDMessageSystem::~LLSDMessageSystem() -{ -} - -bool LLSDMessageSystem::handleMessage(std::string name, const LLSD& message) -{ - setInput(message); - return mMsg.callHandler(name.c_str(), false, this); -} - -void LLSDMessageSystem::setInput(const LLSD& input) -{ - mInput = input; -} - -LLSD getLLSD(const LLSD& input, const char* block, const char* var, S32 blocknum) -{ - if(input[block].isArray()) - { - return input[block][blocknum][var]; - } - return input[block][var]; -} - -//virtual -void LLSDMessageSystem::getU32Fast(const char *block, const char *var, U32 &data, S32 blocknum) -{ - data = ll_U32_from_sd(getLLSD(mInput, block, var, blocknum)); -} - -//virtual -void LLSDMessageSystem::getUUIDFast(const char *block, const char *var, LLUUID &uuid, S32 blocknum) -{ - uuid = getLLSD(mInput, block, var, blocknum).asUUID(); -} - -//virtual -void LLSDMessageSystem::getIPAddrFast(const char *block, const char *var, U32 &ip, S32 blocknum) -{ - ip = ll_ipaddr_from_sd(getLLSD(mInput, block, var, blocknum)); -} - -//virtual -void LLSDMessageSystem::getIPPortFast(const char *block, const char *var, U16 &port, S32 blocknum) -{ - port = getLLSD(mInput, block, var, blocknum).asInteger(); -} - -//virtual -void LLSDMessageSystem::getU64Fast(const char *block, const char *var, U64 &data, S32 blocknum) -{ - data = ll_U64_from_sd(getLLSD(mInput, block, var, blocknum)); -} - -//virtual -void LLSDMessageSystem::getStringFast(const char *block, const char *var, S32 buffer_size, char *buffer, S32 blocknum) -{ - std::string data = getLLSD(mInput, block, var, blocknum).asString(); - S32 length = data.length(); - memset(buffer, 0, buffer_size); - strncpy(buffer, data.c_str(), llmin(length, buffer_size)); /* Flawfinder: ignore */ -} - -//virtual -void LLSDMessageSystem::newMessageFast(const char *name) -{ - mMsg.newMessageFast(name); -} - -//virtual -void LLSDMessageSystem::nextBlockFast(const char *blockname) -{ - mMsg.nextBlockFast(blockname); -} - -//virtual -void LLSDMessageSystem::addU32Fast(const char *varname, U32 u) -{ - mMsg.addU32Fast(varname, u); -} - -//virtual -void LLSDMessageSystem::addUUIDFast( const char *varname, const LLUUID& uuid) -{ - mMsg.addUUIDFast(varname, uuid); -} - -//virtual -S32 LLSDMessageSystem::sendReliable(const LLHost &host) -{ - return mMsg.sendReliable(host); -} - -//virtual -U32 LLSDMessageSystem::getOurCircuitCode() -{ - return mMsg.getOurCircuitCode(); -} - -void LLSDMessageSystem::useServices() -{ - /* - Having this function body here, causes the classes and globals in this - file to be linked into any program that uses the llmessage library. - */ -} - -class LLMessageService : public LLHTTPNode -{ - virtual bool validate(const std::string& name, LLSD& context) const - { return true; } - - virtual void post(LLHTTPNode::ResponsePtr response, const LLSD& context, const LLSD& input) const; -}; - -//virtual -void LLMessageService::post(LLHTTPNode::ResponsePtr response, const LLSD& context, const LLSD& input) const -{ - static LLSDMessageSystem msg(*gMessageSystem); - - std::string name = context["request"]["wildcard"]["message-name"]; - - if (msg.handleMessage(name, input)) - { - response->result(LLSD()); - } - else - { - response->notFound(); - } -} - - -LLHTTPRegistration - gHTTPRegistrationMessageService("/message/"); diff --git a/linden/indra/llmessage/llsdmessagesystem.h b/linden/indra/llmessage/llsdmessagesystem.h deleted file mode 100644 index b114a49..0000000 --- a/linden/indra/llmessage/llsdmessagesystem.h +++ /dev/null @@ -1,73 +0,0 @@ -/** - * @file llsdmessagesystem.h - * @brief LLSDMessageSystem class header file - * - * Copyright (c) 2001-2007, Linden Research, Inc. - * - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlife.com/developers/opensource/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at http://secondlife.com/developers/opensource/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef LLSD_MESSAGE_SYSTEM_H -#define LLSD_MESSAGE_SYSTEM_H - -#include "message.h" -#include "llsd.h" - -class LLSDMessageSystem : public LLMessageSystem -{ -public: - LLSDMessageSystem(); // Testing only. - LLSDMessageSystem(LLMessageSystem& delegateSystem); - virtual ~LLSDMessageSystem(); - - bool handleMessage(std::string name, const LLSD& message); - - void setInput(const LLSD& input); // Testing only. - - // Input methods, read from input LLSD. - virtual void getU32Fast(const char *block, const char *var, U32 &data, S32 blocknum = 0); - virtual void getUUIDFast(const char *block, const char *var, LLUUID &uuid, S32 blocknum = 0); - virtual void getIPAddrFast(const char *block, const char *var, U32 &ip, S32 blocknum = 0); - virtual void getIPPortFast(const char *block, const char *var, U16 &port, S32 blocknum = 0); - virtual void getU64Fast(const char *block, const char *var, U64 &data, S32 blocknum = 0); - virtual void getStringFast(const char *block, const char *var, S32 buffer_size, char *buffer, S32 blocknum = 0); - - // Output methods, routed to delegate message system. - virtual void newMessageFast(const char *name); - virtual void nextBlockFast(const char *blockname); - - virtual void addU32Fast(const char *varname, U32 u); - virtual void addUUIDFast( const char *varname, const LLUUID& uuid); - - virtual S32 sendReliable(const LLHost &host); - - // Global Information messages, routed to delegate message system - virtual U32 getOurCircuitCode(); - - static void useServices(); - // call this from any application, when you set up the http tree - -private: - LLMessageSystem& mMsg; - LLSD mInput; -}; - -#endif // LLSD_MESSAGE_SYSTEM_H diff --git a/linden/indra/llmessage/llsdrpcclient.cpp b/linden/indra/llmessage/llsdrpcclient.cpp index a9ff722..64d4b98 100644 --- a/linden/indra/llmessage/llsdrpcclient.cpp +++ b/linden/indra/llmessage/llsdrpcclient.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llsdrpcclient.h b/linden/indra/llmessage/llsdrpcclient.h index 8de7f12..52439b9 100644 --- a/linden/indra/llmessage/llsdrpcclient.h +++ b/linden/indra/llmessage/llsdrpcclient.h @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llsdrpcserver.cpp b/linden/indra/llmessage/llsdrpcserver.cpp index 67eaf33..ed37181 100644 --- a/linden/indra/llmessage/llsdrpcserver.cpp +++ b/linden/indra/llmessage/llsdrpcserver.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llsdrpcserver.h b/linden/indra/llmessage/llsdrpcserver.h index 35d91ee..4007d6e 100644 --- a/linden/indra/llmessage/llsdrpcserver.h +++ b/linden/indra/llmessage/llsdrpcserver.h @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llservice.cpp b/linden/indra/llmessage/llservice.cpp index 0ffff95..052524d 100644 --- a/linden/indra/llmessage/llservice.cpp +++ b/linden/indra/llmessage/llservice.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llservice.h b/linden/indra/llmessage/llservice.h index 3866dbc..5744f75 100644 --- a/linden/indra/llmessage/llservice.h +++ b/linden/indra/llmessage/llservice.h @@ -6,6 +6,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -90,7 +91,7 @@ namespace boost } inline void intrusive_ptr_release(LLServiceCreator* p) { - if(0 == --p->mReferenceCount) + if(p && 0 == --p->mReferenceCount) { delete p; } diff --git a/linden/indra/llmessage/llservicebuilder.cpp b/linden/indra/llmessage/llservicebuilder.cpp new file mode 100644 index 0000000..86b7d9d --- /dev/null +++ b/linden/indra/llmessage/llservicebuilder.cpp @@ -0,0 +1,135 @@ +/** +* @file llservicebuilder.cpp +* @brief Implementation of the LLServiceBuilder class. +* +* Copyright (c) 2007-2007, Linden Research, Inc. +* + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. +*/ + +#include "llapp.h" +#include "llfile.h" +#include "llservicebuilder.h" +#include "llsd.h" +#include "llsdserialize.h" + +void LLServiceBuilder::loadServiceDefinitionsFromFile( + const std::string& service_filename) +{ + llifstream service_file(service_filename.c_str(), std::ios::binary); + if(service_file.is_open()) + { + LLSD service_data; + LLSDSerialize::fromXML(service_data, service_file); + service_file.close(); + // Load service + LLSD service_map = service_data["services"]; + for(LLSD::array_iterator array_itr = service_map.beginArray(); + array_itr != service_map.endArray(); + ++array_itr) + { + LLSD service_llsd = (*array_itr)["service-builder"]; + std::string service_name = (*array_itr)["name"].asString(); + createServiceDefinition(service_name, service_llsd); + } + llinfos << "loaded config file: " << service_filename << llendl; + } + else + { + llwarns << "unable to find config file: " << service_filename << llendl; + } +} + +void LLServiceBuilder::createServiceDefinition( + const std::string& service_name, + LLSD& service_llsd) +{ + if(service_llsd.isString()) + { + mServiceMap[ service_name ] = service_llsd.asString(); + } + else if(service_llsd.isMap()) + { + for(LLSD::map_iterator map_itr = service_llsd.beginMap(); + map_itr != service_llsd.endMap(); + ++map_itr) + { + std::string compound_builder_name = service_name; + compound_builder_name.append("-"); + compound_builder_name.append((*map_itr).first); + mServiceMap[ compound_builder_name ] = (*map_itr).second.asString(); + } + } +} + +std::string LLServiceBuilder::buildServiceURI(const std::string& service_name) +{ + std::ostringstream service_url; + // Find the service builder + if(mServiceMap.find(service_name) != mServiceMap.end()) + { + // construct the service builder url + LLApp* app = LLApp::instance(); + if(app) + { + LLSD base_url = app->getOption("services-base-url"); + service_url << base_url.asString(); + } + service_url << mServiceMap[service_name]; + } + else + { + llwarns << "Cannot find service " << service_name << llendl; + } + return service_url.str(); +} + +std::string LLServiceBuilder::buildServiceURI( + const std::string& service_name, + const LLSD& option_map) +{ + std::string service_url = buildServiceURI(service_name); + + // Find the Service Name + if(!service_url.empty() && option_map.isMap()) + { + // Do brace replacements - NOT CURRENTLY RECURSIVE + for(LLSD::map_const_iterator option_itr = option_map.beginMap(); + option_itr != option_map.endMap(); + ++option_itr) + { + std::string variable_name = "{$"; + variable_name.append((*option_itr).first); + variable_name.append("}"); + std::string::size_type find_pos = service_url.find(variable_name); + if(find_pos != std::string::npos) + { + service_url.replace( + find_pos, + variable_name.length(), + (*option_itr).second.asString()); + } + } + } + + return service_url; +} diff --git a/linden/indra/llmessage/llservicebuilder.h b/linden/indra/llmessage/llservicebuilder.h new file mode 100644 index 0000000..817ea0c --- /dev/null +++ b/linden/indra/llmessage/llservicebuilder.h @@ -0,0 +1,93 @@ +/** +* @file llservicebuilder.h +* @brief Declaration of the LLServiceBuilder class. +* +* Copyright (c) 2007-2007, Linden Research, Inc. +* + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. +*/ + +#ifndef LLSERVICEBUILDER_H +#define LLSERVICEBUILDER_H + +#include +#include +#include "llerror.h" + +class LLSD; + +/** + * @class LLServiceBuilder + * @brief This class builds urls for us to use when making web service calls. + */ + +class LLServiceBuilder +{ + LOG_CLASS(LLServiceBuilder); +public: + LLServiceBuilder(void) {} + ~LLServiceBuilder(void) {} + + /** + * @brief Initialize this object with the service definitions. + * + * @param service_filename The services definition files -- services.xml. + */ + void loadServiceDefinitionsFromFile(const std::string& service_filename); + + /** + * @brief Build a service url if the url needs no construction parameters. + * + * @param service_name The name of the service you want to call. + */ + std::string buildServiceURI(const std::string& service_name); + + /** + * @brief Build a service url if the url with construction parameters. + * + * The parameter substitution supports string substituition from RUSS: + * [[Recursive_URL_Substitution_Syntax]] + * @param service_name The name of the service you want to call. + * @param option_map The parameters in a map of name:value for the service. + */ + std::string buildServiceURI( + const std::string& service_name, + const LLSD& option_map); + +public: + /** + * @brief Helper method which builds construction state for a service + * + * This method should probably be protected, but we need to test this + * method. + */ + void createServiceDefinition( + const std::string& service_name, + LLSD& service_url); + +protected: + std::map mServiceMap; +}; + + + +#endif diff --git a/linden/indra/llmessage/lltaskname.h b/linden/indra/llmessage/lltaskname.h index e4e5c66..ac4fbd5 100644 --- a/linden/indra/llmessage/lltaskname.h +++ b/linden/indra/llmessage/lltaskname.h @@ -5,6 +5,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llteleportflags.h b/linden/indra/llmessage/llteleportflags.h index e52491a..25aac14 100644 --- a/linden/indra/llmessage/llteleportflags.h +++ b/linden/indra/llmessage/llteleportflags.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lltemplatemessagebuilder.cpp b/linden/indra/llmessage/lltemplatemessagebuilder.cpp new file mode 100644 index 0000000..806f034 --- /dev/null +++ b/linden/indra/llmessage/lltemplatemessagebuilder.cpp @@ -0,0 +1,856 @@ +#include "linden_common.h" + +#include "lltemplatemessagebuilder.h" + +#include "llmessagetemplate.h" +#include "llquaternion.h" +#include "u64.h" +#include "v3dmath.h" +#include "v3math.h" +#include "v4math.h" + +LLTemplateMessageBuilder::LLTemplateMessageBuilder(message_template_name_map_t& name_template_map) : + mCurrentSMessageData(NULL), + mCurrentSMessageTemplate(NULL), + mCurrentSDataBlock(NULL), + mCurrentSMessageName(NULL), + mCurrentSBlockName(NULL), + mbSBuilt(FALSE), + mbSClear(TRUE), + mCurrentSendTotal(0), + mMessageTemplates(name_template_map) +{ +} + +//virtual +LLTemplateMessageBuilder::~LLTemplateMessageBuilder() +{ + delete mCurrentSMessageData; + mCurrentSMessageData = NULL; +} + + +// virtual +void LLTemplateMessageBuilder::newMessage(const char *name) +{ + mbSBuilt = FALSE; + mbSClear = FALSE; + + mCurrentSendTotal = 0; + + delete mCurrentSMessageData; + mCurrentSMessageData = NULL; + + char *namep = (char *)name; + + if (mMessageTemplates.count(namep) > 0) + { + mCurrentSMessageTemplate = mMessageTemplates[namep]; + if (mCurrentSMessageData) + { + delete mCurrentSMessageData; + } + mCurrentSMessageData = new LLMsgData(namep); + mCurrentSMessageName = namep; + mCurrentSDataBlock = NULL; + mCurrentSBlockName = NULL; + + // add at one of each block + LLMessageTemplate* msg_template = mMessageTemplates[namep]; + for (LLMessageTemplate::message_block_map_t::iterator iter = msg_template->mMemberBlocks.begin(); + iter != msg_template->mMemberBlocks.end(); iter++) + { + LLMessageBlock* ci = iter->second; + LLMsgBlkData *tblockp; + tblockp = new LLMsgBlkData(ci->mName, 0); + mCurrentSMessageData->addBlock(tblockp); + } + } + else + { + llerrs << "newMessage - Message " << name << " not registered" << llendl; + } +} + +// virtual +void LLTemplateMessageBuilder::clearMessage() +{ + mbSBuilt = FALSE; + mbSClear = TRUE; + + mCurrentSendTotal = 0; + + mCurrentSMessageTemplate = NULL; + + delete mCurrentSMessageData; + mCurrentSMessageData = NULL; + + mCurrentSMessageName = NULL; + mCurrentSDataBlock = NULL; + mCurrentSBlockName = NULL; +} + +// virtual +void LLTemplateMessageBuilder::nextBlock(const char* blockname) +{ + char *bnamep = (char *)blockname; + + if (!mCurrentSMessageTemplate) + { + llerrs << "newMessage not called prior to setBlock" << llendl; + return; + } + + // now, does this block exist? + LLMessageTemplate::message_block_map_t::iterator temp_iter = mCurrentSMessageTemplate->mMemberBlocks.find(bnamep); + if (temp_iter == mCurrentSMessageTemplate->mMemberBlocks.end()) + { + llerrs << "LLTemplateMessageBuilder::nextBlock " << bnamep + << " not a block in " << mCurrentSMessageTemplate->mName << llendl; + return; + } + + LLMessageBlock* template_data = temp_iter->second; + + // ok, have we already set this block? + LLMsgBlkData* block_data = mCurrentSMessageData->mMemberBlocks[bnamep]; + if (block_data->mBlockNumber == 0) + { + // nope! set this as the current block + block_data->mBlockNumber = 1; + mCurrentSDataBlock = block_data; + mCurrentSBlockName = bnamep; + + // add placeholders for each of the variables + for (LLMessageBlock::message_variable_map_t::iterator iter = template_data->mMemberVariables.begin(); + iter != template_data->mMemberVariables.end(); iter++) + { + LLMessageVariable& ci = *(iter->second); + mCurrentSDataBlock->addVariable(ci.getName(), ci.getType()); + } + return; + } + else + { + // already have this block. . . + // are we supposed to have a new one? + + // if the block is type MBT_SINGLE this is bad! + if (template_data->mType == MBT_SINGLE) + { + llerrs << "LLTemplateMessageBuilder::nextBlock called multiple times" + << " for " << bnamep << " but is type MBT_SINGLE" << llendl; + return; + } + + + // if the block is type MBT_MULTIPLE then we need a known number, + // make sure that we're not exceeding it + if ( (template_data->mType == MBT_MULTIPLE) + &&(mCurrentSDataBlock->mBlockNumber == template_data->mNumber)) + { + llerrs << "LLTemplateMessageBuilder::nextBlock called " + << mCurrentSDataBlock->mBlockNumber << " times for " << bnamep + << " exceeding " << template_data->mNumber + << " specified in type MBT_MULTIPLE." << llendl; + return; + } + + // ok, we can make a new one + // modify the name to avoid name collision by adding number to end + S32 count = block_data->mBlockNumber; + + // incrememt base name's count + block_data->mBlockNumber++; + + if (block_data->mBlockNumber > MAX_BLOCKS) + { + llerrs << "Trying to pack too many blocks into MBT_VARIABLE type " + << "(limited to " << MAX_BLOCKS << ")" << llendl; + } + + // create new name + // Nota Bene: if things are working correctly, + // mCurrentMessageData->mMemberBlocks[blockname]->mBlockNumber == + // mCurrentDataBlock->mBlockNumber + 1 + + char *nbnamep = bnamep + count; + + mCurrentSDataBlock = new LLMsgBlkData(bnamep, count); + mCurrentSDataBlock->mName = nbnamep; + mCurrentSMessageData->mMemberBlocks[nbnamep] = mCurrentSDataBlock; + + // add placeholders for each of the variables + for (LLMessageBlock::message_variable_map_t::iterator + iter = template_data->mMemberVariables.begin(), + end = template_data->mMemberVariables.end(); + iter != end; iter++) + { + LLMessageVariable& ci = *(iter->second); + mCurrentSDataBlock->addVariable(ci.getName(), ci.getType()); + } + return; + } +} + +// TODO: Remove this horror... +BOOL LLTemplateMessageBuilder::removeLastBlock() +{ + if (mCurrentSBlockName) + { + if ( (mCurrentSMessageData) + &&(mCurrentSMessageTemplate)) + { + if (mCurrentSMessageData->mMemberBlocks[mCurrentSBlockName]->mBlockNumber >= 1) + { + // At least one block for the current block name. + + // Store the current block name for future reference. + char *block_name = mCurrentSBlockName; + + // Decrement the sent total by the size of the + // data in the message block that we're currently building. + + LLMessageBlock* template_data = mCurrentSMessageTemplate->mMemberBlocks[mCurrentSBlockName]; + + for (LLMessageBlock::message_variable_map_t::iterator iter = template_data->mMemberVariables.begin(); + iter != template_data->mMemberVariables.end(); iter++) + { + LLMessageVariable& ci = *(iter->second); + mCurrentSendTotal -= ci.getSize(); + } + + + // Now we want to find the block that we're blowing away. + + // Get the number of blocks. + LLMsgBlkData* block_data = mCurrentSMessageData->mMemberBlocks[block_name]; + S32 num_blocks = block_data->mBlockNumber; + + // Use the same (suspect?) algorithm that's used to generate + // the names in the nextBlock method to find it. + char *block_getting_whacked = block_name + num_blocks - 1; + LLMsgBlkData* whacked_data = mCurrentSMessageData->mMemberBlocks[block_getting_whacked]; + delete whacked_data; + mCurrentSMessageData->mMemberBlocks.erase(block_getting_whacked); + + if (num_blocks <= 1) + { + // we just blew away the last one, so return FALSE + llwarns << "not blowing away the only block of message " + << mCurrentSMessageName + << ". Block: " << block_name + << ". Number: " << num_blocks + << llendl; + return FALSE; + } + else + { + // Decrement the counter. + block_data->mBlockNumber--; + return TRUE; + } + } + } + } + return FALSE; +} + +// add data to variable in current block +void LLTemplateMessageBuilder::addData(const char *varname, const void *data, EMsgVariableType type, S32 size) +{ + char *vnamep = (char *)varname; + + // do we have a current message? + if (!mCurrentSMessageTemplate) + { + llerrs << "newMessage not called prior to addData" << llendl; + return; + } + + // do we have a current block? + if (!mCurrentSDataBlock) + { + llerrs << "setBlock not called prior to addData" << llendl; + return; + } + + // kewl, add the data if it exists + LLMessageVariable* var_data = mCurrentSMessageTemplate->mMemberBlocks[mCurrentSBlockName]->mMemberVariables[vnamep]; + if (!var_data || !var_data->getName()) + { + llerrs << vnamep << " not a variable in block " << mCurrentSBlockName << " of " << mCurrentSMessageTemplate->mName << llendl; + return; + } + + // ok, it seems ok. . . are we the correct size? + if (var_data->getType() == MVT_VARIABLE) + { + // Variable 1 can only store 255 bytes, make sure our data is smaller + if ((var_data->getSize() == 1) && + (size > 255)) + { + llwarns << "Field " << varname << " is a Variable 1 but program " + << "attempted to stuff more than 255 bytes in " + << "(" << size << "). Clamping size and truncating data." << llendl; + size = 255; + char *truncate = (char *)data; + truncate[255] = 0; + } + + // no correct size for MVT_VARIABLE, instead we need to tell how many bytes the size will be encoded as + mCurrentSDataBlock->addData(vnamep, data, size, type, var_data->getSize()); + mCurrentSendTotal += size; + } + else + { + if (size != var_data->getSize()) + { + llerrs << varname << " is type MVT_FIXED but request size " << size << " doesn't match template size " + << var_data->getSize() << llendl; + return; + } + // alright, smash it in + mCurrentSDataBlock->addData(vnamep, data, size, type); + mCurrentSendTotal += size; + } +} + +// add data to variable in current block - fails if variable isn't MVT_FIXED +void LLTemplateMessageBuilder::addData(const char *varname, const void *data, EMsgVariableType type) +{ + char *vnamep = (char *)varname; + + // do we have a current message? + if (!mCurrentSMessageTemplate) + { + llerrs << "newMessage not called prior to addData" << llendl; + return; + } + + // do we have a current block? + if (!mCurrentSDataBlock) + { + llerrs << "setBlock not called prior to addData" << llendl; + return; + } + + // kewl, add the data if it exists + LLMessageVariable* var_data = mCurrentSMessageTemplate->mMemberBlocks[mCurrentSBlockName]->mMemberVariables[vnamep]; + if (!var_data->getName()) + { + llerrs << vnamep << " not a variable in block " << mCurrentSBlockName << " of " << mCurrentSMessageTemplate->mName << llendl; + return; + } + + // ok, it seems ok. . . are we MVT_VARIABLE? + if (var_data->getType() == MVT_VARIABLE) + { + // nope + llerrs << vnamep << " is type MVT_VARIABLE. Call using addData(name, data, size)" << llendl; + return; + } + else + { + mCurrentSDataBlock->addData(vnamep, data, var_data->getSize(), type); + mCurrentSendTotal += var_data->getSize(); + } +} + +void LLTemplateMessageBuilder::addBinaryData(const char *varname, + const void *data, S32 size) +{ + addData(varname, data, MVT_FIXED, size); +} + +void LLTemplateMessageBuilder::addS8(const char *varname, S8 s) +{ + addData(varname, &s, MVT_S8, sizeof(s)); +} + +void LLTemplateMessageBuilder::addU8(const char *varname, U8 u) +{ + addData(varname, &u, MVT_U8, sizeof(u)); +} + +void LLTemplateMessageBuilder::addS16(const char *varname, S16 i) +{ + addData(varname, &i, MVT_S16, sizeof(i)); +} + +void LLTemplateMessageBuilder::addU16(const char *varname, U16 i) +{ + addData(varname, &i, MVT_U16, sizeof(i)); +} + +void LLTemplateMessageBuilder::addF32(const char *varname, F32 f) +{ + addData(varname, &f, MVT_F32, sizeof(f)); +} + +void LLTemplateMessageBuilder::addS32(const char *varname, S32 s) +{ + addData(varname, &s, MVT_S32, sizeof(s)); +} + +void LLTemplateMessageBuilder::addU32(const char *varname, U32 u) +{ + addData(varname, &u, MVT_U32, sizeof(u)); +} + +void LLTemplateMessageBuilder::addU64(const char *varname, U64 lu) +{ + addData(varname, &lu, MVT_U64, sizeof(lu)); +} + +void LLTemplateMessageBuilder::addF64(const char *varname, F64 d) +{ + addData(varname, &d, MVT_F64, sizeof(d)); +} + +void LLTemplateMessageBuilder::addIPAddr(const char *varname, U32 u) +{ + addData(varname, &u, MVT_IP_ADDR, sizeof(u)); +} + +void LLTemplateMessageBuilder::addIPPort(const char *varname, U16 u) +{ + u = htons(u); + addData(varname, &u, MVT_IP_PORT, sizeof(u)); +} + +void LLTemplateMessageBuilder::addBOOL(const char* varname, BOOL b) +{ + // Can't just cast a BOOL (actually a U32) to a U8. + // In some cases the low order bits will be zero. + U8 temp = (b != 0); + addData(varname, &temp, MVT_BOOL, sizeof(temp)); +} + +void LLTemplateMessageBuilder::addString(const char* varname, const char* s) +{ + if (s) + addData( varname, (void *)s, MVT_VARIABLE, (S32)strlen(s) + 1); /* Flawfinder: ignore */ + else + addData( varname, NULL, MVT_VARIABLE, 0); +} + +void LLTemplateMessageBuilder::addString(const char* varname, const std::string& s) +{ + if (s.size()) + addData( varname, (void *)s.c_str(), MVT_VARIABLE, (S32)(s.size()) + 1); + else + addData( varname, NULL, MVT_VARIABLE, 0); +} + +void LLTemplateMessageBuilder::addVector3(const char *varname, const LLVector3& vec) +{ + addData(varname, vec.mV, MVT_LLVector3, sizeof(vec.mV)); +} + +void LLTemplateMessageBuilder::addVector4(const char *varname, const LLVector4& vec) +{ + addData(varname, vec.mV, MVT_LLVector4, sizeof(vec.mV)); +} + +void LLTemplateMessageBuilder::addVector3d(const char *varname, const LLVector3d& vec) +{ + addData(varname, vec.mdV, MVT_LLVector3d, sizeof(vec.mdV)); +} + +void LLTemplateMessageBuilder::addQuat(const char *varname, const LLQuaternion& quat) +{ + addData(varname, quat.packToVector3().mV, MVT_LLQuaternion, sizeof(LLVector3)); +} + +void LLTemplateMessageBuilder::addUUID(const char *varname, const LLUUID& uuid) +{ + addData(varname, uuid.mData, MVT_LLUUID, sizeof(uuid.mData)); +} + +static S32 zero_code(U8 **data, U32 *data_size) +{ + // Encoded send buffer needs to be slightly larger since the zero + // coding can potentially increase the size of the send data. + static U8 encodedSendBuffer[2 * MAX_BUFFER_SIZE]; + + S32 count = *data_size; + + S32 net_gain = 0; + U8 num_zeroes = 0; + + U8 *inptr = (U8 *)*data; + U8 *outptr = (U8 *)encodedSendBuffer; + +// skip the packet id field + + for (U32 i=0;i256 zeroes) + + while (count--) + { + if (!(*inptr)) // in a zero count + { + if (num_zeroes) + { + if (++num_zeroes > 254) + { + *outptr++ = num_zeroes; + num_zeroes = 0; + } + net_gain--; // subseqent zeroes save one + } + else + { + *outptr++ = 0; + net_gain++; // starting a zero count adds one + num_zeroes = 1; + } + inptr++; + } + else + { + if (num_zeroes) + { + *outptr++ = num_zeroes; + num_zeroes = 0; + } + *outptr++ = *inptr++; + } + } + + if (num_zeroes) + { + *outptr++ = num_zeroes; + } + + if (net_gain < 0) + { + // TODO: babbage: reinstate stat collecting... + //mCompressedPacketsOut++; + //mUncompressedBytesOut += *data_size; + + *data = encodedSendBuffer; + *data_size += net_gain; + encodedSendBuffer[0] |= LL_ZERO_CODE_FLAG; // set the head bit to indicate zero coding + + //mCompressedBytesOut += *data_size; + + } + //mTotalBytesOut += *data_size; + + return(net_gain); +} + +void LLTemplateMessageBuilder::compressMessage(U8*& buf_ptr, U32& buffer_length) +{ + if(ME_ZEROCODED == mCurrentSMessageTemplate->getEncoding()) + { + zero_code(&buf_ptr, &buffer_length); + } +} + +BOOL LLTemplateMessageBuilder::isMessageFull(const char* blockname) const +{ + if(mCurrentSendTotal > MTUBYTES) + { + return TRUE; + } + if(!blockname) + { + return FALSE; + } + char* bnamep = (char*)blockname; + S32 max; + + LLMessageBlock* template_data = mCurrentSMessageTemplate->mMemberBlocks[bnamep]; + + switch(template_data->mType) + { + case MBT_SINGLE: + max = 1; + break; + case MBT_MULTIPLE: + max = template_data->mNumber; + break; + case MBT_VARIABLE: + default: + max = MAX_BLOCKS; + break; + } + if(mCurrentSMessageData->mMemberBlocks[bnamep]->mBlockNumber >= max) + { + return TRUE; + } + return FALSE; +} + + +// make sure that all the desired data is in place and then copy the data into MAX_BUFFER_SIZEd buffer +U32 LLTemplateMessageBuilder::buildMessage(U8* buffer, U32 buffer_size) +{ + // basic algorithm is to loop through the various pieces, building + // size and offset info if we encounter a -1 for mSize at any + // point that variable wasn't given data + + // do we have a current message? + if (!mCurrentSMessageTemplate) + { + llerrs << "newMessage not called prior to buildMessage" << llendl; + return 0; + } + + // zero out some useful values + + // leave room for circuit counter + U32 result = LL_PACKET_ID_SIZE; + + // encode message number and adjust total_offset + if (mCurrentSMessageTemplate->mFrequency == MFT_HIGH) + { +// old, endian-dependant way +// memcpy(&buffer[result], &mCurrentMessageTemplate->mMessageNumber, sizeof(U8)); + +// new, independant way + buffer[result] = (U8)mCurrentSMessageTemplate->mMessageNumber; + result += sizeof(U8); + } + else if (mCurrentSMessageTemplate->mFrequency == MFT_MEDIUM) + { + U8 temp = 255; + memcpy(&buffer[result], &temp, sizeof(U8)); /*Flawfinder: ignore*/ + result += sizeof(U8); + + // mask off unsightly bits + temp = mCurrentSMessageTemplate->mMessageNumber & 255; + memcpy(&buffer[result], &temp, sizeof(U8)); /*Flawfinder: ignore*/ + result += sizeof(U8); + } + else if (mCurrentSMessageTemplate->mFrequency == MFT_LOW) + { + U8 temp = 255; + U16 message_num; + memcpy(&buffer[result], &temp, sizeof(U8)); /*Flawfinder: ignore*/ + result += sizeof(U8); + memcpy(&buffer[result], &temp, sizeof(U8)); /*Flawfinder: ignore*/ + result += sizeof(U8); + + // mask off unsightly bits + message_num = mCurrentSMessageTemplate->mMessageNumber & 0xFFFF; + + // convert to network byte order + message_num = htons(message_num); + memcpy(&buffer[result], &message_num, sizeof(U16)); /*Flawfinder: ignore*/ + result += sizeof(U16); + } + else + { + llerrs << "unexpected message frequency in buildMessage" << llendl; + return 0; + } + + // counting variables used to encode multiple block info + S32 block_count = 0; + U8 temp_block_number; + + // loop through msg blocks to loop through variables, + // totalling up size data and copying into buffer + for (LLMsgData::msg_blk_data_map_t::iterator + iter = mCurrentSMessageData->mMemberBlocks.begin(), + end = mCurrentSMessageData->mMemberBlocks.end(); + iter != end; iter++) + { + LLMsgBlkData* mbci = iter->second; + // do we need to encode a block code? + if (block_count == 0) + { + block_count = mbci->mBlockNumber; + + LLMessageBlock* template_data = + mCurrentSMessageTemplate->mMemberBlocks[mbci->mName]; + + // ok, if this is the first block of a repeating pack, set + // block_count and, if it's type MBT_VARIABLE encode a byte + // for how many there are + if (template_data->mType == MBT_VARIABLE) + { + // remember that mBlockNumber is a S32 + temp_block_number = (U8)mbci->mBlockNumber; + if ((S32)(result + sizeof(U8)) < MAX_BUFFER_SIZE) + { + memcpy(&buffer[result], &temp_block_number, sizeof(U8)); + result += sizeof(U8); + } + else + { + // Just reporting error is likely not enough. Need + // to check how to abort or error out gracefully + // from this function. XXXTBD + llerrs << "buildMessage failed. Message excedding " + << "sendBuffersize." << llendl; + } + } + else if (template_data->mType == MBT_MULTIPLE) + { + if (block_count != template_data->mNumber) + { + // nope! need to fill it in all the way! + llerrs << "Block " << mbci->mName + << " is type MBT_MULTIPLE but only has data for " + << block_count << " out of its " + << template_data->mNumber << " blocks" << llendl; + } + } + } + + // counting down multiple blocks + block_count--; + + // now loop through the variables + for (LLMsgBlkData::msg_var_data_map_t::iterator iter = mbci->mMemberVarData.begin(); + iter != mbci->mMemberVarData.end(); iter++) + { + LLMsgVarData& mvci = *iter; + if (mvci.getSize() == -1) + { + // oops, this variable wasn't ever set! + llerrs << "The variable " << mvci.getName() << " in block " + << mbci->mName << " of message " + << mCurrentSMessageData->mName + << " wasn't set prior to buildMessage call" << llendl; + } + else + { + S32 data_size = mvci.getDataSize(); + if(data_size > 0) + { + // The type is MVT_VARIABLE, which means that we + // need to encode a size argument. Otherwise, + // there is no need. + S32 size = mvci.getSize(); + U8 sizeb; + U16 sizeh; + switch(data_size) + { + case 1: + sizeb = size; + htonmemcpy(&buffer[result], &sizeb, MVT_U8, 1); + break; + case 2: + sizeh = size; + htonmemcpy(&buffer[result], &sizeh, MVT_U16, 2); + break; + case 4: + htonmemcpy(&buffer[result], &size, MVT_S32, 4); + break; + default: + llerrs << "Attempting to build variable field with unknown size of " << size << llendl; + break; + } + result += mvci.getDataSize(); + } + + // if there is any data to pack, pack it + if((mvci.getData() != NULL) && mvci.getSize()) + { + if(result + mvci.getSize() < buffer_size) + { + memcpy( + &buffer[result], + mvci.getData(), + mvci.getSize()); + result += mvci.getSize(); + } + else + { + // Just reporting error is likely not + // enough. Need to check how to abort or error + // out gracefully from this function. XXXTBD + llerrs << "LLMessageSystem::buildMessage failed. " + << "Attempted to pack " + << result + mvci.getSize() + << " bytes into a buffer with size " + << buffer_size << "." << llendl + } + } + } + } + } + mbSBuilt = TRUE; + + return result; +} + +void LLTemplateMessageBuilder::copyFromMessageData(const LLMsgData& data) +{ + // copy the blocks + // counting variables used to encode multiple block info + S32 block_count = 0; + char *block_name = NULL; + + // loop through msg blocks to loop through variables, totalling up size + // data and filling the new (send) message + LLMsgData::msg_blk_data_map_t::const_iterator iter = + data.mMemberBlocks.begin(); + LLMsgData::msg_blk_data_map_t::const_iterator end = + data.mMemberBlocks.end(); + for(; iter != end; ++iter) + { + const LLMsgBlkData* mbci = iter->second; + if(!mbci) continue; + + // do we need to encode a block code? + if (block_count == 0) + { + block_count = mbci->mBlockNumber; + block_name = (char *)mbci->mName; + } + + // counting down mutliple blocks + block_count--; + + nextBlock(block_name); + + // now loop through the variables + LLMsgBlkData::msg_var_data_map_t::const_iterator dit = mbci->mMemberVarData.begin(); + LLMsgBlkData::msg_var_data_map_t::const_iterator dend = mbci->mMemberVarData.end(); + + for(; dit != dend; ++dit) + { + const LLMsgVarData& mvci = *dit; + addData(mvci.getName(), mvci.getData(), mvci.getType(), mvci.getSize()); + } + } +} + +//virtual +void LLTemplateMessageBuilder::copyFromLLSD(const LLSD&) +{ + // TODO +} + +//virtual +void LLTemplateMessageBuilder::setBuilt(BOOL b) { mbSBuilt = b; } + +//virtual +BOOL LLTemplateMessageBuilder::isBuilt() const {return mbSBuilt;} + +//virtual +BOOL LLTemplateMessageBuilder::isClear() const {return mbSClear;} + +//virtual +S32 LLTemplateMessageBuilder::getMessageSize() {return mCurrentSendTotal;} + +//virtual +const char* LLTemplateMessageBuilder::getMessageName() const +{ + return mCurrentSMessageName; +} diff --git a/linden/indra/llmessage/lltemplatemessagebuilder.h b/linden/indra/llmessage/lltemplatemessagebuilder.h new file mode 100644 index 0000000..ae53328 --- /dev/null +++ b/linden/indra/llmessage/lltemplatemessagebuilder.h @@ -0,0 +1,88 @@ +#ifndef LL_LLTEMPLATEMESSAGEBUILDER_H +#define LL_LLTEMPLATEMESSAGEBUILDER_H + +#include + +#include "llmessagebuilder.h" +#include "llmsgvariabletype.h" + +class LLMsgData; +class LLMessageTemplate; +class LLMsgBlkData; +class LLMessageTemplate; + +class LLTemplateMessageBuilder : public LLMessageBuilder +{ +public: + + typedef std::map message_template_name_map_t; + + LLTemplateMessageBuilder(message_template_name_map_t&); + virtual ~LLTemplateMessageBuilder(); + + virtual void newMessage(const char *name); + + virtual void nextBlock(const char* blockname); + virtual BOOL removeLastBlock(); // TODO: babbage: remove this horror... + + /** All add* methods expect pointers to canonical varname strings. */ + virtual void addBinaryData(const char *varname, const void *data, + S32 size); + virtual void addBOOL(const char* varname, BOOL b); + virtual void addS8(const char *varname, S8 s); + virtual void addU8(const char *varname, U8 u); + virtual void addS16(const char *varname, S16 i); + virtual void addU16(const char *varname, U16 i); + virtual void addF32(const char *varname, F32 f); + virtual void addS32(const char *varname, S32 s); + virtual void addU32(const char *varname, U32 u); + virtual void addU64(const char *varname, U64 lu); + virtual void addF64(const char *varname, F64 d); + virtual void addVector3(const char *varname, const LLVector3& vec); + virtual void addVector4(const char *varname, const LLVector4& vec); + virtual void addVector3d(const char *varname, const LLVector3d& vec); + virtual void addQuat(const char *varname, const LLQuaternion& quat); + virtual void addUUID(const char *varname, const LLUUID& uuid); + virtual void addIPAddr(const char *varname, const U32 ip); + virtual void addIPPort(const char *varname, const U16 port); + virtual void addString(const char* varname, const char* s); + virtual void addString(const char* varname, const std::string& s); + + virtual BOOL isMessageFull(const char* blockname) const; + virtual void compressMessage(U8*& buf_ptr, U32& buffer_length); + + virtual BOOL isBuilt() const; + virtual BOOL isClear() const; + virtual U32 buildMessage(U8* buffer, U32 buffer_size); + /**< Return built message size */ + + virtual void clearMessage(); + + // TODO: babbage: remove this horror. + virtual void setBuilt(BOOL b); + + virtual S32 getMessageSize(); + virtual const char* getMessageName() const; + + virtual void copyFromMessageData(const LLMsgData& data); + virtual void copyFromLLSD(const LLSD&); + +private: + void addData(const char *varname, const void *data, + EMsgVariableType type, S32 size); + + void addData(const char *varname, const void *data, + EMsgVariableType type); + + LLMsgData* mCurrentSMessageData; + LLMessageTemplate* mCurrentSMessageTemplate; + LLMsgBlkData* mCurrentSDataBlock; + char* mCurrentSMessageName; + char* mCurrentSBlockName; + BOOL mbSBuilt; + BOOL mbSClear; + S32 mCurrentSendTotal; + message_template_name_map_t& mMessageTemplates; +}; + +#endif // LL_LLTEMPLATEMESSAGEBUILDER_H diff --git a/linden/indra/llmessage/lltemplatemessagereader.cpp b/linden/indra/llmessage/lltemplatemessagereader.cpp new file mode 100644 index 0000000..892efb8 --- /dev/null +++ b/linden/indra/llmessage/lltemplatemessagereader.cpp @@ -0,0 +1,750 @@ +#include "lltemplatemessagereader.h" + +#include "llfasttimer.h" +#include "llmessagebuilder.h" +#include "llmessagetemplate.h" +#include "llquaternion.h" +#include "message.h" +#include "u64.h" +#include "v3dmath.h" +#include "v3math.h" +#include "v4math.h" + +LLTemplateMessageReader::LLTemplateMessageReader(message_template_number_map_t& + number_template_map) : + mReceiveSize(0), + mCurrentRMessageTemplate(NULL), + mCurrentRMessageData(NULL), + mMessageNumbers(number_template_map) +{ +} + +//virtual +LLTemplateMessageReader::~LLTemplateMessageReader() +{ + delete mCurrentRMessageData; + mCurrentRMessageData = NULL; +} + +//virtual +void LLTemplateMessageReader::clearMessage() +{ + mReceiveSize = -1; + mCurrentRMessageTemplate = NULL; + delete mCurrentRMessageData; + mCurrentRMessageData = NULL; +} + +void LLTemplateMessageReader::getData(const char *blockname, const char *varname, void *datap, S32 size, S32 blocknum, S32 max_size) +{ + // is there a message ready to go? + if (mReceiveSize == -1) + { + llerrs << "No message waiting for decode 2!" << llendl; + return; + } + + if (!mCurrentRMessageData) + { + llerrs << "Invalid mCurrentMessageData in getData!" << llendl; + return; + } + + char *bnamep = (char *)blockname + blocknum; // this works because it's just a hash. The bnamep is never derefference + char *vnamep = (char *)varname; + + LLMsgData::msg_blk_data_map_t::iterator iter = mCurrentRMessageData->mMemberBlocks.find(bnamep); + + if (iter == mCurrentRMessageData->mMemberBlocks.end()) + { + llerrs << "Block " << blockname << " #" << blocknum + << " not in message " << mCurrentRMessageData->mName << llendl; + return; + } + + LLMsgBlkData *msg_block_data = iter->second; + LLMsgVarData& vardata = msg_block_data->mMemberVarData[vnamep]; + + if (!vardata.getName()) + { + llerrs << "Variable "<< vnamep << " not in message " + << mCurrentRMessageData->mName<< " block " << bnamep << llendl; + return; + } + + if (size && size != vardata.getSize()) + { + llerrs << "Msg " << mCurrentRMessageData->mName + << " variable " << vnamep + << " is size " << vardata.getSize() + << " but copying into buffer of size " << size + << llendl; + return; + } + + + const S32 vardata_size = vardata.getSize(); + if( max_size >= vardata_size ) + { + switch( vardata_size ) + { + case 1: + *((U8*)datap) = *((U8*)vardata.getData()); + break; + case 2: + *((U16*)datap) = *((U16*)vardata.getData()); + break; + case 4: + *((U32*)datap) = *((U32*)vardata.getData()); + break; + case 8: + ((U32*)datap)[0] = ((U32*)vardata.getData())[0]; + ((U32*)datap)[1] = ((U32*)vardata.getData())[1]; + break; + default: + memcpy(datap, vardata.getData(), vardata_size); + break; + } + } + else + { + llwarns << "Msg " << mCurrentRMessageData->mName + << " variable " << vnamep + << " is size " << vardata.getSize() + << " but truncated to max size of " << max_size + << llendl; + + memcpy(datap, vardata.getData(), max_size); + } +} + +S32 LLTemplateMessageReader::getNumberOfBlocks(const char *blockname) +{ + // is there a message ready to go? + if (mReceiveSize == -1) + { + llerrs << "No message waiting for decode 3!" << llendl; + return -1; + } + + if (!mCurrentRMessageData) + { + llerrs << "Invalid mCurrentRMessageData in getData!" << llendl; + return -1; + } + + char *bnamep = (char *)blockname; + + LLMsgData::msg_blk_data_map_t::iterator iter = mCurrentRMessageData->mMemberBlocks.find(bnamep); + + if (iter == mCurrentRMessageData->mMemberBlocks.end()) + { +// sprintf(errmsg, "Block %s not in message %s", bnamep, mCurrentRMessageData->mName); +// llerrs << errmsg << llendl; +// return -1; + return 0; + } + + return (iter->second)->mBlockNumber; +} + +S32 LLTemplateMessageReader::getSize(const char *blockname, const char *varname) +{ + // is there a message ready to go? + if (mReceiveSize == -1) + { + llerrs << "No message waiting for decode 4!" << llendl; + return -1; + } + + if (!mCurrentRMessageData) + { + llerrs << "Invalid mCurrentRMessageData in getData!" << llendl; + return -1; + } + + char *bnamep = (char *)blockname; + + LLMsgData::msg_blk_data_map_t::iterator iter = mCurrentRMessageData->mMemberBlocks.find(bnamep); + + if (iter == mCurrentRMessageData->mMemberBlocks.end()) + { + llerrs << "Block " << bnamep << " not in message " + << mCurrentRMessageData->mName << llendl; + return -1; + } + + char *vnamep = (char *)varname; + + LLMsgBlkData* msg_data = iter->second; + LLMsgVarData& vardata = msg_data->mMemberVarData[vnamep]; + + if (!vardata.getName()) + { + llerrs << "Variable " << varname << " not in message " + << mCurrentRMessageData->mName << " block " << bnamep << llendl; + return -1; + } + + if (mCurrentRMessageTemplate->mMemberBlocks[bnamep]->mType != MBT_SINGLE) + { + llerrs << "Block " << bnamep << " isn't type MBT_SINGLE," + " use getSize with blocknum argument!" << llendl; + return -1; + } + + return vardata.getSize(); +} + +S32 LLTemplateMessageReader::getSize(const char *blockname, S32 blocknum, const char *varname) +{ + // is there a message ready to go? + if (mReceiveSize == -1) + { + llerrs << "No message waiting for decode 5!" << llendl; + return -1; + } + + if (!mCurrentRMessageData) + { + llerrs << "Invalid mCurrentRMessageData in getData!" << llendl; + return -1; + } + + char *bnamep = (char *)blockname + blocknum; + char *vnamep = (char *)varname; + + LLMsgData::msg_blk_data_map_t::iterator iter = mCurrentRMessageData->mMemberBlocks.find(bnamep); + + if (iter == mCurrentRMessageData->mMemberBlocks.end()) + { + llerrs << "Block " << bnamep << " not in message " + << mCurrentRMessageData->mName << llendl; + return -1; + } + + LLMsgBlkData* msg_data = iter->second; + LLMsgVarData& vardata = msg_data->mMemberVarData[vnamep]; + + if (!vardata.getName()) + { + llerrs << "Variable " << vnamep << " not in message " + << mCurrentRMessageData->mName << " block " << bnamep << llendl; + return -1; + } + + return vardata.getSize(); +} + +void LLTemplateMessageReader::getBinaryData(const char *blockname, + const char *varname, void *datap, + S32 size, S32 blocknum, + S32 max_size) +{ + getData(blockname, varname, datap, size, blocknum, max_size); +} + +void LLTemplateMessageReader::getS8(const char *block, const char *var, + S8 &u, S32 blocknum) +{ + getData(block, var, &u, sizeof(S8), blocknum); +} + +void LLTemplateMessageReader::getU8(const char *block, const char *var, + U8 &u, S32 blocknum) +{ + getData(block, var, &u, sizeof(U8), blocknum); +} + +void LLTemplateMessageReader::getBOOL(const char *block, const char *var, + BOOL &b, S32 blocknum ) +{ + U8 value; + getData(block, var, &value, sizeof(U8), blocknum); + b = (BOOL) value; +} + +void LLTemplateMessageReader::getS16(const char *block, const char *var, + S16 &d, S32 blocknum) +{ + getData(block, var, &d, sizeof(S16), blocknum); +} + +void LLTemplateMessageReader::getU16(const char *block, const char *var, + U16 &d, S32 blocknum) +{ + getData(block, var, &d, sizeof(U16), blocknum); +} + +void LLTemplateMessageReader::getS32(const char *block, const char *var, + S32 &d, S32 blocknum) +{ + getData(block, var, &d, sizeof(S32), blocknum); +} + +void LLTemplateMessageReader::getU32(const char *block, const char *var, + U32 &d, S32 blocknum) +{ + getData(block, var, &d, sizeof(U32), blocknum); +} + +void LLTemplateMessageReader::getU64(const char *block, const char *var, + U64 &d, S32 blocknum) +{ + getData(block, var, &d, sizeof(U64), blocknum); +} + +void LLTemplateMessageReader::getF32(const char *block, const char *var, + F32 &d, S32 blocknum) +{ + getData(block, var, &d, sizeof(F32), blocknum); + + if( !llfinite( d ) ) + { + llwarns << "non-finite in getF32Fast " << block << " " << var + << llendl; + d = 0; + } +} + +void LLTemplateMessageReader::getF64(const char *block, const char *var, + F64 &d, S32 blocknum) +{ + getData(block, var, &d, sizeof(F64), blocknum); + + if( !llfinite( d ) ) + { + llwarns << "non-finite in getF64Fast " << block << " " << var + << llendl; + d = 0; + } +} + +void LLTemplateMessageReader::getVector3(const char *block, const char *var, + LLVector3 &v, S32 blocknum ) +{ + getData(block, var, v.mV, sizeof(v.mV), blocknum); + + if( !v.isFinite() ) + { + llwarns << "non-finite in getVector3Fast " << block << " " + << var << llendl; + v.zeroVec(); + } +} + +void LLTemplateMessageReader::getVector4(const char *block, const char *var, + LLVector4 &v, S32 blocknum) +{ + getData(block, var, v.mV, sizeof(v.mV), blocknum); + + if( !v.isFinite() ) + { + llwarns << "non-finite in getVector4Fast " << block << " " + << var << llendl; + v.zeroVec(); + } +} + +void LLTemplateMessageReader::getVector3d(const char *block, const char *var, + LLVector3d &v, S32 blocknum ) +{ + getData(block, var, v.mdV, sizeof(v.mdV), blocknum); + + if( !v.isFinite() ) + { + llwarns << "non-finite in getVector3dFast " << block << " " + << var << llendl; + v.zeroVec(); + } + +} + +void LLTemplateMessageReader::getQuat(const char *block, const char *var, + LLQuaternion &q, S32 blocknum) +{ + LLVector3 vec; + getData(block, var, vec.mV, sizeof(vec.mV), blocknum); + if( vec.isFinite() ) + { + q.unpackFromVector3( vec ); + } + else + { + llwarns << "non-finite in getQuatFast " << block << " " << var + << llendl; + q.loadIdentity(); + } +} + +void LLTemplateMessageReader::getUUID(const char *block, const char *var, + LLUUID &u, S32 blocknum) +{ + getData(block, var, u.mData, sizeof(u.mData), blocknum); +} + +inline void LLTemplateMessageReader::getIPAddr(const char *block, const char *var, U32 &u, S32 blocknum) +{ + getData(block, var, &u, sizeof(U32), blocknum); +} + +inline void LLTemplateMessageReader::getIPPort(const char *block, const char *var, U16 &u, S32 blocknum) +{ + getData(block, var, &u, sizeof(U16), blocknum); + u = ntohs(u); +} + +inline void LLTemplateMessageReader::getString(const char *block, const char *var, S32 buffer_size, char *s, S32 blocknum ) +{ + s[0] = '\0'; + getData(block, var, s, 0, blocknum, buffer_size); + s[buffer_size - 1] = '\0'; +} + +//virtual +S32 LLTemplateMessageReader::getMessageSize() const +{ + return mReceiveSize; +} + +// Returns template for the message contained in buffer +BOOL LLTemplateMessageReader::decodeTemplate( + const U8* buffer, S32 buffer_size, // inputs + LLMessageTemplate** msg_template ) // outputs +{ + const U8* header = buffer + LL_PACKET_ID_SIZE; + + // is there a message ready to go? + if (buffer_size <= 0) + { + llwarns << "No message waiting for decode!" << llendl; + return(FALSE); + } + + U32 num = 0; + + if (header[0] != 255) + { + // high frequency message + num = header[0]; + } + else if ((buffer_size >= ((S32) LL_MINIMUM_VALID_PACKET_SIZE + 1)) && (header[1] != 255)) + { + // medium frequency message + num = (255 << 8) | header[1]; + } + else if ((buffer_size >= ((S32) LL_MINIMUM_VALID_PACKET_SIZE + 3)) && (header[1] == 255)) + { + // low frequency message + U16 message_id_U16 = 0; + // I think this check busts the message system. + // it appears that if there is a NULL in the message #, it won't copy it.... + // what was the goal? + //if(header[2]) + memcpy(&message_id_U16, &header[2], 2); + + // dependant on endian-ness: + // U32 temp = (255 << 24) | (255 << 16) | header[2]; + + // independant of endian-ness: + message_id_U16 = ntohs(message_id_U16); + num = 0xFFFF0000 | message_id_U16; + } + else // bogus packet received (too short) + { + llwarns << "Packet with unusable length received (too short): " + << buffer_size << llendl; + return(FALSE); + } + + LLMessageTemplate* temp = get_ptr_in_map(mMessageNumbers,num); + if (temp) + { + *msg_template = temp; + } + else + { + llwarns << "Message #" << std::hex << num << std::dec + << " received but not registered!" << llendl; + gMessageSystem->callExceptionFunc(MX_UNREGISTERED_MESSAGE); + return(FALSE); + } + + return(TRUE); +} + +void LLTemplateMessageReader::logRanOffEndOfPacket( const LLHost& host ) +{ + // we've run off the end of the packet! + llwarns << "Ran off end of packet " << mCurrentRMessageTemplate->mName +// << " with id " << mCurrentRecvPacketID + << " from " << host + << llendl; + if(gMessageSystem->mVerboseLog) + { + llinfos << "MSG: -> " << host << "\tREAD PAST END:\t" +// << mCurrentRecvPacketID << " " + << getMessageName() << llendl; + } + gMessageSystem->callExceptionFunc(MX_RAN_OFF_END_OF_PACKET); +} + +// decode a given message +BOOL LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender ) +{ + llassert( mReceiveSize >= 0 ); + llassert( mCurrentRMessageTemplate); + llassert( !mCurrentRMessageData ); + delete mCurrentRMessageData; // just to make sure + + S32 decode_pos = LL_PACKET_ID_SIZE + (S32)(mCurrentRMessageTemplate->mFrequency); + + // create base working data set + mCurrentRMessageData = new LLMsgData(mCurrentRMessageTemplate->mName); + + // loop through the template building the data structure as we go + for (LLMessageTemplate::message_block_map_t::iterator iter = mCurrentRMessageTemplate->mMemberBlocks.begin(); + iter != mCurrentRMessageTemplate->mMemberBlocks.end(); iter++) + { + LLMessageBlock* mbci = iter->second; + U8 repeat_number; + S32 i; + + // how many of this block? + + if (mbci->mType == MBT_SINGLE) + { + // just one + repeat_number = 1; + } + else if (mbci->mType == MBT_MULTIPLE) + { + // a known number + repeat_number = mbci->mNumber; + } + else if (mbci->mType == MBT_VARIABLE) + { + // need to read the number from the message + // repeat number is a single byte + if (decode_pos >= mReceiveSize) + { + logRanOffEndOfPacket( sender ); + return FALSE; + } + repeat_number = buffer[decode_pos]; + decode_pos++; + } + else + { + llerrs << "Unknown block type" << llendl; + return FALSE; + } + + LLMsgBlkData* cur_data_block = NULL; + + // now loop through the block + for (i = 0; i < repeat_number; i++) + { + if (i) + { + // build new name to prevent collisions + // TODO: This should really change to a vector + cur_data_block = new LLMsgBlkData(mbci->mName, repeat_number); + cur_data_block->mName = mbci->mName + i; + } + else + { + cur_data_block = new LLMsgBlkData(mbci->mName, repeat_number); + } + + // add the block to the message + mCurrentRMessageData->addBlock(cur_data_block); + + // now read the variables + for (LLMessageBlock::message_variable_map_t::iterator iter = mbci->mMemberVariables.begin(); + iter != mbci->mMemberVariables.end(); iter++) + { + LLMessageVariable& mvci = *(iter->second); + // ok, build out the variables + // add variable block + cur_data_block->addVariable(mvci.getName(), mvci.getType()); + + // what type of variable? + if (mvci.getType() == MVT_VARIABLE) + { + // variable, get the number of bytes to read from the template + S32 data_size = mvci.getSize(); + U8 tsizeb = 0; + U16 tsizeh = 0; + U32 tsize = 0; + + if ((decode_pos + data_size) > mReceiveSize) + { + logRanOffEndOfPacket( sender ); + return FALSE; + } + switch(data_size) + { + case 1: + htonmemcpy(&tsizeb, &buffer[decode_pos], MVT_U8, 1); + tsize = tsizeb; + break; + case 2: + htonmemcpy(&tsizeh, &buffer[decode_pos], MVT_U16, 2); + tsize = tsizeh; + break; + case 4: + htonmemcpy(&tsizeb, &buffer[decode_pos], MVT_U32, 4); + break; + default: + llerrs << "Attempting to read variable field with unknown size of " << data_size << llendl; + break; + + } + decode_pos += data_size; + + if ((decode_pos + (S32)tsize) > mReceiveSize) + { + logRanOffEndOfPacket( sender ); + return FALSE; + } + cur_data_block->addData(mvci.getName(), &buffer[decode_pos], tsize, mvci.getType()); + decode_pos += tsize; + } + else + { + // fixed! + // so, copy data pointer and set data size to fixed size + + if ((decode_pos + mvci.getSize()) > mReceiveSize) + { + logRanOffEndOfPacket( sender ); + return FALSE; + } + + cur_data_block->addData(mvci.getName(), &buffer[decode_pos], mvci.getSize(), mvci.getType()); + decode_pos += mvci.getSize(); + } + } + } + } + + if (mCurrentRMessageData->mMemberBlocks.empty() + && !mCurrentRMessageTemplate->mMemberBlocks.empty()) + { + lldebugs << "Empty message '" << mCurrentRMessageTemplate->mName << "' (no blocks)" << llendl; + return FALSE; + } + + { + static LLTimer decode_timer; + + if(LLMessageReader::getTimeDecodes() || gMessageSystem->getTimingCallback()) + { + decode_timer.reset(); + } + + // if( mCurrentRMessageTemplate->mName == _PREHASH_AgentToNewRegion ) + // { + // VTResume(); // VTune + // } + + { + LLFastTimer t(LLFastTimer::FTM_PROCESS_MESSAGES); + if( !mCurrentRMessageTemplate->callHandlerFunc(gMessageSystem) ) + { + llwarns << "Message from " << sender << " with no handler function received: " << mCurrentRMessageTemplate->mName << llendl; + } + } + + // if( mCurrentRMessageTemplate->mName == _PREHASH_AgentToNewRegion ) + // { + // VTPause(); // VTune + // } + + if(LLMessageReader::getTimeDecodes() || gMessageSystem->getTimingCallback()) + { + F32 decode_time = decode_timer.getElapsedTimeF32(); + + if (gMessageSystem->getTimingCallback()) + { + (gMessageSystem->getTimingCallback())(mCurrentRMessageTemplate->mName, + decode_time, + gMessageSystem->getTimingCallbackData()); + } + + if (LLMessageReader::getTimeDecodes()) + { + mCurrentRMessageTemplate->mDecodeTimeThisFrame += decode_time; + + mCurrentRMessageTemplate->mTotalDecoded++; + mCurrentRMessageTemplate->mTotalDecodeTime += decode_time; + + if( mCurrentRMessageTemplate->mMaxDecodeTimePerMsg < decode_time ) + { + mCurrentRMessageTemplate->mMaxDecodeTimePerMsg = decode_time; + } + + + if(decode_time > LLMessageReader::getTimeDecodesSpamThreshold()) + { + lldebugs << "--------- Message " << mCurrentRMessageTemplate->mName << " decode took " << decode_time << " seconds. (" << + mCurrentRMessageTemplate->mMaxDecodeTimePerMsg << " max, " << + (mCurrentRMessageTemplate->mTotalDecodeTime / mCurrentRMessageTemplate->mTotalDecoded) << " avg)" << llendl; + } + } + } + } + return TRUE; +} + +BOOL LLTemplateMessageReader::validateMessage(const U8* buffer, + S32 buffer_size, + const LLHost& sender) +{ + mReceiveSize = buffer_size; + BOOL result = decodeTemplate(buffer, buffer_size, &mCurrentRMessageTemplate ); + if(result) + { + mCurrentRMessageTemplate->mReceiveCount++; + lldebugst(LLERR_MESSAGE) << "MessageRecvd:" + << mCurrentRMessageTemplate->mName + << " from " << sender << llendl; + } + return result; +} + +BOOL LLTemplateMessageReader::readMessage(const U8* buffer, + const LLHost& sender) +{ + return decodeData(buffer, sender); +} + +//virtual +const char* LLTemplateMessageReader::getMessageName() const +{ + static char empty_string[] = ""; + return mCurrentRMessageTemplate ? mCurrentRMessageTemplate->mName : empty_string; +} + +//virtual +bool LLTemplateMessageReader::isTrusted() const +{ + return mCurrentRMessageTemplate->getTrust() == MT_TRUST; +} + +//virtual +bool LLTemplateMessageReader::isBanned(bool trustedSource) const +{ + return mCurrentRMessageTemplate->isBanned(trustedSource); +} + +//virtual +void LLTemplateMessageReader::copyToBuilder(LLMessageBuilder& builder) const +{ + if(NULL == mCurrentRMessageTemplate) + { + return; + } + builder.copyFromMessageData(*mCurrentRMessageData); +} diff --git a/linden/indra/llmessage/lltemplatemessagereader.h b/linden/indra/llmessage/lltemplatemessagereader.h new file mode 100644 index 0000000..dd5ee39 --- /dev/null +++ b/linden/indra/llmessage/lltemplatemessagereader.h @@ -0,0 +1,98 @@ +#ifndef LL_LLTEMPLATEMESSAGEREADER_H +#define LL_LLTEMPLATEMESSAGEREADER_H + +#include "llmessagereader.h" + +#include + +class LLMessageTemplate; +class LLMsgData; + +class LLTemplateMessageReader : public LLMessageReader +{ +public: + + typedef std::map message_template_number_map_t; + + LLTemplateMessageReader(message_template_number_map_t&); + virtual ~LLTemplateMessageReader(); + + /** All get* methods expect pointers to canonical strings. */ + virtual void getBinaryData(const char *blockname, const char *varname, + void *datap, S32 size, S32 blocknum = 0, + S32 max_size = S32_MAX); + virtual void getBOOL(const char *block, const char *var, BOOL &data, + S32 blocknum = 0); + virtual void getS8(const char *block, const char *var, S8 &data, + S32 blocknum = 0); + virtual void getU8(const char *block, const char *var, U8 &data, + S32 blocknum = 0); + virtual void getS16(const char *block, const char *var, S16 &data, + S32 blocknum = 0); + virtual void getU16(const char *block, const char *var, U16 &data, + S32 blocknum = 0); + virtual void getS32(const char *block, const char *var, S32 &data, + S32 blocknum = 0); + virtual void getF32(const char *block, const char *var, F32 &data, + S32 blocknum = 0); + virtual void getU32(const char *block, const char *var, U32 &data, + S32 blocknum = 0); + virtual void getU64(const char *block, const char *var, U64 &data, + S32 blocknum = 0); + virtual void getF64(const char *block, const char *var, F64 &data, + S32 blocknum = 0); + virtual void getVector3(const char *block, const char *var, + LLVector3 &vec, S32 blocknum = 0); + virtual void getVector4(const char *block, const char *var, + LLVector4 &vec, S32 blocknum = 0); + virtual void getVector3d(const char *block, const char *var, + LLVector3d &vec, S32 blocknum = 0); + virtual void getQuat(const char *block, const char *var, LLQuaternion &q, + S32 blocknum = 0); + virtual void getUUID(const char *block, const char *var, LLUUID &uuid, + S32 blocknum = 0); + virtual void getIPAddr(const char *block, const char *var, U32 &ip, + S32 blocknum = 0); + virtual void getIPPort(const char *block, const char *var, U16 &port, + S32 blocknum = 0); + virtual void getString(const char *block, const char *var, + S32 buffer_size, char *buffer, S32 blocknum = 0); + + virtual S32 getNumberOfBlocks(const char *blockname); + virtual S32 getSize(const char *blockname, const char *varname); + virtual S32 getSize(const char *blockname, S32 blocknum, + const char *varname); + + virtual void clearMessage(); + + virtual const char* getMessageName() const; + virtual S32 getMessageSize() const; + + virtual void copyToBuilder(LLMessageBuilder&) const; + + BOOL validateMessage(const U8* buffer, S32 buffer_size, + const LLHost& sender); + BOOL readMessage(const U8* buffer, const LLHost& sender); + + bool isTrusted() const; + bool isBanned(bool trusted_source) const; + +private: + + void getData(const char *blockname, const char *varname, void *datap, + S32 size = 0, S32 blocknum = 0, S32 max_size = S32_MAX); + + BOOL decodeTemplate(const U8* buffer, S32 buffer_size, // inputs + LLMessageTemplate** msg_template ); // outputs + + void logRanOffEndOfPacket( const LLHost& host ); + + BOOL decodeData(const U8* buffer, const LLHost& sender ); + + S32 mReceiveSize; + LLMessageTemplate* mCurrentRMessageTemplate; + LLMsgData* mCurrentRMessageData; + message_template_number_map_t& mMessageNumbers; +}; + +#endif // LL_LLTEMPLATEMESSAGEREADER_H diff --git a/linden/indra/llmessage/llthrottle.cpp b/linden/indra/llmessage/llthrottle.cpp index 87dc929..de80dd0 100644 --- a/linden/indra/llmessage/llthrottle.cpp +++ b/linden/indra/llmessage/llthrottle.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llthrottle.h b/linden/indra/llmessage/llthrottle.h index 8fc2725..a87834b 100644 --- a/linden/indra/llmessage/llthrottle.h +++ b/linden/indra/llmessage/llthrottle.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lltransfermanager.cpp b/linden/indra/llmessage/lltransfermanager.cpp index 43afa78..12e1728 100644 --- a/linden/indra/llmessage/lltransfermanager.cpp +++ b/linden/indra/llmessage/lltransfermanager.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lltransfermanager.h b/linden/indra/llmessage/lltransfermanager.h index 6d9d172..81a0221 100644 --- a/linden/indra/llmessage/lltransfermanager.h +++ b/linden/indra/llmessage/lltransfermanager.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lltransfersourceasset.cpp b/linden/indra/llmessage/lltransfersourceasset.cpp index 0285896..31094c1 100644 --- a/linden/indra/llmessage/lltransfersourceasset.cpp +++ b/linden/indra/llmessage/lltransfersourceasset.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lltransfersourceasset.h b/linden/indra/llmessage/lltransfersourceasset.h index 7859de7..7b1aa63 100644 --- a/linden/indra/llmessage/lltransfersourceasset.h +++ b/linden/indra/llmessage/lltransfersourceasset.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lltransfersourcefile.cpp b/linden/indra/llmessage/lltransfersourcefile.cpp index a8625b0..392349e 100644 --- a/linden/indra/llmessage/lltransfersourcefile.cpp +++ b/linden/indra/llmessage/lltransfersourcefile.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lltransfersourcefile.h b/linden/indra/llmessage/lltransfersourcefile.h index f615e86..21661b5 100644 --- a/linden/indra/llmessage/lltransfersourcefile.h +++ b/linden/indra/llmessage/lltransfersourcefile.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lltransfertargetfile.cpp b/linden/indra/llmessage/lltransfertargetfile.cpp index bb039d7..00af3ff 100644 --- a/linden/indra/llmessage/lltransfertargetfile.cpp +++ b/linden/indra/llmessage/lltransfertargetfile.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lltransfertargetfile.h b/linden/indra/llmessage/lltransfertargetfile.h index 9e249f9..50d617f 100644 --- a/linden/indra/llmessage/lltransfertargetfile.h +++ b/linden/indra/llmessage/lltransfertargetfile.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lltransfertargetvfile.cpp b/linden/indra/llmessage/lltransfertargetvfile.cpp index 5a1acf3..79919b8 100644 --- a/linden/indra/llmessage/lltransfertargetvfile.cpp +++ b/linden/indra/llmessage/lltransfertargetvfile.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lltransfertargetvfile.h b/linden/indra/llmessage/lltransfertargetvfile.h index 4c915dc..6ba8745 100644 --- a/linden/indra/llmessage/lltransfertargetvfile.h +++ b/linden/indra/llmessage/lltransfertargetvfile.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llurlrequest.cpp b/linden/indra/llmessage/llurlrequest.cpp index 8ac8d94..b3dfb52 100644 --- a/linden/indra/llmessage/llurlrequest.cpp +++ b/linden/indra/llmessage/llurlrequest.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llurlrequest.h b/linden/indra/llmessage/llurlrequest.h index 788b0e4..9088244 100644 --- a/linden/indra/llmessage/llurlrequest.h +++ b/linden/indra/llmessage/llurlrequest.h @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lluseroperation.cpp b/linden/indra/llmessage/lluseroperation.cpp index c3ce63c..29146ea 100644 --- a/linden/indra/llmessage/lluseroperation.cpp +++ b/linden/indra/llmessage/lluseroperation.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/lluseroperation.h b/linden/indra/llmessage/lluseroperation.h index 18459f5..325567c 100644 --- a/linden/indra/llmessage/lluseroperation.h +++ b/linden/indra/llmessage/lluseroperation.h @@ -5,6 +5,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llvehicleparams.h b/linden/indra/llmessage/llvehicleparams.h index 7725406..946f88c 100644 --- a/linden/indra/llmessage/llvehicleparams.h +++ b/linden/indra/llmessage/llvehicleparams.h @@ -5,6 +5,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llxfer.cpp b/linden/indra/llmessage/llxfer.cpp index 507b820..e12996d 100644 --- a/linden/indra/llmessage/llxfer.cpp +++ b/linden/indra/llmessage/llxfer.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llxfer.h b/linden/indra/llmessage/llxfer.h index b070c87..51d7731 100644 --- a/linden/indra/llmessage/llxfer.h +++ b/linden/indra/llmessage/llxfer.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llxfer_file.cpp b/linden/indra/llmessage/llxfer_file.cpp index 2fec06b..297d163 100644 --- a/linden/indra/llmessage/llxfer_file.cpp +++ b/linden/indra/llmessage/llxfer_file.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -133,7 +134,7 @@ S32 LLXfer_File::initializeRequest(U64 xfer_id, mRemoteHost = remote_host; mDeleteRemoteOnCompletion = delete_remote_on_completion; - snprintf(mTempFilename, sizeof(mTempFilename), "%s",gDirUtilp->getTempFilename().c_str()); /* Flawfinder : ignore */ + snprintf(mTempFilename, sizeof(mTempFilename), "%s",gDirUtilp->getTempFilename().c_str()); /* Flawfinder: ignore */ mCallback = callback; mCallbackDataHandle = user_data; diff --git a/linden/indra/llmessage/llxfer_file.h b/linden/indra/llmessage/llxfer_file.h index 2a92e00..6a9ee51 100644 --- a/linden/indra/llmessage/llxfer_file.h +++ b/linden/indra/llmessage/llxfer_file.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llxfer_mem.cpp b/linden/indra/llmessage/llxfer_mem.cpp index e9d7bf8..e9b4224 100644 --- a/linden/indra/llmessage/llxfer_mem.cpp +++ b/linden/indra/llmessage/llxfer_mem.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llxfer_mem.h b/linden/indra/llmessage/llxfer_mem.h index bda7893..b80807a 100644 --- a/linden/indra/llmessage/llxfer_mem.h +++ b/linden/indra/llmessage/llxfer_mem.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llxfer_vfile.cpp b/linden/indra/llmessage/llxfer_vfile.cpp index 3a2a4a2..0d0d5fe 100644 --- a/linden/indra/llmessage/llxfer_vfile.cpp +++ b/linden/indra/llmessage/llxfer_vfile.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llxfer_vfile.h b/linden/indra/llmessage/llxfer_vfile.h index 51b64db..e71a0e8 100644 --- a/linden/indra/llmessage/llxfer_vfile.h +++ b/linden/indra/llmessage/llxfer_vfile.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llxfermanager.cpp b/linden/indra/llmessage/llxfermanager.cpp index afeeef3..914488e 100644 --- a/linden/indra/llmessage/llxfermanager.cpp +++ b/linden/indra/llmessage/llxfermanager.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llxfermanager.h b/linden/indra/llmessage/llxfermanager.h index b6e3ee2..7b529ad 100644 --- a/linden/indra/llmessage/llxfermanager.h +++ b/linden/indra/llmessage/llxfermanager.h @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llxorcipher.cpp b/linden/indra/llmessage/llxorcipher.cpp index 3c3f690..042fbd4 100644 --- a/linden/indra/llmessage/llxorcipher.cpp +++ b/linden/indra/llmessage/llxorcipher.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/llxorcipher.h b/linden/indra/llmessage/llxorcipher.h index fbb879e..16579a6 100644 --- a/linden/indra/llmessage/llxorcipher.h +++ b/linden/indra/llmessage/llxorcipher.h @@ -3,6 +3,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/machine.h b/linden/indra/llmessage/machine.h index 72caadc..490ddc5 100644 --- a/linden/indra/llmessage/machine.h +++ b/linden/indra/llmessage/machine.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/mean_collision_data.h b/linden/indra/llmessage/mean_collision_data.h index 2d60159..a319640 100644 --- a/linden/indra/llmessage/mean_collision_data.h +++ b/linden/indra/llmessage/mean_collision_data.h @@ -5,6 +5,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/message.cpp b/linden/indra/llmessage/message.cpp index 2e7cb6a..ef22b63 100644 --- a/linden/indra/llmessage/message.cpp +++ b/linden/indra/llmessage/message.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -52,11 +53,23 @@ // linden library headers #include "indra_constants.h" +#include "lldarray.h" #include "lldir.h" #include "llerror.h" +#include "llerrorlegacy.h" #include "llfasttimer.h" +#include "llhttpclient.h" +#include "llhttpsender.h" #include "llmd5.h" +#include "llmessagebuilder.h" +#include "llmessageconfig.h" +#include "llpumpio.h" +#include "lltemplatemessagebuilder.h" +#include "lltemplatemessagereader.h" +#include "llmessagetemplate.h" #include "llsd.h" +#include "llsdmessagebuilder.h" +#include "llsdmessagereader.h" #include "lltransfermanager.h" #include "lluuid.h" #include "llxfermanager.h" @@ -73,406 +86,6 @@ static const F32 CIRCUIT_DUMP_TIMEOUT = 30.f; static const S32 TRUST_TIME_WINDOW = 3; -class LLMsgVarData -{ -public: - LLMsgVarData() : mName(NULL), mSize(-1), mDataSize(-1), mData(NULL), mType(MVT_U8) - { - } - - LLMsgVarData(const char *name, EMsgVariableType type) : mSize(-1), mDataSize(-1), mData(NULL), mType(type) - { - mName = (char *)name; - } - - ~LLMsgVarData() - { - // copy constructor just copies the mData pointer, so only delete mData explicitly - } - - void deleteData() - { - delete[] mData; - mData = NULL; - } - - void addData(const void *indata, S32 size, EMsgVariableType type, S32 data_size = -1); - - char *getName() const { return mName; } - S32 getSize() const { return mSize; } - void *getData() { return (void*)mData; } - S32 getDataSize() const { return mDataSize; } - EMsgVariableType getType() const { return mType; } - -protected: - char *mName; - S32 mSize; - S32 mDataSize; - - U8 *mData; - EMsgVariableType mType; -}; - - -class LLMsgBlkData -{ -public: - LLMsgBlkData(const char *name, S32 blocknum) : mOffset(-1), mBlockNumber(blocknum), mTotalSize(-1) - { - mName = (char *)name; - } - - ~LLMsgBlkData() - { - for (msg_var_data_map_t::iterator iter = mMemberVarData.begin(); - iter != mMemberVarData.end(); iter++) - { - iter->deleteData(); - } - } - - void addVariable(const char *name, EMsgVariableType type) - { - LLMsgVarData tmp(name,type); - mMemberVarData[name] = tmp; - } - - void addData(char *name, const void *data, S32 size, EMsgVariableType type, S32 data_size = -1) - { - LLMsgVarData* temp = &mMemberVarData[name]; // creates a new entry if one doesn't exist - temp->addData(data, size, type, data_size); - } - - S32 mOffset; - S32 mBlockNumber; - typedef LLDynamicArrayIndexed msg_var_data_map_t; - msg_var_data_map_t mMemberVarData; - char *mName; - S32 mTotalSize; -}; - - -class LLMsgData -{ -public: - LLMsgData(const char *name) : mTotalSize(-1) - { - mName = (char *)name; - } - ~LLMsgData() - { - for_each(mMemberBlocks.begin(), mMemberBlocks.end(), DeletePairedPointer()); - } - - void addBlock(LLMsgBlkData *blockp) - { - mMemberBlocks[blockp->mName] = blockp; - } - - void addDataFast(char *blockname, char *varname, const void *data, S32 size, EMsgVariableType type, S32 data_size = -1); - -public: - S32 mOffset; - typedef std::map msg_blk_data_map_t; - msg_blk_data_map_t mMemberBlocks; - char *mName; - S32 mTotalSize; -}; - -inline void LLMsgVarData::addData(const void *data, S32 size, EMsgVariableType type, S32 data_size) -{ - mSize = size; - mDataSize = data_size; - if ( (type != MVT_VARIABLE) && (type != MVT_FIXED) - && (mType != MVT_VARIABLE) && (mType != MVT_FIXED)) - { - if (mType != type) - { - llwarns << "Type mismatch in addData for " << mName - << " message: " << gMessageSystem->getCurrentSMessageName() - << " block: " << gMessageSystem->getCurrentSBlockName() - << llendl; - } - } - if(size) - { - delete mData; // Delete it if it already exists - mData = new U8[size]; - htonmemcpy(mData, data, mType, size); - } -} - - - -inline void LLMsgData::addDataFast(char *blockname, char *varname, const void *data, S32 size, EMsgVariableType type, S32 data_size) -{ - // remember that if the blocknumber is > 0 then the number is appended to the name - char *namep = (char *)blockname; - LLMsgBlkData* block_data = mMemberBlocks[namep]; - if (block_data->mBlockNumber) - { - namep += block_data->mBlockNumber; - block_data->addData(varname, data, size, type, data_size); - } - else - { - block_data->addData(varname, data, size, type, data_size); - } -} - -// LLMessage* classes store the template of messages - - -class LLMessageVariable -{ -public: - LLMessageVariable() : mName(NULL), mType(MVT_NULL), mSize(-1) - { - } - - LLMessageVariable(char *name) : mType(MVT_NULL), mSize(-1) - { - mName = name; - } - - LLMessageVariable(char *name, const EMsgVariableType type, const S32 size) : mType(type), mSize(size) - { - mName = gMessageStringTable.getString(name); - } - - ~LLMessageVariable() {} - - friend std::ostream& operator<<(std::ostream& s, LLMessageVariable &msg); - - EMsgVariableType getType() const { return mType; } - S32 getSize() const { return mSize; } - char *getName() const { return mName; } -protected: - char *mName; - EMsgVariableType mType; - S32 mSize; -}; - - -typedef enum e_message_block_type -{ - MBT_NULL, - MBT_SINGLE, - MBT_MULTIPLE, - MBT_VARIABLE, - MBT_EOF -} EMsgBlockType; - -class LLMessageBlock -{ -public: - LLMessageBlock(char *name, EMsgBlockType type, S32 number = 1) : mType(type), mNumber(number), mTotalSize(0) - { - mName = gMessageStringTable.getString(name); - } - - ~LLMessageBlock() - { - for_each(mMemberVariables.begin(), mMemberVariables.end(), DeletePairedPointer()); - } - - void addVariable(char *name, const EMsgVariableType type, const S32 size) - { - LLMessageVariable** varp = &mMemberVariables[name]; - if (*varp != NULL) - { - llerrs << name << " has already been used as a variable name!" << llendl; - } - *varp = new LLMessageVariable(name, type, size); - if (((*varp)->getType() != MVT_VARIABLE) - &&(mTotalSize != -1)) - { - mTotalSize += (*varp)->getSize(); - } - else - { - mTotalSize = -1; - } - } - - EMsgVariableType getVariableType(char *name) - { - return (mMemberVariables[name])->getType(); - } - - S32 getVariableSize(char *name) - { - return (mMemberVariables[name])->getSize(); - } - - friend std::ostream& operator<<(std::ostream& s, LLMessageBlock &msg); - - typedef std::map message_variable_map_t; - message_variable_map_t mMemberVariables; - char *mName; - EMsgBlockType mType; - S32 mNumber; - S32 mTotalSize; -}; - - -enum EMsgFrequency -{ - MFT_NULL = 0, // value is size of message number in bytes - MFT_HIGH = 1, - MFT_MEDIUM = 2, - MFT_LOW = 4 -}; - -typedef enum e_message_trust -{ - MT_TRUST, - MT_NOTRUST -} EMsgTrust; - -enum EMsgEncoding -{ - ME_UNENCODED, - ME_ZEROCODED -}; - -class LLMessageTemplate -{ -public: - LLMessageTemplate(const char *name, U32 message_number, EMsgFrequency freq) - : - //mMemberBlocks(), - mName(NULL), - mFrequency(freq), - mTrust(MT_NOTRUST), - mEncoding(ME_ZEROCODED), - mMessageNumber(message_number), - mTotalSize(0), - mReceiveCount(0), - mReceiveBytes(0), - mReceiveInvalid(0), - mDecodeTimeThisFrame(0.f), - mTotalDecoded(0), - mTotalDecodeTime(0.f), - mMaxDecodeTimePerMsg(0.f), - mBanFromTrusted(false), - mBanFromUntrusted(false), - mHandlerFunc(NULL), - mUserData(NULL) - { - mName = gMessageStringTable.getString(name); - } - - ~LLMessageTemplate() - { - for_each(mMemberBlocks.begin(), mMemberBlocks.end(), DeletePairedPointer()); - } - - void addBlock(LLMessageBlock *blockp) - { - LLMessageBlock** member_blockp = &mMemberBlocks[blockp->mName]; - if (*member_blockp != NULL) - { - llerrs << "Block " << blockp->mName - << "has already been used as a block name!" << llendl; - } - *member_blockp = blockp; - if ( (mTotalSize != -1) - &&(blockp->mTotalSize != -1) - &&( (blockp->mType == MBT_SINGLE) - ||(blockp->mType == MBT_MULTIPLE))) - { - mTotalSize += blockp->mNumber*blockp->mTotalSize; - } - else - { - mTotalSize = -1; - } - } - - LLMessageBlock *getBlock(char *name) - { - return mMemberBlocks[name]; - } - - // Trusted messages can only be recieved on trusted circuits. - void setTrust(EMsgTrust t) - { - mTrust = t; - } - - EMsgTrust getTrust(void) - { - return mTrust; - } - - // controls for how the message should be encoded - void setEncoding(EMsgEncoding e) - { - mEncoding = e; - } - EMsgEncoding getEncoding() - { - return mEncoding; - } - - void setHandlerFunc(void (*handler_func)(LLMessageSystem *msgsystem, void **user_data), void **user_data) - { - mHandlerFunc = handler_func; - mUserData = user_data; - } - - BOOL callHandlerFunc(LLMessageSystem *msgsystem) - { - if (mHandlerFunc) - { - mHandlerFunc(msgsystem, mUserData); - return TRUE; - } - return FALSE; - } - - bool isBanned(bool trustedSource) - { - return trustedSource ? mBanFromTrusted : mBanFromUntrusted; - } - - friend std::ostream& operator<<(std::ostream& s, LLMessageTemplate &msg); - -public: - typedef std::map message_block_map_t; - message_block_map_t mMemberBlocks; - char *mName; - EMsgFrequency mFrequency; - EMsgTrust mTrust; - EMsgEncoding mEncoding; - U32 mMessageNumber; - S32 mTotalSize; - U32 mReceiveCount; // how many of this template have been received since last reset - U32 mReceiveBytes; // How many bytes received - U32 mReceiveInvalid; // How many "invalid" packets - F32 mDecodeTimeThisFrame; // Total seconds spent decoding this frame - U32 mTotalDecoded; // Total messages successfully decoded - F32 mTotalDecodeTime; // Total time successfully decoding messages - F32 mMaxDecodeTimePerMsg; - - bool mBanFromTrusted; - bool mBanFromUntrusted; - -private: - // message handler function (this is set by each application) - void (*mHandlerFunc)(LLMessageSystem *msgsystem, void **user_data); - void **mUserData; -}; - - - -// static -BOOL LLMessageSystem::mTimeDecodes = FALSE; - -// static, 50ms per message decode -F32 LLMessageSystem::mTimeDecodesSpamThreshold = 0.05f; - // *NOTE: This needs to be moved into a seperate file so that it never gets // included in the viewer. 30 Sep 2002 mark // *NOTE: I don't think it's important that the messgage system tracks @@ -487,113 +100,6 @@ public: apr_pollfd_t mPollFD; }; - -// LLMessageVariable functions and friends - -std::ostream& operator<<(std::ostream& s, LLMessageVariable &msg) -{ - s << "\t\t" << msg.mName << " ("; - switch (msg.mType) - { - case MVT_FIXED: - s << "Fixed, " << msg.mSize << " bytes total)\n"; - break; - case MVT_VARIABLE: - s << "Variable, " << msg.mSize << " bytes of size info)\n"; - break; - default: - s << "Unknown\n"; - break; - } - return s; -} - -// LLMessageBlock functions and friends - -std::ostream& operator<<(std::ostream& s, LLMessageBlock &msg) -{ - s << "\t" << msg.mName << " ("; - switch (msg.mType) - { - case MBT_SINGLE: - s << "Fixed"; - break; - case MBT_MULTIPLE: - s << "Multiple - " << msg.mNumber << " copies"; - break; - case MBT_VARIABLE: - s << "Variable"; - break; - default: - s << "Unknown"; - break; - } - if (msg.mTotalSize != -1) - { - s << ", " << msg.mTotalSize << " bytes each, " << msg.mNumber*msg.mTotalSize << " bytes total)\n"; - } - else - { - s << ")\n"; - } - - - for (LLMessageBlock::message_variable_map_t::iterator iter = msg.mMemberVariables.begin(); - iter != msg.mMemberVariables.end(); iter++) - { - LLMessageVariable& ci = *(iter->second); - s << ci; - } - - return s; -} - -// LLMessageTemplate functions and friends - -std::ostream& operator<<(std::ostream& s, LLMessageTemplate &msg) -{ - switch (msg.mFrequency) - { - case MFT_HIGH: - s << "========================================\n" << "Message #" << msg.mMessageNumber << "\n" << msg.mName << " ("; - s << "High"; - break; - case MFT_MEDIUM: - s << "========================================\n" << "Message #"; - s << (msg.mMessageNumber & 0xFF) << "\n" << msg.mName << " ("; - s << "Medium"; - break; - case MFT_LOW: - s << "========================================\n" << "Message #"; - s << (msg.mMessageNumber & 0xFFFF) << "\n" << msg.mName << " ("; - s << "Low"; - break; - default: - s << "Unknown"; - break; - } - - if (msg.mTotalSize != -1) - { - s << ", " << msg.mTotalSize << " bytes total)\n"; - } - else - { - s << ")\n"; - } - - for (LLMessageTemplate::message_block_map_t::iterator iter = msg.mMemberBlocks.begin(); - iter != msg.mMemberBlocks.end(); iter++) - { - LLMessageBlock* ci = iter->second; - s << *ci; - } - - return s; -} - -// LLMessageList functions and friends - // Lets support a small subset of regular expressions here // Syntax is a string made up of: // a - checks against alphanumeric ([A-Za-z0-9]) @@ -795,103 +301,162 @@ BOOL b_positive_integer_ok(char *token) return TRUE; } -void LLMessageSystem::init() +namespace { - // initialize member variables - mVerboseLog = FALSE; + class LLFnPtrResponder : public LLHTTPClient::Responder + { + public: + LLFnPtrResponder(void (*callback)(void **,S32), void **callbackData) : + mCallback(callback), + mCallbackData(callbackData) + { + } - mbError = FALSE; - mErrorCode = 0; - mIncomingCompressedSize = 0; - mSendReliable = FALSE; + virtual void error(U32 status, const std::string& reason) + { + // TODO: Map status in to useful error code. + if(NULL != mCallback) mCallback(mCallbackData, LL_ERR_TCP_TIMEOUT); + } + + virtual void result(const LLSD& content) + { + if(NULL != mCallback) mCallback(mCallbackData, LL_ERR_NOERR); + } - mbSBuilt = FALSE; - mbSClear = TRUE; + private: - mUnackedListDepth = 0; - mUnackedListSize = 0; - mDSMaxListDepth = 0; + void (*mCallback)(void **,S32); + void **mCallbackData; + }; +} - mCurrentRMessageData = NULL; - mCurrentRMessageTemplate = NULL; - mCurrentSMessageData = NULL; - mCurrentSMessageTemplate = NULL; - mCurrentSMessageName = NULL; +class LLTrustedMessageService : public LLHTTPNode +{ + virtual bool validate(const std::string& name, LLSD& context) const + { return true; } - mCurrentRecvPacketID = 0; + virtual void post(LLHTTPNode::ResponsePtr response, + const LLSD& context, + const LLSD& input) const; +}; - mNumberHighFreqMessages = 0; - mNumberMediumFreqMessages = 0; - mNumberLowFreqMessages = 0; - mPacketsIn = mPacketsOut = 0; - mBytesIn = mBytesOut = 0; - mCompressedPacketsIn = mCompressedPacketsOut = 0; - mReliablePacketsIn = mReliablePacketsOut = 0; +//virtual +void LLTrustedMessageService::post(LLHTTPNode::ResponsePtr response, + const LLSD& context, + const LLSD& input) const +{ + std::string name = context["request"]["wildcard"]["message-name"]; + std::string senderIP = context["request"]["remote-host"]; + std::string senderPort = context["request"]["headers"] + ["x-secondlife-udp-listen-port"]; - mCompressedBytesIn = 0; - mCompressedBytesOut = 0; - mUncompressedBytesIn = 0; - mUncompressedBytesOut = 0; - mTotalBytesIn = 0; - mTotalBytesOut = 0; + LLSD message_data; + message_data["sender"] = senderIP + ":" + senderPort; + message_data["body"] = input; + + LLMessageSystem::dispatch(name, message_data, response); +} - mDroppedPackets = 0; // total dropped packets in - mResentPackets = 0; // total resent packets out - mFailedResendPackets = 0; // total resend failure packets out - mOffCircuitPackets = 0; // total # of off-circuit packets rejected - mInvalidOnCircuitPackets = 0; // total # of on-circuit packets rejected +class LLMessageHandlerBridge : public LLHTTPNode +{ + virtual bool validate(const std::string& name, LLSD& context) const + { return true; } - mOurCircuitCode = 0; + virtual void post(LLHTTPNode::ResponsePtr response, const LLSD& context, + const LLSD& input) const; +}; - mMessageFileChecksum = 0; - mMessageFileVersionNumber = 0.f; +//virtual +void LLMessageHandlerBridge::post(LLHTTPNode::ResponsePtr response, + const LLSD& context, const LLSD& input) const +{ + std::string name = context["request"]["wildcard"]["message-name"]; + + lldebugs << "Setting mLastSender " << input["sender"].asString() << llendl; + gMessageSystem->mLastSender = LLHost(input["sender"].asString()); + gMessageSystem->mPacketsIn += 1; + gMessageSystem->mLLSDMessageReader->setMessage(name, input["body"]); + gMessageSystem->mMessageReader = gMessageSystem->mLLSDMessageReader; + + if(gMessageSystem->callHandler(name.c_str(), false, gMessageSystem)) + { + response->result(LLSD()); + } + else + { + response->notFound(); + } } -LLMessageSystem::LLMessageSystem() +LLHTTPRegistration + gHTTPRegistrationMessageWildcard("/message/"); + +LLHTTPRegistration + gHTTPRegistrationTrustedMessageWildcard("/trusted-message/"); + +//virtual +LLUseCircuitCodeResponder::~LLUseCircuitCodeResponder() { - init(); + // even abstract base classes need a concrete destructor +} - mSystemVersionMajor = 0; - mSystemVersionMinor = 0; - mSystemVersionPatch = 0; - mSystemVersionServer = 0; - mVersionFlags = 0x0; +void LLMessageSystem::init() +{ + // initialize member variables + mVerboseLog = FALSE; - // default to not accepting packets from not alive circuits - mbProtected = TRUE; + mbError = FALSE; + mErrorCode = 0; + mSendReliable = FALSE; - mSendPacketFailureCount = 0; - mCircuitPrintFreq = 0.f; // seconds + mUnackedListDepth = 0; + mUnackedListSize = 0; + mDSMaxListDepth = 0; - // initialize various bits of net info - mSocket = 0; - mPort = 0; + mNumberHighFreqMessages = 0; + mNumberMediumFreqMessages = 0; + mNumberLowFreqMessages = 0; + mPacketsIn = mPacketsOut = 0; + mBytesIn = mBytesOut = 0; + mCompressedPacketsIn = mCompressedPacketsOut = 0; + mReliablePacketsIn = mReliablePacketsOut = 0; - mPollInfop = NULL; + mCompressedBytesIn = 0; + mCompressedBytesOut = 0; + mUncompressedBytesIn = 0; + mUncompressedBytesOut = 0; + mTotalBytesIn = 0; + mTotalBytesOut = 0; - mResendDumpTime = 0; - mMessageCountTime = 0; - mCircuitPrintTime = 0; - mCurrentMessageTimeSeconds = 0; + mDroppedPackets = 0; // total dropped packets in + mResentPackets = 0; // total resent packets out + mFailedResendPackets = 0; // total resend failure packets out + mOffCircuitPackets = 0; // total # of off-circuit packets rejected + mInvalidOnCircuitPackets = 0; // total # of on-circuit packets rejected - // Constants for dumping output based on message processing time/count - mNumMessageCounts = 0; - mMaxMessageCounts = 0; // >= 0 means dump warnings - mMaxMessageTime = 0.f; + mOurCircuitCode = 0; - mTrueReceiveSize = 0; + mIncomingCompressedSize = 0; + mCurrentRecvPacketID = 0; - // Error if checking this state, subclass methods which aren't implemented are delegated - // to properly constructed message system. - mbError = TRUE; + mMessageFileChecksum = 0; + mMessageFileVersionNumber = 0.f; + + mTimingCallback = NULL; + mTimingCallbackData = NULL; + + mMessageBuilder = NULL; + mMessageReader = NULL; } // Read file and build message templates LLMessageSystem::LLMessageSystem(const char *filename, U32 port, S32 version_major, S32 version_minor, - S32 version_patch) + S32 version_patch) : + mTemplateConfirmed(FALSE), + mTemplateMatches(FALSE) { init(); @@ -910,6 +475,14 @@ LLMessageSystem::LLMessageSystem(const char *filename, U32 port, loadTemplateFile(filename); + mTemplateMessageBuilder = new LLTemplateMessageBuilder(mMessageTemplates); + mLLSDMessageBuilder = new LLSDMessageBuilder(); + mMessageBuilder = NULL; + + mTemplateMessageReader = new LLTemplateMessageReader(mMessageNumbers); + mLLSDMessageReader = new LLSDMessageReader(); + mMessageReader = NULL; + // initialize various bits of net info mSocket = 0; mPort = port; @@ -1728,25 +1301,25 @@ LLMessageSystem::~LLMessageSystem() end_net(); } - delete mCurrentRMessageData; - mCurrentRMessageData = NULL; + delete mMessageReader; + mMessageReader = NULL; - delete mCurrentSMessageData; - mCurrentSMessageData = NULL; + delete mMessageBuilder; + mMessageBuilder = NULL; delete mPollInfop; mPollInfop = NULL; + + mIncomingCompressedSize = 0; + mCurrentRecvPacketID = 0; } void LLMessageSystem::clearReceiveState() { - mReceiveSize = -1; mCurrentRecvPacketID = 0; - mCurrentRMessageTemplate = NULL; - delete mCurrentRMessageData; - mCurrentRMessageData = NULL; mIncomingCompressedSize = 0; mLastSender.invalidate(); + mMessageReader->clearMessage(); } @@ -1773,20 +1346,23 @@ BOOL LLMessageSystem::poll(F32 seconds) // Returns TRUE if a valid, on-circuit message has been received. BOOL LLMessageSystem::checkMessages( S64 frame_count ) { + // Pump BOOL valid_packet = FALSE; + mMessageReader = mTemplateMessageReader; LLTransferTargetVFile::updateQueue(); if (!mNumMessageCounts) { - // This is the first message being handled after a resetReceiveCounts, we must be starting - // the message processing loop. Reset the timers. + // This is the first message being handled after a resetReceiveCounts, + // we must be starting the message processing loop. Reset the timers. mCurrentMessageTimeSeconds = totalTime() * SEC_PER_USEC; mMessageCountTime = getMessageTimeSeconds(); } // loop until either no packets or a valid packet // i.e., burn through packets from unregistered circuits + S32 receive_size = 0; do { clearReceiveState(); @@ -1802,16 +1378,16 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count ) // If you want to dump all received packets into SecondLife.log, uncomment this //dumpPacketToLog(); - mReceiveSize = mTrueReceiveSize; + receive_size = mTrueReceiveSize; mLastSender = mPacketRing.getLastSender(); - if (mReceiveSize < (S32) LL_MINIMUM_VALID_PACKET_SIZE) + if (receive_size < (S32) LL_MINIMUM_VALID_PACKET_SIZE) { // A receive size of zero is OK, that means that there are no more packets available. // Ones that are non-zero but below the minimum packet size are worrisome. - if (mReceiveSize > 0) + if (receive_size > 0) { - llwarns << "Invalid (too short) packet discarded " << mReceiveSize << llendl; + llwarns << "Invalid (too short) packet discarded " << receive_size << llendl; callExceptionFunc(MX_PACKET_TOO_SHORT); } // no data in packet receive buffer @@ -1825,18 +1401,18 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count ) // note if packet acks are appended. if(buffer[0] & LL_ACK_FLAG) { - acks += buffer[--mReceiveSize]; - true_rcv_size = mReceiveSize; - if(mReceiveSize >= ((S32)(acks * sizeof(TPACKETID) + LL_MINIMUM_VALID_PACKET_SIZE))) + acks += buffer[--receive_size]; + true_rcv_size = receive_size; + if(receive_size >= ((S32)(acks * sizeof(TPACKETID) + LL_MINIMUM_VALID_PACKET_SIZE))) { - mReceiveSize -= acks * sizeof(TPACKETID); + receive_size -= acks * sizeof(TPACKETID); } else { // mal-formed packet. ignore it and continue with // the next one llwarns << "Malformed packet received. Packet size " - << mReceiveSize << " with invalid no. of acks " << acks + << receive_size << " with invalid no. of acks " << acks << llendl; valid_packet = FALSE; continue; @@ -1845,7 +1421,7 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count ) // process the message as normal - mIncomingCompressedSize = zeroCodeExpand(&buffer,&mReceiveSize); + mIncomingCompressedSize = zeroCodeExpand(&buffer,&receive_size); mCurrentRecvPacketID = buffer[1] + ((buffer[0] & 0x0f ) * 256); if (sizeof(TPACKETID) == 4) { @@ -1969,7 +1545,7 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count ) std::ostringstream str; str << "MSG: <- " << host; char buffer[MAX_STRING]; /* Flawfinder: ignore*/ - snprintf(buffer, MAX_STRING, "\t%6d\t%6d\t%6d ", mReceiveSize, (mIncomingCompressedSize ? mIncomingCompressedSize : mReceiveSize), mCurrentRecvPacketID);/* Flawfinder: ignore*/ + snprintf(buffer, MAX_STRING, "\t%6d\t%6d\t%6d ", receive_size, (mIncomingCompressedSize ? mIncomingCompressedSize : receive_size), mCurrentRecvPacketID); /* Flawfinder: ignore */ str << buffer << "(unknown)" << (recv_reliable ? " reliable" : "") << " resent " @@ -1987,23 +1563,22 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count ) // But we don't want to acknowledge UseCircuitCode until the circuit is // available, which is why the acknowledgement test is done above. JC - valid_packet = decodeTemplate( buffer, mReceiveSize, &mCurrentRMessageTemplate ); - if( valid_packet ) - { - mCurrentRMessageTemplate->mReceiveCount++; - lldebugst(LLERR_MESSAGE) << "MessageRecvd:" << mCurrentRMessageTemplate->mName << " from " << host << llendl; - } + valid_packet = mTemplateMessageReader->validateMessage(buffer, + receive_size, + host); // UseCircuitCode is allowed in even from an invalid circuit, so that // we can toss circuits around. - if (valid_packet && !cdp && (mCurrentRMessageTemplate->mName != _PREHASH_UseCircuitCode) ) + if(valid_packet && !cdp && + (mTemplateMessageReader->getMessageName() != _PREHASH_UseCircuitCode)) { logMsgFromInvalidCircuit( host, recv_reliable ); clearReceiveState(); valid_packet = FALSE; } - if (valid_packet && cdp && !cdp->getTrusted() && (mCurrentRMessageTemplate->getTrust() == MT_TRUST) ) + if(valid_packet && cdp && !cdp->getTrusted() && + mTemplateMessageReader->isTrusted()) { logTrustedMsgFromUntrustedCircuit( host ); clearReceiveState(); @@ -2013,11 +1588,11 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count ) } if (valid_packet - && mCurrentRMessageTemplate->isBanned(cdp && cdp->getTrusted())) + && mTemplateMessageReader->isBanned(cdp && cdp->getTrusted())) { llwarns << "LLMessageSystem::checkMessages " << "received banned message " - << mCurrentRMessageTemplate->mName + << mTemplateMessageReader->getMessageName() << " from " << ((cdp && cdp->getTrusted()) ? "trusted " : "untrusted ") << host << llendl; @@ -2029,7 +1604,7 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count ) { logValidMsg(cdp, host, recv_reliable, recv_resent, (BOOL)(acks>0) ); - valid_packet = decodeData( buffer, host ); + valid_packet = mTemplateMessageReader->readMessage(buffer, host); } // It's possible that the circuit went away, because ANY message can disable the circuit @@ -2042,7 +1617,7 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count ) if( 1 ) { static char* object_update = gMessageStringTable.getString("ObjectUpdate"); - if(object_update == mCurrentRMessageTemplate->mName ) + if(object_update == mTemplateMessageReader->getMessageName() ) { llinfos << "ObjectUpdate:" << llendl; U32 i; @@ -2053,8 +1628,8 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count ) } llinfos << "" << llendl; - llinfos << " Zero Unencoded: " << mReceiveSize << llendl; - for( i = 0; imName : "") + << mTemplateMessageReader->getMessageName() << " from invalid circuit " << host << llendl; mOffCircuitPackets++; } @@ -2156,7 +1731,7 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count ) // Code for dumping the complete contents of a message // delete [] zero_unexpanded_buffer; } - } while (!valid_packet && mReceiveSize > 0); + } while (!valid_packet && receive_size > 0); F64 mt_sec = getMessageTimeSeconds(); // Check to see if we need to print debug info @@ -2257,728 +1832,188 @@ void LLMessageSystem::processAcks() } } - -void LLMessageSystem::newMessageFast(const char *name) +void LLMessageSystem::copyMessageRtoS() { - mbSBuilt = FALSE; - mbSClear = FALSE; - - mCurrentSendTotal = 0; - mSendReliable = FALSE; - - char *namep = (char *)name; - - if (mMessageTemplates.count(namep) > 0) + // NOTE: babbage: switch builder to match reader to avoid + // converting message format + if(mMessageReader == mTemplateMessageReader) { - mCurrentSMessageTemplate = mMessageTemplates[namep]; - if (mCurrentSMessageData) - { - delete mCurrentSMessageData; - } - mCurrentSMessageData = new LLMsgData(namep); - mCurrentSMessageName = namep; - mCurrentSDataBlock = NULL; - mCurrentSBlockName = NULL; - - // add at one of each block - LLMessageTemplate* msg_template = mMessageTemplates[namep]; - for (LLMessageTemplate::message_block_map_t::iterator iter = msg_template->mMemberBlocks.begin(); - iter != msg_template->mMemberBlocks.end(); iter++) - { - LLMessageBlock* ci = iter->second; - LLMsgBlkData *tblockp; - tblockp = new LLMsgBlkData(ci->mName, 0); - mCurrentSMessageData->addBlock(tblockp); - } + mMessageBuilder = mTemplateMessageBuilder; } else { - llerrs << "newMessage - Message " << name << " not registered" << llendl; + mMessageBuilder = mLLSDMessageBuilder; } + mSendReliable = FALSE; + mMessageBuilder->newMessage(mMessageReader->getMessageName()); + mMessageReader->copyToBuilder(*mMessageBuilder); } -void LLMessageSystem::copyMessageRtoS() +void LLMessageSystem::clearMessage() { - if (!mCurrentRMessageTemplate) - { - return; - } - newMessageFast(mCurrentRMessageTemplate->mName); + mSendReliable = FALSE; + mMessageBuilder->clearMessage(); +} - // copy the blocks - // counting variables used to encode multiple block info - S32 block_count = 0; - char *block_name = NULL; +// set block to add data to within current message +void LLMessageSystem::nextBlockFast(const char *blockname) +{ + mMessageBuilder->nextBlock(blockname); +} - // loop through msg blocks to loop through variables, totalling up size data and filling the new (send) message - LLMsgData::msg_blk_data_map_t::iterator iter = mCurrentRMessageData->mMemberBlocks.begin(); - LLMsgData::msg_blk_data_map_t::iterator end = mCurrentRMessageData->mMemberBlocks.end(); - for(; iter != end; ++iter) +BOOL LLMessageSystem::isSendFull(const char* blockname) +{ + char* stringTableName = NULL; + if(NULL != blockname) { - LLMsgBlkData* mbci = iter->second; - if(!mbci) continue; - - // do we need to encode a block code? - if (block_count == 0) - { - block_count = mbci->mBlockNumber; - block_name = (char *)mbci->mName; - } - - // counting down mutliple blocks - block_count--; - - nextBlockFast(block_name); - - // now loop through the variables - LLMsgBlkData::msg_var_data_map_t::iterator dit = mbci->mMemberVarData.begin(); - LLMsgBlkData::msg_var_data_map_t::iterator dend = mbci->mMemberVarData.end(); - - for(; dit != dend; ++dit) - { - LLMsgVarData& mvci = *dit; - addDataFast(mvci.getName(), mvci.getData(), mvci.getType(), mvci.getSize()); - } + stringTableName = gMessageStringTable.getString(blockname); } + return isSendFullFast(stringTableName); } -void LLMessageSystem::clearMessage() +BOOL LLMessageSystem::isSendFullFast(const char* blockname) { - mbSBuilt = FALSE; - mbSClear = TRUE; - - mCurrentSendTotal = 0; - mSendReliable = FALSE; + return mMessageBuilder->isMessageFull(blockname); +} - mCurrentSMessageTemplate = NULL; - delete mCurrentSMessageData; - mCurrentSMessageData = NULL; +// blow away the last block of a message, return FALSE if that leaves no blocks or there wasn't a block to remove +// TODO: Babbage: Remove this horror. +BOOL LLMessageSystem::removeLastBlock() +{ + return mMessageBuilder->removeLastBlock(); +} - mCurrentSMessageName = NULL; - mCurrentSDataBlock = NULL; - mCurrentSBlockName = NULL; +S32 LLMessageSystem::sendReliable(const LLHost &host) +{ + return sendReliable(host, LL_DEFAULT_RELIABLE_RETRIES, TRUE, LL_PING_BASED_TIMEOUT_DUMMY, NULL, NULL); } -// set block to add data to within current message -void LLMessageSystem::nextBlockFast(const char *blockname) +S32 LLMessageSystem::sendSemiReliable(const LLHost &host, void (*callback)(void **,S32), void ** callback_data) { - char *bnamep = (char *)blockname; - - if (!mCurrentSMessageTemplate) - { - llerrs << "newMessage not called prior to setBlock" << llendl; - return; - } + F32 timeout; - // now, does this block exist? - LLMessageTemplate::message_block_map_t::iterator temp_iter = mCurrentSMessageTemplate->mMemberBlocks.find(bnamep); - if (temp_iter == mCurrentSMessageTemplate->mMemberBlocks.end()) + LLCircuitData *cdp = mCircuitInfo.findCircuit(host); + if (cdp) { - llerrs << "LLMessageSystem::nextBlockFast " << bnamep - << " not a block in " << mCurrentSMessageTemplate->mName << llendl; - return; - } - - LLMessageBlock* template_data = temp_iter->second; - - // ok, have we already set this block? - LLMsgBlkData* block_data = mCurrentSMessageData->mMemberBlocks[bnamep]; - if (block_data->mBlockNumber == 0) - { - // nope! set this as the current block - block_data->mBlockNumber = 1; - mCurrentSDataBlock = block_data; - mCurrentSBlockName = bnamep; - - // add placeholders for each of the variables - for (LLMessageBlock::message_variable_map_t::iterator iter = template_data->mMemberVariables.begin(); - iter != template_data->mMemberVariables.end(); iter++) - { - LLMessageVariable& ci = *(iter->second); - mCurrentSDataBlock->addVariable(ci.getName(), ci.getType()); - } - return; + timeout = llmax(LL_MINIMUM_SEMIRELIABLE_TIMEOUT_SECONDS, + LL_SEMIRELIABLE_TIMEOUT_FACTOR * cdp->getPingDelayAveraged()); } else { - // already have this block. . . - // are we supposed to have a new one? - - // if the block is type MBT_SINGLE this is bad! - if (template_data->mType == MBT_SINGLE) - { - llerrs << "LLMessageSystem::nextBlockFast called multiple times" - << " for " << bnamep << " but is type MBT_SINGLE" << llendl; - return; - } - - - // if the block is type MBT_MULTIPLE then we need a known number, make sure that we're not exceeding it - if ( (template_data->mType == MBT_MULTIPLE) - &&(mCurrentSDataBlock->mBlockNumber == template_data->mNumber)) - { - llerrs << "LLMessageSystem::nextBlockFast called " - << mCurrentSDataBlock->mBlockNumber << " times for " << bnamep - << " exceeding " << template_data->mNumber - << " specified in type MBT_MULTIPLE." << llendl; - return; - } - - // ok, we can make a new one - // modify the name to avoid name collision by adding number to end - S32 count = block_data->mBlockNumber; - - // incrememt base name's count - block_data->mBlockNumber++; - - if (block_data->mBlockNumber > MAX_BLOCKS) - { - llerrs << "Trying to pack too many blocks into MBT_VARIABLE type (limited to " << MAX_BLOCKS << ")" << llendl; - } - - // create new name - // Nota Bene: if things are working correctly, mCurrentMessageData->mMemberBlocks[blockname]->mBlockNumber == mCurrentDataBlock->mBlockNumber + 1 - - char *nbnamep = bnamep + count; - - mCurrentSDataBlock = new LLMsgBlkData(bnamep, count); - mCurrentSDataBlock->mName = nbnamep; - mCurrentSMessageData->mMemberBlocks[nbnamep] = mCurrentSDataBlock; - - // add placeholders for each of the variables - for (LLMessageBlock::message_variable_map_t::iterator - iter = template_data->mMemberVariables.begin(), - end = template_data->mMemberVariables.end(); - iter != end; iter++) - { - LLMessageVariable& ci = *(iter->second); - mCurrentSDataBlock->addVariable(ci.getName(), ci.getType()); - } - return; + timeout = LL_SEMIRELIABLE_TIMEOUT_FACTOR * LL_AVERAGED_PING_MAX; } + + const S32 retries = 0; + const BOOL ping_based_timeout = FALSE; + return sendReliable(host, retries, ping_based_timeout, timeout, callback, callback_data); } -// add data to variable in current block -void LLMessageSystem::addDataFast(const char *varname, const void *data, EMsgVariableType type, S32 size) +// send the message via a UDP packet +S32 LLMessageSystem::sendReliable( const LLHost &host, + S32 retries, + BOOL ping_based_timeout, + F32 timeout, + void (*callback)(void **,S32), + void ** callback_data) { - char *vnamep = (char *)varname; - - // do we have a current message? - if (!mCurrentSMessageTemplate) - { - llerrs << "newMessage not called prior to addData" << llendl; - return; - } - - // do we have a current block? - if (!mCurrentSDataBlock) + if (ping_based_timeout) { - llerrs << "setBlock not called prior to addData" << llendl; - return; + LLCircuitData *cdp = mCircuitInfo.findCircuit(host); + if (cdp) + { + timeout = llmax(LL_MINIMUM_RELIABLE_TIMEOUT_SECONDS, LL_RELIABLE_TIMEOUT_FACTOR * cdp->getPingDelayAveraged()); + } + else + { + timeout = llmax(LL_MINIMUM_RELIABLE_TIMEOUT_SECONDS, LL_RELIABLE_TIMEOUT_FACTOR * LL_AVERAGED_PING_MAX); + } } - // kewl, add the data if it exists - LLMessageVariable* var_data = mCurrentSMessageTemplate->mMemberBlocks[mCurrentSBlockName]->mMemberVariables[vnamep]; - if (!var_data || !var_data->getName()) - { - llerrs << vnamep << " not a variable in block " << mCurrentSBlockName << " of " << mCurrentSMessageTemplate->mName << llendl; - return; - } + mSendReliable = TRUE; + mReliablePacketParams.set(host, retries, ping_based_timeout, timeout, + callback, callback_data, + const_cast(mMessageBuilder->getMessageName())); + return sendMessage(host); +} - // ok, it seems ok. . . are we the correct size? - if (var_data->getType() == MVT_VARIABLE) - { - // Variable 1 can only store 255 bytes, make sure our data is smaller - if ((var_data->getSize() == 1) && - (size > 255)) - { - llwarns << "Field " << varname << " is a Variable 1 but program " - << "attempted to stuff more than 255 bytes in " - << "(" << size << "). Clamping size and truncating data." << llendl; - size = 255; - char *truncate = (char *)data; - truncate[255] = 0; - } +void LLMessageSystem::forwardMessage(const LLHost &host) +{ + copyMessageRtoS(); + sendMessage(host); +} - // no correct size for MVT_VARIABLE, instead we need to tell how many bytes the size will be encoded as - mCurrentSDataBlock->addData(vnamep, data, size, type, var_data->getSize()); - mCurrentSendTotal += size; - } - else - { - if (size != var_data->getSize()) - { - llerrs << varname << " is type MVT_FIXED but request size " << size << " doesn't match template size " - << var_data->getSize() << llendl; - return; - } - // alright, smash it in - mCurrentSDataBlock->addData(vnamep, data, size, type); - mCurrentSendTotal += size; - } +void LLMessageSystem::forwardReliable(const LLHost &host) +{ + copyMessageRtoS(); + sendReliable(host); } -// add data to variable in current block - fails if variable isn't MVT_FIXED -void LLMessageSystem::addDataFast(const char *varname, const void *data, EMsgVariableType type) +void LLMessageSystem::forwardReliable(const U32 circuit_code) { - char *vnamep = (char *)varname; + copyMessageRtoS(); + sendReliable(findHost(circuit_code)); +} - // do we have a current message? - if (!mCurrentSMessageTemplate) - { - llerrs << "newMessage not called prior to addData" << llendl; - return; - } +S32 LLMessageSystem::flushSemiReliable(const LLHost &host, void (*callback)(void **,S32), void ** callback_data) +{ + F32 timeout; - // do we have a current block? - if (!mCurrentSDataBlock) + LLCircuitData *cdp = mCircuitInfo.findCircuit(host); + if (cdp) { - llerrs << "setBlock not called prior to addData" << llendl; - return; + timeout = llmax(LL_MINIMUM_SEMIRELIABLE_TIMEOUT_SECONDS, + LL_SEMIRELIABLE_TIMEOUT_FACTOR * cdp->getPingDelayAveraged()); } - - // kewl, add the data if it exists - LLMessageVariable* var_data = mCurrentSMessageTemplate->mMemberBlocks[mCurrentSBlockName]->mMemberVariables[vnamep]; - if (!var_data->getName()) + else { - llerrs << vnamep << " not a variable in block " << mCurrentSBlockName << " of " << mCurrentSMessageTemplate->mName << llendl; - return; + timeout = LL_SEMIRELIABLE_TIMEOUT_FACTOR * LL_AVERAGED_PING_MAX; } - // ok, it seems ok. . . are we MVT_VARIABLE? - if (var_data->getType() == MVT_VARIABLE) + S32 send_bytes = 0; + if (mMessageBuilder->getMessageSize()) { - // nope - llerrs << vnamep << " is type MVT_VARIABLE. Call using addData(name, data, size)" << llendl; - return; + mSendReliable = TRUE; + // No need for ping-based retry as not going to retry + mReliablePacketParams.set(host, 0, FALSE, timeout, callback, + callback_data, + const_cast(mMessageBuilder->getMessageName())); + send_bytes = sendMessage(host); + clearMessage(); } else { - mCurrentSDataBlock->addData(vnamep, data, var_data->getSize(), type); - mCurrentSendTotal += var_data->getSize(); + delete callback_data; } + return send_bytes; } -BOOL LLMessageSystem::isSendFull(const char* blockname) +S32 LLMessageSystem::flushReliable(const LLHost &host) { - if(!blockname) + S32 send_bytes = 0; + if (mMessageBuilder->getMessageSize()) { - return (mCurrentSendTotal > MTUBYTES); + send_bytes = sendReliable(host); } - return isSendFullFast(gMessageStringTable.getString(blockname)); + clearMessage(); + return send_bytes; } -BOOL LLMessageSystem::isSendFullFast(const char* blockname) + +// This can be called from signal handlers, +// so should should not use llinfos. +S32 LLMessageSystem::sendMessage(const LLHost &host) { - if(mCurrentSendTotal > MTUBYTES) + if (! mMessageBuilder->isBuilt()) { - return TRUE; + mSendSize = mMessageBuilder->buildMessage(mSendBuffer, + MAX_BUFFER_SIZE); } - if(!blockname) + + if (!(host.isOk())) // if port and ip are zero, don't bother trying to send the message { - return FALSE; - } - char* bnamep = (char*)blockname; - S32 max; - - LLMessageBlock* template_data = mCurrentSMessageTemplate->mMemberBlocks[bnamep]; - - switch(template_data->mType) - { - case MBT_SINGLE: - max = 1; - break; - case MBT_MULTIPLE: - max = template_data->mNumber; - break; - case MBT_VARIABLE: - default: - max = MAX_BLOCKS; - break; - } - if(mCurrentSMessageData->mMemberBlocks[bnamep]->mBlockNumber >= max) - { - return TRUE; - } - return FALSE; -} - - -// blow away the last block of a message, return FALSE if that leaves no blocks or there wasn't a block to remove -BOOL LLMessageSystem::removeLastBlock() -{ - if (mCurrentSBlockName) - { - if ( (mCurrentSMessageData) - &&(mCurrentSMessageTemplate)) - { - if (mCurrentSMessageData->mMemberBlocks[mCurrentSBlockName]->mBlockNumber >= 1) - { - // At least one block for the current block name. - - // Store the current block name for future reference. - char *block_name = mCurrentSBlockName; - - // Decrement the sent total by the size of the - // data in the message block that we're currently building. - - LLMessageBlock* template_data = mCurrentSMessageTemplate->mMemberBlocks[mCurrentSBlockName]; - - for (LLMessageBlock::message_variable_map_t::iterator iter = template_data->mMemberVariables.begin(); - iter != template_data->mMemberVariables.end(); iter++) - { - LLMessageVariable& ci = *(iter->second); - mCurrentSendTotal -= ci.getSize(); - } - - - // Now we want to find the block that we're blowing away. - - // Get the number of blocks. - LLMsgBlkData* block_data = mCurrentSMessageData->mMemberBlocks[block_name]; - S32 num_blocks = block_data->mBlockNumber; - - // Use the same (suspect?) algorithm that's used to generate - // the names in the nextBlock method to find it. - char *block_getting_whacked = block_name + num_blocks - 1; - LLMsgBlkData* whacked_data = mCurrentSMessageData->mMemberBlocks[block_getting_whacked]; - delete whacked_data; - mCurrentSMessageData->mMemberBlocks.erase(block_getting_whacked); - - if (num_blocks <= 1) - { - // we just blew away the last one, so return FALSE - return FALSE; - } - else - { - // Decrement the counter. - block_data->mBlockNumber--; - return TRUE; - } - } - } - } - return FALSE; -} - -// make sure that all the desired data is in place and then copy the data into mSendBuffer -void LLMessageSystem::buildMessage() -{ - // basic algorithm is to loop through the various pieces, building - // size and offset info if we encounter a -1 for mSize at any - // point that variable wasn't given data - - // do we have a current message? - if (!mCurrentSMessageTemplate) - { - llerrs << "newMessage not called prior to buildMessage" << llendl; - return; - } - - // zero out some useful values - - // leave room for circuit counter - mSendSize = LL_PACKET_ID_SIZE; - - // encode message number and adjust total_offset - if (mCurrentSMessageTemplate->mFrequency == MFT_HIGH) - { -// old, endian-dependant way -// memcpy(&mSendBuffer[mSendSize], &mCurrentMessageTemplate->mMessageNumber, sizeof(U8)); - -// new, independant way - mSendBuffer[mSendSize] = (U8)mCurrentSMessageTemplate->mMessageNumber; - mSendSize += sizeof(U8); - } - else if (mCurrentSMessageTemplate->mFrequency == MFT_MEDIUM) - { - U8 temp = 255; - memcpy(&mSendBuffer[mSendSize], &temp, sizeof(U8)); /*Flawfinder: ignore*/ - mSendSize += sizeof(U8); - - // mask off unsightly bits - temp = mCurrentSMessageTemplate->mMessageNumber & 255; - memcpy(&mSendBuffer[mSendSize], &temp, sizeof(U8)); /*Flawfinder: ignore*/ - mSendSize += sizeof(U8); - } - else if (mCurrentSMessageTemplate->mFrequency == MFT_LOW) - { - U8 temp = 255; - U16 message_num; - memcpy(&mSendBuffer[mSendSize], &temp, sizeof(U8)); /*Flawfinder: ignore*/ - mSendSize += sizeof(U8); - memcpy(&mSendBuffer[mSendSize], &temp, sizeof(U8)); /*Flawfinder: ignore*/ - mSendSize += sizeof(U8); - - // mask off unsightly bits - message_num = mCurrentSMessageTemplate->mMessageNumber & 0xFFFF; - - // convert to network byte order - message_num = htons(message_num); - memcpy(&mSendBuffer[mSendSize], &message_num, sizeof(U16)); /*Flawfinder: ignore*/ - mSendSize += sizeof(U16); - } - else - { - llerrs << "unexpected message frequency in buildMessage" << llendl; - return; - } - - // counting variables used to encode multiple block info - S32 block_count = 0; - U8 temp_block_number; - - // loop through msg blocks to loop through variables, totalling up size data and copying into mSendBuffer - for (LLMsgData::msg_blk_data_map_t::iterator - iter = mCurrentSMessageData->mMemberBlocks.begin(), - end = mCurrentSMessageData->mMemberBlocks.end(); - iter != end; iter++) - { - LLMsgBlkData* mbci = iter->second; - // do we need to encode a block code? - if (block_count == 0) - { - block_count = mbci->mBlockNumber; - - LLMessageBlock* template_data = mCurrentSMessageTemplate->mMemberBlocks[mbci->mName]; - - // ok, if this is the first block of a repeating pack, set block_count and, if it's type MBT_VARIABLE encode a byte for how many there are - if (template_data->mType == MBT_VARIABLE) - { - // remember that mBlockNumber is a S32 - temp_block_number = (U8)mbci->mBlockNumber; - if ((S32)(mSendSize + sizeof(U8)) < MAX_BUFFER_SIZE) - { - memcpy(&mSendBuffer[mSendSize], &temp_block_number, sizeof(U8)); /* Flawfinder: ignore */ - mSendSize += sizeof(U8); - } - else - { - // Just reporting error is likely not enough. Need - // to check how to abort or error out gracefully - // from this function. XXXTBD - llerrs << "buildMessage failed. Message excedding" - " sendBuffersize." << llendl; - } - } - else if (template_data->mType == MBT_MULTIPLE) - { - if (block_count != template_data->mNumber) - { - // nope! need to fill it in all the way! - llerrs << "Block " << mbci->mName - << " is type MBT_MULTIPLE but only has data for " - << block_count << " out of its " - << template_data->mNumber << " blocks" << llendl; - } - } - } - - // counting down multiple blocks - block_count--; - - // now loop through the variables - for (LLMsgBlkData::msg_var_data_map_t::iterator iter = mbci->mMemberVarData.begin(); - iter != mbci->mMemberVarData.end(); iter++) - { - LLMsgVarData& mvci = *iter; - if (mvci.getSize() == -1) - { - // oops, this variable wasn't ever set! - llerrs << "The variable " << mvci.getName() << " in block " - << mbci->mName << " of message " - << mCurrentSMessageData->mName - << " wasn't set prior to buildMessage call" << llendl; - } - else - { - S32 data_size = mvci.getDataSize(); - if(data_size > 0) - { - // The type is MVT_VARIABLE, which means that we - // need to encode a size argument. Otherwise, - // there is no need. - S32 size = mvci.getSize(); - U8 sizeb; - U16 sizeh; - switch(data_size) - { - case 1: - sizeb = size; - htonmemcpy(&mSendBuffer[mSendSize], &sizeb, MVT_U8, 1); - break; - case 2: - sizeh = size; - htonmemcpy(&mSendBuffer[mSendSize], &sizeh, MVT_U16, 2); - break; - case 4: - htonmemcpy(&mSendBuffer[mSendSize], &size, MVT_S32, 4); - break; - default: - llerrs << "Attempting to build variable field with unknown size of " << size << llendl; - break; - } - mSendSize += mvci.getDataSize(); - } - - // if there is any data to pack, pack it - if((mvci.getData() != NULL) && mvci.getSize()) - { - if(mSendSize + mvci.getSize() < (S32)sizeof(mSendBuffer)) - { - memcpy( /* Flawfinder: ignore */ - &mSendBuffer[mSendSize], - mvci.getData(), - mvci.getSize()); - mSendSize += mvci.getSize(); - } - else - { - // Just reporting error is likely not - // enough. Need to check how to abort or error - // out gracefully from this function. XXXTBD - llerrs << "LLMessageSystem::buildMessage failed. " - << "Attempted to pack " - << mSendSize + mvci.getSize() - << " bytes into a buffer with size " - << mSendBuffer << "." << llendl - } - } - } - } - } - mbSBuilt = TRUE; -} - -S32 LLMessageSystem::sendReliable(const LLHost &host) -{ - return sendReliable(host, LL_DEFAULT_RELIABLE_RETRIES, TRUE, LL_PING_BASED_TIMEOUT_DUMMY, NULL, NULL); -} - - -S32 LLMessageSystem::sendSemiReliable(const LLHost &host, void (*callback)(void **,S32), void ** callback_data) -{ - F32 timeout; - - LLCircuitData *cdp = mCircuitInfo.findCircuit(host); - if (cdp) - { - timeout = llmax(LL_MINIMUM_SEMIRELIABLE_TIMEOUT_SECONDS, - LL_SEMIRELIABLE_TIMEOUT_FACTOR * cdp->getPingDelayAveraged()); - } - else - { - timeout = LL_SEMIRELIABLE_TIMEOUT_FACTOR * LL_AVERAGED_PING_MAX; - } - - return sendReliable(host, 0, FALSE, timeout, callback, callback_data); -} - -// send the message via a UDP packet -S32 LLMessageSystem::sendReliable( const LLHost &host, - S32 retries, - BOOL ping_based_timeout, - F32 timeout, - void (*callback)(void **,S32), - void ** callback_data) -{ - if (ping_based_timeout) - { - LLCircuitData *cdp = mCircuitInfo.findCircuit(host); - if (cdp) - { - timeout = llmax(LL_MINIMUM_RELIABLE_TIMEOUT_SECONDS, LL_RELIABLE_TIMEOUT_FACTOR * cdp->getPingDelayAveraged()); - } - else - { - timeout = llmax(LL_MINIMUM_RELIABLE_TIMEOUT_SECONDS, LL_RELIABLE_TIMEOUT_FACTOR * LL_AVERAGED_PING_MAX); - } - } - - mSendReliable = TRUE; - mReliablePacketParams.set(host, retries, ping_based_timeout, timeout, - callback, callback_data, mCurrentSMessageName); - return sendMessage(host); -} - -void LLMessageSystem::forwardMessage(const LLHost &host) -{ - copyMessageRtoS(); - sendMessage(host); -} - -void LLMessageSystem::forwardReliable(const LLHost &host) -{ - copyMessageRtoS(); - sendReliable(host); -} - -void LLMessageSystem::forwardReliable(const U32 circuit_code) -{ - copyMessageRtoS(); - sendReliable(findHost(circuit_code)); -} - -S32 LLMessageSystem::flushSemiReliable(const LLHost &host, void (*callback)(void **,S32), void ** callback_data) -{ - F32 timeout; - - LLCircuitData *cdp = mCircuitInfo.findCircuit(host); - if (cdp) - { - timeout = llmax(LL_MINIMUM_SEMIRELIABLE_TIMEOUT_SECONDS, - LL_SEMIRELIABLE_TIMEOUT_FACTOR * cdp->getPingDelayAveraged()); - } - else - { - timeout = LL_SEMIRELIABLE_TIMEOUT_FACTOR * LL_AVERAGED_PING_MAX; - } - - S32 send_bytes = 0; - if (mCurrentSendTotal) - { - mSendReliable = TRUE; - // No need for ping-based retry as not going to retry - mReliablePacketParams.set(host, 0, FALSE, timeout, callback, callback_data, mCurrentSMessageName); - send_bytes = sendMessage(host); - clearMessage(); - } - else - { - delete callback_data; - } - return send_bytes; -} - -S32 LLMessageSystem::flushReliable(const LLHost &host) -{ - S32 send_bytes = 0; - if (mCurrentSendTotal) - { - send_bytes = sendReliable(host); - } - clearMessage(); - return send_bytes; -} - - -// This can be called from signal handlers, -// so should should not use llinfos. -S32 LLMessageSystem::sendMessage(const LLHost &host) -{ - if (!mbSBuilt) - { - buildMessage(); - } - - mCurrentSendTotal = 0; - - if (!(host.isOk())) // if port and ip are zero, don't bother trying to send the message - { - return 0; + return 0; } LLCircuitData *cdp = mCircuitInfo.findCircuit(host); @@ -2992,10 +2027,10 @@ S32 LLMessageSystem::sendMessage(const LLHost &host) if(mVerboseLog) { llinfos << "MSG: -> " << host << "\tUNKNOWN CIRCUIT:\t" - << mCurrentSMessageName << llendl; + << mMessageBuilder->getMessageName() << llendl; } llwarns << "sendMessage - Trying to send " - << mCurrentSMessageName << " on unknown circuit " + << mMessageBuilder->getMessageName() << " on unknown circuit " << host << llendl; return 0; } @@ -3014,15 +2049,41 @@ S32 LLMessageSystem::sendMessage(const LLHost &host) if(mVerboseLog) { llinfos << "MSG: -> " << host << "\tDEAD CIRCUIT\t\t" - << mCurrentSMessageName << llendl; + << mMessageBuilder->getMessageName() << llendl; } llwarns << "sendMessage - Trying to send message " - << mCurrentSMessageName << " to dead circuit " + << mMessageBuilder->getMessageName() << " to dead circuit " << host << llendl; return 0; } } + // NOTE: babbage: LLSD message -> HTTP, template message -> UDP + if(mMessageBuilder == mLLSDMessageBuilder) + { + LLSD message = mLLSDMessageBuilder->getMessage(); + + const LLHTTPSender& sender = LLHTTPSender::getSender(host); + LLHTTPClient::ResponderPtr responder = NULL; + if(mSendReliable) + { + responder = + new LLFnPtrResponder(mReliablePacketParams.mCallback, + mReliablePacketParams.mCallbackData); + } + else + { + llwarns << "LLMessageSystem::sendMessage: Sending unreliable " << mMessageBuilder->getMessageName() << " message via HTTP" << llendl; + responder = new LLFnPtrResponder(NULL, NULL); + } + sender.send(host, mLLSDMessageBuilder->getMessageName(), + message, responder); + + mSendReliable = FALSE; + mReliablePacketParams.clear(); + return 1; + } + memset(mSendBuffer,0,LL_PACKET_ID_SIZE); // zero out the packet ID field // add the send id to the front of the message @@ -3033,20 +2094,17 @@ S32 LLMessageSystem::sendMessage(const LLHost &host) // Compress the message, which will usually reduce its size. U8 * buf_ptr = (U8 *)mSendBuffer; - S32 buffer_length = mSendSize; - if(ME_ZEROCODED == mCurrentSMessageTemplate->getEncoding()) - { - zeroCode(&buf_ptr, &buffer_length); - } + U32 buffer_length = mSendSize; + mMessageBuilder->compressMessage(buf_ptr, buffer_length); if (buffer_length > 1500) { - if((mCurrentSMessageName != _PREHASH_ChildAgentUpdate) - && (mCurrentSMessageName != _PREHASH_SendXferPacket)) + if((mMessageBuilder->getMessageName() != _PREHASH_ChildAgentUpdate) + && (mMessageBuilder->getMessageName() != _PREHASH_SendXferPacket)) { llwarns << "sendMessage - Trying to send " << ((buffer_length > 4000) ? "EXTRA " : "") - << "BIG message " << mCurrentSMessageName << " - " + << "BIG message " << mMessageBuilder->getMessageName() << " - " << buffer_length << llendl; } } @@ -3071,7 +2129,7 @@ S32 LLMessageSystem::sendMessage(const LLHost &host) BOOL is_ack_appended = FALSE; std::vector acks; if((space_left > 0) && (ack_count > 0) && - (mCurrentSMessageName != _PREHASH_PacketAck)) + (mMessageBuilder->getMessageName() != _PREHASH_PacketAck)) { buf_ptr[0] |= LL_ACK_FLAG; S32 append_ack_count = llmin(space_left, ack_count); @@ -3142,7 +2200,7 @@ S32 LLMessageSystem::sendMessage(const LLHost &host) char buffer[MAX_STRING]; /* Flawfinder: ignore */ snprintf(buffer, MAX_STRING, "\t%6d\t%6d\t%6d ", mSendSize, buffer_length, cdp->getPacketOutID()); /* Flawfinder: ignore */ str << buffer - << mCurrentSMessageTemplate->mName + << mMessageBuilder->getMessageName() << (mSendReliable ? " reliable " : ""); if(is_ack_appended) { @@ -3153,117 +2211,48 @@ S32 LLMessageSystem::sendMessage(const LLHost &host) llinfos << str.str() << llendl; } - lldebugst(LLERR_MESSAGE) << "MessageSent at: " << (S32)totalTime() - << ", " << mCurrentSMessageTemplate->mName - << " to " << host - << llendl; - - // ok, clean up temp data - delete mCurrentSMessageData; - mCurrentSMessageData = NULL; + /*lldebugst(LLERR_MESSAGE) << "MessageSent at: " << (S32)totalTime() + << "," << mMessageBuilder->getMessageName() + << " to " << host + << llendl;*/ mPacketsOut++; mBytesOut += buffer_length; + mSendReliable = FALSE; + mReliablePacketParams.clear(); return buffer_length; } - -// Returns template for the message contained in buffer -BOOL LLMessageSystem::decodeTemplate( - const U8* buffer, S32 buffer_size, // inputs - LLMessageTemplate** msg_template ) // outputs +void LLMessageSystem::logMsgFromInvalidCircuit( const LLHost& host, BOOL recv_reliable ) { - const U8* header = buffer + LL_PACKET_ID_SIZE; - - // is there a message ready to go? - if (buffer_size <= 0) + if(mVerboseLog) { - llwarns << "No message waiting for decode!" << llendl; - return(FALSE); + std::ostringstream str; + str << "MSG: <- " << host; + char buffer[MAX_STRING]; /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "\t%6d\t%6d\t%6d ", mMessageReader->getMessageSize(), (mIncomingCompressedSize ? mIncomingCompressedSize: mMessageReader->getMessageSize()), mCurrentRecvPacketID); /* Flawfinder: ignore */ + str << buffer + << mMessageReader->getMessageName() + << (recv_reliable ? " reliable" : "") + << " REJECTED"; + llinfos << str.str() << llendl; } + // nope! + // cout << "Rejecting unexpected message " << mCurrentMessageTemplate->mName << " from " << hex << ip << " , " << dec << port << endl; - U32 num = 0; - - if (header[0] != 255) + // Keep track of rejected messages as well + if (mNumMessageCounts >= MAX_MESSAGE_COUNT_NUM) { - // high frequency message - num = header[0]; + llwarns << "Got more than " << MAX_MESSAGE_COUNT_NUM << " packets without clearing counts" << llendl; } - else if ((buffer_size >= ((S32) LL_MINIMUM_VALID_PACKET_SIZE + 1)) && (header[1] != 255)) + else { - // medium frequency message - num = (255 << 8) | header[1]; - } - else if ((buffer_size >= ((S32) LL_MINIMUM_VALID_PACKET_SIZE + 3)) && (header[1] == 255)) - { - // low frequency message - U16 message_id_U16 = 0; - // I think this check busts the message system. - // it appears that if there is a NULL in the message #, it won't copy it.... - // what was the goal? - //if(header[2]) - memcpy(&message_id_U16, &header[2], 2); /* Flawfinder: ignore */ - - // dependant on endian-ness: - // U32 temp = (255 << 24) | (255 << 16) | header[2]; - - // independant of endian-ness: - message_id_U16 = ntohs(message_id_U16); - num = 0xFFFF0000 | message_id_U16; - } - else // bogus packet received (too short) - { - llwarns << "Packet with unusable length received (too short): " - << buffer_size << llendl; - return(FALSE); - } - - LLMessageTemplate* temp = get_ptr_in_map(mMessageNumbers,num); - if (temp) - { - *msg_template = temp; - } - else - { - llwarns << "Message #" << std::hex << num << std::dec - << " received but not registered!" << llendl; - callExceptionFunc(MX_UNREGISTERED_MESSAGE); - return(FALSE); - } - - return(TRUE); -} - - -void LLMessageSystem::logMsgFromInvalidCircuit( const LLHost& host, BOOL recv_reliable ) -{ - if(mVerboseLog) - { - std::ostringstream str; - str << "MSG: <- " << host; - char buffer[MAX_STRING]; /* Flawfinder: ignore */ - snprintf(buffer, MAX_STRING, "\t%6d\t%6d\t%6d ", mReceiveSize, (mIncomingCompressedSize ? mIncomingCompressedSize: mReceiveSize), mCurrentRecvPacketID); /* Flawfinder: ignore */ - str << buffer - << mCurrentRMessageTemplate->mName - << (recv_reliable ? " reliable" : "") - << " REJECTED"; - llinfos << str.str() << llendl; - } - // nope! - // cout << "Rejecting unexpected message " << mCurrentMessageTemplate->mName << " from " << hex << ip << " , " << dec << port << endl; - - // Keep track of rejected messages as well - if (mNumMessageCounts >= MAX_MESSAGE_COUNT_NUM) - { - llwarns << "Got more than " << MAX_MESSAGE_COUNT_NUM << " packets without clearing counts" << llendl; - } - else - { - mMessageCountList[mNumMessageCounts].mMessageNum = mCurrentRMessageTemplate->mMessageNumber; - mMessageCountList[mNumMessageCounts].mMessageBytes = mReceiveSize; - mMessageCountList[mNumMessageCounts].mInvalid = TRUE; - mNumMessageCounts++; + // TODO: babbage: work out if we need these + // mMessageCountList[mNumMessageCounts].mMessageNum = mCurrentRMessageTemplate->mMessageNumber; + mMessageCountList[mNumMessageCounts].mMessageBytes = mMessageReader->getMessageSize(); + mMessageCountList[mNumMessageCounts].mInvalid = TRUE; + mNumMessageCounts++; } } @@ -3271,11 +2260,11 @@ void LLMessageSystem::logTrustedMsgFromUntrustedCircuit( const LLHost& host ) { // RequestTrustedCircuit is how we establish trust, so don't spam // if it's received on a trusted circuit. JC - if (strcmp(mCurrentRMessageTemplate->mName, "RequestTrustedCircuit")) + if (strcmp(mMessageReader->getMessageName(), "RequestTrustedCircuit")) { llwarns << "Received trusted message on untrusted circuit. " << "Will reply with deny. " - << "Message: " << mCurrentRMessageTemplate->mName + << "Message: " << mMessageReader->getMessageName() << " Host: " << host << llendl; } @@ -3287,10 +2276,11 @@ void LLMessageSystem::logTrustedMsgFromUntrustedCircuit( const LLHost& host ) } else { - mMessageCountList[mNumMessageCounts].mMessageNum - = mCurrentRMessageTemplate->mMessageNumber; + // TODO: babbage: work out if we need these + //mMessageCountList[mNumMessageCounts].mMessageNum + // = mCurrentRMessageTemplate->mMessageNumber; mMessageCountList[mNumMessageCounts].mMessageBytes - = mReceiveSize; + = mMessageReader->getMessageSize(); mMessageCountList[mNumMessageCounts].mInvalid = TRUE; mNumMessageCounts++; } @@ -3304,8 +2294,9 @@ void LLMessageSystem::logValidMsg(LLCircuitData *cdp, const LLHost& host, BOOL r } else { - mMessageCountList[mNumMessageCounts].mMessageNum = mCurrentRMessageTemplate->mMessageNumber; - mMessageCountList[mNumMessageCounts].mMessageBytes = mReceiveSize; + // TODO: babbage: work out if we need these + //mMessageCountList[mNumMessageCounts].mMessageNum = mCurrentRMessageTemplate->mMessageNumber; + mMessageCountList[mNumMessageCounts].mMessageBytes = mMessageReader->getMessageSize(); mMessageCountList[mNumMessageCounts].mInvalid = FALSE; mNumMessageCounts++; } @@ -3322,9 +2313,9 @@ void LLMessageSystem::logValidMsg(LLCircuitData *cdp, const LLHost& host, BOOL r std::ostringstream str; str << "MSG: <- " << host; char buffer[MAX_STRING]; /* Flawfinder: ignore */ - snprintf(buffer, MAX_STRING, "\t%6d\t%6d\t%6d ", mReceiveSize, (mIncomingCompressedSize ? mIncomingCompressedSize : mReceiveSize), mCurrentRecvPacketID); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "\t%6d\t%6d\t%6d ", mMessageReader->getMessageSize(), (mIncomingCompressedSize ? mIncomingCompressedSize : mMessageReader->getMessageSize()), mCurrentRecvPacketID); /* Flawfinder: ignore */ str << buffer - << mCurrentRMessageTemplate->mName + << mMessageReader->getMessageName() << (recv_reliable ? " reliable" : "") << (recv_resent ? " resent" : "") << (recv_acks ? " acks" : ""); @@ -3332,627 +2323,211 @@ void LLMessageSystem::logValidMsg(LLCircuitData *cdp, const LLHost& host, BOOL r } } - -void LLMessageSystem::logRanOffEndOfPacket( const LLHost& host ) +void LLMessageSystem::sanityCheck() { - // we've run off the end of the packet! - llwarns << "Ran off end of packet " << mCurrentRMessageTemplate->mName - << " with id " << mCurrentRecvPacketID << " from " << host - << llendl; - if(mVerboseLog) - { - llinfos << "MSG: -> " << host << "\tREAD PAST END:\t" - << mCurrentRecvPacketID << " " - << mCurrentSMessageTemplate->mName << llendl; - } - callExceptionFunc(MX_RAN_OFF_END_OF_PACKET); -} +// TODO: babbage: reinstate +// if (!mCurrentRMessageData) +// { +// llerrs << "mCurrentRMessageData is NULL" << llendl; +// } -// decode a given message -BOOL LLMessageSystem::decodeData(const U8* buffer, const LLHost& sender ) -{ - llassert( mReceiveSize >= 0 ); - llassert( mCurrentRMessageTemplate); - llassert( !mCurrentRMessageData ); - delete mCurrentRMessageData; // just to make sure +// if (!mCurrentRMessageTemplate) +// { +// llerrs << "mCurrentRMessageTemplate is NULL" << llendl; +// } - S32 decode_pos = LL_PACKET_ID_SIZE + (S32)(mCurrentRMessageTemplate->mFrequency); +// if (!mCurrentRTemplateBlock) +// { +// llerrs << "mCurrentRTemplateBlock is NULL" << llendl; +// } - // create base working data set - mCurrentRMessageData = new LLMsgData(mCurrentRMessageTemplate->mName); - - // loop through the template building the data structure as we go - for (LLMessageTemplate::message_block_map_t::iterator iter = mCurrentRMessageTemplate->mMemberBlocks.begin(); - iter != mCurrentRMessageTemplate->mMemberBlocks.end(); iter++) - { - LLMessageBlock* mbci = iter->second; - U8 repeat_number; - S32 i; +// if (!mCurrentRDataBlock) +// { +// llerrs << "mCurrentRDataBlock is NULL" << llendl; +// } - // how many of this block? +// if (!mCurrentSMessageData) +// { +// llerrs << "mCurrentSMessageData is NULL" << llendl; +// } - if (mbci->mType == MBT_SINGLE) - { - // just one - repeat_number = 1; - } - else if (mbci->mType == MBT_MULTIPLE) - { - // a known number - repeat_number = mbci->mNumber; - } - else if (mbci->mType == MBT_VARIABLE) - { - // need to read the number from the message - // repeat number is a single byte - if (decode_pos >= mReceiveSize) - { - logRanOffEndOfPacket( sender ); - return FALSE; - } - repeat_number = buffer[decode_pos]; - decode_pos++; - } - else - { - llerrs << "Unknown block type" << llendl; - return FALSE; - } +// if (!mCurrentSMessageTemplate) +// { +// llerrs << "mCurrentSMessageTemplate is NULL" << llendl; +// } - LLMsgBlkData* cur_data_block = NULL; +// if (!mCurrentSTemplateBlock) +// { +// llerrs << "mCurrentSTemplateBlock is NULL" << llendl; +// } - // now loop through the block - for (i = 0; i < repeat_number; i++) - { - if (i) - { - // build new name to prevent collisions - // TODO: This should really change to a vector - cur_data_block = new LLMsgBlkData(mbci->mName, repeat_number); - cur_data_block->mName = mbci->mName + i; - } - else - { - cur_data_block = new LLMsgBlkData(mbci->mName, repeat_number); - } +// if (!mCurrentSDataBlock) +// { +// llerrs << "mCurrentSDataBlock is NULL" << llendl; +// } +} - // add the block to the message - mCurrentRMessageData->addBlock(cur_data_block); +void LLMessageSystem::showCircuitInfo() +{ + llinfos << mCircuitInfo << llendl; +} - // now read the variables - for (LLMessageBlock::message_variable_map_t::iterator iter = mbci->mMemberVariables.begin(); - iter != mbci->mMemberVariables.end(); iter++) - { - LLMessageVariable& mvci = *(iter->second); - // ok, build out the variables - // add variable block - cur_data_block->addVariable(mvci.getName(), mvci.getType()); - // what type of variable? - if (mvci.getType() == MVT_VARIABLE) - { - // variable, get the number of bytes to read from the template - S32 data_size = mvci.getSize(); - U8 tsizeb = 0; - U16 tsizeh = 0; - U32 tsize = 0; +void LLMessageSystem::dumpCircuitInfo() +{ + lldebugst(LLERR_CIRCUIT_INFO) << mCircuitInfo << llendl; +} - if ((decode_pos + data_size) > mReceiveSize) - { - logRanOffEndOfPacket( sender ); - return FALSE; - } - switch(data_size) - { - case 1: - htonmemcpy(&tsizeb, &buffer[decode_pos], MVT_U8, 1); - tsize = tsizeb; - break; - case 2: - htonmemcpy(&tsizeh, &buffer[decode_pos], MVT_U16, 2); - tsize = tsizeh; - break; - case 4: - htonmemcpy(&tsizeb, &buffer[decode_pos], MVT_U32, 4); - break; - default: - llerrs << "Attempting to read variable field with unknown size of " << data_size << llendl; - break; - - } - decode_pos += data_size; +/* virtual */ +U32 LLMessageSystem::getOurCircuitCode() +{ + return mOurCircuitCode; +} - if ((decode_pos + (S32)tsize) > mReceiveSize) - { - logRanOffEndOfPacket( sender ); - return FALSE; - } - cur_data_block->addData(mvci.getName(), &buffer[decode_pos], tsize, mvci.getType()); - decode_pos += tsize; - } - else - { - // fixed! - // so, copy data pointer and set data size to fixed size +LLString LLMessageSystem::getCircuitInfoString() +{ + LLString info_string; - if ((decode_pos + mvci.getSize()) > mReceiveSize) - { - logRanOffEndOfPacket( sender ); - return FALSE; - } + info_string += mCircuitInfo.getInfoString(); + return info_string; +} - cur_data_block->addData(mvci.getName(), &buffer[decode_pos], mvci.getSize(), mvci.getType()); - decode_pos += mvci.getSize(); - } - } - } +// returns whether the given host is on a trusted circuit +BOOL LLMessageSystem::getCircuitTrust(const LLHost &host) +{ + LLCircuitData *cdp = mCircuitInfo.findCircuit(host); + if (cdp) + { + return cdp->getTrusted(); } - if (mCurrentRMessageData->mMemberBlocks.empty() - && !mCurrentRMessageTemplate->mMemberBlocks.empty()) + return FALSE; +} + +// Activate a circuit, and set its trust level (TRUE if trusted, +// FALSE if not). +void LLMessageSystem::enableCircuit(const LLHost &host, BOOL trusted) +{ + LLCircuitData *cdp = mCircuitInfo.findCircuit(host); + if (!cdp) { - lldebugs << "Empty message '" << mCurrentRMessageTemplate->mName << "' (no blocks)" << llendl; - return FALSE; + cdp = mCircuitInfo.addCircuitData(host, 0); } - + else { - static LLTimer decode_timer; + cdp->setAlive(TRUE); + } + cdp->setTrusted(trusted); +} - if( mTimeDecodes ) - { - decode_timer.reset(); - } +void LLMessageSystem::disableCircuit(const LLHost &host) +{ + llinfos << "LLMessageSystem::disableCircuit for " << host << llendl; + U32 code = gMessageSystem->findCircuitCode( host ); - // if( mCurrentRMessageTemplate->mName == _PREHASH_AgentToNewRegion ) - // { - // VTResume(); // VTune - // } + // Don't need to do this, as we're removing the circuit info anyway - djs 01/28/03 + // don't clean up 0 circuit code entries + // because many hosts (neighbor sims, etc) can have the 0 circuit + if (code) + { + //if (mCircuitCodes.checkKey(code)) + code_session_map_t::iterator it = mCircuitCodes.find(code); + if(it != mCircuitCodes.end()) { - LLFastTimer t(LLFastTimer::FTM_PROCESS_MESSAGES); - if( !mCurrentRMessageTemplate->callHandlerFunc(this) ) - { - llwarns << "Message from " << sender << " with no handler function received: " << mCurrentRMessageTemplate->mName << llendl; - } + llinfos << "Circuit " << code << " removed from list" << llendl; + //mCircuitCodes.removeData(code); + mCircuitCodes.erase(it); } - // if( mCurrentRMessageTemplate->mName == _PREHASH_AgentToNewRegion ) - // { - // VTPause(); // VTune - // } - - if( mTimeDecodes ) + U64 ip_port = 0; + std::map::iterator iter = gMessageSystem->mCircuitCodeToIPPort.find(code); + if (iter != gMessageSystem->mCircuitCodeToIPPort.end()) { - F32 decode_time = decode_timer.getElapsedTimeF32(); - mCurrentRMessageTemplate->mDecodeTimeThisFrame += decode_time; - - mCurrentRMessageTemplate->mTotalDecoded++; - mCurrentRMessageTemplate->mTotalDecodeTime += decode_time; + ip_port = iter->second; - if( mCurrentRMessageTemplate->mMaxDecodeTimePerMsg < decode_time ) - { - mCurrentRMessageTemplate->mMaxDecodeTimePerMsg = decode_time; - } + gMessageSystem->mCircuitCodeToIPPort.erase(iter); + U32 old_port = (U32)(ip_port & (U64)0xFFFFFFFF); + U32 old_ip = (U32)(ip_port >> 32); - if( decode_time > mTimeDecodesSpamThreshold ) - { - lldebugs << "--------- Message " << mCurrentRMessageTemplate->mName << " decode took " << decode_time << " seconds. (" << - mCurrentRMessageTemplate->mMaxDecodeTimePerMsg << " max, " << - (mCurrentRMessageTemplate->mTotalDecodeTime / mCurrentRMessageTemplate->mTotalDecoded) << " avg)" << llendl; - } + llinfos << "Host " << LLHost(old_ip, old_port) << " circuit " << code << " removed from lookup table" << llendl; + gMessageSystem->mIPPortToCircuitCode.erase(ip_port); } } - return TRUE; + else + { + // Sigh, since we can open circuits which don't have circuit + // codes, it's possible for this to happen... + + //llwarns << "Couldn't find circuit code for " << host << llendl; + } + + mCircuitInfo.removeCircuitData(host); } -void LLMessageSystem::getDataFast(const char *blockname, const char *varname, void *datap, S32 size, S32 blocknum, S32 max_size) + +void LLMessageSystem::setCircuitAllowTimeout(const LLHost &host, BOOL allow) { - // is there a message ready to go? - if (mReceiveSize == -1) + LLCircuitData *cdp = mCircuitInfo.findCircuit(host); + if (cdp) { - llerrs << "No message waiting for decode 2!" << llendl; - return; + cdp->setAllowTimeout(allow); } +} - if (!mCurrentRMessageData) +void LLMessageSystem::setCircuitTimeoutCallback(const LLHost &host, void (*callback_func)(const LLHost & host, void *user_data), void *user_data) +{ + LLCircuitData *cdp = mCircuitInfo.findCircuit(host); + if (cdp) { - llerrs << "Invalid mCurrentMessageData in getData!" << llendl; - return; + cdp->setTimeoutCallback(callback_func, user_data); } +} - char *bnamep = (char *)blockname + blocknum; // this works because it's just a hash. The bnamep is never derefference - char *vnamep = (char *)varname; - - LLMsgData::msg_blk_data_map_t::iterator iter = mCurrentRMessageData->mMemberBlocks.find(bnamep); - - if (iter == mCurrentRMessageData->mMemberBlocks.end()) - { - llerrs << "Block " << blockname << " #" << blocknum - << " not in message " << mCurrentRMessageData->mName << llendl; - return; - } - LLMsgBlkData *msg_block_data = iter->second; - LLMsgVarData& vardata = msg_block_data->mMemberVarData[vnamep]; +BOOL LLMessageSystem::checkCircuitBlocked(const U32 circuit) +{ + LLHost host = findHost(circuit); - if (!vardata.getName()) + if (!host.isOk()) { - llerrs << "Variable "<< vnamep << " not in message " - << mCurrentRMessageData->mName<< " block " << bnamep << llendl; - return; + //llinfos << "checkCircuitBlocked: Unknown circuit " << circuit << llendl; + return TRUE; } - if (size && size != vardata.getSize()) + LLCircuitData *cdp = mCircuitInfo.findCircuit(host); + if (cdp) { - llerrs << "Msg " << mCurrentRMessageData->mName - << " variable " << vnamep - << " is size " << vardata.getSize() - << " but copying into buffer of size " << size - << llendl; - return; - } - - - const S32 vardata_size = vardata.getSize(); - if( max_size >= vardata_size ) - { - switch( vardata_size ) - { - case 1: - *((U8*)datap) = *((U8*)vardata.getData()); - break; - case 2: - *((U16*)datap) = *((U16*)vardata.getData()); - break; - case 4: - *((U32*)datap) = *((U32*)vardata.getData()); - break; - case 8: - ((U32*)datap)[0] = ((U32*)vardata.getData())[0]; - ((U32*)datap)[1] = ((U32*)vardata.getData())[1]; - break; - default: - memcpy(datap, vardata.getData(), vardata_size); /* Flawfinder: ignore */ - break; - } + return cdp->isBlocked(); } else { - llwarns << "Msg " << mCurrentRMessageData->mName - << " variable " << vnamep - << " is size " << vardata.getSize() - << " but truncated to max size of " << max_size - << llendl; - - memcpy(datap, vardata.getData(), max_size); /* Flawfinder: ignore */ + llinfos << "checkCircuitBlocked(circuit): Unknown host - " << host << llendl; + return FALSE; } } -S32 LLMessageSystem::getNumberOfBlocksFast(const char *blockname) +BOOL LLMessageSystem::checkCircuitAlive(const U32 circuit) { - // is there a message ready to go? - if (mReceiveSize == -1) + LLHost host = findHost(circuit); + + if (!host.isOk()) { - llerrs << "No message waiting for decode 3!" << llendl; - return -1; + //llinfos << "checkCircuitAlive: Unknown circuit " << circuit << llendl; + return FALSE; } - if (!mCurrentRMessageData) + LLCircuitData *cdp = mCircuitInfo.findCircuit(host); + if (cdp) { - llerrs << "Invalid mCurrentRMessageData in getData!" << llendl; - return -1; + return cdp->isAlive(); } - - char *bnamep = (char *)blockname; - - LLMsgData::msg_blk_data_map_t::iterator iter = mCurrentRMessageData->mMemberBlocks.find(bnamep); - - if (iter == mCurrentRMessageData->mMemberBlocks.end()) + else { -// sprintf(errmsg, "Block %s not in message %s", bnamep, mCurrentRMessageData->mName); -// llerrs << errmsg << llendl; -// return -1; - return 0; - } - - return (iter->second)->mBlockNumber; -} - -S32 LLMessageSystem::getSizeFast(const char *blockname, const char *varname) -{ - // is there a message ready to go? - if (mReceiveSize == -1) - { - llerrs << "No message waiting for decode 4!" << llendl; - return -1; - } - - if (!mCurrentRMessageData) - { - llerrs << "Invalid mCurrentRMessageData in getData!" << llendl; - return -1; - } - - char *bnamep = (char *)blockname; - - LLMsgData::msg_blk_data_map_t::iterator iter = mCurrentRMessageData->mMemberBlocks.find(bnamep); - - if (iter == mCurrentRMessageData->mMemberBlocks.end()) - { - llerrs << "Block " << bnamep << " not in message " - << mCurrentRMessageData->mName << llendl; - return -1; - } - - char *vnamep = (char *)varname; - - LLMsgBlkData* msg_data = iter->second; - LLMsgVarData& vardata = msg_data->mMemberVarData[vnamep]; - - if (!vardata.getName()) - { - llerrs << "Variable " << varname << " not in message " - << mCurrentRMessageData->mName << " block " << bnamep << llendl; - return -1; - } - - if (mCurrentRMessageTemplate->mMemberBlocks[bnamep]->mType != MBT_SINGLE) - { - llerrs << "Block " << bnamep << " isn't type MBT_SINGLE," - " use getSize with blocknum argument!" << llendl; - return -1; - } - - return vardata.getSize(); -} - - -S32 LLMessageSystem::getSizeFast(const char *blockname, S32 blocknum, const char *varname) -{ - // is there a message ready to go? - if (mReceiveSize == -1) - { - llerrs << "No message waiting for decode 5!" << llendl; - return -1; - } - - if (!mCurrentRMessageData) - { - llerrs << "Invalid mCurrentRMessageData in getData!" << llendl; - return -1; - } - - char *bnamep = (char *)blockname + blocknum; - char *vnamep = (char *)varname; - - LLMsgData::msg_blk_data_map_t::iterator iter = mCurrentRMessageData->mMemberBlocks.find(bnamep); - - if (iter == mCurrentRMessageData->mMemberBlocks.end()) - { - llerrs << "Block " << bnamep << " not in message " - << mCurrentRMessageData->mName << llendl; - return -1; - } - - LLMsgBlkData* msg_data = iter->second; - LLMsgVarData& vardata = msg_data->mMemberVarData[vnamep]; - - if (!vardata.getName()) - { - llerrs << "Variable " << vnamep << " not in message " - << mCurrentRMessageData->mName << " block " << bnamep << llendl; - return -1; - } - - return vardata.getSize(); -} - - -void LLMessageSystem::sanityCheck() -{ - if (!mCurrentRMessageData) - { - llerrs << "mCurrentRMessageData is NULL" << llendl; - } - - if (!mCurrentRMessageTemplate) - { - llerrs << "mCurrentRMessageTemplate is NULL" << llendl; - } - -// if (!mCurrentRTemplateBlock) -// { -// llerrs << "mCurrentRTemplateBlock is NULL" << llendl; -// } - -// if (!mCurrentRDataBlock) -// { -// llerrs << "mCurrentRDataBlock is NULL" << llendl; -// } - - if (!mCurrentSMessageData) - { - llerrs << "mCurrentSMessageData is NULL" << llendl; - } - - if (!mCurrentSMessageTemplate) - { - llerrs << "mCurrentSMessageTemplate is NULL" << llendl; - } - -// if (!mCurrentSTemplateBlock) -// { -// llerrs << "mCurrentSTemplateBlock is NULL" << llendl; -// } - - if (!mCurrentSDataBlock) - { - llerrs << "mCurrentSDataBlock is NULL" << llendl; - } -} - -void LLMessageSystem::showCircuitInfo() -{ - llinfos << mCircuitInfo << llendl; -} - - -void LLMessageSystem::dumpCircuitInfo() -{ - lldebugst(LLERR_CIRCUIT_INFO) << mCircuitInfo << llendl; -} - -/* virtual */ -U32 LLMessageSystem::getOurCircuitCode() -{ - return mOurCircuitCode; -} - -LLString LLMessageSystem::getCircuitInfoString() -{ - LLString info_string; - - info_string += mCircuitInfo.getInfoString(); - return info_string; -} - -// returns whether the given host is on a trusted circuit -BOOL LLMessageSystem::getCircuitTrust(const LLHost &host) -{ - LLCircuitData *cdp = mCircuitInfo.findCircuit(host); - if (cdp) - { - return cdp->getTrusted(); - } - - return FALSE; -} - -// Activate a circuit, and set its trust level (TRUE if trusted, -// FALSE if not). -void LLMessageSystem::enableCircuit(const LLHost &host, BOOL trusted) -{ - LLCircuitData *cdp = mCircuitInfo.findCircuit(host); - if (!cdp) - { - cdp = mCircuitInfo.addCircuitData(host, 0); - } - else - { - cdp->setAlive(TRUE); - } - cdp->setTrusted(trusted); -} - -void LLMessageSystem::disableCircuit(const LLHost &host) -{ - llinfos << "LLMessageSystem::disableCircuit for " << host << llendl; - U32 code = gMessageSystem->findCircuitCode( host ); - - // Don't need to do this, as we're removing the circuit info anyway - djs 01/28/03 - - // don't clean up 0 circuit code entries - // because many hosts (neighbor sims, etc) can have the 0 circuit - if (code) - { - //if (mCircuitCodes.checkKey(code)) - code_session_map_t::iterator it = mCircuitCodes.find(code); - if(it != mCircuitCodes.end()) - { - llinfos << "Circuit " << code << " removed from list" << llendl; - //mCircuitCodes.removeData(code); - mCircuitCodes.erase(it); - } - - U64 ip_port = 0; - std::map::iterator iter = gMessageSystem->mCircuitCodeToIPPort.find(code); - if (iter != gMessageSystem->mCircuitCodeToIPPort.end()) - { - ip_port = iter->second; - - gMessageSystem->mCircuitCodeToIPPort.erase(iter); - - U32 old_port = (U32)(ip_port & (U64)0xFFFFFFFF); - U32 old_ip = (U32)(ip_port >> 32); - - llinfos << "Host " << LLHost(old_ip, old_port) << " circuit " << code << " removed from lookup table" << llendl; - gMessageSystem->mIPPortToCircuitCode.erase(ip_port); - } - } - else - { - // Sigh, since we can open circuits which don't have circuit - // codes, it's possible for this to happen... - - //llwarns << "Couldn't find circuit code for " << host << llendl; - } - - mCircuitInfo.removeCircuitData(host); -} - - -void LLMessageSystem::setCircuitAllowTimeout(const LLHost &host, BOOL allow) -{ - LLCircuitData *cdp = mCircuitInfo.findCircuit(host); - if (cdp) - { - cdp->setAllowTimeout(allow); - } -} - -void LLMessageSystem::setCircuitTimeoutCallback(const LLHost &host, void (*callback_func)(const LLHost & host, void *user_data), void *user_data) -{ - LLCircuitData *cdp = mCircuitInfo.findCircuit(host); - if (cdp) - { - cdp->setTimeoutCallback(callback_func, user_data); - } -} - - -BOOL LLMessageSystem::checkCircuitBlocked(const U32 circuit) -{ - LLHost host = findHost(circuit); - - if (!host.isOk()) - { - //llinfos << "checkCircuitBlocked: Unknown circuit " << circuit << llendl; - return TRUE; - } - - LLCircuitData *cdp = mCircuitInfo.findCircuit(host); - if (cdp) - { - return cdp->isBlocked(); - } - else - { - llinfos << "checkCircuitBlocked(circuit): Unknown host - " << host << llendl; - return FALSE; - } -} - -BOOL LLMessageSystem::checkCircuitAlive(const U32 circuit) -{ - LLHost host = findHost(circuit); - - if (!host.isOk()) - { - //llinfos << "checkCircuitAlive: Unknown circuit " << circuit << llendl; - return FALSE; - } - - LLCircuitData *cdp = mCircuitInfo.findCircuit(host); - if (cdp) - { - return cdp->isAlive(); - } - else - { - llinfos << "checkCircuitAlive(circuit): Unknown host - " << host << llendl; - return FALSE; + llinfos << "checkCircuitAlive(circuit): Unknown host - " << host << llendl; + return FALSE; } } @@ -4176,7 +2751,8 @@ bool LLMessageSystem::addCircuitCode(U32 code, const LLUUID& session_id) //} // static -void LLMessageSystem::processUseCircuitCode(LLMessageSystem* msg, void**) +void LLMessageSystem::processUseCircuitCode(LLMessageSystem* msg, + void** user) { U32 circuit_code_in; msg->getU32Fast(_PREHASH_CircuitCode, _PREHASH_Code, circuit_code_in); @@ -4296,6 +2872,13 @@ void LLMessageSystem::processUseCircuitCode(LLMessageSystem* msg, void**) llinfos << "Circuit code " << circuit_code_in << " from " << msg->getSender() << " for agent " << id << " in session " << session_id << llendl; + + const LLUseCircuitCodeResponder* responder = + (const LLUseCircuitCodeResponder*) user; + if(responder) + { + responder->complete(msg->getSender(), id); + } } else { @@ -4303,10 +2886,53 @@ void LLMessageSystem::processUseCircuitCode(LLMessageSystem* msg, void**) } } +static LLHTTPNode& messageRootNode() +{ + static LLHTTPNode root_node; + static bool initialized = false; + if (!initialized) { + initialized = true; + LLHTTPRegistrar::buildAllServices(root_node); + } + return root_node; +} -static void check_for_unrecognized_messages( - const char* type, +//static +void LLMessageSystem::dispatch(const std::string& msg_name, + const LLSD& message) +{ + LLPointer responsep = LLSimpleResponse::create(); + dispatch(msg_name, message, responsep); +} + +//static +void LLMessageSystem::dispatch(const std::string& msg_name, + const LLSD& message, + LLHTTPNode::ResponsePtr responsep) +{ + if (msg_name.empty()) + { + llwarns << "LLMessageService::dispatch called with no message name" + << llendl; + return; + } + + std::string path = "/message/" + msg_name; + LLSD context; + const LLHTTPNode* handler = messageRootNode().traverse(path, context); + if (!handler) + { + llwarns << "LLMessageService::dispatch > no handler for " + << path << llendl; + return; + } + + handler->post(responsep, context, message); +} + +static void check_for_unrecognized_messages( + const char* type, const LLSD& map, LLMessageSystem::message_template_name_map_t& templates) { @@ -4535,76 +3161,6 @@ void process_deny_trusted_circuit(LLMessageSystem *msg, void **) msg->sendCreateTrustedCircuit(msg->getSender(), local_id, remote_id); } -#define LL_ENCRYPT_BUF_LENGTH 16384 - -void encrypt_template(const char *src_name, const char *dest_name) -{ - // encrypt and decrypt are symmetric - decrypt_template(src_name, dest_name); -} - -BOOL decrypt_template(const char *src_name, const char *dest_name) -{ - S32 buf_length = LL_ENCRYPT_BUF_LENGTH; - char buf[LL_ENCRYPT_BUF_LENGTH]; /* Flawfinder: ignore */ - - FILE* infp = NULL; - FILE* outfp = NULL; - BOOL success = FALSE; - char* bufp = NULL; - U32 key = 0; - S32 more_data = 0; - - if(src_name==NULL) - { - llwarns << "Input src_name is NULL!!" << llendl; - goto exit; - } - - infp = LLFile::fopen(src_name,"rb"); /* Flawfinder: ignore */ - if (!infp) - { - llwarns << "could not open " << src_name << " for reading" << llendl; - goto exit; - } - - if(dest_name==NULL) - { - llwarns << "Output dest_name is NULL!!" << llendl; - goto exit; - } - - outfp = LLFile::fopen(dest_name,"w+b"); /* Flawfinder: ignore */ - if (!outfp) - { - llwarns << "could not open " << src_name << " for writing" << llendl; - goto exit; - } - - while ((buf_length = (S32)fread(buf,1,LL_ENCRYPT_BUF_LENGTH,infp))) - { - // unscrozzle bits here - bufp = buf; - more_data = buf_length; - while (more_data--) - { - *bufp = *bufp ^ ((key * 43) % 256); - key++; - bufp++; - } - - if(buf_length != (S32)fwrite(buf,1,buf_length,outfp)) - { - goto exit; - } - } - success = TRUE; - - exit: - if(infp) fclose(infp); - if(outfp) fclose(outfp); - return success; -} void dump_prehash_files() { @@ -4688,7 +3244,8 @@ BOOL start_messaging_system( S32 version_minor, S32 version_patch, BOOL b_dump_prehash_file, - const std::string& secret) + const std::string& secret, + const LLUseCircuitCodeResponder* responder) { gMessageSystem = new LLMessageSystem( template_name.c_str(), @@ -4737,7 +3294,7 @@ BOOL start_messaging_system( //gMessageSystem->setHandlerFuncFast(_PREHASH_AssignCircuitCode, LLMessageSystem::processAssignCircuitCode); gMessageSystem->setHandlerFuncFast(_PREHASH_AddCircuitCode, LLMessageSystem::processAddCircuitCode); //gMessageSystem->setHandlerFuncFast(_PREHASH_AckAddCircuitCode, ack_add_circuit_code, NULL); - gMessageSystem->setHandlerFuncFast(_PREHASH_UseCircuitCode, LLMessageSystem::processUseCircuitCode); + gMessageSystem->setHandlerFuncFast(_PREHASH_UseCircuitCode, LLMessageSystem::processUseCircuitCode, (void**)responder); gMessageSystem->setHandlerFuncFast(_PREHASH_PacketAck, process_packet_ack, NULL); gMessageSystem->setHandlerFuncFast(_PREHASH_TemplateChecksumRequest, process_template_checksum_request, NULL); gMessageSystem->setHandlerFuncFast(_PREHASH_SecuredTemplateChecksumRequest, process_secured_template_checksum_request, NULL); @@ -4790,75 +3347,75 @@ void LLMessageSystem::summarizeLogs(std::ostream& str) char tmp_str[MAX_STRING]; /* Flawfinder: ignore */ F32 run_time = mMessageSystemTimer.getElapsedTimeF32(); str << "START MESSAGE LOG SUMMARY" << std::endl; - snprintf(buffer, MAX_STRING, "Run time: %12.3f seconds", run_time); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Run time: %12.3f seconds", run_time); /* Flawfinder: ignore */ // Incoming str << buffer << std::endl << "Incoming:" << std::endl; U64_to_str(mTotalBytesIn, tmp_str, sizeof(tmp_str)); - snprintf(buffer, MAX_STRING, "Total bytes received: %20s (%5.2f kbits per second)", tmp_str, ((F32)mTotalBytesIn * 0.008f) / run_time); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Total bytes received: %20s (%5.2f kbits per second)", tmp_str, ((F32)mTotalBytesIn * 0.008f) / run_time); /* Flawfinder: ignore */ str << buffer << std::endl; U64_to_str(mPacketsIn, tmp_str, sizeof(tmp_str)); - snprintf(buffer, MAX_STRING, "Total packets received: %20s (%5.2f packets per second)", tmp_str, ((F32) mPacketsIn / run_time)); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Total packets received: %20s (%5.2f packets per second)", tmp_str, ((F32) mPacketsIn / run_time)); /* Flawfinder: ignore */ str << buffer << std::endl; - snprintf(buffer, MAX_STRING, "Average packet size: %20.0f bytes", (F32)mTotalBytesIn / (F32)mPacketsIn); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Average packet size: %20.0f bytes", (F32)mTotalBytesIn / (F32)mPacketsIn); /* Flawfinder: ignore */ str << buffer << std::endl; U64_to_str(mReliablePacketsIn, tmp_str, sizeof(tmp_str)); - snprintf(buffer, MAX_STRING, "Total reliable packets: %20s (%5.2f%%)", tmp_str, 100.f * ((F32) mReliablePacketsIn)/((F32) mPacketsIn + 1)); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Total reliable packets: %20s (%5.2f%%)", tmp_str, 100.f * ((F32) mReliablePacketsIn)/((F32) mPacketsIn + 1)); /* Flawfinder: ignore */ str << buffer << std::endl; U64_to_str(mCompressedPacketsIn, tmp_str, sizeof(tmp_str)); - snprintf(buffer, MAX_STRING, "Total compressed packets: %20s (%5.2f%%)", tmp_str, 100.f * ((F32) mCompressedPacketsIn)/((F32) mPacketsIn + 1)); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Total compressed packets: %20s (%5.2f%%)", tmp_str, 100.f * ((F32) mCompressedPacketsIn)/((F32) mPacketsIn + 1)); /* Flawfinder: ignore */ str << buffer << std::endl; S64 savings = mUncompressedBytesIn - mCompressedBytesIn; U64_to_str(savings, tmp_str, sizeof(tmp_str)); - snprintf(buffer, MAX_STRING, "Total compression savings: %20s bytes", tmp_str); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Total compression savings: %20s bytes", tmp_str); /* Flawfinder: ignore */ str << buffer << std::endl; U64_to_str(savings/(mCompressedPacketsIn +1), tmp_str, sizeof(tmp_str)); - snprintf(buffer, MAX_STRING, "Avg comp packet savings: %20s (%5.2f : 1)", tmp_str, ((F32) mUncompressedBytesIn)/((F32) mCompressedBytesIn+1)); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Avg comp packet savings: %20s (%5.2f : 1)", tmp_str, ((F32) mUncompressedBytesIn)/((F32) mCompressedBytesIn+1)); /* Flawfinder: ignore */ str << buffer << std::endl; U64_to_str(savings/(mPacketsIn+1), tmp_str, sizeof(tmp_str)); - snprintf(buffer, MAX_STRING, "Avg overall comp savings: %20s (%5.2f : 1)", tmp_str, ((F32) mTotalBytesIn + (F32) savings)/((F32) mTotalBytesIn + 1.f)); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Avg overall comp savings: %20s (%5.2f : 1)", tmp_str, ((F32) mTotalBytesIn + (F32) savings)/((F32) mTotalBytesIn + 1.f)); /* Flawfinder: ignore */ // Outgoing str << buffer << std::endl << std::endl << "Outgoing:" << std::endl; U64_to_str(mTotalBytesOut, tmp_str, sizeof(tmp_str)); - snprintf(buffer, MAX_STRING, "Total bytes sent: %20s (%5.2f kbits per second)", tmp_str, ((F32)mTotalBytesOut * 0.008f) / run_time ); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Total bytes sent: %20s (%5.2f kbits per second)", tmp_str, ((F32)mTotalBytesOut * 0.008f) / run_time ); /* Flawfinder: ignore */ str << buffer << std::endl; U64_to_str(mPacketsOut, tmp_str, sizeof(tmp_str)); - snprintf(buffer, MAX_STRING, "Total packets sent: %20s (%5.2f packets per second)", tmp_str, ((F32)mPacketsOut / run_time)); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Total packets sent: %20s (%5.2f packets per second)", tmp_str, ((F32)mPacketsOut / run_time)); /* Flawfinder: ignore */ str << buffer << std::endl; - snprintf(buffer, MAX_STRING, "Average packet size: %20.0f bytes", (F32)mTotalBytesOut / (F32)mPacketsOut); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Average packet size: %20.0f bytes", (F32)mTotalBytesOut / (F32)mPacketsOut); /* Flawfinder: ignore */ str << buffer << std::endl; U64_to_str(mReliablePacketsOut, tmp_str, sizeof(tmp_str)); - snprintf(buffer, MAX_STRING, "Total reliable packets: %20s (%5.2f%%)", tmp_str, 100.f * ((F32) mReliablePacketsOut)/((F32) mPacketsOut + 1)); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Total reliable packets: %20s (%5.2f%%)", tmp_str, 100.f * ((F32) mReliablePacketsOut)/((F32) mPacketsOut + 1)); /* Flawfinder: ignore */ str << buffer << std::endl; U64_to_str(mCompressedPacketsOut, tmp_str, sizeof(tmp_str)); - snprintf(buffer, MAX_STRING, "Total compressed packets: %20s (%5.2f%%)", tmp_str, 100.f * ((F32) mCompressedPacketsOut)/((F32) mPacketsOut + 1)); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Total compressed packets: %20s (%5.2f%%)", tmp_str, 100.f * ((F32) mCompressedPacketsOut)/((F32) mPacketsOut + 1)); /* Flawfinder: ignore */ str << buffer << std::endl; savings = mUncompressedBytesOut - mCompressedBytesOut; U64_to_str(savings, tmp_str, sizeof(tmp_str)); - snprintf(buffer, MAX_STRING, "Total compression savings: %20s bytes", tmp_str); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Total compression savings: %20s bytes", tmp_str); /* Flawfinder: ignore */ str << buffer << std::endl; U64_to_str(savings/(mCompressedPacketsOut +1), tmp_str, sizeof(tmp_str)); - snprintf(buffer, MAX_STRING, "Avg comp packet savings: %20s (%5.2f : 1)", tmp_str, ((F32) mUncompressedBytesOut)/((F32) mCompressedBytesOut+1)); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Avg comp packet savings: %20s (%5.2f : 1)", tmp_str, ((F32) mUncompressedBytesOut)/((F32) mCompressedBytesOut+1)); /* Flawfinder: ignore */ str << buffer << std::endl; U64_to_str(savings/(mPacketsOut+1), tmp_str, sizeof(tmp_str)); - snprintf(buffer, MAX_STRING, "Avg overall comp savings: %20s (%5.2f : 1)", tmp_str, ((F32) mTotalBytesOut + (F32) savings)/((F32) mTotalBytesOut + 1.f)); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Avg overall comp savings: %20s (%5.2f : 1)", tmp_str, ((F32) mTotalBytesOut + (F32) savings)/((F32) mTotalBytesOut + 1.f)); /* Flawfinder: ignore */ str << buffer << std::endl << std::endl; - snprintf(buffer, MAX_STRING, "SendPacket failures: %20d", mSendPacketFailureCount); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "SendPacket failures: %20d", mSendPacketFailureCount); /* Flawfinder: ignore */ str << buffer << std::endl; - snprintf(buffer, MAX_STRING, "Dropped packets: %20d", mDroppedPackets); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Dropped packets: %20d", mDroppedPackets); /* Flawfinder: ignore */ str << buffer << std::endl; - snprintf(buffer, MAX_STRING, "Resent packets: %20d", mResentPackets); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Resent packets: %20d", mResentPackets); /* Flawfinder: ignore */ str << buffer << std::endl; - snprintf(buffer, MAX_STRING, "Failed reliable resends: %20d", mFailedResendPackets); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Failed reliable resends: %20d", mFailedResendPackets); /* Flawfinder: ignore */ str << buffer << std::endl; - snprintf(buffer, MAX_STRING, "Off-circuit rejected packets: %17d", mOffCircuitPackets); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "Off-circuit rejected packets: %17d", mOffCircuitPackets); /* Flawfinder: ignore */ str << buffer << std::endl; - snprintf(buffer, MAX_STRING, "On-circuit invalid packets: %17d", mInvalidOnCircuitPackets); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "On-circuit invalid packets: %17d", mInvalidOnCircuitPackets); /* Flawfinder: ignore */ str << buffer << std::endl << std::endl; str << "Decoding: " << std::endl; - snprintf(buffer, MAX_STRING, "%35s%10s%10s%10s%10s", "Message", "Count", "Time", "Max", "Avg"); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%35s%10s%10s%10s%10s", "Message", "Count", "Time", "Max", "Avg"); /* Flawfinder: ignore */ str << buffer << std:: endl; F32 avg; for (message_template_name_map_t::iterator iter = mMessageTemplates.begin(), @@ -4869,7 +3426,7 @@ void LLMessageSystem::summarizeLogs(std::ostream& str) if(mt->mTotalDecoded > 0) { avg = mt->mTotalDecodeTime / (F32)mt->mTotalDecoded; - snprintf(buffer, MAX_STRING, "%35s%10u%10f%10f%10f", mt->mName, mt->mTotalDecoded, mt->mTotalDecodeTime, mt->mMaxDecodeTimePerMsg, avg); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%35s%10u%10f%10f%10f", mt->mName, mt->mTotalDecoded, mt->mTotalDecodeTime, mt->mMaxDecodeTimePerMsg, avg); /* Flawfinder: ignore */ str << buffer << std::endl; } } @@ -4957,13 +3514,13 @@ void LLMessageSystem::dumpReceiveCounts() BOOL LLMessageSystem::isClear() const { - return mbSClear; + return mMessageBuilder->isClear(); } S32 LLMessageSystem::flush(const LLHost &host) { - if (mCurrentSendTotal) + if (mMessageBuilder->getMessageSize()) { S32 sentbytes = sendMessage(host); clearMessage(); @@ -4980,91 +3537,22 @@ U32 LLMessageSystem::getListenPort( void ) const return mPort; } - -S32 LLMessageSystem::zeroCode(U8 **data, S32 *data_size) +// TODO: babbage: remove this horror! +S32 LLMessageSystem::zeroCodeAdjustCurrentSendTotal() { - S32 count = *data_size; - - S32 net_gain = 0; - U8 num_zeroes = 0; - - U8 *inptr = (U8 *)*data; - U8 *outptr = (U8 *)mEncodedSendBuffer; - -// skip the packet id field - - for (U32 i=0;i256 zeroes) - - while (count--) - { - if (!(*inptr)) // in a zero count - { - if (num_zeroes) - { - if (++num_zeroes > 254) - { - *outptr++ = num_zeroes; - num_zeroes = 0; - } - net_gain--; // subseqent zeroes save one - } - else - { - *outptr++ = 0; - net_gain++; // starting a zero count adds one - num_zeroes = 1; - } - inptr++; - } - else - { - if (num_zeroes) - { - *outptr++ = num_zeroes; - num_zeroes = 0; - } - *outptr++ = *inptr++; - } - } - - if (num_zeroes) - { - *outptr++ = num_zeroes; - } - - if (net_gain < 0) + if(mMessageBuilder == mLLSDMessageBuilder) { - mCompressedPacketsOut++; - mUncompressedBytesOut += *data_size; - - *data = mEncodedSendBuffer; - *data_size += net_gain; - mEncodedSendBuffer[0] |= LL_ZERO_CODE_FLAG; // set the head bit to indicate zero coding - - mCompressedBytesOut += *data_size; - + // babbage: don't compress LLSD messages, so delta is 0 + return 0; } - mTotalBytesOut += *data_size; - - return(net_gain); -} - -S32 LLMessageSystem::zeroCodeAdjustCurrentSendTotal() -{ - if (!mbSBuilt) + + if (! mMessageBuilder->isBuilt()) { - buildMessage(); + mSendSize = mMessageBuilder->buildMessage(mSendBuffer, + MAX_BUFFER_SIZE); } - mbSBuilt = FALSE; + // TODO: babbage: remove this horror + mMessageBuilder->setBuilt(FALSE); S32 count = mSendSize; @@ -5244,7 +3732,6 @@ void LLMessageSystem::setHandlerFuncFast(const char *name, void (*handler_func)( } } - bool LLMessageSystem::callHandler(const char *name, bool trustedSource, LLMessageSystem* msg) { @@ -5297,6 +3784,12 @@ BOOL LLMessageSystem::callExceptionFunc(EMessageException exception) return FALSE; } +void LLMessageSystem::setTimingFunc(msg_timing_callback func, void* data) +{ + mTimingCallback = func; + mTimingCallbackData = data; +} + BOOL LLMessageSystem::isCircuitCodeKnown(U32 code) const { if(mCircuitCodes.find(code) == mCircuitCodes.end()) @@ -5306,27 +3799,14 @@ BOOL LLMessageSystem::isCircuitCodeKnown(U32 code) const BOOL LLMessageSystem::isMessageFast(const char *msg) { - if (mCurrentRMessageTemplate) - { - return(msg == mCurrentRMessageTemplate->mName); - } - else - { - return FALSE; - } + return(msg == mMessageReader->getMessageName()); } char* LLMessageSystem::getMessageName() { - if (mCurrentRMessageTemplate) - { - return mCurrentRMessageTemplate->mName; - } - else - { - return NULL; - } + const char* name = mMessageReader->getMessageName(); + return name[0] == '\0'? NULL : const_cast(name); } const LLUUID& LLMessageSystem::getSenderID() const @@ -5350,211 +3830,6 @@ const LLUUID& LLMessageSystem::getSenderSessionID() const return LLUUID::null; } -void LLMessageSystem::addVector3Fast(const char *varname, const LLVector3& vec) -{ - addDataFast(varname, vec.mV, MVT_LLVector3, sizeof(vec.mV)); -} - -void LLMessageSystem::addVector3(const char *varname, const LLVector3& vec) -{ - addDataFast(gMessageStringTable.getString(varname), vec.mV, MVT_LLVector3, sizeof(vec.mV)); -} - -void LLMessageSystem::addVector4Fast(const char *varname, const LLVector4& vec) -{ - addDataFast(varname, vec.mV, MVT_LLVector4, sizeof(vec.mV)); -} - -void LLMessageSystem::addVector4(const char *varname, const LLVector4& vec) -{ - addDataFast(gMessageStringTable.getString(varname), vec.mV, MVT_LLVector4, sizeof(vec.mV)); -} - - -void LLMessageSystem::addVector3dFast(const char *varname, const LLVector3d& vec) -{ - addDataFast(varname, vec.mdV, MVT_LLVector3d, sizeof(vec.mdV)); -} - -void LLMessageSystem::addVector3d(const char *varname, const LLVector3d& vec) -{ - addDataFast(gMessageStringTable.getString(varname), vec.mdV, MVT_LLVector3d, sizeof(vec.mdV)); -} - - -void LLMessageSystem::addQuatFast(const char *varname, const LLQuaternion& quat) -{ - addDataFast(varname, quat.packToVector3().mV, MVT_LLQuaternion, sizeof(LLVector3)); -} - -void LLMessageSystem::addQuat(const char *varname, const LLQuaternion& quat) -{ - addDataFast(gMessageStringTable.getString(varname), quat.packToVector3().mV, MVT_LLQuaternion, sizeof(LLVector3)); -} - - -void LLMessageSystem::addUUIDFast(const char *varname, const LLUUID& uuid) -{ - addDataFast(varname, uuid.mData, MVT_LLUUID, sizeof(uuid.mData)); -} - -void LLMessageSystem::addUUID(const char *varname, const LLUUID& uuid) -{ - addDataFast(gMessageStringTable.getString(varname), uuid.mData, MVT_LLUUID, sizeof(uuid.mData)); -} - -void LLMessageSystem::getF32Fast(const char *block, const char *var, F32 &d, S32 blocknum) -{ - getDataFast(block, var, &d, sizeof(F32), blocknum); - - if( !llfinite( d ) ) - { - llwarns << "non-finite in getF32Fast " << block << " " << var << llendl; - d = 0; - } -} - -void LLMessageSystem::getF32(const char *block, const char *var, F32 &d, S32 blocknum) -{ - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), &d, sizeof(F32), blocknum); - - if( !llfinite( d ) ) - { - llwarns << "non-finite in getF32 " << block << " " << var << llendl; - d = 0; - } -} - -void LLMessageSystem::getF64Fast(const char *block, const char *var, F64 &d, S32 blocknum) -{ - getDataFast(block, var, &d, sizeof(F64), blocknum); - - if( !llfinite( d ) ) - { - llwarns << "non-finite in getF64Fast " << block << " " << var << llendl; - d = 0; - } -} - -void LLMessageSystem::getF64(const char *block, const char *var, F64 &d, S32 blocknum) -{ - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), &d, sizeof(F64), blocknum); - - if( !llfinite( d ) ) - { - llwarns << "non-finite in getF64 " << block << " " << var << llendl; - d = 0; - } -} - - -void LLMessageSystem::getVector3Fast(const char *block, const char *var, LLVector3 &v, S32 blocknum ) -{ - getDataFast(block, var, v.mV, sizeof(v.mV), blocknum); - - if( !v.isFinite() ) - { - llwarns << "non-finite in getVector3Fast " << block << " " << var << llendl; - v.zeroVec(); - } -} - -void LLMessageSystem::getVector3(const char *block, const char *var, LLVector3 &v, S32 blocknum ) -{ - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), v.mV, sizeof(v.mV), blocknum); - - if( !v.isFinite() ) - { - llwarns << "non-finite in getVector4 " << block << " " << var << llendl; - v.zeroVec(); - } -} - -void LLMessageSystem::getVector4Fast(const char *block, const char *var, LLVector4 &v, S32 blocknum ) -{ - getDataFast(block, var, v.mV, sizeof(v.mV), blocknum); - - if( !v.isFinite() ) - { - llwarns << "non-finite in getVector4Fast " << block << " " << var << llendl; - v.zeroVec(); - } -} - -void LLMessageSystem::getVector4(const char *block, const char *var, LLVector4 &v, S32 blocknum ) -{ - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), v.mV, sizeof(v.mV), blocknum); - - if( !v.isFinite() ) - { - llwarns << "non-finite in getVector3 " << block << " " << var << llendl; - v.zeroVec(); - } -} - -void LLMessageSystem::getVector3dFast(const char *block, const char *var, LLVector3d &v, S32 blocknum ) -{ - getDataFast(block, var, v.mdV, sizeof(v.mdV), blocknum); - - if( !v.isFinite() ) - { - llwarns << "non-finite in getVector3dFast " << block << " " << var << llendl; - v.zeroVec(); - } - -} - -void LLMessageSystem::getVector3d(const char *block, const char *var, LLVector3d &v, S32 blocknum ) -{ - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), v.mdV, sizeof(v.mdV), blocknum); - - if( !v.isFinite() ) - { - llwarns << "non-finite in getVector3d " << block << " " << var << llendl; - v.zeroVec(); - } -} - -void LLMessageSystem::getQuatFast(const char *block, const char *var, LLQuaternion &q, S32 blocknum ) -{ - LLVector3 vec; - getDataFast(block, var, vec.mV, sizeof(vec.mV), blocknum); - if( vec.isFinite() ) - { - q.unpackFromVector3( vec ); - } - else - { - llwarns << "non-finite in getQuatFast " << block << " " << var << llendl; - q.loadIdentity(); - } -} - -void LLMessageSystem::getQuat(const char *block, const char *var, LLQuaternion &q, S32 blocknum ) -{ - LLVector3 vec; - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), vec.mV, sizeof(vec.mV), blocknum); - if( vec.isFinite() ) - { - q.unpackFromVector3( vec ); - } - else - { - llwarns << "non-finite in getQuat " << block << " " << var << llendl; - q.loadIdentity(); - } -} - -void LLMessageSystem::getUUIDFast(const char *block, const char *var, LLUUID &u, S32 blocknum ) -{ - getDataFast(block, var, u.mData, sizeof(u.mData), blocknum); -} - -void LLMessageSystem::getUUID(const char *block, const char *var, LLUUID &u, S32 blocknum ) -{ - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), u.mData, sizeof(u.mData), blocknum); -} - bool LLMessageSystem::generateDigestForNumberAndUUIDs( char* digest, const U32 number, @@ -5584,7 +3859,7 @@ bool LLMessageSystem::generateDigestForNumberAndUUIDs( d.update((const unsigned char *) colon, (U32)strlen(colon)); /* Flawfinder: ignore */ - snprintf(tbuf, sizeof(tbuf),"%i", number); /* Flawfinder: ignore */ + snprintf(tbuf, sizeof(tbuf),"%i", number); /* Flawfinder: ignore */ d.update((unsigned char *) tbuf, (U32)strlen(tbuf)); /* Flawfinder: ignore */ d.update((const unsigned char *) colon, (U32)strlen(colon)); /* Flawfinder: ignore */ @@ -5843,7 +4118,7 @@ void LLMessageSystem::dumpPacketToLog() S32 cur_line = 0; for (i = 0; i < mTrueReceiveSize; i++) { - snprintf(line_buffer + cur_line_pos*3, sizeof(line_buffer),"%02x ", mTrueReceiveBuffer[i]); /* Flawfinder: ignore */ + snprintf(line_buffer + cur_line_pos*3, sizeof(line_buffer),"%02x ", mTrueReceiveBuffer[i]); /* Flawfinder: ignore */ cur_line_pos++; if (cur_line_pos >= 16) { @@ -5859,26 +4134,141 @@ void LLMessageSystem::dumpPacketToLog() } //static -U64 LLMessageSystem::getMessageTimeUsecs(const BOOL update) +BOOL LLMessageSystem::isTemplateConfirmed() { - if (gMessageSystem) - { - if (update) - { - gMessageSystem->mCurrentMessageTimeSeconds = totalTime()*SEC_PER_USEC; - } - return (U64)(gMessageSystem->mCurrentMessageTimeSeconds * USEC_PER_SEC); - } - else - { - return totalTime(); - } + return gMessageSystem->mTemplateConfirmed; } //static -F64 LLMessageSystem::getMessageTimeSeconds(const BOOL update) +BOOL LLMessageSystem::doesTemplateMatch() { - if (gMessageSystem) + if (!isTemplateConfirmed()) + { + return FALSE; + } + return gMessageSystem->mTemplateMatches; +} + +//static +void LLMessageSystem::sendMessageTemplateChecksum(const LLHost ¤tHost) +{ + gMessageSystem->mTemplateConfirmed = FALSE; + gMessageSystem->mTemplateMatches = FALSE; + gMessageSystem->newMessageFast(_PREHASH_TemplateChecksumRequest); + // Don't use ping-based retry + gMessageSystem->sendReliable(currentHost, 40, FALSE, 3, NULL, NULL); +} + +//static +void LLMessageSystem::processMessageTemplateChecksumReply(LLMessageSystem *msg, + void** user_data) +{ + U32 remote_template_checksum = 0; + msg->getU32Fast(_PREHASH_DataBlock, _PREHASH_Checksum, remote_template_checksum); + msg->mTemplateConfirmed = TRUE; + if ((remote_template_checksum) != msg->mMessageFileChecksum) + { + llwarns << "out of sync message template!" << llendl; + + msg->mTemplateMatches = FALSE; + msg->newMessageFast(_PREHASH_CloseCircuit); + msg->sendMessage(msg->getSender()); + return; + } + + msg->mTemplateMatches = TRUE; + llinfos << "According to " << msg->getSender() + << " the message template is current!" + << llendl; +} + +//static +void LLMessageSystem::sendSecureMessageTemplateChecksum(const LLHost& host) +{ + // generate an token for use during template checksum requests to + // prevent DOS attacks from injected bad template checksum replies. + LLUUID *template_tokenp = new LLUUID; + template_tokenp->generate(); + lldebugs << "random token: " << *template_tokenp << llendl; + + // register the handler for the reply while saving off template_token + gMessageSystem->setHandlerFuncFast(_PREHASH_TemplateChecksumReply, + LLMessageSystem::processSecureTemplateChecksumReply, + (void**)template_tokenp); + + // send checksum request + gMessageSystem->mTemplateConfirmed = FALSE; + gMessageSystem->newMessageFast(_PREHASH_SecuredTemplateChecksumRequest); + gMessageSystem->nextBlockFast(_PREHASH_TokenBlock); + gMessageSystem->addUUIDFast(_PREHASH_Token, *template_tokenp); + gMessageSystem->sendReliable(host); +} + +//static +void LLMessageSystem::processSecureTemplateChecksumReply(LLMessageSystem *msg, + void** user_data) +{ + // copy the token out into the stack and delete allocated memory + LLUUID template_token = *((LLUUID*)user_data); + delete user_data; + + LLUUID received_token; + msg->getUUID("TokenBlock", "Token", received_token); + + if(received_token != template_token) + { + llwarns << "Incorrect token in template checksum reply: " + << received_token << llendl; + //return do_normal_idle; + return; + } + + U32 remote_template_checksum = 0; + U8 major_version = 0; + U8 minor_version = 0; + U8 patch_version = 0; + U8 server_version = 0; + U32 flags = 0x0; + msg->getU32("DataBlock", "Checksum", remote_template_checksum); + msg->getU8 ("DataBlock", "MajorVersion", major_version); + msg->getU8 ("DataBlock", "MinorVersion", minor_version); + msg->getU8 ("DataBlock", "PatchVersion", patch_version); + msg->getU8 ("DataBlock", "ServerVersion", server_version); + msg->getU32("DataBlock", "Flags", flags); + + msg->mTemplateConfirmed = TRUE; + if (remote_template_checksum != gMessageSystem->mMessageFileChecksum) + { + llinfos << "Message template out of sync" << llendl; + msg->mTemplateMatches = FALSE; + } + else + { + msg->mTemplateMatches = TRUE; + } +} + +//static +U64 LLMessageSystem::getMessageTimeUsecs(const BOOL update) +{ + if (gMessageSystem) + { + if (update) + { + gMessageSystem->mCurrentMessageTimeSeconds = totalTime()*SEC_PER_USEC; + } + return (U64)(gMessageSystem->mCurrentMessageTimeSeconds * USEC_PER_SEC); + } + else + { + return totalTime(); + } +} + +//static +F64 LLMessageSystem::getMessageTimeSeconds(const BOOL update) +{ + if (gMessageSystem) { if (update) { @@ -5903,3 +4293,558 @@ std::string get_shared_secret() return g_shared_secret; } +typedef std::map BuilderMap; + +static void setBuilder(BuilderMap& map, const char* name, LLMessageBuilder* builder) +{ + map[gMessageStringTable.getString(name)] = builder; +} + +void LLMessageSystem::newMessageFast(const char *name) +{ + if(LLMessageConfig::isMessageBuiltTemplate(name)) + { + mMessageBuilder = mTemplateMessageBuilder; + } + else + { + mMessageBuilder = mLLSDMessageBuilder; + } + mSendReliable = FALSE; + mMessageBuilder->newMessage(name); +} + +void LLMessageSystem::newMessage(const char *name) +{ + newMessageFast(gMessageStringTable.getString(name)); +} + +void LLMessageSystem::addBinaryDataFast(const char *varname, const void *data, S32 size) +{ + mMessageBuilder->addBinaryData(varname, data, size); +} + +void LLMessageSystem::addBinaryData(const char *varname, const void *data, S32 size) +{ + mMessageBuilder->addBinaryData(gMessageStringTable.getString(varname),data, size); +} + +void LLMessageSystem::addS8Fast(const char *varname, S8 v) +{ + mMessageBuilder->addS8(varname, v); +} + +void LLMessageSystem::addS8(const char *varname, S8 v) +{ + mMessageBuilder->addS8(gMessageStringTable.getString(varname), v); +} + +void LLMessageSystem::addU8Fast(const char *varname, U8 v) +{ + mMessageBuilder->addU8(varname, v); +} + +void LLMessageSystem::addU8(const char *varname, U8 v) +{ + mMessageBuilder->addU8(gMessageStringTable.getString(varname), v); +} + +void LLMessageSystem::addS16Fast(const char *varname, S16 v) +{ + mMessageBuilder->addS16(varname, v); +} + +void LLMessageSystem::addS16(const char *varname, S16 v) +{ + mMessageBuilder->addS16(gMessageStringTable.getString(varname), v); +} + +void LLMessageSystem::addU16Fast(const char *varname, U16 v) +{ + mMessageBuilder->addU16(varname, v); +} + +void LLMessageSystem::addU16(const char *varname, U16 v) +{ + mMessageBuilder->addU16(gMessageStringTable.getString(varname), v); +} + +void LLMessageSystem::addF32Fast(const char *varname, F32 v) +{ + mMessageBuilder->addF32(varname, v); +} + +void LLMessageSystem::addF32(const char *varname, F32 v) +{ + mMessageBuilder->addF32(gMessageStringTable.getString(varname), v); +} + +void LLMessageSystem::addS32Fast(const char *varname, S32 v) +{ + mMessageBuilder->addS32(varname, v); +} + +void LLMessageSystem::addS32(const char *varname, S32 v) +{ + mMessageBuilder->addS32(gMessageStringTable.getString(varname), v); +} + +void LLMessageSystem::addU32Fast(const char *varname, U32 v) +{ + mMessageBuilder->addU32(varname, v); +} + +void LLMessageSystem::addU32(const char *varname, U32 v) +{ + mMessageBuilder->addU32(gMessageStringTable.getString(varname), v); +} + +void LLMessageSystem::addU64Fast(const char *varname, U64 v) +{ + mMessageBuilder->addU64(varname, v); +} + +void LLMessageSystem::addU64(const char *varname, U64 v) +{ + mMessageBuilder->addU64(gMessageStringTable.getString(varname), v); +} + +void LLMessageSystem::addF64Fast(const char *varname, F64 v) +{ + mMessageBuilder->addF64(varname, v); +} + +void LLMessageSystem::addF64(const char *varname, F64 v) +{ + mMessageBuilder->addF64(gMessageStringTable.getString(varname), v); +} + +void LLMessageSystem::addIPAddrFast(const char *varname, U32 v) +{ + mMessageBuilder->addIPAddr(varname, v); +} + +void LLMessageSystem::addIPAddr(const char *varname, U32 v) +{ + mMessageBuilder->addIPAddr(gMessageStringTable.getString(varname), v); +} + +void LLMessageSystem::addIPPortFast(const char *varname, U16 v) +{ + mMessageBuilder->addIPPort(varname, v); +} + +void LLMessageSystem::addIPPort(const char *varname, U16 v) +{ + mMessageBuilder->addIPPort(gMessageStringTable.getString(varname), v); +} + +void LLMessageSystem::addBOOLFast(const char* varname, BOOL v) +{ + mMessageBuilder->addBOOL(varname, v); +} + +void LLMessageSystem::addBOOL(const char* varname, BOOL v) +{ + mMessageBuilder->addBOOL(gMessageStringTable.getString(varname), v); +} + +void LLMessageSystem::addStringFast(const char* varname, const char* v) +{ + mMessageBuilder->addString(varname, v); +} + +void LLMessageSystem::addString(const char* varname, const char* v) +{ + mMessageBuilder->addString(gMessageStringTable.getString(varname), v); +} + +void LLMessageSystem::addStringFast(const char* varname, const std::string& v) +{ + mMessageBuilder->addString(varname, v); +} + +void LLMessageSystem::addString(const char* varname, const std::string& v) +{ + mMessageBuilder->addString(gMessageStringTable.getString(varname), v); +} + +void LLMessageSystem::addVector3Fast(const char *varname, const LLVector3& v) +{ + mMessageBuilder->addVector3(varname, v); +} + +void LLMessageSystem::addVector3(const char *varname, const LLVector3& v) +{ + mMessageBuilder->addVector3(gMessageStringTable.getString(varname), v); +} + +void LLMessageSystem::addVector4Fast(const char *varname, const LLVector4& v) +{ + mMessageBuilder->addVector4(varname, v); +} + +void LLMessageSystem::addVector4(const char *varname, const LLVector4& v) +{ + mMessageBuilder->addVector4(gMessageStringTable.getString(varname), v); +} + +void LLMessageSystem::addVector3dFast(const char *varname, const LLVector3d& v) +{ + mMessageBuilder->addVector3d(varname, v); +} + +void LLMessageSystem::addVector3d(const char *varname, const LLVector3d& v) +{ + mMessageBuilder->addVector3d(gMessageStringTable.getString(varname), v); +} + +void LLMessageSystem::addQuatFast(const char *varname, const LLQuaternion& v) +{ + mMessageBuilder->addQuat(varname, v); +} + +void LLMessageSystem::addQuat(const char *varname, const LLQuaternion& v) +{ + mMessageBuilder->addQuat(gMessageStringTable.getString(varname), v); +} + + +void LLMessageSystem::addUUIDFast(const char *varname, const LLUUID& v) +{ + mMessageBuilder->addUUID(varname, v); +} + +void LLMessageSystem::addUUID(const char *varname, const LLUUID& v) +{ + mMessageBuilder->addUUID(gMessageStringTable.getString(varname), v); +} + +S32 LLMessageSystem::getCurrentSendTotal() const +{ + return mMessageBuilder->getMessageSize(); +} + +void LLMessageSystem::getS8Fast(const char *block, const char *var, S8 &u, + S32 blocknum) +{ + mMessageReader->getS8(block, var, u, blocknum); +} + +void LLMessageSystem::getS8(const char *block, const char *var, S8 &u, + S32 blocknum) +{ + getS8Fast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), u, blocknum); +} + +void LLMessageSystem::getU8Fast(const char *block, const char *var, U8 &u, + S32 blocknum) +{ + mMessageReader->getU8(block, var, u, blocknum); +} + +void LLMessageSystem::getU8(const char *block, const char *var, U8 &u, + S32 blocknum) +{ + getU8Fast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), u, blocknum); +} + +void LLMessageSystem::getBOOLFast(const char *block, const char *var, BOOL &b, + S32 blocknum) +{ + mMessageReader->getBOOL(block, var, b, blocknum); +} + +void LLMessageSystem::getBOOL(const char *block, const char *var, BOOL &b, + S32 blocknum) +{ + getBOOLFast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), b, blocknum); +} + +void LLMessageSystem::getS16Fast(const char *block, const char *var, S16 &d, + S32 blocknum) +{ + mMessageReader->getS16(block, var, d, blocknum); +} + +void LLMessageSystem::getS16(const char *block, const char *var, S16 &d, + S32 blocknum) +{ + getS16Fast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), d, blocknum); +} + +void LLMessageSystem::getU16Fast(const char *block, const char *var, U16 &d, + S32 blocknum) +{ + mMessageReader->getU16(block, var, d, blocknum); +} + +void LLMessageSystem::getU16(const char *block, const char *var, U16 &d, + S32 blocknum) +{ + getU16Fast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), d, blocknum); +} + +void LLMessageSystem::getS32Fast(const char *block, const char *var, S32 &d, + S32 blocknum) +{ + mMessageReader->getS32(block, var, d, blocknum); +} + +void LLMessageSystem::getS32(const char *block, const char *var, S32 &d, + S32 blocknum) +{ + getS32Fast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), d, blocknum); +} + +void LLMessageSystem::getU32Fast(const char *block, const char *var, U32 &d, + S32 blocknum) +{ + mMessageReader->getU32(block, var, d, blocknum); +} + +void LLMessageSystem::getU32(const char *block, const char *var, U32 &d, + S32 blocknum) +{ + getU32Fast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), d, blocknum); +} + +void LLMessageSystem::getU64Fast(const char *block, const char *var, U64 &d, + S32 blocknum) +{ + mMessageReader->getU64(block, var, d, blocknum); +} + +void LLMessageSystem::getU64(const char *block, const char *var, U64 &d, + S32 blocknum) +{ + + getU64Fast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), d, blocknum); +} + +void LLMessageSystem::getBinaryDataFast(const char *blockname, + const char *varname, + void *datap, S32 size, + S32 blocknum, S32 max_size) +{ + mMessageReader->getBinaryData(blockname, varname, datap, size, blocknum, + max_size); +} + +void LLMessageSystem::getBinaryData(const char *blockname, + const char *varname, + void *datap, S32 size, + S32 blocknum, S32 max_size) +{ + getBinaryDataFast(gMessageStringTable.getString(blockname), + gMessageStringTable.getString(varname), + datap, size, blocknum, max_size); +} + +void LLMessageSystem::getF32Fast(const char *block, const char *var, F32 &d, + S32 blocknum) +{ + mMessageReader->getF32(block, var, d, blocknum); +} + +void LLMessageSystem::getF32(const char *block, const char *var, F32 &d, + S32 blocknum) +{ + getF32Fast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), d, blocknum); +} + +void LLMessageSystem::getF64Fast(const char *block, const char *var, F64 &d, + S32 blocknum) +{ + mMessageReader->getF64(block, var, d, blocknum); +} + +void LLMessageSystem::getF64(const char *block, const char *var, F64 &d, + S32 blocknum) +{ + getF64Fast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), d, blocknum); +} + + +void LLMessageSystem::getVector3Fast(const char *block, const char *var, + LLVector3 &v, S32 blocknum ) +{ + mMessageReader->getVector3(block, var, v, blocknum); +} + +void LLMessageSystem::getVector3(const char *block, const char *var, + LLVector3 &v, S32 blocknum ) +{ + getVector3Fast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), v, blocknum); +} + +void LLMessageSystem::getVector4Fast(const char *block, const char *var, + LLVector4 &v, S32 blocknum ) +{ + mMessageReader->getVector4(block, var, v, blocknum); +} + +void LLMessageSystem::getVector4(const char *block, const char *var, + LLVector4 &v, S32 blocknum ) +{ + getVector4Fast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), v, blocknum); +} + +void LLMessageSystem::getVector3dFast(const char *block, const char *var, + LLVector3d &v, S32 blocknum ) +{ + mMessageReader->getVector3d(block, var, v, blocknum); +} + +void LLMessageSystem::getVector3d(const char *block, const char *var, + LLVector3d &v, S32 blocknum ) +{ + getVector3dFast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), v, blocknum); +} + +void LLMessageSystem::getQuatFast(const char *block, const char *var, + LLQuaternion &q, S32 blocknum ) +{ + mMessageReader->getQuat(block, var, q, blocknum); +} + +void LLMessageSystem::getQuat(const char *block, const char *var, + LLQuaternion &q, S32 blocknum) +{ + getQuatFast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), q, blocknum); +} + +void LLMessageSystem::getUUIDFast(const char *block, const char *var, + LLUUID &u, S32 blocknum ) +{ + mMessageReader->getUUID(block, var, u, blocknum); +} + +void LLMessageSystem::getUUID(const char *block, const char *var, LLUUID &u, + S32 blocknum ) +{ + getUUIDFast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), u, blocknum); +} + +void LLMessageSystem::getIPAddrFast(const char *block, const char *var, + U32 &u, S32 blocknum) +{ + mMessageReader->getIPAddr(block, var, u, blocknum); +} + +void LLMessageSystem::getIPAddr(const char *block, const char *var, U32 &u, + S32 blocknum) +{ + getIPAddrFast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), u, blocknum); +} + +void LLMessageSystem::getIPPortFast(const char *block, const char *var, + U16 &u, S32 blocknum) +{ + mMessageReader->getIPPort(block, var, u, blocknum); +} + +void LLMessageSystem::getIPPort(const char *block, const char *var, U16 &u, + S32 blocknum) +{ + getIPPortFast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), u, + blocknum); +} + + +void LLMessageSystem::getStringFast(const char *block, const char *var, + S32 buffer_size, char *s, S32 blocknum) +{ + mMessageReader->getString(block, var, buffer_size, s, blocknum); +} + +void LLMessageSystem::getString(const char *block, const char *var, + S32 buffer_size, char *s, S32 blocknum ) +{ + getStringFast(gMessageStringTable.getString(block), + gMessageStringTable.getString(var), buffer_size, s, + blocknum); +} + +S32 LLMessageSystem::getNumberOfBlocksFast(const char *blockname) +{ + return mMessageReader->getNumberOfBlocks(blockname); +} + +S32 LLMessageSystem::getNumberOfBlocks(const char *blockname) +{ + return getNumberOfBlocksFast(gMessageStringTable.getString(blockname)); +} + +S32 LLMessageSystem::getSizeFast(const char *blockname, const char *varname) +{ + return mMessageReader->getSize(blockname, varname); +} + +S32 LLMessageSystem::getSize(const char *blockname, const char *varname) +{ + return getSizeFast(gMessageStringTable.getString(blockname), + gMessageStringTable.getString(varname)); +} + +// size in bytes of variable length data +S32 LLMessageSystem::getSizeFast(const char *blockname, S32 blocknum, + const char *varname) +{ + return mMessageReader->getSize(blockname, blocknum, varname); +} + +S32 LLMessageSystem::getSize(const char *blockname, S32 blocknum, + const char *varname) +{ + return getSizeFast(gMessageStringTable.getString(blockname), blocknum, + gMessageStringTable.getString(varname)); +} + +S32 LLMessageSystem::getReceiveSize() const +{ + return mMessageReader->getMessageSize(); +} + +//static +void LLMessageSystem::setTimeDecodes( BOOL b ) +{ + LLMessageReader::setTimeDecodes(b); +} + +//static +void LLMessageSystem::setTimeDecodesSpamThreshold( F32 seconds ) +{ + LLMessageReader::setTimeDecodesSpamThreshold(seconds); +} + +// HACK! babbage: return true if message rxed via either UDP or HTTP +// TODO: babbage: move gServicePump in to LLMessageSystem? +bool LLMessageSystem::checkAllMessages(S64 frame_count, LLPumpIO* http_pump) +{ + if(checkMessages(frame_count)) + { + return true; + } + U32 packetsIn = mPacketsIn; + http_pump->pump(); + http_pump->callback(); + return (mPacketsIn - packetsIn) > 0; +} diff --git a/linden/indra/llmessage/message.h b/linden/indra/llmessage/message.h index 5cc3ec1..0a55485 100644 --- a/linden/indra/llmessage/message.h +++ b/linden/indra/llmessage/message.h @@ -1,9 +1,10 @@ /** - * @file message.h + * @FILE message.h * @brief LLMessageSystem class header file * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -45,16 +46,15 @@ #include "llerror.h" #include "net.h" #include "string_table.h" -#include "llptrskipmap.h" #include "llcircuit.h" #include "lltimer.h" #include "llpacketring.h" #include "llhost.h" +#include "llhttpnode.h" #include "llpacketack.h" -#include "doublelinkedlist.h" #include "message_prehash.h" #include "llstl.h" -#include "lldarray.h" +#include "llmsgvariabletype.h" const U32 MESSAGE_MAX_STRINGS_LENGTH = 64; const U32 MESSAGE_NUMBER_OF_HASH_BUCKETS = 8192; @@ -153,39 +153,10 @@ class LLQuaternion; class LLSD; class LLUUID; class LLMessageSystem; +class LLPumpIO; // message data pieces are used to collect the data called for by the message template -// iterator typedefs precede each class as needed -typedef enum e_message_variable_type -{ - MVT_NULL, - MVT_FIXED, - MVT_VARIABLE, - MVT_U8, - MVT_U16, - MVT_U32, - MVT_U64, - MVT_S8, - MVT_S16, - MVT_S32, - MVT_S64, - MVT_F32, - MVT_F64, - MVT_LLVector3, - MVT_LLVector3d, - MVT_LLVector4, - MVT_LLQuaternion, - MVT_LLUUID, - MVT_BOOL, - MVT_IP_ADDR, - MVT_IP_PORT, - MVT_U16Vec3, - MVT_U16Quat, - MVT_S16Array, - MVT_EOL -} EMsgVariableType; - // message system exceptional condition handlers. enum EMessageException { @@ -197,25 +168,34 @@ enum EMessageException typedef void (*msg_exception_callback)(LLMessageSystem*,void*,EMessageException); - class LLMsgData; class LLMsgBlkData; class LLMessageTemplate; class LLMessagePollInfo; +class LLMessageBuilder; +class LLTemplateMessageBuilder; +class LLSDMessageBuilder; +class LLMessageReader; +class LLTemplateMessageReader; +class LLSDMessageReader; -class LLMessageSystem +class LLUseCircuitCodeResponder { LOG_CLASS(LLMessageSystem); public: + virtual ~LLUseCircuitCodeResponder(); + virtual void complete(const LLHost& host, const LLUUID& agent) const = 0; +}; + +class LLMessageSystem +{ + private: U8 mSendBuffer[MAX_BUFFER_SIZE]; - // Encoded send buffer needs to be slightly larger since the zero - // coding can potentially increase the size of the send data. - U8 mEncodedSendBuffer[2 * MAX_BUFFER_SIZE]; S32 mSendSize; - S32 mCurrentSendTotal; + public: LLPacketRing mPacketRing; LLReliablePacketParams mReliablePacketParams; @@ -294,12 +274,7 @@ public: LLMessageSystem(const char *filename, U32 port, S32 version_major, S32 version_minor, S32 version_patch); -public: - // Subclass use. - LLMessageSystem(); - -public: - virtual ~LLMessageSystem(); + ~LLMessageSystem(); BOOL isOK() const { return !mbError; } S32 getErrorCode() const { return mErrorCode; } @@ -317,15 +292,26 @@ public: setHandlerFuncFast(gMessageStringTable.getString(name), handler_func, user_data); } - bool callHandler(const char *name, bool trustedSource, - LLMessageSystem* msg); - // Set a callback function for a message system exception. void setExceptionFunc(EMessageException exception, msg_exception_callback func, void* data = NULL); // Call the specified exception func, and return TRUE if a // function was found and called. Otherwise return FALSE. BOOL callExceptionFunc(EMessageException exception); + // Set a function that will be called once per packet processed with the + // hashed message name and the time spent in the processing handler function + // measured in seconds. JC + typedef void (*msg_timing_callback)(const char* hashed_name, F32 time, void* data); + void setTimingFunc(msg_timing_callback func, void* data = NULL); + msg_timing_callback getTimingCallback() + { + return mTimingCallback; + } + void* getTimingCallbackData() + { + return mTimingCallbackData; + } + // This method returns true if the code is in the circuit codes map. BOOL isCircuitCodeKnown(U32 code) const; @@ -364,42 +350,21 @@ public: void setMySessionID(const LLUUID& session_id) { mSessionID = session_id; } const LLUUID& getMySessionID() { return mSessionID; } - virtual void newMessageFast(const char *name); - void newMessage(const char *name) - { - newMessageFast(gMessageStringTable.getString(name)); - } + void newMessageFast(const char *name); + void newMessage(const char *name); void copyMessageRtoS(); void clearMessage(); - virtual void nextBlockFast(const char *blockname); + void nextBlockFast(const char *blockname); void nextBlock(const char *blockname) { nextBlockFast(gMessageStringTable.getString(blockname)); } -private: - void addDataFast(const char *varname, const void *data, EMsgVariableType type, S32 size); // Use only for types not in system already - void addData(const char *varname, const void *data, EMsgVariableType type, S32 size) - { - addDataFast(gMessageStringTable.getString(varname), data, type, size); - } - - void addDataFast(const char *varname, const void *data, EMsgVariableType type); // DEPRECATED - not typed, doesn't check storage space - void addData(const char *varname, const void *data, EMsgVariableType type) - { - addDataFast(gMessageStringTable.getString(varname), data, type); - } public: - void addBinaryDataFast(const char *varname, const void *data, S32 size) - { - addDataFast(varname, data, MVT_FIXED, size); - } - void addBinaryData(const char *varname, const void *data, S32 size) - { - addDataFast(gMessageStringTable.getString(varname), data, MVT_FIXED, size); - } + void addBinaryDataFast(const char *varname, const void *data, S32 size); + void addBinaryData(const char *varname, const void *data, S32 size); void addBOOLFast( const char* varname, BOOL b); // typed, checks storage space void addBOOL( const char* varname, BOOL b); // typed, checks storage space @@ -415,7 +380,7 @@ public: void addF32( const char *varname, F32 f); // typed, checks storage space void addS32Fast( const char *varname, S32 s); // typed, checks storage space void addS32( const char *varname, S32 s); // typed, checks storage space - virtual void addU32Fast( const char *varname, U32 u); // typed, checks storage space + void addU32Fast( const char *varname, U32 u); // typed, checks storage space void addU32( const char *varname, U32 u); // typed, checks storage space void addU64Fast( const char *varname, U64 lu); // typed, checks storage space void addU64( const char *varname, U64 lu); // typed, checks storage space @@ -429,7 +394,7 @@ public: void addVector3d( const char *varname, const LLVector3d& vec); // typed, checks storage space void addQuatFast( const char *varname, const LLQuaternion& quat); // typed, checks storage space void addQuat( const char *varname, const LLQuaternion& quat); // typed, checks storage space - virtual void addUUIDFast( const char *varname, const LLUUID& uuid); // typed, checks storage space + void addUUIDFast( const char *varname, const LLUUID& uuid); // typed, checks storage space void addUUID( const char *varname, const LLUUID& uuid); // typed, checks storage space void addIPAddrFast( const char *varname, const U32 ip); // typed, checks storage space void addIPAddr( const char *varname, const U32 ip); // typed, checks storage space @@ -440,8 +405,8 @@ public: void addStringFast( const char* varname, const std::string& s); // typed, checks storage space void addString( const char* varname, const std::string& s); // typed, checks storage space + S32 getCurrentSendTotal() const; TPACKETID getCurrentRecvPacketID() { return mCurrentRecvPacketID; } - S32 getCurrentSendTotal() const { return mCurrentSendTotal; } // This method checks for current send total and returns true if // you need to go to the next block type or need to start a new @@ -450,16 +415,16 @@ public: BOOL isSendFull(const char* blockname = NULL); BOOL isSendFullFast(const char* blockname = NULL); - BOOL removeLastBlock(); + BOOL removeLastBlock(); - void buildMessage(); + //void buildMessage(); S32 zeroCode(U8 **data, S32 *data_size); S32 zeroCodeExpand(U8 **data, S32 *data_size); S32 zeroCodeAdjustCurrentSendTotal(); // Uses ping-based retry - virtual S32 sendReliable(const LLHost &host); + S32 sendReliable(const LLHost &host); // Uses ping-based retry S32 sendReliable(const U32 circuit) { return sendReliable(findHost(circuit)); } @@ -488,28 +453,10 @@ public: S32 sendMessage(const LLHost &host); S32 sendMessage(const U32 circuit); - BOOL decodeData(const U8 *buffer, const LLHost &host); - - // TODO: Consolide these functions - // TODO: Make these private, force use of typed functions. - // If size is not 0, an error is generated if size doesn't exactly match the size of the data. - // At all times, the number if bytes written to *datap is <= max_size. -private: - void getDataFast(const char *blockname, const char *varname, void *datap, S32 size = 0, S32 blocknum = 0, S32 max_size = S32_MAX); - void getData(const char *blockname, const char *varname, void *datap, S32 size = 0, S32 blocknum = 0, S32 max_size = S32_MAX) - { - getDataFast(gMessageStringTable.getString(blockname), gMessageStringTable.getString(varname), datap, size, blocknum, max_size); - } -public: - void getBinaryDataFast(const char *blockname, const char *varname, void *datap, S32 size, S32 blocknum = 0, S32 max_size = S32_MAX) - { - getDataFast(blockname, varname, datap, size, blocknum, max_size); - } - void getBinaryData(const char *blockname, const char *varname, void *datap, S32 size, S32 blocknum = 0, S32 max_size = S32_MAX) - { - getDataFast(gMessageStringTable.getString(blockname), gMessageStringTable.getString(varname), datap, size, blocknum, max_size); - } + // BOOL decodeData(const U8 *buffer, const LLHost &host); + void getBinaryDataFast(const char *blockname, const char *varname, void *datap, S32 size, S32 blocknum = 0, S32 max_size = S32_MAX); + void getBinaryData(const char *blockname, const char *varname, void *datap, S32 size, S32 blocknum = 0, S32 max_size = S32_MAX); void getBOOLFast( const char *block, const char *var, BOOL &data, S32 blocknum = 0); void getBOOL( const char *block, const char *var, BOOL &data, S32 blocknum = 0); void getS8Fast( const char *block, const char *var, S8 &data, S32 blocknum = 0); @@ -524,9 +471,9 @@ public: void getS32( const char *block, const char *var, S32 &data, S32 blocknum = 0); void getF32Fast( const char *block, const char *var, F32 &data, S32 blocknum = 0); void getF32( const char *block, const char *var, F32 &data, S32 blocknum = 0); - virtual void getU32Fast( const char *block, const char *var, U32 &data, S32 blocknum = 0); + void getU32Fast( const char *block, const char *var, U32 &data, S32 blocknum = 0); void getU32( const char *block, const char *var, U32 &data, S32 blocknum = 0); - virtual void getU64Fast( const char *block, const char *var, U64 &data, S32 blocknum = 0); + void getU64Fast( const char *block, const char *var, U64 &data, S32 blocknum = 0); void getU64( const char *block, const char *var, U64 &data, S32 blocknum = 0); void getF64Fast( const char *block, const char *var, F64 &data, S32 blocknum = 0); void getF64( const char *block, const char *var, F64 &data, S32 blocknum = 0); @@ -538,13 +485,13 @@ public: void getVector3d(const char *block, const char *var, LLVector3d &vec, S32 blocknum = 0); void getQuatFast( const char *block, const char *var, LLQuaternion &q, S32 blocknum = 0); void getQuat( const char *block, const char *var, LLQuaternion &q, S32 blocknum = 0); - virtual void getUUIDFast( const char *block, const char *var, LLUUID &uuid, S32 blocknum = 0); + void getUUIDFast( const char *block, const char *var, LLUUID &uuid, S32 blocknum = 0); void getUUID( const char *block, const char *var, LLUUID &uuid, S32 blocknum = 0); - virtual void getIPAddrFast( const char *block, const char *var, U32 &ip, S32 blocknum = 0); + void getIPAddrFast( const char *block, const char *var, U32 &ip, S32 blocknum = 0); void getIPAddr( const char *block, const char *var, U32 &ip, S32 blocknum = 0); - virtual void getIPPortFast( const char *block, const char *var, U16 &port, S32 blocknum = 0); + void getIPPortFast( const char *block, const char *var, U16 &port, S32 blocknum = 0); void getIPPort( const char *block, const char *var, U16 &port, S32 blocknum = 0); - virtual void getStringFast( const char *block, const char *var, S32 buffer_size, char *buffer, S32 blocknum = 0); + void getStringFast( const char *block, const char *var, S32 buffer_size, char *buffer, S32 blocknum = 0); void getString( const char *block, const char *var, S32 buffer_size, char *buffer, S32 blocknum = 0); @@ -566,7 +513,7 @@ public: void showCircuitInfo(); LLString getCircuitInfoString(); - virtual U32 getOurCircuitCode(); + U32 getOurCircuitCode(); void enableCircuit(const LLHost &host, BOOL trusted); void disableCircuit(const LLHost &host); @@ -612,20 +559,12 @@ public: void sanityCheck(); S32 getNumberOfBlocksFast(const char *blockname); - S32 getNumberOfBlocks(const char *blockname) - { - return getNumberOfBlocksFast(gMessageStringTable.getString(blockname)); - } + S32 getNumberOfBlocks(const char *blockname); S32 getSizeFast(const char *blockname, const char *varname); - S32 getSize(const char *blockname, const char *varname) - { - return getSizeFast(gMessageStringTable.getString(blockname), gMessageStringTable.getString(varname)); - } - S32 getSizeFast(const char *blockname, S32 blocknum, const char *varname); // size in bytes of variable length data - S32 getSize(const char *blockname, S32 blocknum, const char *varname) - { - return getSizeFast(gMessageStringTable.getString(blockname), blocknum, gMessageStringTable.getString(varname)); - } + S32 getSize(const char *blockname, const char *varname); + S32 getSizeFast(const char *blockname, S32 blocknum, + const char *varname); // size in bytes of data + S32 getSize(const char *blockname, S32 blocknum, const char *varname); void resetReceiveCounts(); // resets receive counts for all message types to 0 void dumpReceiveCounts(); // dumps receive count for each message type to llinfos @@ -640,14 +579,14 @@ public: void stopLogging(); // flush and close file void summarizeLogs(std::ostream& str); // log statistics - S32 getReceiveSize() const { return mReceiveSize; } - S32 getReceiveCompressedSize() const { return mIncomingCompressedSize; } + S32 getReceiveSize() const; + S32 getReceiveCompressedSize() const { return mIncomingCompressedSize; } S32 getReceiveBytes() const; S32 getUnackedListSize() const { return mUnackedListSize; } - const char* getCurrentSMessageName() const { return mCurrentSMessageName; } - const char* getCurrentSBlockName() const { return mCurrentSBlockName; } + //const char* getCurrentSMessageName() const { return mCurrentSMessageName; } + //const char* getCurrentSBlockName() const { return mCurrentSBlockName; } // friends friend std::ostream& operator<<(std::ostream& s, LLMessageSystem &msg); @@ -656,25 +595,41 @@ public: void setMaxMessageCounts(const S32 num); // Max number of messages before dumping (neg to disable) // statics -public: + static BOOL isTemplateConfirmed(); + static BOOL doesTemplateMatch(); + static void sendMessageTemplateChecksum(const LLHost&); + static void processMessageTemplateChecksumReply(LLMessageSystem *msg, + void** user_data); + static void sendSecureMessageTemplateChecksum(const LLHost&); + static void processSecureTemplateChecksumReply(LLMessageSystem *msg, + void** user_data); static U64 getMessageTimeUsecs(const BOOL update = FALSE); // Get the current message system time in microseconds static F64 getMessageTimeSeconds(const BOOL update = FALSE); // Get the current message system time in seconds - static void setTimeDecodes( BOOL b ) - { LLMessageSystem::mTimeDecodes = b; } - - static void setTimeDecodesSpamThreshold( F32 seconds ) - { LLMessageSystem::mTimeDecodesSpamThreshold = seconds; } + static void setTimeDecodes(BOOL b); + static void setTimeDecodesSpamThreshold(F32 seconds); // message handlers internal to the message systesm //static void processAssignCircuitCode(LLMessageSystem* msg, void**); static void processAddCircuitCode(LLMessageSystem* msg, void**); static void processUseCircuitCode(LLMessageSystem* msg, void**); + // dispatch llsd message to http node tree + static void dispatch(const std::string& msg_name, + const LLSD& message); + static void dispatch(const std::string& msg_name, + const LLSD& message, + LLHTTPNode::ResponsePtr responsep); + void setMessageBans(const LLSD& trusted, const LLSD& untrusted); + + // Check UDP messages and pump http_pump to receive HTTP messages. + bool checkAllMessages(S64 frame_count, LLPumpIO* http_pump); private: // data used in those internal handlers + BOOL mTemplateConfirmed; + BOOL mTemplateMatches; // The mCircuitCodes is a map from circuit codes to session // ids. This allows us to verify sessions on connect. @@ -685,7 +640,6 @@ private: // that no one gives them a bad circuit code. LLUUID mSessionID; -private: void addTemplate(LLMessageTemplate *templatep); void clearReceiveState(); BOOL decodeTemplate( const U8* buffer, S32 buffer_size, LLMessageTemplate** msg_template ); @@ -695,7 +649,6 @@ private: void logValidMsg(LLCircuitData *cdp, const LLHost& sender, BOOL recv_reliable, BOOL recv_resent, BOOL recv_acks ); void logRanOffEndOfPacket( const LLHost& sender ); -private: class LLMessageCountInfo { public: @@ -711,26 +664,10 @@ private: S32 mTrueReceiveSize; // Must be valid during decode - S32 mReceiveSize; - TPACKETID mCurrentRecvPacketID; // packet ID of current receive packet (for reporting) - LLMessageTemplate *mCurrentRMessageTemplate; - LLMsgData *mCurrentRMessageData; - S32 mIncomingCompressedSize; // original size of compressed msg (0 if uncomp.) - LLHost mLastSender; - - // send message storage - LLMsgData *mCurrentSMessageData; - LLMessageTemplate *mCurrentSMessageTemplate; - LLMsgBlkData *mCurrentSDataBlock; - char *mCurrentSMessageName; - char *mCurrentSBlockName; - + BOOL mbError; S32 mErrorCode; - BOOL mbSBuilt; // is send message built? - BOOL mbSClear; // is the send message clear? - F64 mResendDumpTime; // The last time we dumped resends LLMessageCountInfo mMessageCountList[MAX_MESSAGE_COUNT_NUM]; @@ -753,16 +690,31 @@ private: static F32 mTimeDecodesSpamThreshold; // If mTimeDecodes is on, all this many seconds for each msg decode before spamming static BOOL mTimeDecodes; // Measure time for all message decodes if TRUE; + msg_timing_callback mTimingCallback; + void* mTimingCallbackData; + void init(); // ctor shared initialisation. + + LLHost mLastSender; + S32 mIncomingCompressedSize; // original size of compressed msg (0 if uncomp.) + TPACKETID mCurrentRecvPacketID; // packet ID of current receive packet (for reporting) + + LLMessageBuilder* mMessageBuilder; + LLTemplateMessageBuilder* mTemplateMessageBuilder; + LLSDMessageBuilder* mLLSDMessageBuilder; + LLMessageReader* mMessageReader; + LLTemplateMessageReader* mTemplateMessageReader; + LLSDMessageReader* mLLSDMessageReader; + + friend class LLMessageHandlerBridge; + + bool callHandler(const char *name, bool trustedSource, + LLMessageSystem* msg); }; // external hook into messaging system extern LLMessageSystem *gMessageSystem; -//extern const char* MESSAGE_LOG_FILENAME; - -void encrypt_template(const char *src_name, const char *dest_name); -BOOL decrypt_template(const char *src_name, const char *dest_name); // Must specific overall system version, which is used to determine // if a patch is available in the message template checksum verification. @@ -774,7 +726,8 @@ BOOL start_messaging_system( S32 version_minor, S32 version_patch, BOOL b_dump_prehash_file, - const std::string& secret); + const std::string& secret, + const LLUseCircuitCodeResponder* responder = NULL); void end_messaging_system(); @@ -950,12 +903,9 @@ inline void *ntohmemcpy(void *s, const void *ct, EMsgVariableType type, size_t n } -inline const LLHost& LLMessageSystem::getSender() const -{ - return mLastSender; -} +inline const LLHost& LLMessageSystem::getSender() const {return mLastSender;} -inline U32 LLMessageSystem::getSenderIP() const +inline U32 LLMessageSystem::getSenderIP() const { return mLastSender.getAddress(); } @@ -965,308 +915,13 @@ inline U32 LLMessageSystem::getSenderPort() const return mLastSender.getPort(); } -inline void LLMessageSystem::addS8Fast(const char *varname, S8 s) -{ - addDataFast(varname, &s, MVT_S8, sizeof(s)); -} - -inline void LLMessageSystem::addS8(const char *varname, S8 s) -{ - addDataFast(gMessageStringTable.getString(varname), &s, MVT_S8, sizeof(s)); -} - -inline void LLMessageSystem::addU8Fast(const char *varname, U8 u) -{ - addDataFast(varname, &u, MVT_U8, sizeof(u)); -} - -inline void LLMessageSystem::addU8(const char *varname, U8 u) -{ - addDataFast(gMessageStringTable.getString(varname), &u, MVT_U8, sizeof(u)); -} - -inline void LLMessageSystem::addS16Fast(const char *varname, S16 i) -{ - addDataFast(varname, &i, MVT_S16, sizeof(i)); -} - -inline void LLMessageSystem::addS16(const char *varname, S16 i) -{ - addDataFast(gMessageStringTable.getString(varname), &i, MVT_S16, sizeof(i)); -} - -inline void LLMessageSystem::addU16Fast(const char *varname, U16 i) -{ - addDataFast(varname, &i, MVT_U16, sizeof(i)); -} - -inline void LLMessageSystem::addU16(const char *varname, U16 i) -{ - addDataFast(gMessageStringTable.getString(varname), &i, MVT_U16, sizeof(i)); -} - -inline void LLMessageSystem::addF32Fast(const char *varname, F32 f) -{ - addDataFast(varname, &f, MVT_F32, sizeof(f)); -} - -inline void LLMessageSystem::addF32(const char *varname, F32 f) -{ - addDataFast(gMessageStringTable.getString(varname), &f, MVT_F32, sizeof(f)); -} - -inline void LLMessageSystem::addS32Fast(const char *varname, S32 s) -{ - addDataFast(varname, &s, MVT_S32, sizeof(s)); -} - -inline void LLMessageSystem::addS32(const char *varname, S32 s) -{ - addDataFast(gMessageStringTable.getString(varname), &s, MVT_S32, sizeof(s)); -} - -inline void LLMessageSystem::addU32Fast(const char *varname, U32 u) -{ - addDataFast(varname, &u, MVT_U32, sizeof(u)); -} - -inline void LLMessageSystem::addU32(const char *varname, U32 u) -{ - addDataFast(gMessageStringTable.getString(varname), &u, MVT_U32, sizeof(u)); -} - -inline void LLMessageSystem::addU64Fast(const char *varname, U64 lu) -{ - addDataFast(varname, &lu, MVT_U64, sizeof(lu)); -} - -inline void LLMessageSystem::addU64(const char *varname, U64 lu) -{ - addDataFast(gMessageStringTable.getString(varname), &lu, MVT_U64, sizeof(lu)); -} - -inline void LLMessageSystem::addF64Fast(const char *varname, F64 d) -{ - addDataFast(varname, &d, MVT_F64, sizeof(d)); -} - -inline void LLMessageSystem::addF64(const char *varname, F64 d) -{ - addDataFast(gMessageStringTable.getString(varname), &d, MVT_F64, sizeof(d)); -} - -inline void LLMessageSystem::addIPAddrFast(const char *varname, U32 u) -{ - addDataFast(varname, &u, MVT_IP_ADDR, sizeof(u)); -} - -inline void LLMessageSystem::addIPAddr(const char *varname, U32 u) -{ - addDataFast(gMessageStringTable.getString(varname), &u, MVT_IP_ADDR, sizeof(u)); -} - -inline void LLMessageSystem::addIPPortFast(const char *varname, U16 u) -{ - u = htons(u); - addDataFast(varname, &u, MVT_IP_PORT, sizeof(u)); -} - -inline void LLMessageSystem::addIPPort(const char *varname, U16 u) -{ - u = htons(u); - addDataFast(gMessageStringTable.getString(varname), &u, MVT_IP_PORT, sizeof(u)); -} - -inline void LLMessageSystem::addBOOLFast(const char* varname, BOOL b) -{ - // Can't just cast a BOOL (actually a U32) to a U8. - // In some cases the low order bits will be zero. - U8 temp = (b != 0); - addDataFast(varname, &temp, MVT_BOOL, sizeof(temp)); -} - -inline void LLMessageSystem::addBOOL(const char* varname, BOOL b) -{ - // Can't just cast a BOOL (actually a U32) to a U8. - // In some cases the low order bits will be zero. - U8 temp = (b != 0); - addDataFast(gMessageStringTable.getString(varname), &temp, MVT_BOOL, sizeof(temp)); -} - -inline void LLMessageSystem::addStringFast(const char* varname, const char* s) -{ - if (s) - addDataFast( varname, (void *)s, MVT_VARIABLE, (S32)strlen(s) + 1); /* Flawfinder: ignore */ - else - addDataFast( varname, NULL, MVT_VARIABLE, 0); -} - -inline void LLMessageSystem::addString(const char* varname, const char* s) -{ - if (s) - addDataFast( gMessageStringTable.getString(varname), (void *)s, MVT_VARIABLE, (S32)strlen(s) + 1); /* Flawfinder: ignore */ - else - addDataFast( gMessageStringTable.getString(varname), NULL, MVT_VARIABLE, 0); -} - -inline void LLMessageSystem::addStringFast(const char* varname, const std::string& s) -{ - if (s.size()) - addDataFast( varname, (void *)s.c_str(), MVT_VARIABLE, (S32)(s.size()) + 1); - else - addDataFast( varname, NULL, MVT_VARIABLE, 0); -} - -inline void LLMessageSystem::addString(const char* varname, const std::string& s) -{ - if (s.size()) - addDataFast( gMessageStringTable.getString(varname), (void *)s.c_str(), MVT_VARIABLE, (S32)(s.size()) + 1); - else - addDataFast( gMessageStringTable.getString(varname), NULL, MVT_VARIABLE, 0); -} - - -//----------------------------------------------------------------------------- -// Retrieval aliases -//----------------------------------------------------------------------------- -inline void LLMessageSystem::getS8Fast(const char *block, const char *var, S8 &u, S32 blocknum) -{ - getDataFast(block, var, &u, sizeof(S8), blocknum); -} - -inline void LLMessageSystem::getS8(const char *block, const char *var, S8 &u, S32 blocknum) -{ - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), &u, sizeof(S8), blocknum); -} - -inline void LLMessageSystem::getU8Fast(const char *block, const char *var, U8 &u, S32 blocknum) -{ - getDataFast(block, var, &u, sizeof(U8), blocknum); -} - -inline void LLMessageSystem::getU8(const char *block, const char *var, U8 &u, S32 blocknum) -{ - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), &u, sizeof(U8), blocknum); -} - -inline void LLMessageSystem::getBOOLFast(const char *block, const char *var, BOOL &b, S32 blocknum ) -{ - U8 value; - getDataFast(block, var, &value, sizeof(U8), blocknum); - b = (BOOL) value; -} - -inline void LLMessageSystem::getBOOL(const char *block, const char *var, BOOL &b, S32 blocknum ) -{ - U8 value; - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), &value, sizeof(U8), blocknum); - b = (BOOL) value; -} - -inline void LLMessageSystem::getS16Fast(const char *block, const char *var, S16 &d, S32 blocknum) -{ - getDataFast(block, var, &d, sizeof(S16), blocknum); -} - -inline void LLMessageSystem::getS16(const char *block, const char *var, S16 &d, S32 blocknum) -{ - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), &d, sizeof(S16), blocknum); -} - -inline void LLMessageSystem::getU16Fast(const char *block, const char *var, U16 &d, S32 blocknum) -{ - getDataFast(block, var, &d, sizeof(U16), blocknum); -} - -inline void LLMessageSystem::getU16(const char *block, const char *var, U16 &d, S32 blocknum) -{ - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), &d, sizeof(U16), blocknum); -} - -inline void LLMessageSystem::getS32Fast(const char *block, const char *var, S32 &d, S32 blocknum) -{ - getDataFast(block, var, &d, sizeof(S32), blocknum); -} - -inline void LLMessageSystem::getS32(const char *block, const char *var, S32 &d, S32 blocknum) -{ - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), &d, sizeof(S32), blocknum); -} - -inline void LLMessageSystem::getU32Fast(const char *block, const char *var, U32 &d, S32 blocknum) -{ - getDataFast(block, var, &d, sizeof(U32), blocknum); -} - -inline void LLMessageSystem::getU32(const char *block, const char *var, U32 &d, S32 blocknum) -{ - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), &d, sizeof(U32), blocknum); -} - -inline void LLMessageSystem::getU64Fast(const char *block, const char *var, U64 &d, S32 blocknum) -{ - getDataFast(block, var, &d, sizeof(U64), blocknum); -} - -inline void LLMessageSystem::getU64(const char *block, const char *var, U64 &d, S32 blocknum) -{ - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), &d, sizeof(U64), blocknum); -} - - -inline void LLMessageSystem::getIPAddrFast(const char *block, const char *var, U32 &u, S32 blocknum) -{ - getDataFast(block, var, &u, sizeof(U32), blocknum); -} - -inline void LLMessageSystem::getIPAddr(const char *block, const char *var, U32 &u, S32 blocknum) -{ - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), &u, sizeof(U32), blocknum); -} - -inline void LLMessageSystem::getIPPortFast(const char *block, const char *var, U16 &u, S32 blocknum) -{ - getDataFast(block, var, &u, sizeof(U16), blocknum); - u = ntohs(u); -} - -inline void LLMessageSystem::getIPPort(const char *block, const char *var, U16 &u, S32 blocknum) -{ - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), &u, sizeof(U16), blocknum); - u = ntohs(u); -} - - -inline void LLMessageSystem::getStringFast(const char *block, const char *var, S32 buffer_size, char *s, S32 blocknum ) -{ - s[0] = '\0'; - getDataFast(block, var, s, 0, blocknum, buffer_size); - s[buffer_size - 1] = '\0'; -} - -inline void LLMessageSystem::getString(const char *block, const char *var, S32 buffer_size, char *s, S32 blocknum ) -{ - s[0] = '\0'; - getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), s, 0, blocknum, buffer_size); - s[buffer_size - 1] = '\0'; -} - //----------------------------------------------------------------------------- // Transmission aliases //----------------------------------------------------------------------------- -//inline S32 LLMessageSystem::sendMessage(U32 ip, U32 port, BOOL zero_code) -//{ -// return sendMessage(LLHost(ip, port), zero_code); -//} - -//inline S32 LLMessageSystem::sendMessage(const char *ip_str, U32 port, BOOL zero_code) -//{ -// return sendMessage(LLHost(ip_str, port), zero_code); -//} -inline S32 LLMessageSystem::sendMessage(const U32 circuit)//, BOOL zero_code) +inline S32 LLMessageSystem::sendMessage(const U32 circuit) { - return sendMessage(findHost(circuit));//, zero_code); + return sendMessage(findHost(circuit)); } #endif diff --git a/linden/indra/llmessage/message_prehash.cpp b/linden/indra/llmessage/message_prehash.cpp index ef01c82..39b3737 100644 --- a/linden/indra/llmessage/message_prehash.cpp +++ b/linden/indra/llmessage/message_prehash.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -39,7 +40,6 @@ char * _PREHASH_X; char * _PREHASH_Y; char * _PREHASH_Z; char * _PREHASH_AddFlags; -char * _PREHASH_ReservedNewbie; char * _PREHASH_FailureInfo; char * _PREHASH_MapData; char * _PREHASH_AddItem; @@ -108,7 +108,6 @@ char * _PREHASH_RelatedRights; char * _PREHASH_RedirectGridX; char * _PREHASH_RedirectGridY; char * _PREHASH_TransferID; -char * _PREHASH_Transacted; char * _PREHASH_TexturesChanged; char * _PREHASH_UserLookAt; char * _PREHASH_TestBlock1; @@ -135,7 +134,6 @@ char * _PREHASH_SetSimStatusInDatabase; char * _PREHASH_SetSimPresenceInDatabase; char * _PREHASH_CameraProperty; char * _PREHASH_BrushSize; -char * _PREHASH_StartExpungeProcess; char * _PREHASH_SimulatorSetMap; char * _PREHASH_RegionPresenceRequestByRegionID; char * _PREHASH_ParcelObjectOwnersReply; @@ -229,8 +227,8 @@ char * _PREHASH_SimName; char * _PREHASH_UserReport; char * _PREHASH_DownloadPriority; char * _PREHASH_ToAgentId; -char * _PREHASH_Mag; char * _PREHASH_DirPopularQuery; +char * _PREHASH_Mag; char * _PREHASH_ParcelPropertiesRequestByID; char * _PREHASH_ObjectLink; char * _PREHASH_RpcScriptReplyInbound; @@ -439,7 +437,6 @@ char * _PREHASH_TerminateFriendship; char * _PREHASH_TaskData; char * _PREHASH_SimWideMaxPrims; char * _PREHASH_TotalPrims; -char * _PREHASH_SourceFilename; char * _PREHASH_ProfileBegin; char * _PREHASH_MoneyDetailsRequest; char * _PREHASH_Request; @@ -486,7 +483,6 @@ char * _PREHASH_ParamInUse; char * _PREHASH_GodKickUser; char * _PREHASH_PickName; char * _PREHASH_TaskName; -char * _PREHASH_ParcelGodReserveForNewbie; char * _PREHASH_SubType; char * _PREHASH_ObjectCount; char * _PREHASH_RegionPresenceRequestByHandle; @@ -505,10 +501,13 @@ char * _PREHASH_UpdateParcel; char * _PREHASH_ClearAgentSessions; char * _PREHASH_SetAlwaysRun; char * _PREHASH_NVPair; +char * _PREHASH_SearchType; char * _PREHASH_ObjectSpinStart; char * _PREHASH_UseEstateSun; char * _PREHASH_LogoutBlock; +char * _PREHASH_RelayLogControl; char * _PREHASH_RegionID; +char * _PREHASH_AbuseRegionID; char * _PREHASH_Creator; char * _PREHASH_ProposalText; char * _PREHASH_DirEventsReply; @@ -553,7 +552,6 @@ char * _PREHASH_MaxY; char * _PREHASH_TextureAnim; char * _PREHASH_ReturnIDs; char * _PREHASH_Date; -char * _PREHASH_GestureUpdate; char * _PREHASH_AgentWearablesUpdate; char * _PREHASH_AgentDataUpdate; char * _PREHASH_Hash; @@ -575,7 +573,6 @@ char * _PREHASH_HistoryItemData; char * _PREHASH_AgentCachedTexture; char * _PREHASH_Subject; char * _PREHASH_East; -char * _PREHASH_GodExpungeUser; char * _PREHASH_QueryReplies; char * _PREHASH_ObjectCategory; char * _PREHASH_Time; @@ -802,6 +799,7 @@ char * _PREHASH_UnsubscribeLoad; char * _PREHASH_Packet; char * _PREHASH_UndoLand; char * _PREHASH_SimAccess; +char * _PREHASH_AbuserID; char * _PREHASH_MembershipFee; char * _PREHASH_InviteGroupResponse; char * _PREHASH_CreateInventoryFolder; @@ -939,6 +937,7 @@ char * _PREHASH_ImageNotInDatabase; char * _PREHASH_StartDate; char * _PREHASH_AnimID; char * _PREHASH_Serial; +char * _PREHASH_AbuseRegionName; char * _PREHASH_ControlPort; char * _PREHASH_ModifyLand; char * _PREHASH_Digest; @@ -1003,11 +1002,11 @@ char * _PREHASH_EventFlags; char * _PREHASH_TallyVotes; char * _PREHASH_Result; char * _PREHASH_LookAt; +char * _PREHASH_SearchOrder; char * _PREHASH_PayButton; char * _PREHASH_SelfCount; char * _PREHASH_PacketCount; char * _PREHASH_ParcelBuyPass; -char * _PREHASH_Identified; char * _PREHASH_OldItemID; char * _PREHASH_RegionPort; char * _PREHASH_PriceEnergyUnit; @@ -1043,7 +1042,6 @@ char * _PREHASH_EconomyDataRequest; char * _PREHASH_TeleportLureRequest; char * _PREHASH_FolderID; char * _PREHASH_RegionHandleRequest; -char * _PREHASH_GestureRequest; char * _PREHASH_ScriptDataRequest; char * _PREHASH_GroupRoleDataRequest; char * _PREHASH_GroupTitlesRequest; @@ -1187,11 +1185,9 @@ char * _PREHASH_Ratio; char * _PREHASH_JoinGroupReply; char * _PREHASH_LiveHelpGroupReply; char * _PREHASH_Score; -char * _PREHASH_ExpungeData; char * _PREHASH_Image; char * _PREHASH_ObjectClickAction; char * _PREHASH_Delta; -char * _PREHASH_InitiateUpload; char * _PREHASH_Parameter; char * _PREHASH_Flags; char * _PREHASH_Plane; @@ -1227,7 +1223,6 @@ char * _PREHASH_Disconnect; char * _PREHASH_SimPosition; char * _PREHASH_SimWideTotalPrims; char * _PREHASH_Index; -char * _PREHASH_BaseFilename; char * _PREHASH_SimFilename; char * _PREHASH_LastOwnerID; char * _PREHASH_GroupNoticeRequest; @@ -1312,6 +1307,7 @@ char * _PREHASH_AssetBlock; char * _PREHASH_AcceptNotices; char * _PREHASH_SetGroupAcceptNotices; char * _PREHASH_CloseCircuit; +char * _PREHASH_LogControl; char * _PREHASH_TeleportFinish; char * _PREHASH_PathRevolutions; char * _PREHASH_ClassifiedInfoReply; @@ -1491,7 +1487,6 @@ char * _PREHASH_DirLandReply; char * _PREHASH_SpaceLocationTeleportReply; char * _PREHASH_MuteType; char * _PREHASH_IMViaEMail; -char * _PREHASH_StartExpungeProcessAck; char * _PREHASH_RentPrice; char * _PREHASH_GenericMessage; char * _PREHASH_ChildAgentAlive; @@ -1511,7 +1506,6 @@ void init_prehash_data() _PREHASH_Y = gMessageStringTable.getString("Y"); _PREHASH_Z = gMessageStringTable.getString("Z"); _PREHASH_AddFlags = gMessageStringTable.getString("AddFlags"); - _PREHASH_ReservedNewbie = gMessageStringTable.getString("ReservedNewbie"); _PREHASH_FailureInfo = gMessageStringTable.getString("FailureInfo"); _PREHASH_MapData = gMessageStringTable.getString("MapData"); _PREHASH_AddItem = gMessageStringTable.getString("AddItem"); @@ -1580,7 +1574,6 @@ void init_prehash_data() _PREHASH_RedirectGridX = gMessageStringTable.getString("RedirectGridX"); _PREHASH_RedirectGridY = gMessageStringTable.getString("RedirectGridY"); _PREHASH_TransferID = gMessageStringTable.getString("TransferID"); - _PREHASH_Transacted = gMessageStringTable.getString("Transacted"); _PREHASH_TexturesChanged = gMessageStringTable.getString("TexturesChanged"); _PREHASH_UserLookAt = gMessageStringTable.getString("UserLookAt"); _PREHASH_TestBlock1 = gMessageStringTable.getString("TestBlock1"); @@ -1607,7 +1600,6 @@ void init_prehash_data() _PREHASH_SetSimPresenceInDatabase = gMessageStringTable.getString("SetSimPresenceInDatabase"); _PREHASH_CameraProperty = gMessageStringTable.getString("CameraProperty"); _PREHASH_BrushSize = gMessageStringTable.getString("BrushSize"); - _PREHASH_StartExpungeProcess = gMessageStringTable.getString("StartExpungeProcess"); _PREHASH_SimulatorSetMap = gMessageStringTable.getString("SimulatorSetMap"); _PREHASH_RegionPresenceRequestByRegionID = gMessageStringTable.getString("RegionPresenceRequestByRegionID"); _PREHASH_ParcelObjectOwnersReply = gMessageStringTable.getString("ParcelObjectOwnersReply"); @@ -1701,8 +1693,8 @@ void init_prehash_data() _PREHASH_UserReport = gMessageStringTable.getString("UserReport"); _PREHASH_DownloadPriority = gMessageStringTable.getString("DownloadPriority"); _PREHASH_ToAgentId = gMessageStringTable.getString("ToAgentId"); - _PREHASH_Mag = gMessageStringTable.getString("Mag"); _PREHASH_DirPopularQuery = gMessageStringTable.getString("DirPopularQuery"); + _PREHASH_Mag = gMessageStringTable.getString("Mag"); _PREHASH_ParcelPropertiesRequestByID = gMessageStringTable.getString("ParcelPropertiesRequestByID"); _PREHASH_ObjectLink = gMessageStringTable.getString("ObjectLink"); _PREHASH_RpcScriptReplyInbound = gMessageStringTable.getString("RpcScriptReplyInbound"); @@ -1911,7 +1903,6 @@ void init_prehash_data() _PREHASH_TaskData = gMessageStringTable.getString("TaskData"); _PREHASH_SimWideMaxPrims = gMessageStringTable.getString("SimWideMaxPrims"); _PREHASH_TotalPrims = gMessageStringTable.getString("TotalPrims"); - _PREHASH_SourceFilename = gMessageStringTable.getString("SourceFilename"); _PREHASH_ProfileBegin = gMessageStringTable.getString("ProfileBegin"); _PREHASH_MoneyDetailsRequest = gMessageStringTable.getString("MoneyDetailsRequest"); _PREHASH_Request = gMessageStringTable.getString("Request"); @@ -1958,7 +1949,6 @@ void init_prehash_data() _PREHASH_GodKickUser = gMessageStringTable.getString("GodKickUser"); _PREHASH_PickName = gMessageStringTable.getString("PickName"); _PREHASH_TaskName = gMessageStringTable.getString("TaskName"); - _PREHASH_ParcelGodReserveForNewbie = gMessageStringTable.getString("ParcelGodReserveForNewbie"); _PREHASH_SubType = gMessageStringTable.getString("SubType"); _PREHASH_ObjectCount = gMessageStringTable.getString("ObjectCount"); _PREHASH_RegionPresenceRequestByHandle = gMessageStringTable.getString("RegionPresenceRequestByHandle"); @@ -1977,10 +1967,13 @@ void init_prehash_data() _PREHASH_ClearAgentSessions = gMessageStringTable.getString("ClearAgentSessions"); _PREHASH_SetAlwaysRun = gMessageStringTable.getString("SetAlwaysRun"); _PREHASH_NVPair = gMessageStringTable.getString("NVPair"); + _PREHASH_SearchType = gMessageStringTable.getString("SearchType"); _PREHASH_ObjectSpinStart = gMessageStringTable.getString("ObjectSpinStart"); _PREHASH_UseEstateSun = gMessageStringTable.getString("UseEstateSun"); _PREHASH_LogoutBlock = gMessageStringTable.getString("LogoutBlock"); + _PREHASH_RelayLogControl = gMessageStringTable.getString("RelayLogControl"); _PREHASH_RegionID = gMessageStringTable.getString("RegionID"); + _PREHASH_AbuseRegionID = gMessageStringTable.getString("AbuseRegionID"); _PREHASH_Creator = gMessageStringTable.getString("Creator"); _PREHASH_ProposalText = gMessageStringTable.getString("ProposalText"); _PREHASH_DirEventsReply = gMessageStringTable.getString("DirEventsReply"); @@ -2025,7 +2018,6 @@ void init_prehash_data() _PREHASH_TextureAnim = gMessageStringTable.getString("TextureAnim"); _PREHASH_ReturnIDs = gMessageStringTable.getString("ReturnIDs"); _PREHASH_Date = gMessageStringTable.getString("Date"); - _PREHASH_GestureUpdate = gMessageStringTable.getString("GestureUpdate"); _PREHASH_AgentWearablesUpdate = gMessageStringTable.getString("AgentWearablesUpdate"); _PREHASH_AgentDataUpdate = gMessageStringTable.getString("AgentDataUpdate"); _PREHASH_Hash = gMessageStringTable.getString("Hash"); @@ -2047,7 +2039,6 @@ void init_prehash_data() _PREHASH_AgentCachedTexture = gMessageStringTable.getString("AgentCachedTexture"); _PREHASH_Subject = gMessageStringTable.getString("Subject"); _PREHASH_East = gMessageStringTable.getString("East"); - _PREHASH_GodExpungeUser = gMessageStringTable.getString("GodExpungeUser"); _PREHASH_QueryReplies = gMessageStringTable.getString("QueryReplies"); _PREHASH_ObjectCategory = gMessageStringTable.getString("ObjectCategory"); _PREHASH_Time = gMessageStringTable.getString("Time"); @@ -2274,6 +2265,7 @@ void init_prehash_data() _PREHASH_Packet = gMessageStringTable.getString("Packet"); _PREHASH_UndoLand = gMessageStringTable.getString("UndoLand"); _PREHASH_SimAccess = gMessageStringTable.getString("SimAccess"); + _PREHASH_AbuserID = gMessageStringTable.getString("AbuserID"); _PREHASH_MembershipFee = gMessageStringTable.getString("MembershipFee"); _PREHASH_InviteGroupResponse = gMessageStringTable.getString("InviteGroupResponse"); _PREHASH_CreateInventoryFolder = gMessageStringTable.getString("CreateInventoryFolder"); @@ -2411,6 +2403,7 @@ void init_prehash_data() _PREHASH_StartDate = gMessageStringTable.getString("StartDate"); _PREHASH_AnimID = gMessageStringTable.getString("AnimID"); _PREHASH_Serial = gMessageStringTable.getString("Serial"); + _PREHASH_AbuseRegionName = gMessageStringTable.getString("AbuseRegionName"); _PREHASH_ControlPort = gMessageStringTable.getString("ControlPort"); _PREHASH_ModifyLand = gMessageStringTable.getString("ModifyLand"); _PREHASH_Digest = gMessageStringTable.getString("Digest"); @@ -2475,11 +2468,11 @@ void init_prehash_data() _PREHASH_TallyVotes = gMessageStringTable.getString("TallyVotes"); _PREHASH_Result = gMessageStringTable.getString("Result"); _PREHASH_LookAt = gMessageStringTable.getString("LookAt"); + _PREHASH_SearchOrder = gMessageStringTable.getString("SearchOrder"); _PREHASH_PayButton = gMessageStringTable.getString("PayButton"); _PREHASH_SelfCount = gMessageStringTable.getString("SelfCount"); _PREHASH_PacketCount = gMessageStringTable.getString("PacketCount"); _PREHASH_ParcelBuyPass = gMessageStringTable.getString("ParcelBuyPass"); - _PREHASH_Identified = gMessageStringTable.getString("Identified"); _PREHASH_OldItemID = gMessageStringTable.getString("OldItemID"); _PREHASH_RegionPort = gMessageStringTable.getString("RegionPort"); _PREHASH_PriceEnergyUnit = gMessageStringTable.getString("PriceEnergyUnit"); @@ -2515,7 +2508,6 @@ void init_prehash_data() _PREHASH_TeleportLureRequest = gMessageStringTable.getString("TeleportLureRequest"); _PREHASH_FolderID = gMessageStringTable.getString("FolderID"); _PREHASH_RegionHandleRequest = gMessageStringTable.getString("RegionHandleRequest"); - _PREHASH_GestureRequest = gMessageStringTable.getString("GestureRequest"); _PREHASH_ScriptDataRequest = gMessageStringTable.getString("ScriptDataRequest"); _PREHASH_GroupRoleDataRequest = gMessageStringTable.getString("GroupRoleDataRequest"); _PREHASH_GroupTitlesRequest = gMessageStringTable.getString("GroupTitlesRequest"); @@ -2659,11 +2651,9 @@ void init_prehash_data() _PREHASH_JoinGroupReply = gMessageStringTable.getString("JoinGroupReply"); _PREHASH_LiveHelpGroupReply = gMessageStringTable.getString("LiveHelpGroupReply"); _PREHASH_Score = gMessageStringTable.getString("Score"); - _PREHASH_ExpungeData = gMessageStringTable.getString("ExpungeData"); _PREHASH_Image = gMessageStringTable.getString("Image"); _PREHASH_ObjectClickAction = gMessageStringTable.getString("ObjectClickAction"); _PREHASH_Delta = gMessageStringTable.getString("Delta"); - _PREHASH_InitiateUpload = gMessageStringTable.getString("InitiateUpload"); _PREHASH_Parameter = gMessageStringTable.getString("Parameter"); _PREHASH_Flags = gMessageStringTable.getString("Flags"); _PREHASH_Plane = gMessageStringTable.getString("Plane"); @@ -2699,7 +2689,6 @@ void init_prehash_data() _PREHASH_SimPosition = gMessageStringTable.getString("SimPosition"); _PREHASH_SimWideTotalPrims = gMessageStringTable.getString("SimWideTotalPrims"); _PREHASH_Index = gMessageStringTable.getString("Index"); - _PREHASH_BaseFilename = gMessageStringTable.getString("BaseFilename"); _PREHASH_SimFilename = gMessageStringTable.getString("SimFilename"); _PREHASH_LastOwnerID = gMessageStringTable.getString("LastOwnerID"); _PREHASH_GroupNoticeRequest = gMessageStringTable.getString("GroupNoticeRequest"); @@ -2784,6 +2773,7 @@ void init_prehash_data() _PREHASH_AcceptNotices = gMessageStringTable.getString("AcceptNotices"); _PREHASH_SetGroupAcceptNotices = gMessageStringTable.getString("SetGroupAcceptNotices"); _PREHASH_CloseCircuit = gMessageStringTable.getString("CloseCircuit"); + _PREHASH_LogControl = gMessageStringTable.getString("LogControl"); _PREHASH_TeleportFinish = gMessageStringTable.getString("TeleportFinish"); _PREHASH_PathRevolutions = gMessageStringTable.getString("PathRevolutions"); _PREHASH_ClassifiedInfoReply = gMessageStringTable.getString("ClassifiedInfoReply"); @@ -2963,7 +2953,6 @@ void init_prehash_data() _PREHASH_SpaceLocationTeleportReply = gMessageStringTable.getString("SpaceLocationTeleportReply"); _PREHASH_MuteType = gMessageStringTable.getString("MuteType"); _PREHASH_IMViaEMail = gMessageStringTable.getString("IMViaEMail"); - _PREHASH_StartExpungeProcessAck = gMessageStringTable.getString("StartExpungeProcessAck"); _PREHASH_RentPrice = gMessageStringTable.getString("RentPrice"); _PREHASH_GenericMessage = gMessageStringTable.getString("GenericMessage"); _PREHASH_ChildAgentAlive = gMessageStringTable.getString("ChildAgentAlive"); diff --git a/linden/indra/llmessage/message_prehash.h b/linden/indra/llmessage/message_prehash.h index 9cb4884..84c769e 100644 --- a/linden/indra/llmessage/message_prehash.h +++ b/linden/indra/llmessage/message_prehash.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -39,7 +40,6 @@ extern char * _PREHASH_X; extern char * _PREHASH_Y; extern char * _PREHASH_Z; extern char * _PREHASH_AddFlags; -extern char * _PREHASH_ReservedNewbie; extern char * _PREHASH_FailureInfo; extern char * _PREHASH_MapData; extern char * _PREHASH_AddItem; @@ -108,7 +108,6 @@ extern char * _PREHASH_RelatedRights; extern char * _PREHASH_RedirectGridX; extern char * _PREHASH_RedirectGridY; extern char * _PREHASH_TransferID; -extern char * _PREHASH_Transacted; extern char * _PREHASH_TexturesChanged; extern char * _PREHASH_UserLookAt; extern char * _PREHASH_TestBlock1; @@ -135,7 +134,6 @@ extern char * _PREHASH_SetSimStatusInDatabase; extern char * _PREHASH_SetSimPresenceInDatabase; extern char * _PREHASH_CameraProperty; extern char * _PREHASH_BrushSize; -extern char * _PREHASH_StartExpungeProcess; extern char * _PREHASH_SimulatorSetMap; extern char * _PREHASH_RegionPresenceRequestByRegionID; extern char * _PREHASH_ParcelObjectOwnersReply; @@ -229,8 +227,8 @@ extern char * _PREHASH_SimName; extern char * _PREHASH_UserReport; extern char * _PREHASH_DownloadPriority; extern char * _PREHASH_ToAgentId; -extern char * _PREHASH_Mag; extern char * _PREHASH_DirPopularQuery; +extern char * _PREHASH_Mag; extern char * _PREHASH_ParcelPropertiesRequestByID; extern char * _PREHASH_ObjectLink; extern char * _PREHASH_RpcScriptReplyInbound; @@ -439,7 +437,6 @@ extern char * _PREHASH_TerminateFriendship; extern char * _PREHASH_TaskData; extern char * _PREHASH_SimWideMaxPrims; extern char * _PREHASH_TotalPrims; -extern char * _PREHASH_SourceFilename; extern char * _PREHASH_ProfileBegin; extern char * _PREHASH_MoneyDetailsRequest; extern char * _PREHASH_Request; @@ -486,7 +483,6 @@ extern char * _PREHASH_ParamInUse; extern char * _PREHASH_GodKickUser; extern char * _PREHASH_PickName; extern char * _PREHASH_TaskName; -extern char * _PREHASH_ParcelGodReserveForNewbie; extern char * _PREHASH_SubType; extern char * _PREHASH_ObjectCount; extern char * _PREHASH_RegionPresenceRequestByHandle; @@ -505,10 +501,13 @@ extern char * _PREHASH_UpdateParcel; extern char * _PREHASH_ClearAgentSessions; extern char * _PREHASH_SetAlwaysRun; extern char * _PREHASH_NVPair; +extern char * _PREHASH_SearchType; extern char * _PREHASH_ObjectSpinStart; extern char * _PREHASH_UseEstateSun; extern char * _PREHASH_LogoutBlock; +extern char * _PREHASH_RelayLogControl; extern char * _PREHASH_RegionID; +extern char * _PREHASH_AbuseRegionID; extern char * _PREHASH_Creator; extern char * _PREHASH_ProposalText; extern char * _PREHASH_DirEventsReply; @@ -553,7 +552,6 @@ extern char * _PREHASH_MaxY; extern char * _PREHASH_TextureAnim; extern char * _PREHASH_ReturnIDs; extern char * _PREHASH_Date; -extern char * _PREHASH_GestureUpdate; extern char * _PREHASH_AgentWearablesUpdate; extern char * _PREHASH_AgentDataUpdate; extern char * _PREHASH_Hash; @@ -575,7 +573,6 @@ extern char * _PREHASH_HistoryItemData; extern char * _PREHASH_AgentCachedTexture; extern char * _PREHASH_Subject; extern char * _PREHASH_East; -extern char * _PREHASH_GodExpungeUser; extern char * _PREHASH_QueryReplies; extern char * _PREHASH_ObjectCategory; extern char * _PREHASH_Time; @@ -802,6 +799,7 @@ extern char * _PREHASH_UnsubscribeLoad; extern char * _PREHASH_Packet; extern char * _PREHASH_UndoLand; extern char * _PREHASH_SimAccess; +extern char * _PREHASH_AbuserID; extern char * _PREHASH_MembershipFee; extern char * _PREHASH_InviteGroupResponse; extern char * _PREHASH_CreateInventoryFolder; @@ -939,6 +937,7 @@ extern char * _PREHASH_ImageNotInDatabase; extern char * _PREHASH_StartDate; extern char * _PREHASH_AnimID; extern char * _PREHASH_Serial; +extern char * _PREHASH_AbuseRegionName; extern char * _PREHASH_ControlPort; extern char * _PREHASH_ModifyLand; extern char * _PREHASH_Digest; @@ -1003,11 +1002,11 @@ extern char * _PREHASH_EventFlags; extern char * _PREHASH_TallyVotes; extern char * _PREHASH_Result; extern char * _PREHASH_LookAt; +extern char * _PREHASH_SearchOrder; extern char * _PREHASH_PayButton; extern char * _PREHASH_SelfCount; extern char * _PREHASH_PacketCount; extern char * _PREHASH_ParcelBuyPass; -extern char * _PREHASH_Identified; extern char * _PREHASH_OldItemID; extern char * _PREHASH_RegionPort; extern char * _PREHASH_PriceEnergyUnit; @@ -1043,7 +1042,6 @@ extern char * _PREHASH_EconomyDataRequest; extern char * _PREHASH_TeleportLureRequest; extern char * _PREHASH_FolderID; extern char * _PREHASH_RegionHandleRequest; -extern char * _PREHASH_GestureRequest; extern char * _PREHASH_ScriptDataRequest; extern char * _PREHASH_GroupRoleDataRequest; extern char * _PREHASH_GroupTitlesRequest; @@ -1187,11 +1185,9 @@ extern char * _PREHASH_Ratio; extern char * _PREHASH_JoinGroupReply; extern char * _PREHASH_LiveHelpGroupReply; extern char * _PREHASH_Score; -extern char * _PREHASH_ExpungeData; extern char * _PREHASH_Image; extern char * _PREHASH_ObjectClickAction; extern char * _PREHASH_Delta; -extern char * _PREHASH_InitiateUpload; extern char * _PREHASH_Parameter; extern char * _PREHASH_Flags; extern char * _PREHASH_Plane; @@ -1227,7 +1223,6 @@ extern char * _PREHASH_Disconnect; extern char * _PREHASH_SimPosition; extern char * _PREHASH_SimWideTotalPrims; extern char * _PREHASH_Index; -extern char * _PREHASH_BaseFilename; extern char * _PREHASH_SimFilename; extern char * _PREHASH_LastOwnerID; extern char * _PREHASH_GroupNoticeRequest; @@ -1312,6 +1307,7 @@ extern char * _PREHASH_AssetBlock; extern char * _PREHASH_AcceptNotices; extern char * _PREHASH_SetGroupAcceptNotices; extern char * _PREHASH_CloseCircuit; +extern char * _PREHASH_LogControl; extern char * _PREHASH_TeleportFinish; extern char * _PREHASH_PathRevolutions; extern char * _PREHASH_ClassifiedInfoReply; @@ -1491,7 +1487,6 @@ extern char * _PREHASH_DirLandReply; extern char * _PREHASH_SpaceLocationTeleportReply; extern char * _PREHASH_MuteType; extern char * _PREHASH_IMViaEMail; -extern char * _PREHASH_StartExpungeProcessAck; extern char * _PREHASH_RentPrice; extern char * _PREHASH_GenericMessage; extern char * _PREHASH_ChildAgentAlive; diff --git a/linden/indra/llmessage/message_string_table.cpp b/linden/indra/llmessage/message_string_table.cpp index 7fea048..2ae269b 100644 --- a/linden/indra/llmessage/message_string_table.cpp +++ b/linden/indra/llmessage/message_string_table.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/net.cpp b/linden/indra/llmessage/net.cpp index de19ef8..c61f4a2 100644 --- a/linden/indra/llmessage/net.cpp +++ b/linden/indra/llmessage/net.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -241,6 +242,12 @@ S32 start_net(S32& socket_out, int& nPort) return 4; } } + + sockaddr_in socket_address; + S32 socket_address_size = sizeof(socket_address); + getsockname(hSocket, (SOCKADDR*) &socket_address, &socket_address_size); + attempt_port = ntohs(socket_address.sin_port); + llinfos << "connected on port " << attempt_port << llendl; nPort = attempt_port; diff --git a/linden/indra/llmessage/net.h b/linden/indra/llmessage/net.h index d406006..b2f931f 100644 --- a/linden/indra/llmessage/net.h +++ b/linden/indra/llmessage/net.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/network.cpp b/linden/indra/llmessage/network.cpp index 46e9893..03aad63 100644 --- a/linden/indra/llmessage/network.cpp +++ b/linden/indra/llmessage/network.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/network.h b/linden/indra/llmessage/network.h index 8a20e32..6c6577b 100644 --- a/linden/indra/llmessage/network.h +++ b/linden/indra/llmessage/network.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/partsyspacket.cpp b/linden/indra/llmessage/partsyspacket.cpp index d6ba11e..4750faa 100644 --- a/linden/indra/llmessage/partsyspacket.cpp +++ b/linden/indra/llmessage/partsyspacket.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/partsyspacket.h b/linden/indra/llmessage/partsyspacket.h index 8e10e56..5dbc41c 100644 --- a/linden/indra/llmessage/partsyspacket.h +++ b/linden/indra/llmessage/partsyspacket.h @@ -5,6 +5,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/patch_code.cpp b/linden/indra/llmessage/patch_code.cpp index 3eb2be6..c996899 100644 --- a/linden/indra/llmessage/patch_code.cpp +++ b/linden/indra/llmessage/patch_code.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/patch_code.h b/linden/indra/llmessage/patch_code.h index 28b1839..ba3dea4 100644 --- a/linden/indra/llmessage/patch_code.h +++ b/linden/indra/llmessage/patch_code.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/patch_dct.cpp b/linden/indra/llmessage/patch_dct.cpp index b404c75..0e8aa25 100644 --- a/linden/indra/llmessage/patch_dct.cpp +++ b/linden/indra/llmessage/patch_dct.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/patch_dct.h b/linden/indra/llmessage/patch_dct.h index 5d98921..b69249e 100644 --- a/linden/indra/llmessage/patch_dct.h +++ b/linden/indra/llmessage/patch_dct.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/patch_idct.cpp b/linden/indra/llmessage/patch_idct.cpp index a20641f..680003a 100644 --- a/linden/indra/llmessage/patch_idct.cpp +++ b/linden/indra/llmessage/patch_idct.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llmessage/sound_ids.h b/linden/indra/llmessage/sound_ids.h index 11452c0..2652778 100644 --- a/linden/indra/llmessage/sound_ids.h +++ b/linden/indra/llmessage/sound_ids.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llprimitive/legacy_object_types.h b/linden/indra/llprimitive/legacy_object_types.h index 19af9e6..9cdc632 100644 --- a/linden/indra/llprimitive/legacy_object_types.h +++ b/linden/indra/llprimitive/legacy_object_types.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llprimitive/llmaterialtable.cpp b/linden/indra/llprimitive/llmaterialtable.cpp index 201d0c9..d7ac57a 100644 --- a/linden/indra/llprimitive/llmaterialtable.cpp +++ b/linden/indra/llprimitive/llmaterialtable.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llprimitive/llmaterialtable.h b/linden/indra/llprimitive/llmaterialtable.h index a472274..d9596e1 100644 --- a/linden/indra/llprimitive/llmaterialtable.h +++ b/linden/indra/llprimitive/llmaterialtable.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llprimitive/llprimitive.cpp b/linden/indra/llprimitive/llprimitive.cpp index 859a34f..e2cf7e3 100644 --- a/linden/indra/llprimitive/llprimitive.cpp +++ b/linden/indra/llprimitive/llprimitive.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -733,7 +734,7 @@ const char * LLPrimitive::pCodeToString(const LLPCode pcode) snprintf(pcode_string, sizeof(pcode_string), "text bubble"); /* Flawfinder: ignore */ break; case LL_PCODE_LEGACY_TREE: - snprintf(pcode_string, sizeof(pcode_string), "tree"); /* Flawfinder: ignore */ + snprintf(pcode_string, sizeof(pcode_string), "tree"); /* Flawfinder: ignore */ break; case LL_PCODE_TREE_NEW: snprintf(pcode_string, sizeof(pcode_string), "tree_new"); /* Flawfinder: ignore */ @@ -764,23 +765,23 @@ const char * LLPrimitive::pCodeToString(const LLPCode pcode) } else if (base_code == LL_PCODE_PYRAMID) { - snprintf(shape, sizeof(shape), "pyramid"); /* Flawfinder: ignore */ + snprintf(shape, sizeof(shape), "pyramid"); /* Flawfinder: ignore */ } else if (base_code == LL_PCODE_SPHERE) { - snprintf(shape, sizeof(shape), "sphere"); /* Flawfinder: ignore */ + snprintf(shape, sizeof(shape), "sphere"); /* Flawfinder: ignore */ } else if (base_code == LL_PCODE_TETRAHEDRON) { - snprintf(shape, sizeof(shape), "tetrahedron"); /* Flawfinder: ignore */ + snprintf(shape, sizeof(shape), "tetrahedron"); /* Flawfinder: ignore */ } else if (base_code == LL_PCODE_VOLUME) { - snprintf(shape, sizeof(shape), "volume"); /* Flawfinder: ignore */ + snprintf(shape, sizeof(shape), "volume"); /* Flawfinder: ignore */ } else if (base_code == LL_PCODE_APP) { - snprintf(shape, sizeof(shape), "app"); /* Flawfinder: ignore */ + snprintf(shape, sizeof(shape), "app"); /* Flawfinder: ignore */ } else { @@ -790,15 +791,15 @@ const char * LLPrimitive::pCodeToString(const LLPCode pcode) U8 mask_code = pcode & (~LL_PCODE_BASE_MASK); if (base_code == LL_PCODE_APP) { - snprintf(mask, sizeof(mask), "%x", mask_code); /* Flawfinder: ignore */ + snprintf(mask, sizeof(mask), "%x", mask_code); /* Flawfinder: ignore */ } else if (mask_code & LL_PCODE_HEMI_MASK) { - snprintf(mask, sizeof(mask), "hemi"); /* Flawfinder: ignore */ + snprintf(mask, sizeof(mask), "hemi"); /* Flawfinder: ignore */ } else if (mask != 0) { - snprintf(mask, sizeof(mask), "%x", mask_code); /* Flawfinder: ignore */ + snprintf(mask, sizeof(mask), "%x", mask_code); /* Flawfinder: ignore */ } else { @@ -807,11 +808,11 @@ const char * LLPrimitive::pCodeToString(const LLPCode pcode) if (mask[0]) { - snprintf(pcode_string, sizeof(pcode_string), "%s-%s", shape, mask); /* Flawfinder: ignore */ + snprintf(pcode_string, sizeof(pcode_string), "%s-%s", shape, mask); /* Flawfinder: ignore */ } else { - snprintf(pcode_string, sizeof(pcode_string), "%s", shape); /* Flawfinder: ignore */ + snprintf(pcode_string, sizeof(pcode_string), "%s", shape); /* Flawfinder: ignore */ } } return pcode_string; @@ -1279,8 +1280,8 @@ BOOL LLPrimitive::packTEMessage(LLMessageSystem *mesgsys) const U8 image_ids[MAX_TES*16]; U8 colors[MAX_TES*4]; - S16 scale_s[MAX_TES]; - S16 scale_t[MAX_TES]; + F32 scale_s[MAX_TES]; + F32 scale_t[MAX_TES]; S16 offset_s[MAX_TES]; S16 offset_t[MAX_TES]; S16 image_rot[MAX_TES]; @@ -1315,8 +1316,8 @@ BOOL LLPrimitive::packTEMessage(LLMessageSystem *mesgsys) const colors[4*face_index + 3] = 255 - coloru.mV[3]; const LLTextureEntry* te = getTE(face_index); - scale_s[face_index] = (S16) llround(((llclamp(te->mScaleS,-LL_MAX_SCALE_S, LL_MAX_SCALE_S)-1.0f)/(LL_MAX_SCALE_S+1.f) * (F32)0x7FFF)); - scale_t[face_index] = (S16) llround(((llclamp(te->mScaleT,-LL_MAX_SCALE_T, LL_MAX_SCALE_T)-1.0f)/(LL_MAX_SCALE_T+1.f) * (F32)0x7FFF)); + scale_s[face_index] = (F32) te->mScaleS; + scale_t[face_index] = (F32) te->mScaleT; offset_s[face_index] = (S16) llround((llclamp(te->mOffsetS,-1.0f,1.0f) * (F32)0x7FFF)) ; offset_t[face_index] = (S16) llround((llclamp(te->mOffsetT,-1.0f,1.0f) * (F32)0x7FFF)) ; image_rot[face_index] = (S16) llround(((fmod(te->mRotation, F_TWO_PI)/F_TWO_PI) * (F32)0x7FFF)); @@ -1329,9 +1330,9 @@ BOOL LLPrimitive::packTEMessage(LLMessageSystem *mesgsys) const *cur_ptr++ = 0; cur_ptr += packTEField(cur_ptr, (U8 *)colors, 4 ,last_face_index, MVT_U8); *cur_ptr++ = 0; - cur_ptr += packTEField(cur_ptr, (U8 *)scale_s, 2 ,last_face_index, MVT_S16Array); + cur_ptr += packTEField(cur_ptr, (U8 *)scale_s, 4 ,last_face_index, MVT_F32); *cur_ptr++ = 0; - cur_ptr += packTEField(cur_ptr, (U8 *)scale_t, 2 ,last_face_index, MVT_S16Array); + cur_ptr += packTEField(cur_ptr, (U8 *)scale_t, 4 ,last_face_index, MVT_F32); *cur_ptr++ = 0; cur_ptr += packTEField(cur_ptr, (U8 *)offset_s, 2 ,last_face_index, MVT_S16Array); *cur_ptr++ = 0; @@ -1355,8 +1356,8 @@ BOOL LLPrimitive::packTEMessage(LLDataPacker &dp) const U8 image_ids[MAX_TES*16]; U8 colors[MAX_TES*4]; - S16 scale_s[MAX_TES]; - S16 scale_t[MAX_TES]; + F32 scale_s[MAX_TES]; + F32 scale_t[MAX_TES]; S16 offset_s[MAX_TES]; S16 offset_t[MAX_TES]; S16 image_rot[MAX_TES]; @@ -1391,8 +1392,8 @@ BOOL LLPrimitive::packTEMessage(LLDataPacker &dp) const colors[4*face_index + 3] = 255 - coloru.mV[3]; const LLTextureEntry* te = getTE(face_index); - scale_s[face_index] = (S16) llround(((llclamp(te->mScaleS,-LL_MAX_SCALE_S, LL_MAX_SCALE_S)-1.0f)/(LL_MAX_SCALE_S+1.f) * (F32)0x7FFF)); - scale_t[face_index] = (S16) llround(((llclamp(te->mScaleT,-LL_MAX_SCALE_T, LL_MAX_SCALE_T)-1.0f)/(LL_MAX_SCALE_T+1.f) * (F32)0x7FFF)); + scale_s[face_index] = (F32) te->mScaleS; + scale_t[face_index] = (F32) te->mScaleT; offset_s[face_index] = (S16) llround((llclamp(te->mOffsetS,-1.0f,1.0f) * (F32)0x7FFF)) ; offset_t[face_index] = (S16) llround((llclamp(te->mOffsetT,-1.0f,1.0f) * (F32)0x7FFF)) ; image_rot[face_index] = (S16) llround(((fmod(te->mRotation, F_TWO_PI)/F_TWO_PI) * (F32)0x7FFF)); @@ -1406,9 +1407,9 @@ BOOL LLPrimitive::packTEMessage(LLDataPacker &dp) const *cur_ptr++ = 0; cur_ptr += packTEField(cur_ptr, (U8 *)colors, 4 ,last_face_index, MVT_U8); *cur_ptr++ = 0; - cur_ptr += packTEField(cur_ptr, (U8 *)scale_s, 2 ,last_face_index, MVT_S16Array); + cur_ptr += packTEField(cur_ptr, (U8 *)scale_s, 4 ,last_face_index, MVT_F32); *cur_ptr++ = 0; - cur_ptr += packTEField(cur_ptr, (U8 *)scale_t, 2 ,last_face_index, MVT_S16Array); + cur_ptr += packTEField(cur_ptr, (U8 *)scale_t, 4 ,last_face_index, MVT_F32); *cur_ptr++ = 0; cur_ptr += packTEField(cur_ptr, (U8 *)offset_s, 2 ,last_face_index, MVT_S16Array); *cur_ptr++ = 0; @@ -1440,8 +1441,8 @@ S32 LLPrimitive::unpackTEMessage(LLMessageSystem *mesgsys, char *block_name, con U8 image_data[MAX_TES*16]; U8 colors[MAX_TES*4]; - S16 scale_s[MAX_TES]; - S16 scale_t[MAX_TES]; + F32 scale_s[MAX_TES]; + F32 scale_t[MAX_TES]; S16 offset_s[MAX_TES]; S16 offset_t[MAX_TES]; S16 image_rot[MAX_TES]; @@ -1484,9 +1485,9 @@ S32 LLPrimitive::unpackTEMessage(LLMessageSystem *mesgsys, char *block_name, con cur_ptr++; cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)colors, 4, face_count, MVT_U8); cur_ptr++; - cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)scale_s, 2, face_count, MVT_S16Array); + cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)scale_s, 4, face_count, MVT_F32); cur_ptr++; - cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)scale_t, 2, face_count, MVT_S16Array); + cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)scale_t, 4, face_count, MVT_F32); cur_ptr++; cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)offset_s, 2, face_count, MVT_S16Array); cur_ptr++; @@ -1503,9 +1504,7 @@ S32 LLPrimitive::unpackTEMessage(LLMessageSystem *mesgsys, char *block_name, con for (U32 i = 0; i < face_count; i++) { retval |= setTETexture(i, ((LLUUID*)image_data)[i]); - retval |= setTEScale(i, - floor((1.0f + ((((F32)scale_s[i] / (F32)0x7FFF)) * (LL_MAX_SCALE_S+1.f))) * 100.f + 0.5f) / 100.f, - floor((1.0f + ((((F32)scale_t[i] / (F32)0x7FFF)) * (LL_MAX_SCALE_T+1.f))) * 100.f + 0.5f) / 100.f); + retval |= setTEScale(i, scale_s[i], scale_t[i]); retval |= setTEOffset(i, (F32)offset_s[i] / (F32)0x7FFF, (F32) offset_t[i] / (F32) 0x7FFF); retval |= setTERotation(i, ((F32)image_rot[i]/ (F32)0x7FFF) * F_TWO_PI); retval |= setTEBumpShinyFullbright(i, bump[i]); @@ -1537,8 +1536,8 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp) U8 image_data[MAX_TES*16]; U8 colors[MAX_TES*4]; - S16 scale_s[MAX_TES]; - S16 scale_t[MAX_TES]; + F32 scale_s[MAX_TES]; + F32 scale_t[MAX_TES]; S16 offset_s[MAX_TES]; S16 offset_t[MAX_TES]; S16 image_rot[MAX_TES]; @@ -1571,9 +1570,9 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp) cur_ptr++; cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)colors, 4, face_count, MVT_U8); cur_ptr++; - cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)scale_s, 2, face_count, MVT_S16Array); + cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)scale_s, 4, face_count, MVT_F32); cur_ptr++; - cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)scale_t, 2, face_count, MVT_S16Array); + cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)scale_t, 4, face_count, MVT_F32); cur_ptr++; cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)offset_s, 2, face_count, MVT_S16Array); cur_ptr++; @@ -1596,9 +1595,7 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp) for (i = 0; i < face_count; i++) { retval |= setTETexture(i, image_ids[i]); - retval |= setTEScale(i, - floor((1.0f + ((((F32)scale_s[i] / (F32)0x7FFF)) * (LL_MAX_SCALE_S+1.f))) * 100.f + 0.5f) / 100.f, - floor((1.0f + ((((F32)scale_t[i] / (F32)0x7FFF)) * (LL_MAX_SCALE_T+1.f))) * 100.f + 0.5f) / 100.f); + retval |= setTEScale(i, scale_s[i], scale_t[i]); retval |= setTEOffset(i, (F32)offset_s[i] / (F32)0x7FFF, (F32) offset_t[i] / (F32) 0x7FFF); retval |= setTERotation(i, ((F32)image_rot[i]/ (F32)0x7FFF) * F_TWO_PI); retval |= setTEBumpShinyFullbright(i, bump[i]); diff --git a/linden/indra/llprimitive/llprimitive.h b/linden/indra/llprimitive/llprimitive.h index 953d284..89e6623 100644 --- a/linden/indra/llprimitive/llprimitive.h +++ b/linden/indra/llprimitive/llprimitive.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llprimitive/lltextureanim.cpp b/linden/indra/llprimitive/lltextureanim.cpp index b496463..e373a29 100644 --- a/linden/indra/llprimitive/lltextureanim.cpp +++ b/linden/indra/llprimitive/lltextureanim.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llprimitive/lltextureanim.h b/linden/indra/llprimitive/lltextureanim.h index b47d492..502cf54 100644 --- a/linden/indra/llprimitive/lltextureanim.h +++ b/linden/indra/llprimitive/lltextureanim.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llprimitive/lltextureentry.cpp b/linden/indra/llprimitive/lltextureentry.cpp index 5099eef..81bfd6f 100644 --- a/linden/indra/llprimitive/lltextureentry.cpp +++ b/linden/indra/llprimitive/lltextureentry.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llprimitive/lltextureentry.h b/linden/indra/llprimitive/lltextureentry.h index b06f9a1..861b585 100644 --- a/linden/indra/llprimitive/lltextureentry.h +++ b/linden/indra/llprimitive/lltextureentry.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llprimitive/lltree_common.h b/linden/indra/llprimitive/lltree_common.h index 0904f9d..f9594e2 100644 --- a/linden/indra/llprimitive/lltree_common.h +++ b/linden/indra/llprimitive/lltree_common.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llprimitive/lltreeparams.cpp b/linden/indra/llprimitive/lltreeparams.cpp index ce52cae..fde21f0 100644 --- a/linden/indra/llprimitive/lltreeparams.cpp +++ b/linden/indra/llprimitive/lltreeparams.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llprimitive/lltreeparams.h b/linden/indra/llprimitive/lltreeparams.h index 7822d31..29bbc9a 100644 --- a/linden/indra/llprimitive/lltreeparams.h +++ b/linden/indra/llprimitive/lltreeparams.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llprimitive/llvolumemessage.cpp b/linden/indra/llprimitive/llvolumemessage.cpp index b00bbc5..650e0cd 100644 --- a/linden/indra/llprimitive/llvolumemessage.cpp +++ b/linden/indra/llprimitive/llvolumemessage.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -42,23 +43,25 @@ bool LLVolumeMessage::packProfileParams( LLMessageSystem *mesgsys) { // Default to cylinder - static LLProfileParams defaultparams(LL_PCODE_PROFILE_CIRCLE, U8(0), U8(0), U8(0)); + static LLProfileParams defaultparams(LL_PCODE_PROFILE_CIRCLE, U16(0), U16(0), U16(0)); if (!params) params = &defaultparams; U8 tempU8; + U16 tempU16; + tempU8 = params->getCurveType(); mesgsys->addU8Fast(_PREHASH_ProfileCurve, tempU8); - tempU8 = (U8) llround( params->getBegin() / CUT_QUANTA); - mesgsys->addU8Fast(_PREHASH_ProfileBegin, tempU8); + tempU16 = (U16) llround( params->getBegin() / CUT_QUANTA); + mesgsys->addU16Fast(_PREHASH_ProfileBegin, tempU16); - tempU8 = 200 - (U8) llround(params->getEnd() / CUT_QUANTA); - mesgsys->addU8Fast(_PREHASH_ProfileEnd, tempU8); + tempU16 = 50000 - (U16) llround(params->getEnd() / CUT_QUANTA); + mesgsys->addU16Fast(_PREHASH_ProfileEnd, tempU16); - tempU8 = (S8) llround(params->getHollow() / SHEAR_QUANTA); - mesgsys->addU8Fast(_PREHASH_ProfileHollow, tempU8); + tempU16 = (U16) llround(params->getHollow() / HOLLOW_QUANTA); + mesgsys->addU16Fast(_PREHASH_ProfileHollow, tempU16); return true; } @@ -68,23 +71,25 @@ bool LLVolumeMessage::packProfileParams( LLDataPacker &dp) { // Default to cylinder - static LLProfileParams defaultparams(LL_PCODE_PROFILE_CIRCLE, U8(0), U8(0), U8(0)); + static LLProfileParams defaultparams(LL_PCODE_PROFILE_CIRCLE, U16(0), U16(0), U16(0)); if (!params) params = &defaultparams; U8 tempU8; + U16 tempU16; + tempU8 = params->getCurveType(); dp.packU8(tempU8, "Curve"); - tempU8 = (U8) llround( params->getBegin() / CUT_QUANTA); - dp.packU8(tempU8, "Begin"); + tempU16 = (U16) llround( params->getBegin() / CUT_QUANTA); + dp.packU16(tempU16, "Begin"); - tempU8 = 200 - (U8) llround(params->getEnd() / CUT_QUANTA); - dp.packU8(tempU8, "End"); + tempU16 = 50000 - (U16) llround(params->getEnd() / CUT_QUANTA); + dp.packU16(tempU16, "End"); - tempU8 = (S8) llround(params->getHollow() / SHEAR_QUANTA); - dp.packU8(tempU8, "Hollow"); + tempU16 = (U16) llround(params->getHollow() / HOLLOW_QUANTA); + dp.packU16(tempU16, "Hollow"); return true; } @@ -96,13 +101,14 @@ bool LLVolumeMessage::unpackProfileParams( { bool ok = true; U8 temp_u8; + U16 temp_u16; F32 temp_f32; mesgsys->getU8Fast(block_name, _PREHASH_ProfileCurve, temp_u8, block_num); params->setCurveType(temp_u8); - mesgsys->getU8Fast(block_name, _PREHASH_ProfileBegin, temp_u8, block_num); - temp_f32 = temp_u8 * CUT_QUANTA; + mesgsys->getU16Fast(block_name, _PREHASH_ProfileBegin, temp_u16, block_num); + temp_f32 = temp_u16 * CUT_QUANTA; if (temp_f32 > 1.f) { llwarns << "Profile begin out of range: " << temp_f32 @@ -112,8 +118,8 @@ bool LLVolumeMessage::unpackProfileParams( } params->setBegin(temp_f32); - mesgsys->getU8Fast(block_name, _PREHASH_ProfileEnd, temp_u8, block_num); - temp_f32 = temp_u8 * CUT_QUANTA; + mesgsys->getU16Fast(block_name, _PREHASH_ProfileEnd, temp_u16, block_num); + temp_f32 = temp_u16 * CUT_QUANTA; if (temp_f32 > 1.f) { llwarns << "Profile end out of range: " << 1.f - temp_f32 @@ -123,8 +129,8 @@ bool LLVolumeMessage::unpackProfileParams( } params->setEnd(1.f - temp_f32); - mesgsys->getU8Fast(block_name, _PREHASH_ProfileHollow, temp_u8, block_num); - temp_f32 = temp_u8 * SCALE_QUANTA; + mesgsys->getU16Fast(block_name, _PREHASH_ProfileHollow, temp_u16, block_num); + temp_f32 = temp_u16 * HOLLOW_QUANTA; if (temp_f32 > 1.f) { llwarns << "Profile hollow out of range: " << temp_f32 @@ -151,13 +157,14 @@ bool LLVolumeMessage::unpackProfileParams( { bool ok = true; U8 temp_u8; + U16 temp_u16; F32 temp_f32; dp.unpackU8(temp_u8, "Curve"); params->setCurveType(temp_u8); - dp.unpackU8(temp_u8, "Begin"); - temp_f32 = temp_u8 * CUT_QUANTA; + dp.unpackU16(temp_u16, "Begin"); + temp_f32 = temp_u16 * CUT_QUANTA; if (temp_f32 > 1.f) { llwarns << "Profile begin out of range: " << temp_f32 << llendl; @@ -167,8 +174,8 @@ bool LLVolumeMessage::unpackProfileParams( } params->setBegin(temp_f32); - dp.unpackU8(temp_u8, "End"); - temp_f32 = temp_u8 * CUT_QUANTA; + dp.unpackU16(temp_u16, "End"); + temp_f32 = temp_u16 * CUT_QUANTA; if (temp_f32 > 1.f) { llwarns << "Profile end out of range: " << 1.f - temp_f32 << llendl; @@ -178,8 +185,8 @@ bool LLVolumeMessage::unpackProfileParams( } params->setEnd(1.f - temp_f32); - dp.unpackU8(temp_u8, "Hollow"); - temp_f32 = temp_u8 * SCALE_QUANTA; + dp.unpackU16(temp_u16, "Hollow"); + temp_f32 = temp_u16 * HOLLOW_QUANTA; if (temp_f32 > 1.f) { llwarns << "Profile hollow out of range: " << temp_f32 << llendl; @@ -212,11 +219,11 @@ bool LLVolumeMessage::packPathParams( U8 curve = params->getCurveType(); mesgsys->addU8Fast(_PREHASH_PathCurve, curve); - U8 begin = (U8) llround(params->getBegin() / SCALE_QUANTA); - mesgsys->addU8Fast(_PREHASH_PathBegin, begin); + U16 begin = (U16) llround(params->getBegin() / CUT_QUANTA); + mesgsys->addU16Fast(_PREHASH_PathBegin, begin); - U8 end = 100 - (U8) llround(params->getEnd() / SCALE_QUANTA); - mesgsys->addU8Fast(_PREHASH_PathEnd, end); + U16 end = 50000 - (U16) llround(params->getEnd() / CUT_QUANTA); + mesgsys->addU16Fast(_PREHASH_PathEnd, end); // Avoid truncation problem with direct F32->U8 cast. // (e.g., (U8) (0.50 / 0.01) = (U8) 49.9999999 = 49 not 50. @@ -269,11 +276,11 @@ bool LLVolumeMessage::packPathParams( U8 curve = params->getCurveType(); dp.packU8(curve, "Curve"); - U8 begin = (U8) llround(params->getBegin() / SCALE_QUANTA); - dp.packU8(begin, "Begin"); + U16 begin = (U16) llround(params->getBegin() / CUT_QUANTA); + dp.packU16(begin, "Begin"); - U8 end = 100 - (U8) llround(params->getEnd() / SCALE_QUANTA); - dp.packU8(end, "End"); + U16 end = 50000 - (U16) llround(params->getEnd() / CUT_QUANTA); + dp.packU16(end, "End"); // Avoid truncation problem with direct F32->U8 cast. // (e.g., (U8) (0.50 / 0.01) = (U8) 49.9999999 = 49 not 50. @@ -324,13 +331,13 @@ bool LLVolumeMessage::unpackPathParams( mesgsys->getU8Fast(block_name, _PREHASH_PathCurve, curve, block_num); params->setCurveType(curve); - U8 begin; - mesgsys->getU8Fast(block_name, _PREHASH_PathBegin, begin, block_num); - params->setBegin((F32)(begin * SCALE_QUANTA)); + U16 begin; + mesgsys->getU16Fast(block_name, _PREHASH_PathBegin, begin, block_num); + params->setBegin((F32)(begin * CUT_QUANTA)); - U8 end; - mesgsys->getU8Fast(block_name, _PREHASH_PathEnd, end, block_num); - params->setEnd((F32)((100 - end) * SCALE_QUANTA)); + U16 end; + mesgsys->getU16Fast(block_name, _PREHASH_PathEnd, end, block_num); + params->setEnd((F32)((50000 - end) * CUT_QUANTA)); U8 pack_scale_x, pack_scale_y; mesgsys->getU8Fast(block_name, _PREHASH_PathScaleX, pack_scale_x, block_num); @@ -390,14 +397,16 @@ bool LLVolumeMessage::unpackPathParams(LLPathParams* params, LLDataPacker &dp) { U8 value; S8 svalue; + U16 temp_u16; + dp.unpackU8(value, "Curve"); params->setCurveType( value ); - dp.unpackU8(value, "Begin"); - params->setBegin((F32)(value * SCALE_QUANTA)); + dp.unpackU16(temp_u16, "Begin"); + params->setBegin((F32)(temp_u16 * CUT_QUANTA)); - dp.unpackU8(value, "End"); - params->setEnd((F32)((100 - value) * SCALE_QUANTA)); + dp.unpackU16(temp_u16, "End"); + params->setEnd((F32)((50000 - temp_u16) * CUT_QUANTA)); dp.unpackU8(value, "ScaleX"); F32 x = (F32) (200 - value) * SCALE_QUANTA; diff --git a/linden/indra/llprimitive/llvolumemessage.h b/linden/indra/llprimitive/llvolumemessage.h index ad062a9..e626a04 100644 --- a/linden/indra/llprimitive/llvolumemessage.h +++ b/linden/indra/llprimitive/llvolumemessage.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llprimitive/llvolumexml.cpp b/linden/indra/llprimitive/llvolumexml.cpp index 101eace..370f152 100644 --- a/linden/indra/llprimitive/llvolumexml.cpp +++ b/linden/indra/llprimitive/llvolumexml.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llprimitive/llvolumexml.h b/linden/indra/llprimitive/llvolumexml.h index c6ae480..0a3d1c5 100644 --- a/linden/indra/llprimitive/llvolumexml.h +++ b/linden/indra/llprimitive/llvolumexml.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llprimitive/material_codes.h b/linden/indra/llprimitive/material_codes.h index fe55344..01a5573 100644 --- a/linden/indra/llprimitive/material_codes.h +++ b/linden/indra/llprimitive/material_codes.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llprimitive/object_flags.h b/linden/indra/llprimitive/object_flags.h index 7c8a66c..e7bf023 100644 --- a/linden/indra/llprimitive/object_flags.h +++ b/linden/indra/llprimitive/object_flags.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llrender/files.lst b/linden/indra/llrender/files.lst index a813342..a4d541e 100644 --- a/linden/indra/llrender/files.lst +++ b/linden/indra/llrender/files.lst @@ -3,4 +3,3 @@ llrender/llfontgl.cpp llrender/llgldbg.cpp llrender/llimagegl.cpp llrender/llvertexbuffer.cpp -llrender/text_out.cpp diff --git a/linden/indra/llrender/llfont.cpp b/linden/indra/llrender/llfont.cpp index c64744e..ed787e0 100644 --- a/linden/indra/llrender/llfont.cpp +++ b/linden/indra/llrender/llfont.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -135,6 +136,7 @@ LLFont::LLFont(LLImageRaw *imagep) mNumComponents = 0; mFallbackFontp = NULL; mIsFallback = FALSE; + mFTFace = NULL; } @@ -143,7 +145,8 @@ LLFont::~LLFont() mRawImagep = NULL; // dereferences or deletes image // Clean up freetype libs. - FT_Done_Face(mFTFace); + if (mFTFace) + FT_Done_Face(mFTFace); mFTFace = NULL; // Delete glyph info @@ -200,6 +203,7 @@ BOOL LLFont::loadFace(const std::string& filename, const F32 point_size, const F { // Clean up freetype libs. FT_Done_Face(mFTFace); + mFTFace = NULL; return FALSE; } diff --git a/linden/indra/llrender/llfont.h b/linden/indra/llrender/llfont.h index a84a302..f10f7bb 100644 --- a/linden/indra/llrender/llfont.h +++ b/linden/indra/llrender/llfont.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llrender/llfontgl.cpp b/linden/indra/llrender/llfontgl.cpp index f72a7de..7ee89c7 100644 --- a/linden/indra/llrender/llfontgl.cpp +++ b/linden/indra/llrender/llfontgl.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -69,6 +70,7 @@ const F32 PIXEL_BORDER_THRESHOLD = 0.0001f; const F32 PIXEL_CORRECTION_DISTANCE = 0.01f; const F32 PAD_AMT = 0.5f; +const F32 DROP_SHADOW_STRENGTH = 0.3f; F32 llfont_round_x(F32 x) { @@ -133,7 +135,8 @@ void LLFontGL::init() mImageGLp = new LLImageGL(FALSE); //RN: use nearest mipmap filtering to obviate the need to do pixel-accurate positioning mImageGLp->bind(); - mImageGLp->setMipFilterNearest(TRUE, TRUE); + // we allow bilinear filtering to get sub-pixel positioning for drop shadows + //mImageGLp->setMipFilterNearest(TRUE, TRUE); } if (mRawImageGLp.isNull()) { @@ -549,28 +552,8 @@ S32 LLFontGL::render(const LLWString &wstr, return 0; } - if (style & DROP_SHADOW) - { - LLColor4 shadow_color = sShadowColor; - shadow_color[3] = color[3]; - render(wstr, begin_offset, - x + 1.f / sScaleX, - y - 1.f / sScaleY, - shadow_color, - halign, - valign, - style & (~DROP_SHADOW), - max_chars, - max_pixels, - right_x, - use_embedded, - use_ellipses); - } - S32 scaled_max_pixels = max_pixels == S32_MAX ? S32_MAX : llceil((F32)max_pixels * sScaleX); - BOOL render_bold = FALSE; - // HACK for better bolding if (style & BOLD) { @@ -585,9 +568,17 @@ S32 LLFontGL::render(const LLWString &wstr, max_chars, max_pixels, right_x, use_embedded); } - else + } + + F32 drop_shadow_strength = 0.f; + if (style & DROP_SHADOW) + { + F32 luminance; + color.calcHSL(NULL, NULL, &luminance); + drop_shadow_strength = clamp_rescale(luminance, 0.35f, 0.6f, 0.f, DROP_SHADOW_STRENGTH); + if (luminance < 0.35f) { - render_bold = TRUE; + style = style & ~DROP_SHADOW; } } @@ -631,9 +622,6 @@ S32 LLFontGL::render(const LLWString &wstr, } F32 cur_x, cur_y, cur_render_x, cur_render_y; - F32 slant_offset; - - slant_offset = ((style & ITALIC) ? ( -mAscender * 0.25f) : 0.f); // Bind the font texture @@ -696,7 +684,7 @@ S32 LLFontGL::render(const LLWString &wstr, if (use_ellipses && halign == LEFT) { // check for too long of a string - if (getWidthF32(wstr.c_str(), 0, max_chars) > scaled_max_pixels) + if (getWidthF32(wstr.c_str(), 0, max_chars) * sScaleX > scaled_max_pixels) { // use four dots for ellipsis width to generate padding const LLWString dots(utf8str_to_wstring(LLString("...."))); @@ -706,7 +694,6 @@ S32 LLFontGL::render(const LLWString &wstr, } - glBegin(GL_QUADS); for (i = begin_offset; i < begin_offset + length; i++) { llwchar wch = wstr[i]; @@ -735,36 +722,13 @@ S32 LLFontGL::render(const LLWString &wstr, break; } - glEnd(); - - glColor3f(1.f, 1.f, 1.f); - ext_image->bind(); const F32 ext_x = cur_render_x + (EXT_X_BEARING * sScaleX); const F32 ext_y = cur_render_y + (EXT_Y_BEARING * sScaleY + mAscender - mLineHeight); - glBegin(GL_QUADS); - { - S32 num_passes = render_bold ? 2 : 1; - for (S32 pass = 0; pass < num_passes; pass++) - { - glTexCoord2f(1.f, 1.f); - glVertex2f(llfont_round_x(ext_x + ext_width + (F32)(pass * BOLD_OFFSET)), - llfont_round_y(ext_y + ext_height)); - - glTexCoord2f(0.f, 1.f); - glVertex2f(llfont_round_x(ext_x + (F32)(pass * BOLD_OFFSET)), - llfont_round_y(ext_y + ext_height)); - - glTexCoord2f(0.f, 0.f); - glVertex2f(llfont_round_x(ext_x + (F32)(pass * BOLD_OFFSET)), llfont_round_y(ext_y)); - - glTexCoord2f(1.f, 0.f); - glVertex2f(llfont_round_x(ext_x + ext_width + (F32)(pass * BOLD_OFFSET)), - llfont_round_y(ext_y)); - } - } - glEnd(); + LLRectf uv_rect(0.f, 1.f, 1.f, 0.f); + LLRectf screen_rect(ext_x, ext_y + ext_height, ext_x + ext_width, ext_y); + drawGlyph(screen_rect, uv_rect, LLColor4::white, style, drop_shadow_strength); if (!label.empty()) { @@ -793,15 +757,12 @@ S32 LLFontGL::render(const LLWString &wstr, // Bind the font texture mImageGLp->bind(); - glBegin(GL_QUADS); } else { if (!hasGlyph(wch)) { - glEnd(); (const_cast(this))->addChar(wch); - glBegin(GL_QUADS); } const LLFontGlyphInfo* fgi= getGlyphInfo(wch); @@ -817,40 +778,28 @@ S32 LLFontGL::render(const LLWString &wstr, // Draw the text at the appropriate location //Specify vertices and texture coordinates - S32 num_passes = render_bold ? 2 : 1; - for (S32 pass = 0; pass < num_passes; pass++) - { - glTexCoord2f((fgi->mXBitmapOffset - PAD_AMT) * inv_width, - (fgi->mYBitmapOffset + fgi->mHeight + PAD_AMT) * inv_height); - glVertex2f(llfont_round_x(cur_render_x + (F32)fgi->mXBearing + (F32)(pass * BOLD_OFFSET) - PAD_AMT), - llfont_round_y(cur_render_y + (F32)fgi->mYBearing + PAD_AMT)); - glTexCoord2f((fgi->mXBitmapOffset - PAD_AMT) * inv_width, - (fgi->mYBitmapOffset - PAD_AMT) * inv_height); - glVertex2f(llfont_round_x(cur_render_x + (F32)fgi->mXBearing + slant_offset + (F32)(pass * BOLD_OFFSET) - PAD_AMT), - llfont_round_y(cur_render_y + (F32)fgi->mYBearing - (F32)fgi->mHeight - PAD_AMT)); - glTexCoord2f((fgi->mXBitmapOffset + fgi->mWidth + PAD_AMT) * inv_width, - (fgi->mYBitmapOffset - PAD_AMT) * inv_height); - glVertex2f(llfont_round_x(cur_render_x + (F32)fgi->mXBearing + slant_offset + (F32)fgi->mWidth + (F32)(pass * BOLD_OFFSET) + PAD_AMT), - llfont_round_y(cur_render_y + (F32)fgi->mYBearing - (F32)fgi->mHeight - PAD_AMT)); - glTexCoord2f((fgi->mXBitmapOffset + fgi->mWidth + PAD_AMT) * inv_width, - (fgi->mYBitmapOffset + fgi->mHeight + PAD_AMT) * inv_height); - glVertex2f(llfont_round_x(cur_render_x + (F32)fgi->mXBearing + (F32)fgi->mWidth + (F32)(pass * BOLD_OFFSET) + PAD_AMT), - llfont_round_y(cur_render_y + (F32)fgi->mYBearing + PAD_AMT)); - } + LLRectf uv_rect((fgi->mXBitmapOffset - PAD_AMT) * inv_width, + (fgi->mYBitmapOffset + fgi->mHeight + PAD_AMT) * inv_height, + (fgi->mXBitmapOffset + fgi->mWidth + PAD_AMT) * inv_width, + (fgi->mYBitmapOffset - PAD_AMT) * inv_height); + LLRectf screen_rect(cur_render_x + (F32)fgi->mXBearing - PAD_AMT, + cur_render_y + (F32)fgi->mYBearing + PAD_AMT, + cur_render_x + (F32)fgi->mXBearing + (F32)fgi->mWidth + PAD_AMT, + cur_render_y + (F32)fgi->mYBearing - (F32)fgi->mHeight - PAD_AMT); - chars_drawn++; + drawGlyph(screen_rect, uv_rect, color, style, drop_shadow_strength); + chars_drawn++; cur_x += fgi->mXAdvance; cur_y += fgi->mYAdvance; + llwchar next_char = wstr[i+1]; if (next_char && (next_char < LAST_CHARACTER)) { // Kern this puppy. if (!hasGlyph(next_char)) { - glEnd(); (const_cast(this))->addChar(next_char); - glBegin(GL_QUADS); } cur_x += getXKerning(wch, next_char); } @@ -867,8 +816,6 @@ S32 LLFontGL::render(const LLWString &wstr, } } - glEnd(); - if (right_x) { *right_x = cur_x / sScaleX; @@ -1347,6 +1294,89 @@ void LLFontGL::removeEmbeddedChar( llwchar wc ) } } + +void LLFontGL::renderQuad(const LLRectf& screen_rect, const LLRectf& uv_rect, F32 slant_amt) const +{ + glTexCoord2f(uv_rect.mRight, uv_rect.mTop); + glVertex2f(llfont_round_x(screen_rect.mRight), + llfont_round_y(screen_rect.mTop)); + + glTexCoord2f(uv_rect.mLeft, uv_rect.mTop); + glVertex2f(llfont_round_x(screen_rect.mLeft), + llfont_round_y(screen_rect.mTop)); + + glTexCoord2f(uv_rect.mLeft, uv_rect.mBottom); + glVertex2f(llfont_round_x(screen_rect.mLeft + slant_amt), + llfont_round_y(screen_rect.mBottom)); + + glTexCoord2f(uv_rect.mRight, uv_rect.mBottom); + glVertex2f(llfont_round_x(screen_rect.mRight + slant_amt), + llfont_round_y(screen_rect.mBottom)); +} + +void LLFontGL::drawGlyph(const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4& color, U8 style, F32 drop_shadow_strength) const +{ + F32 slant_offset; + slant_offset = ((style & ITALIC) ? ( -mAscender * 0.2f) : 0.f); + + glBegin(GL_QUADS); + { + //FIXME: bold and drop shadow are mutually exclusive only for convenience + //Allow both when we need them. + if (style & BOLD) + { + glColor4fv(color.mV); + for (S32 pass = 0; pass < 2; pass++) + { + LLRectf screen_rect_offset = screen_rect; + + screen_rect_offset.translate((F32)(pass * BOLD_OFFSET), 0.f); + renderQuad(screen_rect_offset, uv_rect, slant_offset); + } + } + else if (style & DROP_SHADOW) + { + LLColor4 shadow_color = LLFontGL::sShadowColor; + shadow_color.mV[VALPHA] = color.mV[VALPHA] * drop_shadow_strength; + glColor4fv(shadow_color.mV); + for (S32 pass = 0; pass < 5; pass++) + { + LLRectf screen_rect_offset = screen_rect; + + switch(pass) + { + case 0: + screen_rect_offset.translate(-1.f, -1.f); + break; + case 1: + screen_rect_offset.translate(1.f, -1.f); + break; + case 2: + screen_rect_offset.translate(1.f, 1.f); + break; + case 3: + screen_rect_offset.translate(-1.f, 1.f); + break; + case 4: + screen_rect_offset.translate(0, -2.f); + break; + } + + renderQuad(screen_rect_offset, uv_rect, slant_offset); + } + glColor4fv(color.mV); + renderQuad(screen_rect, uv_rect, slant_offset); + } + else // normal rendering + { + glColor4fv(color.mV); + renderQuad(screen_rect, uv_rect, slant_offset); + } + + } + glEnd(); +} + // static LLString LLFontGL::nameFromFont(const LLFontGL* fontp) { diff --git a/linden/indra/llrender/llfontgl.h b/linden/indra/llrender/llfontgl.h index bcb8dfb..98a7a55 100644 --- a/linden/indra/llrender/llfontgl.h +++ b/linden/indra/llrender/llfontgl.h @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -33,6 +34,7 @@ #include "llimagegl.h" #include "v2math.h" #include "llcoord.h" +#include "llrect.h" class LLColor4; @@ -206,6 +208,8 @@ protected: const embedded_data_t* getEmbeddedCharData(const llwchar wch) const; F32 getEmbeddedCharAdvance(const embedded_data_t* ext_data) const; void clearEmbeddedChars(); + void renderQuad(const LLRectf& screen_rect, const LLRectf& uv_rect, F32 slant_amt) const; + void drawGlyph(const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4& color, U8 style, F32 drop_shadow_fade) const; public: static F32 sVertDPI; diff --git a/linden/indra/llrender/llgldbg.cpp b/linden/indra/llrender/llgldbg.cpp index ab35353..84f0082 100644 --- a/linden/indra/llrender/llgldbg.cpp +++ b/linden/indra/llrender/llgldbg.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -100,7 +101,7 @@ char *fv3(F32 *f) char *fv1(F32 *f) { static char str[128]; /* Flawfinder: ignore */ - snprintf(str, sizeof(str), "%8.3f", f[0]); /* Flawfinder: ignore */ + snprintf(str, sizeof(str), "%8.3f", f[0]); /* Flawfinder: ignore */ return str; } diff --git a/linden/indra/llrender/llgldbg.h b/linden/indra/llrender/llgldbg.h index 39be147..4483fb9 100644 --- a/linden/indra/llrender/llgldbg.h +++ b/linden/indra/llrender/llgldbg.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llrender/llimagegl.cpp b/linden/indra/llrender/llimagegl.cpp index 8386e95..464507e 100644 --- a/linden/indra/llrender/llimagegl.cpp +++ b/linden/indra/llrender/llimagegl.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -176,7 +177,7 @@ void LLImageGL::destroyGL(BOOL save_state) if (save_state) { glimage->mSaveData = new LLImageRaw; - glimage->readBackRaw(glimage->mCurrentDiscardLevel, glimage->mSaveData); + glimage->readBackRaw(glimage->mCurrentDiscardLevel, glimage->mSaveData, false); } glimage->destroyGLTexture(); stop_glerror(); @@ -939,7 +940,7 @@ BOOL LLImageGL::setDiscardLevel(S32 discard_level) LLPointer imageraw = new LLImageRaw; while(discard_level > mCurrentDiscardLevel) { - if (readBackRaw(discard_level, imageraw)) + if (readBackRaw(discard_level, imageraw, false)) { break; } @@ -961,7 +962,7 @@ BOOL LLImageGL::setDiscardLevel(S32 discard_level) } } -BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw) +BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compressed_ok) { if (discard_level < 0) { @@ -999,7 +1000,10 @@ BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw) } LLGLint is_compressed = 0; - glGetTexLevelParameteriv(mTarget, is_compressed, GL_TEXTURE_COMPRESSED, (GLint*)&is_compressed); + if (compressed_ok) + { + glGetTexLevelParameteriv(mTarget, is_compressed, GL_TEXTURE_COMPRESSED, (GLint*)&is_compressed); + } if (is_compressed) { LLGLint glbytes; diff --git a/linden/indra/llrender/llimagegl.h b/linden/indra/llrender/llimagegl.h index 20c31d1..16315ee 100644 --- a/linden/indra/llrender/llimagegl.h +++ b/linden/indra/llrender/llimagegl.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -91,7 +92,8 @@ public: BOOL setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height); BOOL setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_pos, S32 width, S32 height); BOOL setDiscardLevel(S32 discard_level); - BOOL readBackRaw(S32 discard_level, LLImageRaw* imageraw); // Read back a raw image for this discard level, if it exists + // Read back a raw image for this discard level, if it exists + BOOL readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compressed_ok); void destroyGLTexture(); void setClamp(BOOL clamps, BOOL clampt); diff --git a/linden/indra/llrender/llrender.vcproj b/linden/indra/llrender/llrender.vcproj index d13384d..86ab1c8 100644 --- a/linden/indra/llrender/llrender.vcproj +++ b/linden/indra/llrender/llrender.vcproj @@ -168,9 +168,6 @@ - - - - - - - - MAX_TEXT_LINES) return; - - TEXT_LINE *linep = &gTextLine[gNumTextLines++]; - - strcpy(linep->line, text); /* Flawfinder: ignore */ - linep->x = x; - linep->y = y; -} - - -// Writes text on the screen. Deprecated, don't write new code using this. -void show_text_gl(void) -{ - S32 i; - - TEXT_LINE *linep; - - if (gNumTextLines > MAX_TEXT_LINES) - { - gNumTextLines = MAX_TEXT_LINES; - } - - for (i = 0; i < gNumTextLines; i++) - { - linep = &gTextLine[i]; - - LLFontGL::sMonospace->renderUTF8(linep->line, 0, (F32)linep->x, (F32)linep->y, gCurrentColor, - LLFontGL::LEFT, LLFontGL::TOP, - LLFontGL::NORMAL, S32_MAX, S32_MAX, NULL, FALSE); - } - gNumTextLines = 0; -} - diff --git a/linden/indra/llrender/text_out.h b/linden/indra/llrender/text_out.h deleted file mode 100644 index 5080bd5..0000000 --- a/linden/indra/llrender/text_out.h +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @file text_out.h - * @brief Text rendering implementation - * - * Copyright (c) 2000-2007, Linden Research, Inc. - * - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlife.com/developers/opensource/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at http://secondlife.com/developers/opensource/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef LL_TEXT_OUT_H -#define LL_TEXT_OUT_H - -// DEPRECATED - Use LLFontGL for raw rendering, or make an LLTextBox to hold the text - -class LLColor4; - -void set_text_color(const LLColor4& color); -void add_text(S32 x, S32 y, char *text); -void show_text_gl(void); -void reset_num_text_lines(void); - -#endif diff --git a/linden/indra/llui/files.lst b/linden/indra/llui/files.lst index 96bb170..5a62573 100644 --- a/linden/indra/llui/files.lst +++ b/linden/indra/llui/files.lst @@ -8,6 +8,7 @@ llui/lldraghandle.cpp llui/lleditmenuhandler.cpp llui/llfloater.cpp llui/llfocusmgr.cpp +llui/llhtmlhelp.h llui/lliconctrl.cpp llui/llkeywords.cpp llui/lllineeditor.cpp diff --git a/linden/indra/llui/llalertdialog.cpp b/linden/indra/llui/llalertdialog.cpp index 6523e44..547efae 100644 --- a/linden/indra/llui/llalertdialog.cpp +++ b/linden/indra/llui/llalertdialog.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llalertdialog.h b/linden/indra/llui/llalertdialog.h index 1085f23..d389236 100644 --- a/linden/indra/llui/llalertdialog.h +++ b/linden/indra/llui/llalertdialog.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llbutton.cpp b/linden/indra/llui/llbutton.cpp index 41c2269..d35dd57 100644 --- a/linden/indra/llui/llbutton.cpp +++ b/linden/indra/llui/llbutton.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -65,7 +66,9 @@ LLButton::LLButton( const LLString& name, const LLRect& rect, const LLString& co mMouseUpCallback( NULL ), mHeldDownCallback( NULL ), mGLFont( NULL ), + mMouseDownFrame( 0 ), mHeldDownDelay( 0.5f ), // seconds until held-down callback is called + mHeldDownFrameDelay( 0 ), mImageUnselected( NULL ), mImageSelected( NULL ), mImageHoverSelected( NULL ), @@ -118,7 +121,9 @@ LLButton::LLButton(const LLString& name, const LLRect& rect, mMouseUpCallback( NULL ), mHeldDownCallback( NULL ), mGLFont( NULL ), + mMouseDownFrame( 0 ), mHeldDownDelay( 0.5f ), // seconds until held-down callback is called + mHeldDownFrameDelay( 0 ), mImageUnselected( NULL ), mImageSelected( NULL ), mImageHoverSelected( NULL ), @@ -215,9 +220,9 @@ void LLButton::init(void (*click_callback)(void*), void *callback_data, const LL LLButton::~LLButton() { - if( this == gFocusMgr.getMouseCapture() ) + if( hasMouseCapture() ) { - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); } } @@ -303,7 +308,7 @@ BOOL LLButton::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent ) BOOL LLButton::handleMouseDown(S32 x, S32 y, MASK mask) { // Route future Mouse messages here preemptively. (Release on mouse up.) - gFocusMgr.setMouseCapture( this, &LLButton::onMouseCaptureLost ); + gFocusMgr.setMouseCapture( this ); if (hasTabStop() && !getIsChrome()) { @@ -316,6 +321,7 @@ BOOL LLButton::handleMouseDown(S32 x, S32 y, MASK mask) } mMouseDownTimer.start(); + mMouseDownFrame = LLFrameTimer::getFrameCount(); if (mSoundFlags & MOUSE_DOWN) { @@ -329,19 +335,17 @@ BOOL LLButton::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLButton::handleMouseUp(S32 x, S32 y, MASK mask) { // We only handle the click if the click both started and ended within us - if( this == gFocusMgr.getMouseCapture() ) + if( hasMouseCapture() ) { + // Always release the mouse + gFocusMgr.setMouseCapture( NULL ); + // Regardless of where mouseup occurs, handle callback if (mMouseUpCallback) { (*mMouseUpCallback)(mCallbackUserData); } - mMouseDownTimer.stop(); - - // Always release the mouse - gFocusMgr.setMouseCapture( NULL, NULL ); - // DO THIS AT THE VERY END to allow the button to be destroyed as a result of being clicked. // If mouseup in the widget, it's been clicked if (pointInView(x, y)) @@ -356,6 +360,9 @@ BOOL LLButton::handleMouseUp(S32 x, S32 y, MASK mask) (*mClickedCallback)( mCallbackUserData ); } } + + mMouseDownTimer.stop(); + mMouseDownTimer.reset(); } return TRUE; @@ -375,14 +382,14 @@ BOOL LLButton::handleHover(S32 x, S32 y, MASK mask) if (mMouseDownTimer.getStarted() && NULL != mHeldDownCallback) { F32 elapsed = mMouseDownTimer.getElapsedTimeF32(); - if( mHeldDownDelay < elapsed ) + if( mHeldDownDelay <= elapsed && mHeldDownFrameDelay <= LLFrameTimer::getFrameCount() - mMouseDownFrame) { mHeldDownCallback( mCallbackUserData ); } } // We only handle the click if the click both started and ended within us - if( this == gFocusMgr.getMouseCapture() ) + if( hasMouseCapture() ) { handled = TRUE; } @@ -431,7 +438,7 @@ void LLButton::draw() cursor_pos_gl.mY = llround((F32)cursor_pos_gl.mY / LLUI::sGLScaleFactor.mV[VY]); screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &local_mouse_x, &local_mouse_y); - BOOL pressed = pressed_by_keyboard || (this == gFocusMgr.getMouseCapture() && pointInView(local_mouse_x, local_mouse_y)); + BOOL pressed = pressed_by_keyboard || (hasMouseCapture() && pointInView(local_mouse_x, local_mouse_y)); BOOL display_state = FALSE; if( pressed ) @@ -819,11 +826,10 @@ void LLButton::setHoverImages( const LLString& image_name, const LLString& selec setImageHoverSelected(selected_name); } -// static -void LLButton::onMouseCaptureLost( LLMouseHandler* old_captor ) +void LLButton::onMouseCaptureLost() { - LLButton* self = (LLButton*) old_captor; - self->mMouseDownTimer.stop(); + mMouseDownTimer.stop(); + mMouseDownTimer.reset(); } //------------------------------------------------------------------------- @@ -947,6 +953,19 @@ LLXMLNodePtr LLButton::getXML(bool save_children) const return node; } +void clicked_help(void* data) +{ + LLButton* self = (LLButton*)data; + if (!self) return; + + if (!LLUI::sHtmlHelp) + { + return; + } + + LLUI::sHtmlHelp->show(self->getHelpURL()); +} + // static LLView* LLButton::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory) { @@ -1023,9 +1042,21 @@ LLView* LLButton::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *fa { button->setLabelSelected(node->getTextContents()); } + + if (node->hasAttribute("help_url")) + { + LLString help_url; + node->getAttributeString("help_url",help_url); + button->setHelpURLCallback(help_url); + } button->initFromXML(node, parent); return button; } +void LLButton::setHelpURLCallback(std::string help_url) +{ + mHelpURL = help_url; + setClickedCallback(clicked_help,this); +} diff --git a/linden/indra/llui/llbutton.h b/linden/indra/llui/llbutton.h index fe906a6..44e8776 100644 --- a/linden/indra/llui/llbutton.h +++ b/linden/indra/llui/llbutton.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -94,6 +95,8 @@ public: virtual BOOL handleHover(S32 x, S32 y, MASK mask); virtual void draw(); + virtual void onMouseCaptureLost(); + // HACK: "committing" a button is the same as clicking on it. virtual void onCommit(); @@ -104,7 +107,7 @@ public: void setMouseDownCallback( void (*cb)(void *data) ) { mMouseDownCallback = cb; } // mouse down within button void setMouseUpCallback( void (*cb)(void *data) ) { mMouseUpCallback = cb; } // mouse up, EVEN IF NOT IN BUTTON void setHeldDownCallback( void (*cb)(void *data) ) { mHeldDownCallback = cb; } // Mouse button held down and in button - void setHeldDownDelay( F32 seconds) { mHeldDownDelay = seconds; } + void setHeldDownDelay( F32 seconds, S32 frames = 0) { mHeldDownDelay = seconds; mHeldDownFrameDelay = frames; } F32 getHeldDownTime() const { return mMouseDownTimer.getElapsedTimeF32(); } @@ -159,7 +162,6 @@ public: void setBorderEnabled(BOOL b) { mBorderEnabled = b; } static void onHeldDown(void *userdata); // to be called by gIdleCallbacks - static void onMouseCaptureLost(LLMouseHandler* old_captor); void setFixedBorder(S32 width, S32 height) { mFixedWidth = width; mFixedHeight = height; } void setHoverGlowStrength(F32 strength) { mHoverGlowStrength = strength; } @@ -181,6 +183,8 @@ public: void setCommitOnReturn(BOOL commit) { mCommitOnReturn = commit; } BOOL getCommitOnReturn() { return mCommitOnReturn; } + void setHelpURLCallback(std::string help_url); + LLString getHelpURL() { return mHelpURL; } protected: virtual void drawBorder(const LLColor4& color, S32 size); @@ -194,7 +198,9 @@ protected: const LLFontGL *mGLFont; LLFrameTimer mMouseDownTimer; + S32 mMouseDownFrame; F32 mHeldDownDelay; // seconds, after which held-down callbacks get called + S32 mHeldDownFrameDelay; // frames, after which held-down callbacks get called LLPointer mImageUnselected; LLUIString mUnselectedLabel; @@ -259,6 +265,8 @@ protected: BOOL mNeedsHighlight; BOOL mCommitOnReturn; + LLString mHelpURL; + LLPointer mImagep; static LLFrameTimer sFlashingTimer; diff --git a/linden/indra/llui/llcallbackmap.h b/linden/indra/llui/llcallbackmap.h index 3a0e3b3..4a47f60 100644 --- a/linden/indra/llui/llcallbackmap.h +++ b/linden/indra/llui/llcallbackmap.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llcheckboxctrl.cpp b/linden/indra/llui/llcheckboxctrl.cpp index 9f11ff8..5f3350e 100644 --- a/linden/indra/llui/llcheckboxctrl.cpp +++ b/linden/indra/llui/llcheckboxctrl.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -175,7 +176,7 @@ void LLCheckBoxCtrl::onCommit() void LLCheckBoxCtrl::setEnabled(BOOL b) { - LLUICtrl::setEnabled(b); + LLView::setEnabled(b); mButton->setEnabled(b); } diff --git a/linden/indra/llui/llcheckboxctrl.h b/linden/indra/llui/llcheckboxctrl.h index 77dc39d..1b895cb 100644 --- a/linden/indra/llui/llcheckboxctrl.h +++ b/linden/indra/llui/llcheckboxctrl.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llclipboard.cpp b/linden/indra/llui/llclipboard.cpp index d7c25fb..19f0188 100644 --- a/linden/indra/llui/llclipboard.cpp +++ b/linden/indra/llui/llclipboard.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llclipboard.h b/linden/indra/llui/llclipboard.h index 00bd73e..dc4cb32 100644 --- a/linden/indra/llui/llclipboard.h +++ b/linden/indra/llui/llclipboard.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llcombobox.cpp b/linden/indra/llui/llcombobox.cpp index 7c3755a..983dd43 100644 --- a/linden/indra/llui/llcombobox.cpp +++ b/linden/indra/llui/llcombobox.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -59,7 +60,7 @@ LLComboBox::LLComboBox( const LLString& name, const LLRect &rect, const LLString ) : LLUICtrl(name, rect, TRUE, commit_callback, callback_userdata, FOLLOWS_LEFT | FOLLOWS_TOP), - mDrawButton(TRUE), + mDrawArrow(TRUE), mTextEntry(NULL), mArrowImage(NULL), mArrowImageWidth(8), @@ -67,8 +68,8 @@ LLComboBox::LLComboBox( const LLString& name, const LLRect &rect, const LLString mMaxChars(20), mTextEntryTentative(TRUE), mPrearrangeCallback( NULL ), - mTextEntryCallback( NULL ), - mListWidth(list_width) + mListPosition(BELOW), + mTextEntryCallback( NULL ) { // For now, all comboboxes don't take keyboard focus when clicked. // This might change if it is part of a modal dialog. @@ -76,7 +77,7 @@ LLComboBox::LLComboBox( const LLString& name, const LLRect &rect, const LLString // Revert to standard behavior. When this control's parent is hidden, it needs to // hide this ctrl--which won't just happen automatically since when LLComboBox is - // showing its list, it's also set to TopView. When keyboard focus is cleared all + // showing its list, it's also set to TopCtrl. When keyboard focus is cleared all // controls (including this one) know that they are no longer editing. mKeyboardFocusOnClick = TRUE; @@ -87,7 +88,8 @@ LLComboBox::LLComboBox( const LLString& name, const LLRect &rect, const LLString // Text label button mButton = new LLSquareButton("comboxbox button", r, label, NULL, LLString::null, - &LLComboBox::onButtonClick, this); + NULL, this); + mButton->setMouseDownCallback(onButtonDown); mButton->setFont(LLFontGL::sSansSerifSmall); mButton->setFollows(FOLLOWS_LEFT | FOLLOWS_BOTTOM | FOLLOWS_RIGHT); mButton->setHAlign( LLFontGL::LEFT ); @@ -110,6 +112,7 @@ LLComboBox::LLComboBox( const LLString& name, const LLRect &rect, const LLString mList->setVisible(FALSE); mList->setBgWriteableColor( LLColor4(1,1,1,1) ); mList->setCommitOnKeyboardMovement(FALSE); + mList->setFocusChangedCallback(onListFocusChanged); addChild(mList); LLRect border_rect(0, mRect.getHeight(), mRect.getWidth(), 0); @@ -119,7 +122,7 @@ LLComboBox::LLComboBox( const LLString& name, const LLRect &rect, const LLString LLUUID arrow_image_id( LLUI::sAssetsGroup->getString("combobox_arrow.tga") ); mArrowImage = LLUI::sImageProvider->getUIImageByID(arrow_image_id); - mArrowImageWidth = llmax(8,mArrowImage->getWidth()); // In case image hasn't loaded yet + mArrowImageWidth = llmax(8,mArrowImage->getWidth(0)); // In case image hasn't loaded yet } @@ -219,115 +222,10 @@ LLView* LLComboBox::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory * void LLComboBox::setEnabled(BOOL enabled) { - LLUICtrl::setEnabled(enabled); + LLView::setEnabled(enabled); mButton->setEnabled(enabled); } -// *HACK: these are all hacks to support the fact that the combobox -// has mouse capture so we can hide the list when we don't handle the -// mouse up event -BOOL LLComboBox::handleHover(S32 x, S32 y, MASK mask) -{ - if (mList->getVisible()) - { - S32 local_x, local_y; - LLView::localPointToOtherView(x, y, &local_x, &local_y, mList); - if (mList->pointInView(local_x, local_y)) - { - return mList->handleHover(local_x, local_y, mask); - } - } - return LLUICtrl::handleHover(x, y, mask); -} - -BOOL LLComboBox::handleMouseDown(S32 x, S32 y, MASK mask) -{ - if (mList->getVisible()) - { - S32 local_x, local_y; - LLView::localPointToOtherView(x, y, &local_x, &local_y, mList); - if (mList->pointInView(local_x, local_y)) - { - return mList->handleMouseDown(local_x, local_y, mask); - } - } - BOOL has_focus_now = hasFocus(); - BOOL handled = LLUICtrl::handleMouseDown(x, y, mask); - if (handled && !has_focus_now) - { - onFocusReceived(); - } - - return handled; -} - -BOOL LLComboBox::handleRightMouseDown(S32 x, S32 y, MASK mask) -{ - if (mList->getVisible()) - { - S32 local_x, local_y; - LLView::localPointToOtherView(x, y, &local_x, &local_y, mList); - if (mList->pointInView(local_x, local_y)) - { - return mList->handleRightMouseDown(local_x, local_y, mask); - } - } - return LLUICtrl::handleRightMouseDown(x, y, mask); -} - -BOOL LLComboBox::handleRightMouseUp(S32 x, S32 y, MASK mask) -{ - if (mList->getVisible()) - { - S32 local_x, local_y; - LLView::localPointToOtherView(x, y, &local_x, &local_y, mList); - if (mList->pointInView(local_x, local_y)) - { - return mList->handleRightMouseUp(local_x, local_y, mask); - } - } - return LLUICtrl::handleRightMouseUp(x, y, mask); -} - -BOOL LLComboBox::handleDoubleClick(S32 x, S32 y, MASK mask) -{ - if (mList->getVisible()) - { - S32 local_x, local_y; - LLView::localPointToOtherView(x, y, &local_x, &local_y, mList); - if (mList->pointInView(local_x, local_y)) - { - return mList->handleDoubleClick(local_x, local_y, mask); - } - } - return LLUICtrl::handleDoubleClick(x, y, mask); -} - -BOOL LLComboBox::handleMouseUp(S32 x, S32 y, MASK mask) -{ - BOOL handled = childrenHandleMouseUp(x, y, mask) != NULL; - - if (!handled && mList->getVisible()) - { - S32 local_x, local_y; - LLView::localPointToOtherView(x, y, &local_x, &local_y, mList); - if (mList->pointInView(local_x, local_y)) - { - handled = mList->handleMouseUp(local_x, local_y, mask); - } - } - - if( !handled && gFocusMgr.getMouseCapture() == this ) - { - // Mouse events that we didn't handle cause the list to be hidden. - // Eat mouse event, regardless of where on the screen it happens. - hideList(); - handled = TRUE; - } - - return handled; -} - void LLComboBox::clear() { if (mTextEntry) @@ -512,12 +410,13 @@ void LLComboBox::onFocusLost() { mTextEntry->selectAll(); } + LLUICtrl::onFocusLost(); } void LLComboBox::setButtonVisible(BOOL visible) { mButton->setVisible(visible); - mDrawButton = visible; + mDrawArrow = visible; if (mTextEntry) { LLRect text_entry_rect(0, mRect.getHeight(), mRect.getWidth(), 0); @@ -541,15 +440,17 @@ void LLComboBox::draw() // Draw children LLUICtrl::draw(); - if (mDrawButton) + if (mDrawArrow) { // Paste the graphic on the right edge if (!mArrowImage.isNull()) { - S32 left = mRect.getWidth() - mArrowImageWidth - LLUI::sConfigGroup->getS32("DropShadowButton"); + S32 arrow_height = llmin(mRect.getHeight(), mArrowImage->getHeight()); + S32 arrow_width = llround((F32)mArrowImage->getWidth() * ((F32)arrow_height / (F32)mArrowImage->getHeight())); + + S32 left = mRect.getWidth() - mArrowImage->getWidth() - LLUI::sConfigGroup->getS32("DropShadowButton"); - gl_draw_image( left, 0, mArrowImage, - LLColor4::white); + gl_draw_scaled_image( left, 0, arrow_width, arrow_height, mArrowImage, LLColor4::white); } } } @@ -595,18 +496,61 @@ void LLComboBox::showList() //HACK: shouldn't have to know about scale here mList->arrange( 192, llfloor((F32)window_size.mY / LLUI::sGLScaleFactor.mV[VY]) - 50 ); - // Move rect so it hangs off the bottom of this view + // Make sure that we can see the whole list + LLRect root_view_local; + LLView* root_view = getRootView(); + root_view->localRectToOtherView(root_view->getLocalRect(), &root_view_local, this); + LLRect rect = mList->getRect(); - rect.setLeftTopAndSize(0, 0, rect.getWidth(), rect.getHeight() ); - mList->setRect(rect); + if (mListPosition == BELOW) + { + if (rect.getHeight() <= -root_view_local.mBottom) + { + // Move rect so it hangs off the bottom of this view + rect.setLeftTopAndSize(0, 0, rect.getWidth(), rect.getHeight() ); + } + else + { + // stack on top or bottom, depending on which has more room + if (-root_view_local.mBottom > root_view_local.mTop - mRect.getHeight()) + { + // Move rect so it hangs off the bottom of this view + rect.setLeftTopAndSize(0, 0, rect.getWidth(), llmin(-root_view_local.mBottom, rect.getHeight())); + } + else + { + // move rect so it stacks on top of this view (clipped to size of screen) + rect.setOriginAndSize(0, mRect.getHeight(), rect.getWidth(), llmin(root_view_local.mTop - mRect.getHeight(), rect.getHeight())); + } + } + } + else // ABOVE + { + if (rect.getHeight() <= root_view_local.mTop - mRect.getHeight()) + { + // move rect so it stacks on top of this view (clipped to size of screen) + rect.setOriginAndSize(0, mRect.getHeight(), rect.getWidth(), llmin(root_view_local.mTop - mRect.getHeight(), rect.getHeight())); + } + else + { + // stack on top or bottom, depending on which has more room + if (-root_view_local.mBottom > root_view_local.mTop - mRect.getHeight()) + { + // Move rect so it hangs off the bottom of this view + rect.setLeftTopAndSize(0, 0, rect.getWidth(), llmin(-root_view_local.mBottom, rect.getHeight())); + } + else + { + // move rect so it stacks on top of this view (clipped to size of screen) + rect.setOriginAndSize(0, mRect.getHeight(), rect.getWidth(), llmin(root_view_local.mTop - mRect.getHeight(), rect.getHeight())); + } + } - // Make sure that we can see the whole list - LLRect floater_area_screen; - LLRect floater_area_local; - gFloaterView->getParent()->localRectToScreen( gFloaterView->getRect(), &floater_area_screen ); - screenRectToLocal( floater_area_screen, &floater_area_local ); - mList->translateIntoRect( floater_area_local, FALSE ); + } + mList->setOrigin(rect.mLeft, rect.mBottom); + mList->reshape(rect.getWidth(), rect.getHeight()); + mList->translateIntoRect(root_view_local, FALSE); // Make sure we didn't go off bottom of screen S32 x, y; @@ -617,7 +561,12 @@ void LLComboBox::showList() mList->translate(0, -y); } - gFocusMgr.setMouseCapture( this, LLComboBox::onMouseCaptureLost ); + // pass mouse capture on to list if button is depressed + if (mButton->hasMouseCapture()) + { + gFocusMgr.setMouseCapture(mList); + } + // NB: this call will trigger the focuslost callback which will hide the list, so do it first // before finally showing the list @@ -627,14 +576,13 @@ void LLComboBox::showList() // so that the callback is not immediately triggered on setFocus() mList->selectFirstItem(); } - gFocusMgr.setKeyboardFocus(mList, onListFocusLost); + mList->setFocus(TRUE); // Show the list and push the button down mButton->setToggleState(TRUE); mList->setVisible(TRUE); - gFocusMgr.setTopView(mList, LLComboBox::onTopViewLost ); - + gFocusMgr.setTopCtrl(mList); } void LLComboBox::hideList() @@ -643,37 +591,21 @@ void LLComboBox::hideList() mList->setVisible(FALSE); mList->highlightNthItem(-1); - if( gFocusMgr.getTopView() == mList ) - { - gFocusMgr.setTopView(NULL, NULL); - } - - if( gFocusMgr.getMouseCapture() == this ) + if( gFocusMgr.getTopCtrl() == mList ) { - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setTopCtrl(NULL); } - if( gFocusMgr.getKeyboardFocus() == mList ) - { - if (mAllowTextEntry) - { - mTextEntry->setFocus(TRUE); - } - else - { - setFocus(TRUE); - } - } + //mList->setFocus(FALSE); } - //------------------------------------------------------------------ // static functions //------------------------------------------------------------------ // static -void LLComboBox::onButtonClick(void *userdata) +void LLComboBox::onButtonDown(void *userdata) { LLComboBox *self = (LLComboBox *)userdata; @@ -720,50 +652,47 @@ void LLComboBox::onItemSelected(LLUICtrl* item, void *userdata) const LLString& name = self->mList->getSimpleSelectedItem(); - self->hideList(); - S32 cur_id = self->getCurrentIndex(); if (cur_id != -1) { - self->setLabel(self->mList->getSimpleSelectedItem()); + self->setLabel(name); if (self->mAllowTextEntry) { - self->mTextEntry->setText(name); - self->mTextEntry->setTentative(FALSE); gFocusMgr.setKeyboardFocus(self->mTextEntry, NULL); self->mTextEntry->selectAll(); } - else - { - self->mButton->setLabelUnselected( name ); - self->mButton->setLabelSelected( name ); - self->mButton->setDisabledLabel( name ); - self->mButton->setDisabledSelectedLabel( name ); - } + } + else + { + // invalid selection, just restore existing value + self->mList->selectSimpleItem(self->mButton->getLabelSelected()); } self->onCommit(); -} -// static -void LLComboBox::onTopViewLost(LLView* old_focus) -{ - LLComboBox *self = (LLComboBox *) old_focus->getParent(); self->hideList(); } - // static -void LLComboBox::onMouseCaptureLost(LLMouseHandler*) +void LLComboBox::onListFocusChanged(LLUICtrl* list, void* user_data) { - // Can't hide the list here. If the list scrolls off the screen, - // and you click in the arrow buttons of the scroll bar, they must capture - // the mouse to handle scrolling-while-mouse-down. + LLComboBox *self = (LLComboBox *) list->getParent(); + // user not manipulating list or clicking on drop down button + if (!self->mList->hasFocus() && !self->mButton->hasMouseCapture()) + { + //*HACK: store the original value explicitly somewhere, not just in label + LLString orig_selection = self->mAllowTextEntry ? self->mTextEntry->getText() : self->mButton->getLabelSelected(); + + self->hideList(); + + // reassert original selection + self->mList->selectSimpleItem(orig_selection, FALSE); + } } BOOL LLComboBox::handleToolTip(S32 x, S32 y, LLString& msg, LLRect* sticky_rect_screen) { - + LLString tool_tip; if (LLUI::sShowXUINames) @@ -875,6 +804,7 @@ void LLComboBox::setAllowTextEntry(BOOL allow, S32 max_chars, BOOL set_tentative mTextEntry->setCommitOnFocusLost(FALSE); mTextEntry->setText(cur_label); mTextEntry->setIgnoreTab(TRUE); + mTextEntry->setFollowsAll(); addChild(mTextEntry); mMaxChars = max_chars; } @@ -882,6 +812,8 @@ void LLComboBox::setAllowTextEntry(BOOL allow, S32 max_chars, BOOL set_tentative { mTextEntry->setVisible(TRUE); } + + mButton->setFollows(FOLLOWS_BOTTOM | FOLLOWS_TOP | FOLLOWS_RIGHT); } else if (!allow && mAllowTextEntry) { @@ -892,6 +824,7 @@ void LLComboBox::setAllowTextEntry(BOOL allow, S32 max_chars, BOOL set_tentative { mTextEntry->setVisible(FALSE); } + mButton->setFollowsAll(); } mAllowTextEntry = allow; mTextEntryTentative = set_tentative; @@ -927,6 +860,7 @@ void LLComboBox::onTextEntry(LLLineEditor* line_editor, void* user_data) else { line_editor->setTentative(self->mTextEntryTentative); + self->mList->deselectAllItems(); } return; } @@ -1141,15 +1075,3 @@ BOOL LLComboBox::operateOnAll(EOperation op) } return FALSE; } - -//static -void LLComboBox::onListFocusLost(LLUICtrl* old_focus) -{ - // if focus is going to nothing (user hit ESC), take it back - LLComboBox* combo = (LLComboBox*)old_focus->getParent(); - combo->hideList(); - if (gFocusMgr.getKeyboardFocus() == NULL) - { - combo->focusFirstItem(); - } -} diff --git a/linden/indra/llui/llcombobox.h b/linden/indra/llui/llcombobox.h index 5de9463..8c317ee 100644 --- a/linden/indra/llui/llcombobox.h +++ b/linden/indra/llui/llcombobox.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -53,6 +54,12 @@ class LLComboBox : public LLUICtrl, public LLCtrlListInterface { public: + typedef enum e_preferred_position + { + ABOVE, + BELOW + } EPreferredPosition; + LLComboBox( const LLString& name, const LLRect &rect, @@ -77,12 +84,6 @@ public: virtual BOOL handleToolTip(S32 x, S32 y, LLString& msg, LLRect* sticky_rect); virtual BOOL handleKeyHere(KEY key, MASK mask, BOOL called_from_parent); virtual BOOL handleUnicodeCharHere(llwchar uni_char, BOOL called_from_parent); - virtual BOOL handleHover(S32 x, S32 y, MASK mask); - virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleRightMouseUp(S32 x, S32 y, MASK mask); - virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); // LLUICtrl interface virtual void clear(); // select nothing @@ -165,34 +166,31 @@ public: void setButtonVisible(BOOL visible); - static void onButtonClick(void *userdata); + static void onButtonDown(void *userdata); static void onItemSelected(LLUICtrl* item, void *userdata); - static void onTopViewLost(LLView* old_focus); - static void onMouseCaptureLost(LLMouseHandler* old_captor); + static void onListFocusChanged(LLUICtrl* item, void *userdata); static void onTextEntry(LLLineEditor* line_editor, void* user_data); static void onTextCommit(LLUICtrl* caller, void* user_data); void updateSelection(); - void showList(); - void hideList(); - - static void onListFocusLost(LLUICtrl* old_focus); - + virtual void showList(); + virtual void hideList(); + protected: LLButton* mButton; LLScrollListCtrl* mList; LLViewBorder* mBorder; BOOL mKeyboardFocusOnClick; - BOOL mDrawButton; + BOOL mDrawArrow; LLLineEditor* mTextEntry; LLPointer mArrowImage; S32 mArrowImageWidth; BOOL mAllowTextEntry; S32 mMaxChars; BOOL mTextEntryTentative; + EPreferredPosition mListPosition; void (*mPrearrangeCallback)(LLUICtrl*,void*); void (*mTextEntryCallback)(LLLineEditor*, void*); - S32 mListWidth; // width of pop-up list, 0 = use combobox width }; #endif diff --git a/linden/indra/llui/llctrlselectioninterface.cpp b/linden/indra/llui/llctrlselectioninterface.cpp index 446eb63..3b71942 100644 --- a/linden/indra/llui/llctrlselectioninterface.cpp +++ b/linden/indra/llui/llctrlselectioninterface.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llctrlselectioninterface.h b/linden/indra/llui/llctrlselectioninterface.h index 189d2e1..878648d 100644 --- a/linden/indra/llui/llctrlselectioninterface.h +++ b/linden/indra/llui/llctrlselectioninterface.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/lldraghandle.cpp b/linden/indra/llui/lldraghandle.cpp index 261d149..9e80c99 100644 --- a/linden/indra/llui/lldraghandle.cpp +++ b/linden/indra/llui/lldraghandle.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -288,7 +289,7 @@ BOOL LLDragHandle::handleMouseDown(S32 x, S32 y, MASK mask) { // Route future Mouse messages here preemptively. (Release on mouse up.) // No handler needed for focus lost since this clas has no state that depends on it. - gFocusMgr.setMouseCapture(this, NULL ); + gFocusMgr.setMouseCapture(this); localPointToScreen(x, y, &mDragLastScreenX, &mDragLastScreenY); mLastMouseScreenX = mDragLastScreenX; @@ -301,10 +302,10 @@ BOOL LLDragHandle::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLDragHandle::handleMouseUp(S32 x, S32 y, MASK mask) { - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { // Release the mouse - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); } // Note: don't pass on to children @@ -317,7 +318,7 @@ BOOL LLDragHandle::handleHover(S32 x, S32 y, MASK mask) BOOL handled = FALSE; // We only handle the click if the click both started and ended within us - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { S32 screen_x; S32 screen_y; diff --git a/linden/indra/llui/lldraghandle.h b/linden/indra/llui/lldraghandle.h index 5344358..691851d 100644 --- a/linden/indra/llui/lldraghandle.h +++ b/linden/indra/llui/lldraghandle.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/lleditmenuhandler.cpp b/linden/indra/llui/lleditmenuhandler.cpp index 7425aa8..85b4464 100644 --- a/linden/indra/llui/lleditmenuhandler.cpp +++ b/linden/indra/llui/lleditmenuhandler.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/lleditmenuhandler.h b/linden/indra/llui/lleditmenuhandler.h index 35e223b..ec3d246 100644 --- a/linden/indra/llui/lleditmenuhandler.h +++ b/linden/indra/llui/lleditmenuhandler.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llfloater.cpp b/linden/indra/llui/llfloater.cpp index 02a410e..12758b3 100644 --- a/linden/indra/llui/llfloater.cpp +++ b/linden/indra/llui/llfloater.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -57,6 +58,8 @@ extern BOOL gNoRender; const S32 MINIMIZED_WIDTH = 160; const S32 CLOSE_BOX_FROM_TOP = 1; +// use this to control "jumping" behavior when Ctrl-Tabbing +const S32 TABBED_FLOATER_OFFSET = 0; LLString LLFloater::sButtonActiveImageNames[BUTTON_COUNT] = { @@ -298,7 +301,6 @@ void LLFloater::init(const LLString& title, mRect.getHeight() - LLPANEL_BORDER_WIDTH - close_box_size); mDragHandle = new LLDragHandleLeft("drag", drag_handle_rect, title ); } - mDragHandle->setSaveToXML(false); addChild(mDragHandle); // Resize Handle @@ -314,28 +316,24 @@ void LLFloater::init(const LLString& title, "resizebar_left", LLRect( 0, mRect.getHeight(), RESIZE_BAR_THICKNESS, 0), min_width, min_height, LLResizeBar::LEFT ); - mResizeBar[0]->setSaveToXML(false); addChild( mResizeBar[0] ); mResizeBar[1] = new LLResizeBar( "resizebar_top", LLRect( 0, mRect.getHeight(), mRect.getWidth(), mRect.getHeight() - RESIZE_BAR_THICKNESS), min_width, min_height, LLResizeBar::TOP ); - mResizeBar[1]->setSaveToXML(false); addChild( mResizeBar[1] ); mResizeBar[2] = new LLResizeBar( "resizebar_right", LLRect( mRect.getWidth() - RESIZE_BAR_THICKNESS, mRect.getHeight(), mRect.getWidth(), 0), min_width, min_height, LLResizeBar::RIGHT ); - mResizeBar[2]->setSaveToXML(false); addChild( mResizeBar[2] ); mResizeBar[3] = new LLResizeBar( "resizebar_bottom", LLRect( 0, RESIZE_BAR_THICKNESS, mRect.getWidth(), 0), min_width, min_height, LLResizeBar::BOTTOM ); - mResizeBar[3]->setSaveToXML(false); addChild( mResizeBar[3] ); @@ -346,7 +344,6 @@ void LLFloater::init(const LLString& title, min_width, min_height, LLResizeHandle::RIGHT_BOTTOM); - mResizeHandle[0]->setSaveToXML(false); addChild(mResizeHandle[0]); mResizeHandle[1] = new LLResizeHandle( "resize", @@ -354,7 +351,6 @@ void LLFloater::init(const LLString& title, min_width, min_height, LLResizeHandle::RIGHT_TOP ); - mResizeHandle[1]->setSaveToXML(false); addChild(mResizeHandle[1]); mResizeHandle[2] = new LLResizeHandle( "resize", @@ -362,7 +358,6 @@ void LLFloater::init(const LLString& title, min_width, min_height, LLResizeHandle::LEFT_BOTTOM ); - mResizeHandle[2]->setSaveToXML(false); addChild(mResizeHandle[2]); mResizeHandle[3] = new LLResizeHandle( "resize", @@ -370,7 +365,6 @@ void LLFloater::init(const LLString& title, min_width, min_height, LLResizeHandle::LEFT_TOP ); - mResizeHandle[3]->setSaveToXML(false); addChild(mResizeHandle[3]); } else @@ -482,14 +476,14 @@ void LLFloater::setVisible( BOOL visible ) if( !visible ) { - if( gFocusMgr.childIsTopView( this ) ) + if( gFocusMgr.childIsTopCtrl( this ) ) { - gFocusMgr.setTopView(NULL, NULL); + gFocusMgr.setTopCtrl(NULL); } if( gFocusMgr.childHasMouseCapture( this ) ) { - gFocusMgr.setMouseCapture(NULL, NULL); + gFocusMgr.setMouseCapture(NULL); } } @@ -603,9 +597,9 @@ void LLFloater::close(bool app_quitting) void LLFloater::releaseFocus() { - if( gFocusMgr.childIsTopView( this ) ) + if( gFocusMgr.childIsTopCtrl( this ) ) { - gFocusMgr.setTopView(NULL, NULL); + gFocusMgr.setTopCtrl(NULL); } if( gFocusMgr.childHasKeyboardFocus( this ) ) @@ -615,7 +609,7 @@ void LLFloater::releaseFocus() if( gFocusMgr.childHasMouseCapture( this ) ) { - gFocusMgr.setMouseCapture(NULL, NULL); + gFocusMgr.setMouseCapture(NULL); } } @@ -1483,28 +1477,24 @@ void LLFloater::setCanResize(BOOL can_resize) "resizebar_left", LLRect( 0, mRect.getHeight(), RESIZE_BAR_THICKNESS, 0), mMinWidth, mMinHeight, LLResizeBar::LEFT ); - mResizeBar[0]->setSaveToXML(false); addChild( mResizeBar[0] ); mResizeBar[1] = new LLResizeBar( "resizebar_top", LLRect( 0, mRect.getHeight(), mRect.getWidth(), mRect.getHeight() - RESIZE_BAR_THICKNESS), mMinWidth, mMinHeight, LLResizeBar::TOP ); - mResizeBar[1]->setSaveToXML(false); addChild( mResizeBar[1] ); mResizeBar[2] = new LLResizeBar( "resizebar_right", LLRect( mRect.getWidth() - RESIZE_BAR_THICKNESS, mRect.getHeight(), mRect.getWidth(), 0), mMinWidth, mMinHeight, LLResizeBar::RIGHT ); - mResizeBar[2]->setSaveToXML(false); addChild( mResizeBar[2] ); mResizeBar[3] = new LLResizeBar( "resizebar_bottom", LLRect( 0, RESIZE_BAR_THICKNESS, mRect.getWidth(), 0), mMinWidth, mMinHeight, LLResizeBar::BOTTOM ); - mResizeBar[3]->setSaveToXML(false); addChild( mResizeBar[3] ); @@ -1515,7 +1505,6 @@ void LLFloater::setCanResize(BOOL can_resize) mMinWidth, mMinHeight, LLResizeHandle::RIGHT_BOTTOM); - mResizeHandle[0]->setSaveToXML(false); addChild(mResizeHandle[0]); mResizeHandle[1] = new LLResizeHandle( "resize", @@ -1523,7 +1512,6 @@ void LLFloater::setCanResize(BOOL can_resize) mMinWidth, mMinHeight, LLResizeHandle::RIGHT_TOP ); - mResizeHandle[1]->setSaveToXML(false); addChild(mResizeHandle[1]); mResizeHandle[2] = new LLResizeHandle( "resize", @@ -1531,7 +1519,6 @@ void LLFloater::setCanResize(BOOL can_resize) mMinWidth, mMinHeight, LLResizeHandle::LEFT_BOTTOM ); - mResizeHandle[2]->setSaveToXML(false); addChild(mResizeHandle[2]); mResizeHandle[3] = new LLResizeHandle( "resize", @@ -1539,7 +1526,6 @@ void LLFloater::setCanResize(BOOL can_resize) mMinWidth, mMinHeight, LLResizeHandle::LEFT_TOP ); - mResizeHandle[3]->setSaveToXML(false); addChild(mResizeHandle[3]); } mResizable = can_resize; @@ -2041,8 +2027,7 @@ void LLFloaterView::focusFrontFloater() void LLFloaterView::getMinimizePosition(S32 *left, S32 *bottom) { S32 col = 0; - LLRect snap_rect_local = getSnapRect(); - snap_rect_local.translate(-mRect.mLeft, -mRect.mBottom); + LLRect snap_rect_local = getLocalSnapRect(); for(S32 row = snap_rect_local.mBottom; row < snap_rect_local.getHeight() - LLFLOATER_HEADER_SIZE; row += LLFLOATER_HEADER_SIZE ) //loop rows @@ -2165,8 +2150,7 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out S32 screen_width = getSnapRect().getWidth(); S32 screen_height = getSnapRect().getHeight(); // convert to local coordinate frame - LLRect snap_rect_local = getSnapRect(); - snap_rect_local.translate(-mRect.mLeft, -mRect.mBottom); + LLRect snap_rect_local = getLocalSnapRect(); if( floater->isResizable() ) { @@ -2207,32 +2191,27 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out void LLFloaterView::draw() { - if( getVisible() ) - { - refresh(); - - // hide focused floater if in cycle mode, so that it can be drawn on top - LLFloater* focused_floater = getFocusedFloater(); - BOOL floater_visible = FALSE; - if (mFocusCycleMode && focused_floater) - { - floater_visible = focused_floater->getVisible(); - focused_floater->setVisible(FALSE); - } + refresh(); - // And actually do the draw - LLView::draw(); + // hide focused floater if in cycle mode, so that it can be drawn on top + LLFloater* focused_floater = getFocusedFloater(); - // manually draw focused floater on top when in cycle mode - if (mFocusCycleMode && focused_floater) + if (mFocusCycleMode && focused_floater) + { + child_list_const_iter_t child_it = getChildList()->begin(); + for (;child_it != getChildList()->end(); ++child_it) { - // draw focused item on top for better feedback - focused_floater->setVisible(floater_visible); - if (floater_visible) + if ((*child_it) != focused_floater) { - drawChild(focused_floater); + drawChild(*child_it); } } + + drawChild(focused_floater, -TABBED_FLOATER_OFFSET, TABBED_FLOATER_OFFSET); + } + else + { + LLView::draw(); } } diff --git a/linden/indra/llui/llfloater.h b/linden/indra/llui/llfloater.h index 25b2697..e752d8b 100644 --- a/linden/indra/llui/llfloater.h +++ b/linden/indra/llui/llfloater.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llfocusmgr.cpp b/linden/indra/llui/llfocusmgr.cpp index f02996b..f79164e 100644 --- a/linden/indra/llui/llfocusmgr.cpp +++ b/linden/indra/llui/llfocusmgr.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -40,18 +41,16 @@ LLFocusMgr::LLFocusMgr() mLockedView( NULL ), mKeyboardLockedFocusLostCallback( NULL ), mMouseCaptor( NULL ), - mMouseCaptureLostCallback( NULL ), mKeyboardFocus( NULL ), mDefaultKeyboardFocus( NULL ), mKeyboardFocusLostCallback( NULL ), - mTopView( NULL ), - mTopViewLostCallback( NULL ), + mTopCtrl( NULL ), mFocusWeight(0.f), mAppHasFocus(TRUE) // Macs don't seem to notify us that we've gotten focus, so default to true #ifdef _DEBUG , mMouseCaptorName("none") , mKeyboardFocusName("none") - , mTopViewName("none") + , mTopCtrlName("none") #endif { } @@ -65,7 +64,7 @@ void LLFocusMgr::releaseFocusIfNeeded( LLView* view ) { if( childHasMouseCapture( view ) ) { - setMouseCapture( NULL, NULL ); + setMouseCapture( NULL ); } if( childHasKeyboardFocus( view )) @@ -82,9 +81,9 @@ void LLFocusMgr::releaseFocusIfNeeded( LLView* view ) } } - if( childIsTopView( view ) ) + if( childIsTopCtrl( view ) ) { - setTopView( NULL, NULL ); + setTopCtrl( NULL ); } } @@ -127,13 +126,13 @@ void LLFocusMgr::setKeyboardFocus(LLUICtrl* new_focus, FocusLostCallback on_focu // If we've got a default keyboard focus, and the caller is // releasing keyboard focus, move to the default. - if (mDefaultKeyboardFocus != NULL && new_focus == NULL) + if (mDefaultKeyboardFocus != NULL && mKeyboardFocus == NULL) { mDefaultKeyboardFocus->setFocus(TRUE); } - LLView* focus_subtree = new_focus; - LLView* viewp = new_focus; + LLView* focus_subtree = mKeyboardFocus; + LLView* viewp = mKeyboardFocus; // find root-most focus root while(viewp) { @@ -147,13 +146,13 @@ void LLFocusMgr::setKeyboardFocus(LLUICtrl* new_focus, FocusLostCallback on_focu if (focus_subtree) { - mFocusHistory[focus_subtree->mViewHandle] = new_focus ? new_focus->mViewHandle : LLViewHandle::sDeadHandle; + mFocusHistory[focus_subtree->mViewHandle] = mKeyboardFocus ? mKeyboardFocus->mViewHandle : LLViewHandle::sDeadHandle; } } if (lock) { - mLockedView = new_focus; + mLockedView = mKeyboardFocus; mKeyboardLockedFocusLostCallback = on_focus_lost; } } @@ -217,16 +216,13 @@ void LLFocusMgr::removeKeyboardFocusWithoutCallback( LLView* focus ) } -void LLFocusMgr::setMouseCapture( LLMouseHandler* new_captor, void (*on_capture_lost)(LLMouseHandler* old_captor) ) +void LLFocusMgr::setMouseCapture( LLMouseHandler* new_captor ) { //if (mFocusLocked) //{ // return; //} - void (*old_callback)(LLMouseHandler*) = mMouseCaptureLostCallback; - mMouseCaptureLostCallback = on_capture_lost; - if( new_captor != mMouseCaptor ) { LLMouseHandler* old_captor = mMouseCaptor; @@ -249,9 +245,9 @@ void LLFocusMgr::setMouseCapture( LLMouseHandler* new_captor, void (*on_capture_ } */ - if( old_callback ) + if( old_captor ) { - old_callback( old_captor ); + old_captor->onMouseCaptureLost(); } #ifdef _DEBUG @@ -269,7 +265,6 @@ void LLFocusMgr::removeMouseCaptureWithoutCallback( LLMouseHandler* captor ) if( mMouseCaptor == captor ) { mMouseCaptor = NULL; - mMouseCaptureLostCallback = NULL; #ifdef _DEBUG mMouseCaptorName = "none"; #endif @@ -277,9 +272,9 @@ void LLFocusMgr::removeMouseCaptureWithoutCallback( LLMouseHandler* captor ) } -BOOL LLFocusMgr::childIsTopView( LLView* parent ) +BOOL LLFocusMgr::childIsTopCtrl( LLView* parent ) { - LLView* top_view = mTopView; + LLView* top_view = (LLView*)mTopCtrl; while( top_view ) { if( top_view == parent ) @@ -294,36 +289,25 @@ BOOL LLFocusMgr::childIsTopView( LLView* parent ) // set new_top = NULL to release top_view. -void LLFocusMgr::setTopView( LLView* new_top, void (*on_top_lost)(LLView* old_top) ) +void LLFocusMgr::setTopCtrl( LLUICtrl* new_top ) { - void (*old_callback)(LLView*) = mTopViewLostCallback; - mTopViewLostCallback = on_top_lost; - - if( new_top != mTopView ) + if( new_top != mTopCtrl ) { - LLView* old_top = mTopView; - mTopView = new_top; - if( old_callback ) - { - old_callback( old_top ); - } - - mTopView = new_top; + mTopCtrl = new_top; #ifdef _DEBUG - mTopViewName = new_top ? new_top->getName() : "none"; + mTopCtrlName = new_top ? new_top->getName() : "none"; #endif } } -void LLFocusMgr::removeTopViewWithoutCallback( LLView* top_view ) +void LLFocusMgr::removeTopCtrlWithoutCallback( LLUICtrl* top_view ) { - if( mTopView == top_view ) + if( mTopCtrl == top_view ) { - mTopView = NULL; - mTopViewLostCallback = NULL; + mTopCtrl = NULL; #ifdef _DEBUG - mTopViewName = "none"; + mTopCtrlName = "none"; #endif } } @@ -362,6 +346,12 @@ void LLFocusMgr::setAppHasFocus(BOOL focus) { triggerFocusFlash(); } + + // release focus from "top ctrl"s, which generally hides them + if (!focus && mTopCtrl && mTopCtrl->hasFocus()) + { + mTopCtrl->setFocus(FALSE); + } mAppHasFocus = focus; } diff --git a/linden/indra/llui/llfocusmgr.h b/linden/indra/llui/llfocusmgr.h index 5687b99..e189945 100644 --- a/linden/indra/llui/llfocusmgr.h +++ b/linden/indra/llui/llfocusmgr.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -46,7 +47,7 @@ public: ~LLFocusMgr(); // Mouse Captor - void setMouseCapture(LLMouseHandler* new_captor,void (*on_capture_lost)(LLMouseHandler* old_captor)); // new_captor = NULL to release the mouse. + void setMouseCapture(LLMouseHandler* new_captor); // new_captor = NULL to release the mouse. LLMouseHandler* getMouseCapture() { return mMouseCaptor; } void removeMouseCaptureWithoutCallback( LLMouseHandler* captor ); BOOL childHasMouseCapture( LLView* parent ); @@ -73,10 +74,10 @@ public: // Top View - void setTopView(LLView* new_top, void (*on_top_lost)(LLView* old_top)); - LLView* getTopView() const { return mTopView; } - void removeTopViewWithoutCallback( LLView* top_view ); - BOOL childIsTopView( LLView* parent ); + void setTopCtrl(LLUICtrl* new_top); + LLUICtrl* getTopCtrl() const { return mTopCtrl; } + void removeTopCtrlWithoutCallback( LLUICtrl* top_view ); + BOOL childIsTopCtrl( LLView* parent ); // All Three void releaseFocusIfNeeded( LLView* top_view ); @@ -89,7 +90,6 @@ protected: // Mouse Captor LLMouseHandler* mMouseCaptor; // Mouse events are premptively routed to this object - void (*mMouseCaptureLostCallback)(LLMouseHandler*); // The object to which mouse events are routed is called before another object takes its place // Keyboard Focus LLUICtrl* mKeyboardFocus; // Keyboard events are preemptively routed to this object @@ -97,8 +97,7 @@ protected: FocusLostCallback mKeyboardFocusLostCallback; // The object to which keyboard events are routed is called before another object takes its place // Top View - LLView* mTopView; - void (*mTopViewLostCallback)(LLView*); + LLUICtrl* mTopCtrl; LLFrameTimer mFocusTimer; F32 mFocusWeight; @@ -111,7 +110,7 @@ protected: #ifdef _DEBUG LLString mMouseCaptorName; LLString mKeyboardFocusName; - LLString mTopViewName; + LLString mTopCtrlName; #endif }; diff --git a/linden/indra/llui/llhtmlhelp.h b/linden/indra/llui/llhtmlhelp.h new file mode 100644 index 0000000..4b2a43a --- /dev/null +++ b/linden/indra/llui/llhtmlhelp.h @@ -0,0 +1,40 @@ +/** + * @file llhtmlhelp.h + * @brief HTML Help floater interface + * + * Copyright (c) 2006-2007, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + */ + +#ifndef LL_LLHTMLHELP_H +#define LL_LLHTMLHELP_H + +class LLHtmlHelp +{ +public: + virtual ~LLHtmlHelp() {} + virtual void show(std::string start_url = "")=0; + virtual BOOL getFloaterOpened()=0; +}; + +#endif // LL_LLFLOATERHTMLHELP_H diff --git a/linden/indra/llui/lliconctrl.cpp b/linden/indra/llui/lliconctrl.cpp index 7dbd2bf..2d3071b 100644 --- a/linden/indra/llui/lliconctrl.cpp +++ b/linden/indra/llui/lliconctrl.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/lliconctrl.h b/linden/indra/llui/lliconctrl.h index e0a2df0..8dbe6db 100644 --- a/linden/indra/llui/lliconctrl.h +++ b/linden/indra/llui/lliconctrl.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llkeywords.cpp b/linden/indra/llui/llkeywords.cpp index 05ec652..8997bd6 100644 --- a/linden/indra/llui/llkeywords.cpp +++ b/linden/indra/llui/llkeywords.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llkeywords.h b/linden/indra/llui/llkeywords.h index dc2745e..040df53 100644 --- a/linden/indra/llui/llkeywords.h +++ b/linden/indra/llui/llkeywords.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/lllineeditor.cpp b/linden/indra/llui/lllineeditor.cpp index 1ca17fe..ec156ba 100644 --- a/linden/indra/llui/lllineeditor.cpp +++ b/linden/indra/llui/lllineeditor.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -115,7 +116,7 @@ LLLineEditor::LLLineEditor(const LLString& name, const LLRect& rect, S32 max_length_bytes, void (*commit_callback)(LLUICtrl* caller, void* user_data ), void (*keystroke_callback)(LLLineEditor* caller, void* user_data ), - void (*focus_lost_callback)(LLLineEditor* caller, void* user_data ), + void (*focus_lost_callback)(LLUICtrl* caller, void* user_data ), void* userdata, LLLinePrevalidateFunc prevalidate_func, LLViewBorder::EBevel border_bevel, @@ -132,7 +133,6 @@ LLLineEditor::LLLineEditor(const LLString& name, const LLRect& rect, mCommitOnFocusLost( TRUE ), mRevertOnEsc( TRUE ), mKeystrokeCallback( keystroke_callback ), - mFocusLostCallback( focus_lost_callback ), mIsSelecting( FALSE ), mSelectionStart( 0 ), mSelectionEnd( 0 ), @@ -166,6 +166,8 @@ LLLineEditor::LLLineEditor(const LLString& name, const LLRect& rect, mGLFont = LLFontGL::sSansSerifSmall; } + setFocusLostCallback(focus_lost_callback); + mMinHPixels = mBorderThickness + UI_LINEEDITOR_H_PAD + mBorderLeft; mMaxHPixels = mRect.getWidth() - mMinHPixels - mBorderThickness - mBorderRight; @@ -186,7 +188,6 @@ LLLineEditor::LLLineEditor(const LLString& name, const LLRect& rect, LLLineEditor::~LLLineEditor() { - mFocusLostCallback = NULL; mCommitOnFocusLost = FALSE; gFocusMgr.releaseFocusIfNeeded( this ); @@ -211,11 +212,8 @@ LLString LLLineEditor::getWidgetTag() const void LLLineEditor::onFocusLost() { - if( mFocusLostCallback ) - { - mFocusLostCallback( this, mCallbackUserData ); - } - + LLUICtrl::onFocusLost(); + if( mCommitOnFocusLost && mText.getString() != mPrevText) { onCommit(); @@ -502,7 +500,7 @@ BOOL LLLineEditor::handleMouseDown(S32 x, S32 y, MASK mask) startSelection(); } - gFocusMgr.setMouseCapture( this, &LLLineEditor::onMouseCaptureLost ); + gFocusMgr.setMouseCapture( this ); } // delay cursor flashing @@ -515,14 +513,14 @@ BOOL LLLineEditor::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLLineEditor::handleHover(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; - if (gFocusMgr.getMouseCapture() != this && (x < mBorderLeft || x > (mRect.getWidth() - mBorderRight))) + if (!hasMouseCapture() && (x < mBorderLeft || x > (mRect.getWidth() - mBorderRight))) { return LLUICtrl::handleHover(x, y, mask); } if( getVisible() ) { - if( (gFocusMgr.getMouseCapture() == this) && mIsSelecting ) + if( (hasMouseCapture()) && mIsSelecting ) { if (x != mLastSelectionX || y != mLastSelectionY) { @@ -580,9 +578,9 @@ BOOL LLLineEditor::handleMouseUp(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); handled = TRUE; } @@ -1916,11 +1914,9 @@ BOOL LLLineEditor::prevalidateASCII(const LLWString &str) return rv; } -//static -void LLLineEditor::onMouseCaptureLost( LLMouseHandler* old_captor ) +void LLLineEditor::onMouseCaptureLost() { - LLLineEditor* self = (LLLineEditor*) old_captor; - self->endSelection(); + endSelection(); } @@ -1935,11 +1931,6 @@ void LLLineEditor::setKeystrokeCallback(void (*keystroke_callback)(LLLineEditor* mKeystrokeCallback = keystroke_callback; } -void LLLineEditor::setFocusLostCallback(void (*keystroke_callback)(LLLineEditor* caller, void* user_data)) -{ - mFocusLostCallback = keystroke_callback; -} - // virtual LLXMLNodePtr LLLineEditor::getXML(bool save_children) const { diff --git a/linden/indra/llui/lllineeditor.h b/linden/indra/llui/lllineeditor.h index 427860d..65c75ab 100644 --- a/linden/indra/llui/lllineeditor.h +++ b/linden/indra/llui/lllineeditor.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -70,7 +71,7 @@ public: S32 max_length_bytes = 254, void (*commit_callback)(LLUICtrl* caller, void* user_data) = NULL, void (*keystroke_callback)(LLLineEditor* caller, void* user_data) = NULL, - void (*focus_lost_callback)(LLLineEditor* caller, void* user_data) = NULL, + void (*focus_lost_callback)(LLUICtrl* caller, void* user_data) = NULL, void* userdata = NULL, LLLinePrevalidateFunc prevalidate_func = NULL, LLViewBorder::EBevel border_bevel = LLViewBorder::BEVEL_IN, @@ -91,6 +92,7 @@ public: /*virtual*/ BOOL handleDoubleClick(S32 x,S32 y,MASK mask); /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask, BOOL called_from_parent ); /*virtual*/ BOOL handleUnicodeCharHere(llwchar uni_char, BOOL called_from_parent); + /*virtual*/ void onMouseCaptureLost(); // LLEditMenuHandler overrides virtual void cut(); @@ -185,7 +187,6 @@ public: void setSelectAllonFocusReceived(BOOL b); void setKeystrokeCallback(void (*keystroke_callback)(LLLineEditor* caller, void* user_data)); - void setFocusLostCallback(void (*keystroke_callback)(LLLineEditor* caller, void* user_data)); void setMaxTextLength(S32 max_text_length); void setBorderWidth(S32 left, S32 right); @@ -205,8 +206,6 @@ public: static BOOL postvalidateFloat(const LLString &str); - static void onMouseCaptureLost( LLMouseHandler* old_captor ); - protected: void removeChar(); void addChar(const llwchar c); @@ -241,7 +240,6 @@ protected: BOOL mRevertOnEsc; void (*mKeystrokeCallback)( LLLineEditor* caller, void* userdata ); - void (*mFocusLostCallback)( LLLineEditor* caller, void* userdata ); BOOL mIsSelecting; // Selection for clipboard operations S32 mSelectionStart; diff --git a/linden/indra/llui/llmemberlistener.h b/linden/indra/llui/llmemberlistener.h index 93bcff5..92e7278 100755 --- a/linden/indra/llui/llmemberlistener.h +++ b/linden/indra/llui/llmemberlistener.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llmenugl.cpp b/linden/indra/llui/llmenugl.cpp index 1748956..1920aac 100644 --- a/linden/indra/llui/llmenugl.cpp +++ b/linden/indra/llui/llmenugl.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -3254,6 +3255,7 @@ LLPieMenu::LLPieMenu(const LLString& name, const LLString& label) mUseInfiniteRadius(FALSE), mHoverItem(NULL), mHoverThisFrame(FALSE), + mHoveredAnyItem(FALSE), mOuterRingAlpha(1.f), mCurRadius(0.f), mRightMouseDown(FALSE) @@ -3268,6 +3270,7 @@ LLPieMenu::LLPieMenu(const LLString& name) mUseInfiniteRadius(FALSE), mHoverItem(NULL), mHoverThisFrame(FALSE), + mHoveredAnyItem(FALSE), mOuterRingAlpha(1.f), mCurRadius(0.f), mRightMouseDown(FALSE) @@ -3338,12 +3341,12 @@ BOOL LLPieMenu::handleHover( S32 x, S32 y, MASK mask ) // release mouse capture after short period of visibility if we're using a finite boundary // so that right click outside of boundary will trigger new pie menu - if (gFocusMgr.getMouseCapture() == this && + if (hasMouseCapture() && !mRightMouseDown && mShrinkBorderTimer.getStarted() && mShrinkBorderTimer.getElapsedTimeF32() >= PIE_SHRINK_TIME) { - gFocusMgr.setMouseCapture(NULL, NULL); + gFocusMgr.setMouseCapture(NULL); mUseInfiniteRadius = FALSE; } @@ -3395,6 +3398,7 @@ BOOL LLPieMenu::handleHover( S32 x, S32 y, MASK mask ) break; } } + mHoveredAnyItem = TRUE; } else { @@ -3456,7 +3460,7 @@ BOOL LLPieMenu::handleRightMouseDown(S32 x, S32 y, MASK mask) if (clicked_in_pie) { // capture mouse cursor as if on initial menu show - gFocusMgr.setMouseCapture(this, NULL); + gFocusMgr.setMouseCapture(this); mShrinkBorderTimer.stop(); mUseInfiniteRadius = TRUE; handled = TRUE; @@ -3482,11 +3486,22 @@ BOOL LLPieMenu::handleRightMouseUp( S32 x, S32 y, MASK mask ) mShrinkBorderTimer.getElapsedTimeF32() > PIE_SHRINK_TIME) { mUseInfiniteRadius = FALSE; - gFocusMgr.setMouseCapture(NULL, NULL); + gFocusMgr.setMouseCapture(NULL); } + S32 delta_x = x /*+ mShiftHoriz*/ - getLocalRect().getCenterX(); + S32 delta_y = y /*+ mShiftVert*/ - getLocalRect().getCenterY(); + if (!mHoveredAnyItem && !mFirstMouseDown && (delta_x * delta_x) + (delta_y * delta_y) < PIE_CENTER_SIZE * PIE_CENTER_SIZE) + { + // user released right mouse button in middle of pie, interpret this as closing the menu + sMenuContainer->hideMenus(); + return TRUE; + } + + BOOL result = handleMouseUp( x, y, mask ); mRightMouseDown = FALSE; + mHoveredAnyItem = FALSE; return result; } @@ -3893,6 +3908,8 @@ void LLPieMenu::show(S32 x, S32 y, BOOL mouse_down) mRightMouseDown = mouse_down; mFirstMouseDown = mouse_down; mUseInfiniteRadius = TRUE; + mHoveredAnyItem = FALSE; + if (!mFirstMouseDown) { make_ui_sound("UISndPieMenuAppear"); @@ -3902,7 +3919,7 @@ void LLPieMenu::show(S32 x, S32 y, BOOL mouse_down) // we want all mouse events in case user does quick right click again off of pie menu // rectangle, to support gestural menu traversal - gFocusMgr.setMouseCapture(this, NULL); + gFocusMgr.setMouseCapture(this); if (mouse_down) { @@ -3929,10 +3946,11 @@ void LLPieMenu::hide(BOOL item_selected) mFirstMouseDown = FALSE; mRightMouseDown = FALSE; mUseInfiniteRadius = FALSE; + mHoveredAnyItem = FALSE; LLView::setVisible(FALSE); - gFocusMgr.setMouseCapture(NULL, NULL); + gFocusMgr.setMouseCapture(NULL); } ///============================================================================ @@ -4529,6 +4547,7 @@ void LLTearOffMenu::onFocusLost() { // remove highlight from parent item and our own menu mMenu->clearHoverItem(); + LLFloater::onFocusLost(); } BOOL LLTearOffMenu::handleUnicodeChar(llwchar uni_char, BOOL called_from_parent) diff --git a/linden/indra/llui/llmenugl.h b/linden/indra/llui/llmenugl.h index c4a0043..6051a26 100644 --- a/linden/indra/llui/llmenugl.h +++ b/linden/indra/llui/llmenugl.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -691,6 +692,7 @@ private: BOOL mUseInfiniteRadius; // allow picking pie menu items anywhere outside of center circle LLMenuItemGL* mHoverItem; BOOL mHoverThisFrame; + BOOL mHoveredAnyItem; LLFrameTimer mShrinkBorderTimer; F32 mOuterRingAlpha; // for rendering pie menus as both bounded and unbounded F32 mCurRadius; diff --git a/linden/indra/llui/llmodaldialog.cpp b/linden/indra/llui/llmodaldialog.cpp index c875e7c..788dead 100644 --- a/linden/indra/llui/llmodaldialog.cpp +++ b/linden/indra/llui/llmodaldialog.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -84,8 +85,8 @@ void LLModalDialog::startModal() } // This is a modal dialog. It sucks up all mouse and keyboard operations. - gFocusMgr.setMouseCapture( this, NULL ); - gFocusMgr.setTopView( this, NULL ); + gFocusMgr.setMouseCapture( this ); + gFocusMgr.setTopCtrl( this ); setFocus(TRUE); sModalStack.push_front( this ); @@ -126,10 +127,10 @@ void LLModalDialog::setVisible( BOOL visible ) if( visible ) { // This is a modal dialog. It sucks up all mouse and keyboard operations. - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); // The dialog view is a root view - gFocusMgr.setTopView( this, NULL ); + gFocusMgr.setTopCtrl( this ); setFocus( TRUE ); } else @@ -241,9 +242,9 @@ void LLModalDialog::draw() if (mModal) { // If we've lost focus to a non-child, get it back ASAP. - if( gFocusMgr.getTopView() != this ) + if( gFocusMgr.getTopCtrl() != this ) { - gFocusMgr.setTopView( this, NULL); + gFocusMgr.setTopCtrl( this ); } if( !gFocusMgr.childHasKeyboardFocus( this ) ) @@ -253,7 +254,7 @@ void LLModalDialog::draw() if( !gFocusMgr.childHasMouseCapture( this ) ) { - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); } } } @@ -278,7 +279,7 @@ void LLModalDialog::onAppFocusLost() LLModalDialog* instance = LLModalDialog::sModalStack.front(); if( gFocusMgr.childHasMouseCapture( instance ) ) { - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); } if( gFocusMgr.childHasKeyboardFocus( instance ) ) @@ -296,9 +297,9 @@ void LLModalDialog::onAppFocusGained() LLModalDialog* instance = LLModalDialog::sModalStack.front(); // This is a modal dialog. It sucks up all mouse and keyboard operations. - gFocusMgr.setMouseCapture( instance, NULL ); + gFocusMgr.setMouseCapture( instance ); instance->setFocus(TRUE); - gFocusMgr.setTopView( instance, NULL ); + gFocusMgr.setTopCtrl( instance ); instance->centerOnScreen(); } diff --git a/linden/indra/llui/llmodaldialog.h b/linden/indra/llui/llmodaldialog.h index 2fc101c..c2564af 100644 --- a/linden/indra/llui/llmodaldialog.h +++ b/linden/indra/llui/llmodaldialog.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llpanel.cpp b/linden/indra/llui/llpanel.cpp index 8d3fba6..9e444c1 100644 --- a/linden/indra/llui/llpanel.cpp +++ b/linden/indra/llui/llpanel.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llpanel.h b/linden/indra/llui/llpanel.h index d9bd19c..9da942e 100644 --- a/linden/indra/llui/llpanel.h +++ b/linden/indra/llui/llpanel.h @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llradiogroup.cpp b/linden/indra/llui/llradiogroup.cpp index f52faf9..eda54b1 100644 --- a/linden/indra/llui/llradiogroup.cpp +++ b/linden/indra/llui/llradiogroup.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llradiogroup.h b/linden/indra/llui/llradiogroup.h index 9324113..0cd5901 100644 --- a/linden/indra/llui/llradiogroup.h +++ b/linden/indra/llui/llradiogroup.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llresizebar.cpp b/linden/indra/llui/llresizebar.cpp index 1298b75..79127a8 100644 --- a/linden/indra/llui/llresizebar.cpp +++ b/linden/indra/llui/llresizebar.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -40,8 +41,8 @@ LLResizeBar::LLResizeBar( const LLString& name, const LLRect& rect, S32 min_width, S32 min_height, Side side ) : LLView( name, rect, TRUE ), - mDragStartScreenX( 0 ), - mDragStartScreenY( 0 ), + mDragLastScreenX( 0 ), + mDragLastScreenY( 0 ), mLastMouseScreenX( 0 ), mLastMouseScreenY( 0 ), mMinWidth( min_width ), @@ -74,6 +75,8 @@ LLResizeBar::LLResizeBar( const LLString& name, const LLRect& rect, S32 min_widt default: break; } + // this is just a decorator + setSaveToXML(FALSE); } @@ -83,12 +86,11 @@ BOOL LLResizeBar::handleMouseDown(S32 x, S32 y, MASK mask) { // Route future Mouse messages here preemptively. (Release on mouse up.) // No handler needed for focus lost since this clas has no state that depends on it. - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); - //localPointToScreen(x, y, &mDragStartScreenX, &mDragStartScreenX); - localPointToOtherView(x, y, &mDragStartScreenX, &mDragStartScreenY, getParent()->getParent()); - mLastMouseScreenX = mDragStartScreenX; - mLastMouseScreenY = mDragStartScreenY; + localPointToScreen(x, y, &mDragLastScreenX, &mDragLastScreenY); + mLastMouseScreenX = mDragLastScreenX; + mLastMouseScreenY = mDragLastScreenY; } return TRUE; @@ -99,10 +101,10 @@ BOOL LLResizeBar::handleMouseUp(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { // Release the mouse - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); handled = TRUE; } else @@ -127,74 +129,73 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask) BOOL handled = FALSE; // We only handle the click if the click both started and ended within us - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { - // *NOTE: this, of course, is fragile - LLView* floater_view = getParent()->getParent(); - S32 floater_view_x; - S32 floater_view_y; - localPointToOtherView(x, y, &floater_view_x, &floater_view_y, floater_view); + S32 screen_x; + S32 screen_y; + localPointToScreen(x, y, &screen_x, &screen_y); - S32 delta_x = floater_view_x - mDragStartScreenX; - S32 delta_y = floater_view_y - mDragStartScreenY; + S32 delta_x = screen_x - mDragLastScreenX; + S32 delta_y = screen_y - mDragLastScreenY; LLCoordGL mouse_dir; // use hysteresis on mouse motion to preserve user intent when mouse stops moving - mouse_dir.mX = (floater_view_x == mLastMouseScreenX) ? mLastMouseDir.mX : floater_view_x - mLastMouseScreenX; - mouse_dir.mY = (floater_view_y == mLastMouseScreenY) ? mLastMouseDir.mY : floater_view_y - mLastMouseScreenY; + mouse_dir.mX = (screen_x == mLastMouseScreenX) ? mLastMouseDir.mX : screen_x - mLastMouseScreenX; + mouse_dir.mY = (screen_y == mLastMouseScreenY) ? mLastMouseDir.mY : screen_y - mLastMouseScreenY; mLastMouseDir = mouse_dir; - mLastMouseScreenX = floater_view_x; - mLastMouseScreenY = floater_view_y; + mLastMouseScreenX = screen_x; + mLastMouseScreenY = screen_y; // Make sure the mouse in still over the application. We don't want to make the parent // so big that we can't see the resize handle any more. - LLRect valid_rect = floater_view->getRect(); - LLView* parentView = getParent(); - if( valid_rect.localPointInRect( floater_view_x, floater_view_y ) && parentView ) + LLRect valid_rect = getRootView()->getRect(); + LLView* resizing_view = getParent(); + + if( valid_rect.localPointInRect( screen_x, screen_y ) && resizing_view ) { // Resize the parent - LLRect parent_rect = parentView->getRect(); - LLRect scaled_rect = parent_rect; + LLRect orig_rect = resizing_view->getRect(); + LLRect scaled_rect = orig_rect; - S32 new_width = parent_rect.getWidth(); - S32 new_height = parent_rect.getHeight(); + S32 new_width = orig_rect.getWidth(); + S32 new_height = orig_rect.getHeight(); switch( mSide ) { case LEFT: - new_width = parent_rect.getWidth() - delta_x; + new_width = orig_rect.getWidth() - delta_x; if( new_width < mMinWidth ) { new_width = mMinWidth; - delta_x = parent_rect.getWidth() - mMinWidth; + delta_x = orig_rect.getWidth() - mMinWidth; } scaled_rect.translate(delta_x, 0); break; case TOP: - new_height = parent_rect.getHeight() + delta_y; + new_height = orig_rect.getHeight() + delta_y; if( new_height < mMinHeight ) { new_height = mMinHeight; - delta_y = mMinHeight - parent_rect.getHeight(); + delta_y = mMinHeight - orig_rect.getHeight(); } break; case RIGHT: - new_width = parent_rect.getWidth() + delta_x; + new_width = orig_rect.getWidth() + delta_x; if( new_width < mMinWidth ) { new_width = mMinWidth; - delta_x = mMinWidth - parent_rect.getWidth(); + delta_x = mMinWidth - orig_rect.getWidth(); } break; case BOTTOM: - new_height = parent_rect.getHeight() - delta_y; + new_height = orig_rect.getHeight() - delta_y; if( new_height < mMinHeight ) { new_height = mMinHeight; - delta_y = parent_rect.getHeight() - mMinHeight; + delta_y = orig_rect.getHeight() - mMinHeight; } scaled_rect.translate(0, delta_y); break; @@ -202,56 +203,59 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask) scaled_rect.mTop = scaled_rect.mBottom + new_height; scaled_rect.mRight = scaled_rect.mLeft + new_width; - parentView->setRect(scaled_rect); - - S32 snap_delta_x = 0; - S32 snap_delta_y = 0; + resizing_view->setRect(scaled_rect); LLView* snap_view = NULL; switch( mSide ) { case LEFT: - snap_view = parentView->findSnapEdge(snap_delta_x, mouse_dir, SNAP_LEFT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_x -= scaled_rect.mLeft; - scaled_rect.mLeft += snap_delta_x; + snap_view = resizing_view->findSnapEdge(scaled_rect.mLeft, mouse_dir, SNAP_LEFT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); break; case TOP: - snap_view = parentView->findSnapEdge(snap_delta_y, mouse_dir, SNAP_TOP, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_y -= scaled_rect.mTop; - scaled_rect.mTop += snap_delta_y; + snap_view = resizing_view->findSnapEdge(scaled_rect.mTop, mouse_dir, SNAP_TOP, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); break; case RIGHT: - snap_view = parentView->findSnapEdge(snap_delta_x, mouse_dir, SNAP_RIGHT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_x -= scaled_rect.mRight; - scaled_rect.mRight += snap_delta_x; + snap_view = resizing_view->findSnapEdge(scaled_rect.mRight, mouse_dir, SNAP_RIGHT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); break; case BOTTOM: - snap_view = parentView->findSnapEdge(snap_delta_y, mouse_dir, SNAP_BOTTOM, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_y -= scaled_rect.mBottom; - scaled_rect.mBottom += snap_delta_y; + snap_view = resizing_view->findSnapEdge(scaled_rect.mBottom, mouse_dir, SNAP_BOTTOM, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); break; } - parentView->snappedTo(snap_view); + // register "snap" behavior with snapped view + resizing_view->snappedTo(snap_view); - parentView->setRect(parent_rect); + // restore original rectangle so the appropriate changes are detected + resizing_view->setRect(orig_rect); + // change view shape as user operation + resizing_view->userSetShape(scaled_rect); - parentView->reshape(scaled_rect.getWidth(), scaled_rect.getHeight(), FALSE); - parentView->translate(scaled_rect.mLeft - parentView->getRect().mLeft, scaled_rect.mBottom - parentView->getRect().mBottom); - - floater_view_x = mDragStartScreenX + delta_x; - floater_view_y = mDragStartScreenY + delta_y; - mDragStartScreenX = floater_view_x + snap_delta_x; - mDragStartScreenY = floater_view_y + snap_delta_y; + // update last valid mouse cursor position based on resized view's actual size + LLRect new_rect = resizing_view->getRect(); + switch(mSide) + { + case LEFT: + mDragLastScreenX += new_rect.mLeft - orig_rect.mLeft; + break; + case RIGHT: + mDragLastScreenX += new_rect.mRight - orig_rect.mRight; + break; + case TOP: + mDragLastScreenY += new_rect.mTop - orig_rect.mTop; + break; + case BOTTOM: + mDragLastScreenY += new_rect.mBottom- orig_rect.mBottom; + break; + default: + break; + } } - lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (active)" << llendl; handled = TRUE; } else { - lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (inactive)" << llendl; handled = TRUE; } diff --git a/linden/indra/llui/llresizebar.h b/linden/indra/llui/llresizebar.h index 5862ffc..e1fc0f9 100644 --- a/linden/indra/llui/llresizebar.h +++ b/linden/indra/llui/llresizebar.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -49,8 +50,8 @@ public: void setResizeLimits( S32 min_width, S32 min_height ) { mMinWidth = min_width; mMinHeight = min_height; } protected: - S32 mDragStartScreenX; - S32 mDragStartScreenY; + S32 mDragLastScreenX; + S32 mDragLastScreenY; S32 mLastMouseScreenX; S32 mLastMouseScreenY; LLCoordGL mLastMouseDir; diff --git a/linden/indra/llui/llresizehandle.cpp b/linden/indra/llui/llresizehandle.cpp index fc15bcc..d9b8fac 100644 --- a/linden/indra/llui/llresizehandle.cpp +++ b/linden/indra/llui/llresizehandle.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -42,8 +43,8 @@ const S32 RESIZE_BORDER_WIDTH = 3; LLResizeHandle::LLResizeHandle( const LLString& name, const LLRect& rect, S32 min_width, S32 min_height, ECorner corner ) : LLView( name, rect, TRUE ), - mDragStartScreenX( 0 ), - mDragStartScreenY( 0 ), + mDragLastScreenX( 0 ), + mDragLastScreenY( 0 ), mLastMouseScreenX( 0 ), mLastMouseScreenY( 0 ), mImage( NULL ), @@ -66,6 +67,9 @@ LLResizeHandle::LLResizeHandle( const LLString& name, const LLRect& rect, S32 mi case RIGHT_TOP: setFollows( FOLLOWS_RIGHT | FOLLOWS_TOP ); break; case RIGHT_BOTTOM: setFollows( FOLLOWS_RIGHT | FOLLOWS_BOTTOM ); break; } + + // decorator object, don't serialize + setSaveToXML(FALSE); } EWidgetType LLResizeHandle::getWidgetType() const @@ -88,11 +92,11 @@ BOOL LLResizeHandle::handleMouseDown(S32 x, S32 y, MASK mask) { // Route future Mouse messages here preemptively. (Release on mouse up.) // No handler needed for focus lost since this clas has no state that depends on it. - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); - localPointToScreen(x, y, &mDragStartScreenX, &mDragStartScreenY); - mLastMouseScreenX = mDragStartScreenX; - mLastMouseScreenY = mDragStartScreenY; + localPointToScreen(x, y, &mDragLastScreenX, &mDragLastScreenY); + mLastMouseScreenX = mDragLastScreenX; + mLastMouseScreenY = mDragLastScreenY; } } @@ -104,10 +108,10 @@ BOOL LLResizeHandle::handleMouseUp(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { // Release the mouse - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); handled = TRUE; } else @@ -125,7 +129,7 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask) BOOL handled = FALSE; // We only handle the click if the click both started and ended within us - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { // Make sure the mouse in still over the application. We don't want to make the parent // so big that we can't see the resize handle any more. @@ -133,18 +137,18 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask) S32 screen_x; S32 screen_y; localPointToScreen(x, y, &screen_x, &screen_y); - const LLRect& valid_rect = gFloaterView->getRect(); // Assumes that the parent is a floater. + const LLRect valid_rect = getRootView()->getRect(); screen_x = llclamp( screen_x, valid_rect.mLeft, valid_rect.mRight ); screen_y = llclamp( screen_y, valid_rect.mBottom, valid_rect.mTop ); - LLView* parentView = getParent(); - if( parentView ) + LLView* resizing_view = getParent(); + if( resizing_view ) { // Resize the parent - LLRect parent_rect = parentView->getRect(); - LLRect scaled_rect = parent_rect; - S32 delta_x = screen_x - mDragStartScreenX; - S32 delta_y = screen_y - mDragStartScreenY; + LLRect orig_rect = resizing_view->getRect(); + LLRect scaled_rect = orig_rect; + S32 delta_x = screen_x - mDragLastScreenX; + S32 delta_y = screen_y - mDragLastScreenY; LLCoordGL mouse_dir; // use hysteresis on mouse motion to preserve user intent when mouse stops moving mouse_dir.mX = (screen_x == mLastMouseScreenX) ? mLastMouseDir.mX : screen_x - mLastMouseScreenX; @@ -175,18 +179,18 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask) break; } - S32 new_width = parent_rect.getWidth() + x_multiple * delta_x; + S32 new_width = orig_rect.getWidth() + x_multiple * delta_x; if( new_width < mMinWidth ) { new_width = mMinWidth; - delta_x = x_multiple * (mMinWidth - parent_rect.getWidth()); + delta_x = x_multiple * (mMinWidth - orig_rect.getWidth()); } - S32 new_height = parent_rect.getHeight() + y_multiple * delta_y; + S32 new_height = orig_rect.getHeight() + y_multiple * delta_y; if( new_height < mMinHeight ) { new_height = mMinHeight; - delta_y = y_multiple * (mMinHeight - parent_rect.getHeight()); + delta_y = y_multiple * (mMinHeight - orig_rect.getHeight()); } switch( mCorner ) @@ -207,10 +211,7 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask) // temporarily set new parent rect scaled_rect.mRight = scaled_rect.mLeft + new_width; scaled_rect.mTop = scaled_rect.mBottom + new_height; - parentView->setRect(scaled_rect); - - S32 snap_delta_x = 0; - S32 snap_delta_y = 0; + resizing_view->setRect(scaled_rect); LLView* snap_view = NULL; LLView* test_view = NULL; @@ -219,77 +220,78 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask) switch(mCorner) { case LEFT_TOP: - snap_view = parentView->findSnapEdge(snap_delta_x, mouse_dir, SNAP_LEFT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_x -= scaled_rect.mLeft; - test_view = parentView->findSnapEdge(snap_delta_y, mouse_dir, SNAP_TOP, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_y -= scaled_rect.mTop; + snap_view = resizing_view->findSnapEdge(scaled_rect.mLeft, mouse_dir, SNAP_LEFT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); + test_view = resizing_view->findSnapEdge(scaled_rect.mTop, mouse_dir, SNAP_TOP, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); if (!snap_view) { snap_view = test_view; } - scaled_rect.mLeft += snap_delta_x; - scaled_rect.mTop += snap_delta_y; break; case LEFT_BOTTOM: - snap_view = parentView->findSnapEdge(snap_delta_x, mouse_dir, SNAP_LEFT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_x -= scaled_rect.mLeft; - test_view = parentView->findSnapEdge(snap_delta_y, mouse_dir, SNAP_BOTTOM, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_y -= scaled_rect.mBottom; + snap_view = resizing_view->findSnapEdge(scaled_rect.mLeft, mouse_dir, SNAP_LEFT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); + test_view = resizing_view->findSnapEdge(scaled_rect.mBottom, mouse_dir, SNAP_BOTTOM, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); if (!snap_view) { snap_view = test_view; } - scaled_rect.mLeft += snap_delta_x; - scaled_rect.mBottom += snap_delta_y; break; case RIGHT_TOP: - snap_view = parentView->findSnapEdge(snap_delta_x, mouse_dir, SNAP_RIGHT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_x -= scaled_rect.mRight; - test_view = parentView->findSnapEdge(snap_delta_y, mouse_dir, SNAP_TOP, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_y -= scaled_rect.mTop; + snap_view = resizing_view->findSnapEdge(scaled_rect.mRight, mouse_dir, SNAP_RIGHT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); + test_view = resizing_view->findSnapEdge(scaled_rect.mTop, mouse_dir, SNAP_TOP, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); if (!snap_view) { snap_view = test_view; } - scaled_rect.mRight += snap_delta_x; - scaled_rect.mTop += snap_delta_y; break; case RIGHT_BOTTOM: - snap_view = parentView->findSnapEdge(snap_delta_x, mouse_dir, SNAP_RIGHT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_x -= scaled_rect.mRight; - test_view = parentView->findSnapEdge(snap_delta_y, mouse_dir, SNAP_BOTTOM, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_y -= scaled_rect.mBottom; + snap_view = resizing_view->findSnapEdge(scaled_rect.mRight, mouse_dir, SNAP_RIGHT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); + test_view = resizing_view->findSnapEdge(scaled_rect.mBottom, mouse_dir, SNAP_BOTTOM, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); if (!snap_view) { snap_view = test_view; } - scaled_rect.mRight += snap_delta_x; - scaled_rect.mBottom += snap_delta_y; break; } - parentView->snappedTo(snap_view); + // register "snap" behavior with snapped view + resizing_view->snappedTo(snap_view); // reset parent rect - parentView->setRect(parent_rect); + resizing_view->setRect(orig_rect); // translate and scale to new shape - parentView->reshape(scaled_rect.getWidth(), scaled_rect.getHeight(), FALSE); - parentView->translate(scaled_rect.mLeft - parentView->getRect().mLeft, scaled_rect.mBottom - parentView->getRect().mBottom); + resizing_view->userSetShape(scaled_rect); - screen_x = mDragStartScreenX + delta_x + snap_delta_x; - screen_y = mDragStartScreenY + delta_y + snap_delta_y; - mDragStartScreenX = screen_x; - mDragStartScreenY = screen_y; + // update last valid mouse cursor position based on resized view's actual size + LLRect new_rect = resizing_view->getRect(); + switch(mCorner) + { + case LEFT_TOP: + mDragLastScreenX += new_rect.mLeft - orig_rect.mLeft; + mDragLastScreenY += new_rect.mTop - orig_rect.mTop; + break; + case LEFT_BOTTOM: + mDragLastScreenX += new_rect.mLeft - orig_rect.mLeft; + mDragLastScreenY += new_rect.mBottom- orig_rect.mBottom; + break; + case RIGHT_TOP: + mDragLastScreenX += new_rect.mRight - orig_rect.mRight; + mDragLastScreenY += new_rect.mTop - orig_rect.mTop; + break; + case RIGHT_BOTTOM: + mDragLastScreenX += new_rect.mRight - orig_rect.mRight; + mDragLastScreenY += new_rect.mBottom- orig_rect.mBottom; + break; + default: + break; + } } - lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (active) " << llendl; handled = TRUE; } else if( getVisible() && pointInHandle( x, y ) ) { - lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (inactive) " << llendl; handled = TRUE; } diff --git a/linden/indra/llui/llresizehandle.h b/linden/indra/llui/llresizehandle.h index dcde8e6..b091f1f 100644 --- a/linden/indra/llui/llresizehandle.h +++ b/linden/indra/llui/llresizehandle.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -56,8 +57,8 @@ protected: BOOL pointInHandle( S32 x, S32 y ); protected: - S32 mDragStartScreenX; - S32 mDragStartScreenY; + S32 mDragLastScreenX; + S32 mDragLastScreenY; S32 mLastMouseScreenX; S32 mLastMouseScreenY; LLCoordGL mLastMouseDir; diff --git a/linden/indra/llui/llresmgr.cpp b/linden/indra/llui/llresmgr.cpp index a73b487..2350093 100644 --- a/linden/indra/llui/llresmgr.cpp +++ b/linden/indra/llui/llresmgr.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -440,8 +441,8 @@ const LLString LLLocale::SYSTEM_LOCALE("English_United States.1252"); const LLString LLLocale::USER_LOCALE("en_US.iso8859-1");// = LLString::null; const LLString LLLocale::SYSTEM_LOCALE("en_US.iso8859-1"); #else // LL_LINUX likes this -const LLString LLLocale::USER_LOCALE("en_US.utf8");// = LLString::null; -const LLString LLLocale::SYSTEM_LOCALE("en_US.utf8"); +const LLString LLLocale::USER_LOCALE("en_US.utf8"); +const LLString LLLocale::SYSTEM_LOCALE("C"); #endif diff --git a/linden/indra/llui/llresmgr.h b/linden/indra/llui/llresmgr.h index 0bb4e0d..836d352 100644 --- a/linden/indra/llui/llresmgr.h +++ b/linden/indra/llui/llresmgr.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llrootview.cpp b/linden/indra/llui/llrootview.cpp index 49e512c..d78244d 100644 --- a/linden/indra/llui/llrootview.cpp +++ b/linden/indra/llui/llrootview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llrootview.h b/linden/indra/llui/llrootview.h index 84a989b..ce98006 100644 --- a/linden/indra/llui/llrootview.h +++ b/linden/indra/llui/llrootview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llscrollbar.cpp b/linden/indra/llui/llscrollbar.cpp index 578fdb1..4edf81e 100644 --- a/linden/indra/llui/llscrollbar.cpp +++ b/linden/indra/llui/llscrollbar.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -233,7 +234,7 @@ BOOL LLScrollbar::handleMouseDown(S32 x, S32 y, MASK mask) { // Start dragging the thumb // No handler needed for focus lost since this clas has no state that depends on it. - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); mDragStartX = x; mDragStartY = y; mOrigRect.mTop = mThumbRect.mTop; @@ -274,7 +275,7 @@ BOOL LLScrollbar::handleHover(S32 x, S32 y, MASK mask) // because they'll capture the mouse whenever they need hover events. BOOL handled = FALSE; - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { S32 height = mRect.getHeight(); S32 width = mRect.getWidth(); @@ -427,9 +428,9 @@ BOOL LLScrollbar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, BOOL LLScrollbar::handleMouseUp(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); handled = TRUE; } else @@ -461,7 +462,7 @@ void LLScrollbar::draw() screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &local_mouse_x, &local_mouse_y); BOOL other_captor = gFocusMgr.getMouseCapture() && gFocusMgr.getMouseCapture() != this; - BOOL hovered = mEnabled && !other_captor && (gFocusMgr.getMouseCapture() == this || mThumbRect.pointInRect(local_mouse_x, local_mouse_y)); + BOOL hovered = mEnabled && !other_captor && (hasMouseCapture() || mThumbRect.pointInRect(local_mouse_x, local_mouse_y)); if (hovered) { mCurGlowStrength = lerp(mCurGlowStrength, mHoverGlowStrength, LLCriticalDamp::getInterpolant(0.05f)); diff --git a/linden/indra/llui/llscrollbar.h b/linden/indra/llui/llscrollbar.h index b7689ea..f6ac17d 100644 --- a/linden/indra/llui/llscrollbar.h +++ b/linden/indra/llui/llscrollbar.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llscrollcontainer.cpp b/linden/indra/llui/llscrollcontainer.cpp index 73be607..cf43ee1 100644 --- a/linden/indra/llui/llscrollcontainer.cpp +++ b/linden/indra/llui/llscrollcontainer.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -456,7 +457,7 @@ void LLScrollableContainerView::draw() // auto-focus when scrollbar active // this allows us to capture user intent (i.e. stop automatically scrolling the view/etc) if (!gFocusMgr.childHasKeyboardFocus(this) && - (gFocusMgr.getMouseCapture() == mScrollbar[VERTICAL] || gFocusMgr.getMouseCapture() == mScrollbar[HORIZONTAL])) + (mScrollbar[VERTICAL]->hasMouseCapture() || mScrollbar[HORIZONTAL]->hasMouseCapture())) { focusFirstItem(); } diff --git a/linden/indra/llui/llscrollcontainer.h b/linden/indra/llui/llscrollcontainer.h index f6bacda..3b3bbef 100644 --- a/linden/indra/llui/llscrollcontainer.h +++ b/linden/indra/llui/llscrollcontainer.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llscrollingpanellist.cpp b/linden/indra/llui/llscrollingpanellist.cpp index 209785e..eb806e4 100644 --- a/linden/indra/llui/llscrollingpanellist.cpp +++ b/linden/indra/llui/llscrollingpanellist.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llscrollingpanellist.h b/linden/indra/llui/llscrollingpanellist.h index 94e34e6..29e3d41 100644 --- a/linden/indra/llui/llscrollingpanellist.h +++ b/linden/indra/llui/llscrollingpanellist.h @@ -3,6 +3,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llscrolllistctrl.cpp b/linden/indra/llui/llscrolllistctrl.cpp index 4d5c49f..22987dc 100644 --- a/linden/indra/llui/llscrolllistctrl.cpp +++ b/linden/indra/llui/llscrolllistctrl.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -48,8 +49,11 @@ #include "llwindow.h" #include "llcontrol.h" #include "llkeyboard.h" +#include "llresizebar.h" const S32 LIST_BORDER_PAD = 2; // white space inside the border and to the left of the scrollbar +const S32 MIN_COLUMN_WIDTH = 20; +const S32 LIST_SNAP_PADDING = 5; // local structures & classes. struct SortScrollListItem @@ -152,6 +156,19 @@ BOOL LLScrollListCheck::handleClick() } // +// LLScrollListSeparator +// +LLScrollListSeparator::LLScrollListSeparator(S32 width) : mWidth(width) +{ +} + +void LLScrollListSeparator::drawToWidth(S32 width, const LLColor4& color, const LLColor4& highlight_color) const +{ + //*FIXME: use dynamic item heights and make separators narrow, and inactive + gl_line_2d(5, 8, llmax(5, width - 5), 8, color); +} + +// // LLScrollListText // U32 LLScrollListText::sCount = 0; @@ -273,7 +290,7 @@ LLScrollListItem::~LLScrollListItem() std::for_each(mColumns.begin(), mColumns.end(), DeletePointer()); } -BOOL LLScrollListItem::handleMouseDown(S32 x, S32 y, MASK mask) +BOOL LLScrollListItem::handleClick(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; @@ -374,14 +391,13 @@ LLScrollListCtrl::LLScrollListCtrl(const LLString& name, const LLRect& rect, mPageLines(0), mHeadingHeight(20), mMaxSelectable(0), - mHeadingFont(NULL), mAllowMultipleSelection( allow_multiple_selection ), mAllowKeyboardMovement(TRUE), mCommitOnKeyboardMovement(TRUE), mCommitOnSelectionChange(FALSE), mSelectionChanged(FALSE), mCanSelect(TRUE), - mDisplayColumnButtons(FALSE), + mDisplayColumnHeaders(FALSE), mCollapseEmptyColumns(FALSE), mIsPopup(FALSE), mMaxItemCount(INT_MAX), @@ -396,21 +412,21 @@ LLScrollListCtrl::LLScrollListCtrl(const LLString& name, const LLRect& rect, mFgUnselectedColor( LLUI::sColorsGroup->getColor("ScrollUnselectedColor") ), mFgDisabledColor( LLUI::sColorsGroup->getColor("ScrollDisabledColor") ), mHighlightedColor( LLUI::sColorsGroup->getColor("ScrollHighlightedColor") ), + mHighlightedItem(-1), mBorderThickness( 2 ), mOnDoubleClickCallback( NULL ), mOnMaximumSelectCallback( NULL ), mOnSortChangedCallback( NULL ), - mHighlightedItem(-1), + mDrewSelected(FALSE), mBorder(NULL), - mDefaultColumn("SIMPLE"), mSearchColumn(0), + mDefaultColumn("SIMPLE"), mNumDynamicWidthColumns(0), mTotalStaticColumnWidth(0), - mSortColumn(0), - mSortAscending(TRUE), - - mDrewSelected(FALSE) + mSortColumn(-1), + mSorted(TRUE), + mSortAscending(TRUE) { mItemListRect.setOriginAndSize( mBorderThickness + LIST_BORDER_PAD, @@ -497,6 +513,7 @@ void LLScrollListCtrl::clearRows() mScrollLines = 0; mLastSelected = NULL; + updateMaxContentWidth(NULL); } @@ -546,7 +563,6 @@ S32 LLScrollListCtrl::getFirstSelectedIndex() return -1; } - LLScrollListItem* LLScrollListCtrl::getFirstData() const { if (mItemList.size() == 0) @@ -556,6 +572,15 @@ LLScrollListItem* LLScrollListCtrl::getFirstData() const return mItemList[0]; } +LLScrollListItem* LLScrollListCtrl::getLastData() const +{ + if (mItemList.size() == 0) + { + return NULL; + } + return mItemList[mItemList.size() - 1]; +} + std::vector LLScrollListCtrl::getAllData() const { std::vector ret; @@ -573,7 +598,7 @@ void LLScrollListCtrl::reshape( S32 width, S32 height, BOOL called_from_parent ) { LLUICtrl::reshape( width, height, called_from_parent ); - S32 heading_size = (mDisplayColumnButtons ? mHeadingHeight : 0); + S32 heading_size = (mDisplayColumnHeaders ? mHeadingHeight : 0); mItemListRect.setOriginAndSize( mBorderThickness + LIST_BORDER_PAD, @@ -586,10 +611,8 @@ void LLScrollListCtrl::reshape( S32 width, S32 height, BOOL called_from_parent ) mScrollbar->setPageSize( mPageLines ); updateColumns(); - updateColumnButtons(); } - // Attempt to size the control to show all items. // Do not make larger than width or height. void LLScrollListCtrl::arrange(S32 max_width, S32 max_height) @@ -621,35 +644,83 @@ BOOL LLScrollListCtrl::addItem( LLScrollListItem* item, EAddPosition pos ) { case ADD_TOP: mItemList.push_front(item); + setSorted(FALSE); break; case ADD_SORTED: - mSortColumn = 0; - mSortAscending = TRUE; + if (mSortColumn == -1) + { + mSortColumn = 0; + mSortAscending = TRUE; + } mItemList.push_back(item); std::sort(mItemList.begin(), mItemList.end(), SortScrollListItem(mSortColumn, mSortAscending)); break; case ADD_BOTTOM: mItemList.push_back(item); + setSorted(FALSE); break; default: llassert(0); mItemList.push_back(item); + setSorted(FALSE); break; } updateLineHeight(); mPageLines = mLineHeight ? mItemListRect.getHeight() / mLineHeight : 0; - mScrollbar->setVisible(mPageLines < getItemCount()); + BOOL scrollbar_visible = mPageLines < getItemCount(); + + if (scrollbar_visible != mScrollbar->getVisible()) + { + mScrollbar->setVisible(mPageLines < getItemCount()); + updateColumns(); + } mScrollbar->setPageSize( mPageLines ); mScrollbar->setDocSize( getItemCount() ); + + updateMaxContentWidth(item); } + return not_too_big; } +void LLScrollListCtrl::updateMaxContentWidth(LLScrollListItem* added_item) +{ + const S32 HEADING_TEXT_PADDING = 30; + const S32 COLUMN_TEXT_PADDING = 20; + + std::map::iterator column_itor; + for (column_itor = mColumns.begin(); column_itor != mColumns.end(); ++column_itor) + { + LLScrollListColumn* column = &column_itor->second; + + if (!added_item) + { + // update on all items + column->mMaxContentWidth = column->mHeader ? LLFontGL::sSansSerifSmall->getWidth(column->mLabel) + mColumnPadding + HEADING_TEXT_PADDING : 0; + item_list::iterator iter; + for (iter = mItemList.begin(); iter != mItemList.end(); iter++) + { + LLScrollListCell* cellp = (*iter)->getColumn(column->mIndex); + if (!cellp) continue; + + column->mMaxContentWidth = llmax(LLFontGL::sSansSerifSmall->getWidth(cellp->getText()) + mColumnPadding + COLUMN_TEXT_PADDING, column->mMaxContentWidth); + } + } + else + { + LLScrollListCell* cellp = added_item->getColumn(column->mIndex); + if (!cellp) continue; + + column->mMaxContentWidth = llmax(LLFontGL::sSansSerifSmall->getWidth(cellp->getText()) + mColumnPadding + COLUMN_TEXT_PADDING, column->mMaxContentWidth); + } + } +} + // Line height is the max height of all the cells in all the items. void LLScrollListCtrl::updateLineHeight() @@ -678,60 +749,82 @@ void LLScrollListCtrl::updateColumns() for (column_itor = mColumns.begin(); column_itor != mColumns.end(); ++column_itor) { LLScrollListColumn *column = &column_itor->second; + S32 new_width = column->mWidth; if (column->mRelWidth >= 0) { - column->mWidth = (S32)llround(column->mRelWidth*mItemListRect.getWidth()); + new_width = (S32)llround(column->mRelWidth*mItemListRect.getWidth()); } else if (column->mDynamicWidth) { - column->mWidth = (mItemListRect.getWidth() - mTotalStaticColumnWidth) / mNumDynamicWidthColumns; - + new_width = (mItemListRect.getWidth() - mTotalStaticColumnWidth) / mNumDynamicWidthColumns; + } + + if (new_width != column->mWidth) + { + column->mWidth = new_width; } mColumnsIndexed[column_itor->second.mIndex] = column; } -} -void LLScrollListCtrl::updateColumnButtons() -{ - std::map::iterator column_itor; - for (column_itor = mColumns.begin(); column_itor != mColumns.end(); ++column_itor) + item_list::iterator iter; + for (iter = mItemList.begin(); iter != mItemList.end(); iter++) { - LLScrollListColumn* column = &column_itor->second; - LLButton *button = column->mButton; - - if (button) + LLScrollListItem *itemp = *iter; + S32 num_cols = itemp->getNumColumns(); + S32 i = 0; + for (LLScrollListCell* cell = itemp->getColumn(i); i < num_cols; cell = itemp->getColumn(++i)) { - mColumnsIndexed[column->mIndex] = column; + if (i >= (S32)mColumnsIndexed.size()) break; + + cell->setWidth(mColumnsIndexed[i]->mWidth); + } + } + // update headers + std::vector::iterator column_ordered_it; + S32 left = mItemListRect.mLeft; + LLColumnHeader* last_header = NULL; + for (column_ordered_it = mColumnsIndexed.begin(); column_ordered_it != mColumnsIndexed.end(); ++column_ordered_it) + { + if ((*column_ordered_it)->mWidth <= 0) + { + // skip hidden columns + } + LLScrollListColumn* column = *column_ordered_it; + + if (column->mHeader) + { + last_header = column->mHeader; S32 top = mItemListRect.mTop; - S32 left = mItemListRect.mLeft; - { - std::map::iterator itor; - for (itor = mColumns.begin(); itor != mColumns.end(); ++itor) - { - if (itor->second.mIndex < column->mIndex && - itor->second.mWidth > 0) - { - left += itor->second.mWidth + mColumnPadding; - } - } - } - S32 right = left+column->mWidth; - if (column->mIndex != (S32)mColumns.size()-1) + S32 right = left + column->mWidth; + + if (column->mIndex != (S32)mColumnsIndexed.size()-1) { right += mColumnPadding; } - LLRect temp_rect = LLRect(left,top+mHeadingHeight,right,top); - button->setRect(temp_rect); - button->setFont(mHeadingFont); - button->setVisible(mDisplayColumnButtons); + right = llmax(left, llmin(mItemListRect.getWidth(), right)); + + S32 header_width = right - left; + + last_header->reshape(header_width, mHeadingHeight); + last_header->translate(left - last_header->getRect().mLeft, top - last_header->getRect().mBottom); + last_header->setVisible(mDisplayColumnHeaders && header_width > 0); + left = right; } } + + // expand last column header we encountered to full list width + if (last_header) + { + S32 header_strip_width = mItemListRect.getWidth() + (mScrollbar->getVisible() ? 0 : SCROLLBAR_SIZE); + S32 new_width = llmax(0, mItemListRect.mLeft + header_strip_width - last_header->getRect().mLeft); + last_header->reshape(new_width, last_header->getRect().getHeight()); + } } void LLScrollListCtrl::setDisplayHeading(BOOL display) { - mDisplayColumnButtons = display; + mDisplayColumnHeaders = display; updateColumns(); @@ -745,15 +838,7 @@ void LLScrollListCtrl::setHeadingHeight(S32 heading_height) reshape(mRect.getWidth(), mRect.getHeight()); // Resize - mScrollbar->reshape(SCROLLBAR_SIZE, mItemListRect.getHeight()); - - updateColumnButtons(); -} - -void LLScrollListCtrl::setHeadingFont(const LLFontGL* heading_font) -{ - mHeadingFont = heading_font; - updateColumnButtons(); + mScrollbar->reshape(SCROLLBAR_SIZE, mItemListRect.getHeight() + (mDisplayColumnHeaders ? mHeadingHeight : 0)); } void LLScrollListCtrl::setCollapseEmptyColumns(BOOL collapse) @@ -873,6 +958,7 @@ void LLScrollListCtrl::deleteSingleItem(S32 target_index) } delete itemp; mItemList.erase(mItemList.begin() + target_index); + updateMaxContentWidth(NULL); } void LLScrollListCtrl::deleteSelectedItems() @@ -892,6 +978,7 @@ void LLScrollListCtrl::deleteSelectedItems() } } mLastSelected = NULL; + updateMaxContentWidth(NULL); } void LLScrollListCtrl::highlightNthItem(S32 target_index) @@ -1033,7 +1120,7 @@ void LLScrollListCtrl::selectNextItem( BOOL extend_selection) } } - if ((mCommitOnSelectionChange || mCommitOnKeyboardMovement)) + if (mCommitOnKeyboardMovement) { onCommit(); } @@ -1486,109 +1573,153 @@ BOOL LLScrollListCtrl::handleScrollWheel(S32 x, S32 y, S32 clicks) return handled; } - -BOOL LLScrollListCtrl::handleMouseDown(S32 x, S32 y, MASK mask) +BOOL LLScrollListCtrl::selectItemAt(S32 x, S32 y, MASK mask) { - BOOL handled = LLView::childrenHandleMouseDown(x, y, mask) != NULL; + if (!mCanSelect) return FALSE; - // set keyboard focus first, in case click action wants to move focus elsewhere - setFocus(TRUE); + BOOL selection_changed = FALSE; - if( !handled && mCanSelect) + LLScrollListItem* hit_item = hitItem(x, y); + if( hit_item ) { - LLScrollListItem* hit_item = hitItem(x, y); - if( hit_item ) + if( mAllowMultipleSelection ) { - if( mAllowMultipleSelection ) + if (mask & MASK_SHIFT) { - if (mask & MASK_SHIFT) + if (mLastSelected == NULL) { - if (mLastSelected == NULL) - { - selectItem(hit_item); - } - else + selectItem(hit_item); + } + else + { + // Select everthing between mLastSelected and hit_item + bool selecting = false; + item_list::iterator itor; + // If we multiselect backwards, we'll stomp on mLastSelected, + // meaning that we never stop selecting until hitting max or + // the end of the list. + LLScrollListItem* lastSelected = mLastSelected; + for (itor = mItemList.begin(); itor != mItemList.end(); ++itor) { - // Select everthing between mLastSelected and hit_item - bool selecting = false; - item_list::iterator itor; - // If we multiselect backwards, we'll stomp on mLastSelected, - // meaning that we never stop selecting until hitting max or - // the end of the list. - LLScrollListItem* lastSelected = mLastSelected; - for (itor = mItemList.begin(); itor != mItemList.end(); ++itor) + if(mMaxSelectable > 0 && getAllSelected().size() >= mMaxSelectable) { - if(mMaxSelectable > 0 && getAllSelected().size() >= mMaxSelectable) - { - if(mOnMaximumSelectCallback) - { - mOnMaximumSelectCallback(mCallbackUserData); - } - break; - } - LLScrollListItem *item = *itor; - if (item == hit_item || item == lastSelected) - { - selectItem(item, FALSE); - selecting = !selecting; - } - if (selecting) + if(mOnMaximumSelectCallback) { - selectItem(item, FALSE); + mOnMaximumSelectCallback(mCallbackUserData); } + break; + } + LLScrollListItem *item = *itor; + if (item == hit_item || item == lastSelected) + { + selectItem(item, FALSE); + selecting = !selecting; + } + if (selecting) + { + selectItem(item, FALSE); } } } - else if (mask & MASK_CONTROL) + } + else if (mask & MASK_CONTROL) + { + if (hit_item->getSelected()) + { + deselectItem(hit_item); + } + else { - if (hit_item->getSelected()) + if(!(mMaxSelectable > 0 && getAllSelected().size() >= mMaxSelectable)) { - deselectItem(hit_item); + selectItem(hit_item, FALSE); } else { - if(!(mMaxSelectable > 0 && getAllSelected().size() >= mMaxSelectable)) + if(mOnMaximumSelectCallback) { - selectItem(hit_item, FALSE); - } - else - { - if(mOnMaximumSelectCallback) - { - mOnMaximumSelectCallback(mCallbackUserData); - } + mOnMaximumSelectCallback(mCallbackUserData); } } } - else - { - deselectAllItems(TRUE); - selectItem(hit_item); - } } else { + deselectAllItems(TRUE); selectItem(hit_item); } - - hit_item->handleMouseDown(x - mBorderThickness - LIST_BORDER_PAD, - 1, mask); - // always commit on mousedown - onCommit(); - mSelectionChanged = FALSE; - - // clear search string on mouse operations - mSearchString.clear(); } else { - mLastSelected = NULL; + selectItem(hit_item); } + + hit_item->handleClick(x - mBorderThickness - LIST_BORDER_PAD, + 1, mask); + + selection_changed = mSelectionChanged; + if (mCommitOnSelectionChange) + { + commitIfChanged(); + } + + // clear search string on mouse operations + mSearchString.clear(); + } + else + { + //mLastSelected = NULL; + //deselectAllItems(TRUE); + } + + return selection_changed; +} + + +BOOL LLScrollListCtrl::handleMouseDown(S32 x, S32 y, MASK mask) +{ + BOOL handled = LLView::childrenHandleMouseDown(x, y, mask) != NULL; + + if( !handled ) + { + // set keyboard focus first, in case click action wants to move focus elsewhere + setFocus(TRUE); + + // clear selection changed flag so because user is starting a selection operation + mSelectionChanged = FALSE; + + gFocusMgr.setMouseCapture(this); + selectItemAt(x, y, mask); } return TRUE; } +BOOL LLScrollListCtrl::handleMouseUp(S32 x, S32 y, MASK mask) +{ + if (hasMouseCapture()) + { + if(mask == MASK_NONE) + { + selectItemAt(x, y, mask); + } + } + + if (hasMouseCapture()) + { + gFocusMgr.setMouseCapture(NULL); + } + + // always commit when mouse operation is completed inside list + if (mItemListRect.pointInRect(x,y)) + { + mSelectionChanged = FALSE; + onCommit(); + } + + return LLUICtrl::handleMouseUp(x, y, mask); +} + BOOL LLScrollListCtrl::handleDoubleClick(S32 x, S32 y, MASK mask) { //BOOL handled = FALSE; @@ -1647,31 +1778,35 @@ BOOL LLScrollListCtrl::handleHover(S32 x,S32 y,MASK mask) { BOOL handled = FALSE; - if(getVisible()) + if (hasMouseCapture()) { - if (mCanSelect) + if(mask == MASK_NONE) { - LLScrollListItem* item = hitItem(x, y); - if (item) - { - highlightNthItem(getItemIndex(item)); - } - else - { - highlightNthItem(-1); - } + selectItemAt(x, y, mask); } - - handled = LLView::handleHover( x, y, mask ); - - if( !handled ) + } + else if (mCanSelect) + { + LLScrollListItem* item = hitItem(x, y); + if (item) + { + highlightNthItem(getItemIndex(item)); + } + else { - // Opaque - getWindow()->setCursor(UI_CURSOR_ARROW); - lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << llendl; - handled = TRUE; + highlightNthItem(-1); } } + + handled = LLUICtrl::handleHover( x, y, mask ); + + //if( !handled ) + //{ + // // Opaque + // getWindow()->setCursor(UI_CURSOR_ARROW); + // lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << llendl; + // handled = TRUE; + //} return handled; } @@ -1980,6 +2115,16 @@ void LLScrollListCtrl::commitIfChanged() } } +void LLScrollListCtrl::setSorted(BOOL sorted) +{ + mSorted = sorted; +} + +BOOL LLScrollListCtrl::isSorted() +{ + return mSorted; +} + // Called by scrollbar //static void LLScrollListCtrl::onScrollChange( S32 new_pos, LLScrollbar* scrollbar, void* userdata ) @@ -1992,9 +2137,19 @@ void LLScrollListCtrl::onScrollChange( S32 new_pos, LLScrollbar* scrollbar, void // First column is column 0 void LLScrollListCtrl::sortByColumn(U32 column, BOOL ascending) { - mSortColumn = column; - mSortAscending = ascending; - std::sort(mItemList.begin(), mItemList.end(), SortScrollListItem(mSortColumn, mSortAscending)); + if (!mSorted || mSortColumn != column) + { + mSortColumn = column; + std::sort(mItemList.begin(), mItemList.end(), SortScrollListItem(mSortColumn, mSortAscending)); + setSorted(TRUE); + } + + // just reverse the list if changing sort order + if(mSortAscending != ascending) + { + std::reverse(mItemList.begin(), mItemList.end()); + mSortAscending = ascending; + } } void LLScrollListCtrl::sortByColumn(LLString name, BOOL ascending) @@ -2066,7 +2221,7 @@ LLXMLNodePtr LLScrollListCtrl::getXML(bool save_children) const node->createChild("draw_border", TRUE)->setBoolValue((mBorder != NULL)); - node->createChild("draw_heading", TRUE)->setBoolValue(mDisplayColumnButtons); + node->createChild("draw_heading", TRUE)->setBoolValue(mDisplayColumnHeaders); node->createChild("background_visible", TRUE)->setBoolValue(mBackgroundVisible); @@ -2215,13 +2370,6 @@ LLView* LLScrollListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFac node->getAttributeS32("heading_height", heading_height); scroll_list->setHeadingHeight(heading_height); } - if (node->hasAttribute("heading_font")) - { - LLString heading_font(""); - node->getAttributeString("heading_font", heading_font); - LLFontGL* gl_font = LLFontGL::fontFromName(heading_font.c_str()); - scroll_list->setHeadingFont(gl_font); - } scroll_list->setCollapseEmptyColumns(collapse_empty_columns); scroll_list->setScrollListParameters(node); @@ -2246,6 +2394,9 @@ LLView* LLScrollListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFac LLString sortname(columnname); child->getAttributeString("sort", sortname); + + BOOL sort_ascending = TRUE; + child->getAttributeBOOL("sort_ascending", sort_ascending); LLString imagename; child->getAttributeString("image", imagename); @@ -2267,6 +2418,7 @@ LLView* LLScrollListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFac columns[index]["name"] = columnname; columns[index]["sort"] = sortname; + columns[index]["sort_ascending"] = sort_ascending; columns[index]["image"] = imagename; columns[index]["label"] = labelname; columns[index]["width"] = columnwidth; @@ -2427,10 +2579,17 @@ BOOL LLScrollListCtrl::canDeselect() void LLScrollListCtrl::addColumn(const LLSD& column, EAddPosition pos) { LLString name = column["name"].asString(); - if (mColumns.size() == 0) + if (mColumns.empty()) { mDefaultColumn = 0; } + // if no column name provided, just use ordinal as name + if (name.empty()) + { + std::ostringstream new_name; + new_name << mColumnsIndexed.size(); + name = new_name.str(); + } if (mColumns.find(name) == mColumns.end()) { // Add column @@ -2470,30 +2629,28 @@ void LLScrollListCtrl::addColumn(const LLSD& column, EAddPosition pos) right += mColumnPadding; } LLRect temp_rect = LLRect(left,top+mHeadingHeight,right,top); - new_column->mButton = new LLSquareButton(button_name, temp_rect, "", mHeadingFont, "", onClickColumn, NULL); + new_column->mHeader = new LLColumnHeader(button_name, temp_rect, new_column); if(column["image"].asString() != "") { - //new_column->mButton->setScaleImage(false); - new_column->mButton->setImageSelected(column["image"].asString()); - new_column->mButton->setImageUnselected(column["image"].asString()); + //new_column->mHeader->setScaleImage(false); + new_column->mHeader->setImage(column["image"].asString()); } else { - new_column->mButton->setLabelSelected(new_column->mLabel); - new_column->mButton->setLabelUnselected(new_column->mLabel); + new_column->mHeader->setLabel(new_column->mLabel); + //new_column->mHeader->setLabel(new_column->mLabel); } //RN: although it might be useful to change sort order with the keyboard, // mixing tab stops on child items along with the parent item is not supported yet - new_column->mButton->setTabStop(FALSE); - addChild(new_column->mButton); - new_column->mButton->setVisible(mDisplayColumnButtons); + new_column->mHeader->setTabStop(FALSE); + addChild(new_column->mHeader); + new_column->mHeader->setVisible(mDisplayColumnHeaders); // Move scroll to front removeChild(mScrollbar); addChild(mScrollbar); - - new_column->mButton->setCallbackUserData(new_column); + } } updateColumns(); @@ -2511,6 +2668,7 @@ void LLScrollListCtrl::onClickColumn(void *userdata) U32 column_index = info->mIndex; LLScrollListColumn* column = parent->mColumnsIndexed[info->mIndex]; + bool ascending = column->mSortAscending; if (column->mSortingColumn != column->mName) { if (parent->mColumns.find(column->mSortingColumn) != parent->mColumns.end()) @@ -2520,7 +2678,6 @@ void LLScrollListCtrl::onClickColumn(void *userdata) } } - bool ascending = true; if (column_index == parent->mSortColumn) { ascending = !parent->mSortAscending; @@ -2536,7 +2693,7 @@ void LLScrollListCtrl::onClickColumn(void *userdata) std::string LLScrollListCtrl::getSortColumnName() { - LLScrollListColumn* column = mColumnsIndexed[mSortColumn]; + LLScrollListColumn* column = mSortColumn >= 0 ? mColumnsIndexed[mSortColumn] : NULL; if (column) return column->mName; else return ""; @@ -2547,11 +2704,11 @@ void LLScrollListCtrl::clearColumns() std::map::iterator itor; for (itor = mColumns.begin(); itor != mColumns.end(); ++itor) { - LLButton *button = itor->second.mButton; - if (button) + LLColumnHeader *header = itor->second.mHeader; + if (header) { - removeChild(button); - delete button; + removeChild(header); + delete header; } } mColumns.clear(); @@ -2563,14 +2720,22 @@ void LLScrollListCtrl::setColumnLabel(const LLString& column, const LLString& la if (itor != mColumns.end()) { itor->second.mLabel = label; - if (itor->second.mButton) + if (itor->second.mHeader) { - itor->second.mButton->setLabelSelected(label); - itor->second.mButton->setLabelUnselected(label); + itor->second.mHeader->setLabel(label); } } } +LLScrollListColumn* LLScrollListCtrl::getColumn(S32 index) +{ + if (index < 0 || index >= (S32)mColumnsIndexed.size()) + { + return NULL; + } + return mColumnsIndexed[index]; +} + void LLScrollListCtrl::setColumnHeadings(LLSD headings) { mColumns.clear(); @@ -2597,6 +2762,7 @@ LLScrollListItem* LLScrollListCtrl::addElement(const LLSD& value, EAddPosition p // Add any columns we don't already have LLSD columns = value["columns"]; LLSD::array_const_iterator itor; + S32 col_index = 0 ; for (itor = columns.beginArray(); itor != columns.endArray(); ++itor) { LLString column = (*itor)["column"].asString(); @@ -2605,21 +2771,39 @@ LLScrollListItem* LLScrollListCtrl::addElement(const LLSD& value, EAddPosition p { mDefaultColumn = 0; } - std::map::iterator column_itor = mColumns.find(column); - if (column_itor == mColumns.end()) + + LLScrollListColumn* columnp = NULL; + + // empty columns strings index by ordinal + if (column.empty()) + { + std::ostringstream new_name; + new_name << col_index; + column = new_name.str(); + } + + std::map::iterator column_itor; + column_itor = mColumns.find(column); + if (column_itor != mColumns.end()) + { + columnp = &column_itor->second; + } + + // create new column on demand + if (!columnp) { LLSD new_column; new_column["name"] = column; new_column["label"] = column; - new_column["width"] = 0; + new_column["width"] = (*itor)["width"]; addColumn(new_column); - column_itor = mColumns.find(column); + columnp = &mColumns.find(column)->second; new_item->setNumColumns(mColumns.size()); } - S32 index = column_itor->second.mIndex; - S32 width = column_itor->second.mWidth; - LLFontGL::HAlign font_alignment = column_itor->second.mFontAlignment; + S32 index = columnp->mIndex; + S32 width = columnp->mWidth; + LLFontGL::HAlign font_alignment = columnp->mFontAlignment; LLSD value = (*itor)["value"]; LLString fontname = (*itor)["font"].asString(); @@ -2645,10 +2829,20 @@ LLScrollListItem* LLScrollListCtrl::addElement(const LLSD& value, EAddPosition p LLRect(0, 0, width, width), "label"); new_item->setColumn(index, new LLScrollListCheck(ctrl,width)); } + else if (type == "separator") + { + new_item->setColumn(index, new LLScrollListSeparator(width)); + } else { new_item->setColumn(index, new LLScrollListText(value.asString(), font, width, font_style, font_alignment)); + if (columnp->mHeader && !value.asString().empty()) + { + columnp->mHeader->setHasResizableElement(TRUE); + } } + + col_index++; } S32 num_columns = mColumns.size(); @@ -2744,6 +2938,14 @@ void LLScrollListCtrl::setFocus(BOOL b) } LLUICtrl::setFocus(b); } + +//virtual +void LLScrollListCtrl::onFocusReceived() +{ + // forget latent selection changes when getting focus + mSelectionChanged = FALSE; +} + //virtual void LLScrollListCtrl::onFocusLost() { @@ -2754,5 +2956,411 @@ void LLScrollListCtrl::onFocusLost() getParent()->onFocusLost(); } } + if (hasMouseCapture()) + { + gFocusMgr.setMouseCapture(NULL); + } + LLUICtrl::onFocusLost(); } +LLColumnHeader::LLColumnHeader(const LLString& label, const LLRect &rect, LLScrollListColumn* column, const LLFontGL* fontp) : + LLComboBox(label, rect, label, NULL, NULL), + mColumn(column), + mOrigLabel(label), + mShowSortOptions(FALSE), + mHasResizableElement(FALSE) +{ + mListPosition = LLComboBox::ABOVE; + setCommitCallback(onSelectSort); + setCallbackUserData(this); + mButton->setTabStop(FALSE); + // require at least two frames between mouse down and mouse up event to capture intentional "hold" not just bad framerate + mButton->setHeldDownDelay(LLUI::sConfigGroup->getF32("ColumnHeaderDropDownDelay"), 2); + mButton->setHeldDownCallback(onHeldDown); + mButton->setClickedCallback(onClick); + mButton->setMouseDownCallback(onMouseDown); + + mButton->setCallbackUserData(this); + + mAscendingText = "[LOW]...[HIGH](Ascending)"; + mDescendingText = "[HIGH]...[LOW](Descending)"; + + mList->reshape(llmax(mList->getRect().getWidth(), 110, mRect.getWidth()), mList->getRect().getHeight()); + + // resize handles on left and right + const S32 RESIZE_BAR_THICKNESS = 3; + mResizeBar = new LLResizeBar( + "resizebar", + LLRect( mRect.getWidth() - RESIZE_BAR_THICKNESS, mRect.getHeight(), mRect.getWidth(), 0), + MIN_COLUMN_WIDTH, mRect.getHeight(), LLResizeBar::RIGHT ); + addChild(mResizeBar); + + mResizeBar->setEnabled(FALSE); +} + +LLColumnHeader::~LLColumnHeader() +{ +} + +void LLColumnHeader::draw() +{ + if( getVisible() ) + { + mDrawArrow = !mColumn->mLabel.empty() && mColumn->mParentCtrl->isSorted() && mColumn->mParentCtrl->getSortColumnName() == mColumn->mSortingColumn; + + BOOL is_ascending = mColumn->mParentCtrl->getSortAscending(); + mArrowImage = is_ascending ? LLUI::sImageProvider->getUIImageByID(LLUUID(LLUI::sAssetsGroup->getString("up_arrow.tga"))) + : LLUI::sImageProvider->getUIImageByID(LLUUID(LLUI::sAssetsGroup->getString("down_arrow.tga"))); + + //BOOL clip = mRect.mRight > mColumn->mParentCtrl->getItemListRect().getWidth(); + //LLGLEnable scissor_test(clip ? GL_SCISSOR_TEST : GL_FALSE); + + //LLRect column_header_local_rect(-mRect.mLeft, mRect.getHeight(), mColumn->mParentCtrl->getItemListRect().getWidth() - mRect.mLeft, 0); + //LLUI::setScissorRegionLocal(column_header_local_rect); + + // Draw children + LLComboBox::draw(); + + if (mList->getVisible()) + { + // sync sort order with list selection every frame + mColumn->mParentCtrl->sortByColumn(mColumn->mSortingColumn, getCurrentIndex() == 0); + } + + } +} + +BOOL LLColumnHeader::handleDoubleClick(S32 x, S32 y, MASK mask) +{ + if (canResize() && mResizeBar->getRect().pointInRect(x, y)) + { + // reshape column to max content width + LLRect column_rect = getRect(); + column_rect.mRight = column_rect.mLeft + mColumn->mMaxContentWidth; + userSetShape(column_rect); + } + else + { + onClick(this); + } + return TRUE; +} + +void LLColumnHeader::setImage(const LLString &image_name) +{ + if (mButton) + { + mButton->setImageSelected(image_name); + mButton->setImageUnselected(image_name); + } +} + +//static +void LLColumnHeader::onClick(void* user_data) +{ + LLColumnHeader* headerp = (LLColumnHeader*)user_data; + if (!headerp) return; + + LLScrollListColumn* column = headerp->mColumn; + if (!column) return; + + if (headerp->mList->getVisible()) + { + headerp->hideList(); + } + + LLScrollListCtrl::onClickColumn(column); + + // propage new sort order to sort order list + headerp->mList->selectNthItem(column->mParentCtrl->getSortAscending() ? 0 : 1); +} + +//static +void LLColumnHeader::onMouseDown(void* user_data) +{ + // for now, do nothing but block the normal showList() behavior + return; +} + +//static +void LLColumnHeader::onHeldDown(void* user_data) +{ + LLColumnHeader* headerp = (LLColumnHeader*)user_data; + headerp->showList(); +} + +void LLColumnHeader::showList() +{ + if (mShowSortOptions) + { + //LLSD item_val = mColumn->mParentCtrl->getFirstData()->getValue(); + mOrigLabel = mButton->getLabelSelected(); + + // move sort column over to this column and do initial sort + mColumn->mParentCtrl->sortByColumn(mColumn->mSortingColumn, mColumn->mParentCtrl->getSortAscending()); + + LLString low_item_text; + LLString high_item_text; + + LLScrollListItem* itemp = mColumn->mParentCtrl->getFirstData(); + if (itemp) + { + LLScrollListCell* cell = itemp->getColumn(mColumn->mIndex); + if (cell && cell->isText()) + { + if (mColumn->mParentCtrl->getSortAscending()) + { + low_item_text = cell->getText(); + } + else + { + high_item_text = cell->getText(); + } + } + } + + itemp = mColumn->mParentCtrl->getLastData(); + if (itemp) + { + LLScrollListCell* cell = itemp->getColumn(mColumn->mIndex); + if (cell && cell->isText()) + { + if (mColumn->mParentCtrl->getSortAscending()) + { + high_item_text = cell->getText(); + } + else + { + low_item_text = cell->getText(); + } + } + } + + LLString::truncate(low_item_text, 3); + LLString::truncate(high_item_text, 3); + + LLString ascending_string; + LLString descending_string; + + if (low_item_text.empty() || high_item_text.empty()) + { + ascending_string = "Ascending"; + descending_string = "Descending"; + } + else + { + mAscendingText.setArg("[LOW]", low_item_text); + mAscendingText.setArg("[HIGH]", high_item_text); + mDescendingText.setArg("[LOW]", low_item_text); + mDescendingText.setArg("[HIGH]", high_item_text); + ascending_string = mAscendingText.getString(); + descending_string = mDescendingText.getString(); + } + + S32 text_width = LLFontGL::sSansSerifSmall->getWidth(ascending_string); + text_width = llmax(text_width, LLFontGL::sSansSerifSmall->getWidth(descending_string)) + 10; + text_width = llmax(text_width, mRect.getWidth() - 30); + + mList->getColumn(0)->mWidth = text_width; + ((LLScrollListText*)mList->getFirstData()->getColumn(0))->setText(ascending_string); + ((LLScrollListText*)mList->getLastData()->getColumn(0))->setText(descending_string); + + mList->reshape(llmax(text_width + 30, 110, mRect.getWidth()), mList->getRect().getHeight()); + + LLComboBox::showList(); + } +} + +//static +void LLColumnHeader::onSelectSort(LLUICtrl* ctrl, void* user_data) +{ + LLColumnHeader* headerp = (LLColumnHeader*)user_data; + if (!headerp) return; + + LLScrollListColumn* column = headerp->mColumn; + if (!column) return; + LLScrollListCtrl *parent = column->mParentCtrl; + if (!parent) return; + + if (headerp->getCurrentIndex() == 0) + { + // ascending + parent->sortByColumn(column->mSortingColumn, TRUE); + } + else + { + // descending + parent->sortByColumn(column->mSortingColumn, FALSE); + } + + // restore original column header + headerp->setLabel(headerp->mOrigLabel); +} + +LLView* LLColumnHeader::findSnapEdge(S32& new_edge_val, const LLCoordGL& mouse_dir, ESnapEdge snap_edge, ESnapType snap_type, S32 threshold, S32 padding) +{ + // this logic assumes dragging on right + llassert(snap_edge == SNAP_RIGHT); + + // use higher snap threshold for column headers + threshold = llmin(threshold, 15); + + LLRect snap_rect = getSnapRect(); + + S32 snap_delta = mColumn->mMaxContentWidth - snap_rect.getWidth(); + + // x coord growing means column growing, so same signs mean we're going in right direction + if (llabs(snap_delta) <= threshold && mouse_dir.mX * snap_delta > 0 ) + { + new_edge_val = snap_rect.mRight + snap_delta; + } + else + { + LLScrollListColumn* next_column = mColumn->mParentCtrl->getColumn(mColumn->mIndex + 1); + while (next_column) + { + if (next_column->mHeader) + { + snap_delta = (next_column->mHeader->getSnapRect().mRight - next_column->mMaxContentWidth) - snap_rect.mRight; + if (llabs(snap_delta) <= threshold && mouse_dir.mX * snap_delta > 0 ) + { + new_edge_val = snap_rect.mRight + snap_delta; + } + break; + } + next_column = mColumn->mParentCtrl->getColumn(next_column->mIndex + 1); + } + } + + return this; +} + +void LLColumnHeader::userSetShape(const LLRect& new_rect) +{ + S32 new_width = new_rect.getWidth(); + S32 delta_width = new_width - (mRect.getWidth() + mColumn->mParentCtrl->getColumnPadding()); + + if (delta_width != 0) + { + S32 remaining_width = delta_width; + S32 col; + for (col = mColumn->mIndex + 1; col < mColumn->mParentCtrl->getNumColumns(); col++) + { + LLScrollListColumn* columnp = mColumn->mParentCtrl->getColumn(col); + if (!columnp) break; + + if (columnp->mHeader && columnp->mHeader->canResize()) + { + // how many pixels in width can this column afford to give up? + S32 resize_buffer_amt = llmax(0, columnp->mWidth - MIN_COLUMN_WIDTH); + + // user shrinking column, need to add width to other columns + if (delta_width < 0) + { + if (!columnp->mDynamicWidth && columnp->mWidth > 0) + { + // statically sized column, give all remaining width to this column + columnp->mWidth -= remaining_width; + if (columnp->mRelWidth > 0.f) + { + columnp->mRelWidth = (F32)columnp->mWidth / (F32)mColumn->mParentCtrl->getItemListRect().getWidth(); + } + } + break; + } + else + { + // user growing column, need to take width from other columns + remaining_width -= resize_buffer_amt; + + if (!columnp->mDynamicWidth && columnp->mWidth > 0) + { + columnp->mWidth -= llmin(columnp->mWidth - MIN_COLUMN_WIDTH, delta_width); + if (columnp->mRelWidth > 0.f) + { + columnp->mRelWidth = (F32)columnp->mWidth / (F32)mColumn->mParentCtrl->getItemListRect().getWidth(); + } + } + + if (remaining_width <= 0) + { + // width sucked up from neighboring columns, done + break; + } + } + } + } + + // clamp resize amount to maximum that can be absorbed by other columns + if (delta_width > 0) + { + delta_width -= llmax(remaining_width, 0); + } + + // propagate constrained delta_width to new width for this column + new_width = mRect.getWidth() + delta_width - mColumn->mParentCtrl->getColumnPadding(); + + // use requested width + mColumn->mWidth = new_width; + + // update proportional spacing + if (mColumn->mRelWidth > 0.f) + { + mColumn->mRelWidth = (F32)new_width / (F32)mColumn->mParentCtrl->getItemListRect().getWidth(); + } + + // tell scroll list to layout columns again + mColumn->mParentCtrl->updateColumns(); + } +} + +void LLColumnHeader::setHasResizableElement(BOOL resizable) +{ + // for now, dynamically spaced columns can't be resized + if (mColumn->mDynamicWidth) return; + + if (resizable != mHasResizableElement) + { + mHasResizableElement = resizable; + + S32 num_resizable_columns = 0; + S32 col; + for (col = 0; col < mColumn->mParentCtrl->getNumColumns(); col++) + { + LLScrollListColumn* columnp = mColumn->mParentCtrl->getColumn(col); + if (columnp->mHeader && columnp->mHeader->canResize()) + { + num_resizable_columns++; + } + } + + S32 num_resizers_enabled = 0; + + // now enable/disable resize handles on resizable columns if we have at least two + for (col = 0; col < mColumn->mParentCtrl->getNumColumns(); col++) + { + LLScrollListColumn* columnp = mColumn->mParentCtrl->getColumn(col); + if (!columnp->mHeader) continue; + BOOL enable = num_resizable_columns >= 2 && num_resizers_enabled < (num_resizable_columns - 1) && columnp->mHeader->canResize(); + columnp->mHeader->enableResizeBar(enable); + if (enable) + { + num_resizers_enabled++; + } + } + } +} + +void LLColumnHeader::enableResizeBar(BOOL enable) +{ + // for now, dynamically spaced columns can't be resized + if (!mColumn->mDynamicWidth) + { + mResizeBar->setEnabled(enable); + } +} + +BOOL LLColumnHeader::canResize() +{ + return getVisible() && (mHasResizableElement || mColumn->mDynamicWidth); +} diff --git a/linden/indra/llui/llscrolllistctrl.h b/linden/indra/llui/llscrolllistctrl.h index a1c4853..eed07b8 100644 --- a/linden/indra/llui/llscrolllistctrl.h +++ b/linden/indra/llui/llscrolllistctrl.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -42,9 +43,12 @@ #include "llviewborder.h" #include "llframetimer.h" #include "llcheckboxctrl.h" +#include "llcombobox.h" class LLScrollbar; class LLScrollListCtrl; +class LLColumnHeader; +class LLResizeBar; class LLScrollListCell { @@ -58,11 +62,27 @@ public: virtual const BOOL getVisible() const { return TRUE; } virtual void setWidth(S32 width) = 0; virtual void highlightText(S32 offset, S32 num_chars) {} + virtual BOOL isText() = 0; virtual BOOL handleClick() { return FALSE; } virtual void setEnabled(BOOL enable) { } }; +class LLScrollListSeparator : public LLScrollListCell +{ +public: + LLScrollListSeparator(S32 width); + virtual ~LLScrollListSeparator() {}; + virtual void drawToWidth(S32 width, const LLColor4& color, const LLColor4& highlight_color) const; // truncate to given width, if possible + virtual S32 getWidth() const {return mWidth;} + virtual S32 getHeight() const { return 5; }; + virtual void setWidth(S32 width) {mWidth = width; } + virtual BOOL isText() { return FALSE; } + +protected: + S32 mWidth; +}; + class LLScrollListText : public LLScrollListCell { public: @@ -77,6 +97,7 @@ public: virtual const BOOL getVisible() const { return mVisible; } virtual void highlightText(S32 offset, S32 num_chars) {mHighlightOffset = offset; mHighlightCount = num_chars;} void setText(const LLString& text); + virtual BOOL isText() { return TRUE; } private: LLUIString mText; @@ -105,6 +126,7 @@ public: virtual const LLString& getText() const { return mImageUUID; } virtual const LLString& getTextLower() const { return mImageUUID; } virtual void setWidth(S32 width) { mWidth = width; } + virtual BOOL isText() { return FALSE; } private: LLPointer mIcon; @@ -126,6 +148,7 @@ public: virtual void setEnabled(BOOL enable) { if (mCheckBox) mCheckBox->setEnabled(enable); } LLCheckBoxCtrl* getCheckBox() { return mCheckBox; } + virtual BOOL isText() { return FALSE; } private: LLCheckBoxCtrl* mCheckBox; @@ -136,20 +159,50 @@ class LLScrollListColumn { public: // Default constructor - LLScrollListColumn() : mName(""), mSortingColumn(""), mLabel(""), mWidth(-1), mRelWidth(-1.0), mDynamicWidth(FALSE), mIndex(-1), mParentCtrl(NULL), mButton(NULL), mFontAlignment(LLFontGL::LEFT) + LLScrollListColumn() : + mName(""), + mSortingColumn(""), + mSortAscending(TRUE), + mLabel(""), + mWidth(-1), + mRelWidth(-1.0), + mDynamicWidth(FALSE), + mMaxContentWidth(0), + mIndex(-1), + mParentCtrl(NULL), + mHeader(NULL), + mFontAlignment(LLFontGL::LEFT) { } - LLScrollListColumn(LLString name, LLString label, S32 width, F32 relwidth) - : mName(name), mSortingColumn(name), mLabel(label), mWidth(width), mRelWidth(relwidth), mDynamicWidth(FALSE), mIndex(-1), mParentCtrl(NULL), mButton(NULL) { } + LLScrollListColumn(LLString name, LLString label, S32 width, F32 relwidth) : + mName(name), + mSortingColumn(name), + mSortAscending(TRUE), + mLabel(label), + mWidth(width), + mRelWidth(relwidth), + mDynamicWidth(FALSE), + mMaxContentWidth(0), + mIndex(-1), + mParentCtrl(NULL), + mHeader(NULL) + { } LLScrollListColumn(const LLSD &sd) { + mMaxContentWidth = 0; + mName = sd.get("name").asString(); mSortingColumn = mName; if (sd.has("sort")) { mSortingColumn = sd.get("sort").asString(); } + mSortAscending = TRUE; + if (sd.has("sort_ascending")) + { + mSortAscending = sd.get("sort_ascending").asBoolean(); + } mLabel = sd.get("label").asString(); if (sd.has("relwidth") && (F32)sd.get("relwidth").asReal() > 0) { @@ -179,21 +232,57 @@ public: mIndex = -1; mParentCtrl = NULL; - mButton = NULL; + mHeader = NULL; } LLString mName; LLString mSortingColumn; + BOOL mSortAscending; LLString mLabel; S32 mWidth; F32 mRelWidth; BOOL mDynamicWidth; + S32 mMaxContentWidth; S32 mIndex; LLScrollListCtrl* mParentCtrl; - LLButton* mButton; + LLColumnHeader* mHeader; LLFontGL::HAlign mFontAlignment; }; +class LLColumnHeader : public LLComboBox +{ +public: + LLColumnHeader(const LLString& label, const LLRect &rect, LLScrollListColumn* column, const LLFontGL *font = NULL); + ~LLColumnHeader(); + + /*virtual*/ void draw(); + /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask); + /*virtual*/ void showList(); + /*virtual*/ LLView* findSnapEdge(S32& new_edge_val, const LLCoordGL& mouse_dir, ESnapEdge snap_edge, ESnapType snap_type, S32 threshold, S32 padding); + /*virtual*/ void userSetShape(const LLRect& new_rect); + + void setImage(const LLString &image_name); + LLScrollListColumn* getColumn() { return mColumn; } + void setHasResizableElement(BOOL resizable); + BOOL canResize(); + void enableResizeBar(BOOL enable); + LLString getLabel() { return mOrigLabel; } + + static void onSelectSort(LLUICtrl* ctrl, void* user_data); + static void onClick(void* user_data); + static void onMouseDown(void* user_data); + static void onHeldDown(void* user_data); + +protected: + LLScrollListColumn* mColumn; + LLResizeBar* mResizeBar; + LLString mOrigLabel; + LLUIString mAscendingText; + LLUIString mDescendingText; + BOOL mShowSortOptions; + BOOL mHasResizableElement; +}; + class LLScrollListItem { public: @@ -235,7 +324,7 @@ public: LLScrollListCell *getColumn(const S32 i) const { if (i < (S32)mColumns.size()) { return mColumns[i]; } return NULL; } - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); + virtual BOOL handleClick(S32 x, S32 y, MASK mask); LLString getContentsCSV(); @@ -282,6 +371,10 @@ public: virtual void addColumn(const LLSD& column, EAddPosition pos = ADD_BOTTOM); virtual void clearColumns(); virtual void setColumnLabel(const LLString& column, const LLString& label); + + virtual LLScrollListColumn* getColumn(S32 index); + virtual S32 getNumColumns() const { return mColumnsIndexed.size(); } + // Adds a single element, from an array of: // "columns" => [ "column" => column name, "value" => value, "type" => type, "font" => font, "font-style" => style ], "id" => uuid // Creates missing columns automatically. @@ -316,11 +409,14 @@ public: // Returns FALSE if not found. BOOL setSelectedByValue(LLSD value, BOOL selected); - virtual BOOL isSelected(LLSD value); + BOOL isSorted(); + virtual BOOL isSelected(LLSD value); + BOOL selectFirstItem(); BOOL selectNthItem( S32 index ); - + BOOL selectItemAt(S32 x, S32 y, MASK mask); + void deleteSingleItem( S32 index ) ; void deleteSelectedItems(); void deselectAllItems(BOOL no_commit_on_change = FALSE); // by default, go ahead and commit on selection change @@ -357,23 +453,6 @@ public: LLScrollListItem* addStringUUIDItem(const LLString& item_text, const LLUUID& id, EAddPosition pos = ADD_BOTTOM, BOOL enabled = TRUE, S32 column_width = 0); LLUUID getStringUUIDSelectedItem(); - // "Full" interface: use this when you're creating a list that has one or more of the following: - // * contains icons - // * contains multiple columns - // * allows multiple selection - // * has items that are not guarenteed to have unique names - // * has additional per-item data (e.g. a UUID or void* userdata) - // - // To add items using this approach, create new LLScrollListItems and LLScrollListCells. Add the - // cells (column entries) to each item, and add the item to the LLScrollListCtrl. - // - // The LLScrollListCtrl owns its items and is responsible for deleting them - // (except in the case that the addItem() call fails, in which case it is up - // to the caller to delete the item) - - // returns FALSE if item faile to be added to list, does NOT delete 'item' - // TomY TODO - Deprecate this API and remove it - BOOL addItem( LLScrollListItem* item, EAddPosition pos = ADD_BOTTOM ); LLScrollListItem* getFirstSelected() const; virtual S32 getFirstSelectedIndex(); std::vector getAllSelected() const; @@ -382,6 +461,7 @@ public: // iterate over all items LLScrollListItem* getFirstData() const; + LLScrollListItem* getLastData() const; std::vector getAllData() const; void setAllowMultipleSelection(BOOL mult ) { mAllowMultipleSelection = mult; } @@ -398,6 +478,7 @@ public: void setBackgroundVisible(BOOL b) { mBackgroundVisible = b; } void setDrawStripes(BOOL b) { mDrawStripes = b; } void setColumnPadding(const S32 c) { mColumnPadding = c; } + S32 getColumnPadding() { return mColumnPadding; } void setCommitOnKeyboardMovement(BOOL b) { mCommitOnKeyboardMovement = b; } void setCommitOnSelectionChange(BOOL b) { mCommitOnSelectionChange = b; } void setAllowKeyboardMovement(BOOL b) { mAllowKeyboardMovement = b; } @@ -417,6 +498,7 @@ public: // Overridden from LLView virtual void draw(); virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); virtual BOOL handleHover(S32 x, S32 y, MASK mask); virtual BOOL handleKeyHere(KEY key, MASK mask, BOOL called_from_parent); @@ -424,6 +506,7 @@ public: virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); virtual void setEnabled(BOOL enabled); virtual void setFocus( BOOL b ); + virtual void onFocusReceived(); virtual void onFocusLost(); virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); @@ -431,17 +514,18 @@ public: virtual LLRect getRequiredRect(); static BOOL rowPreceeds(LLScrollListItem *new_row, LLScrollListItem *test_row); + LLRect getItemListRect() { return mItemListRect; } + // Used "internally" by the scroll bar. static void onScrollChange( S32 new_pos, LLScrollbar* src, void* userdata ); static void onClickColumn(void *userdata); void updateColumns(); - void updateColumnButtons(); + void updateMaxContentWidth(LLScrollListItem* changed_item); void setDisplayHeading(BOOL display); void setHeadingHeight(S32 heading_height); - void setHeadingFont(const LLFontGL* heading_font); void setCollapseEmptyColumns(BOOL collapse); void setIsPopup(BOOL is_popup) { mIsPopup = is_popup; } @@ -473,6 +557,22 @@ public: S32 selectMultiple( LLDynamicArray ids ); protected: + // "Full" interface: use this when you're creating a list that has one or more of the following: + // * contains icons + // * contains multiple columns + // * allows multiple selection + // * has items that are not guarenteed to have unique names + // * has additional per-item data (e.g. a UUID or void* userdata) + // + // To add items using this approach, create new LLScrollListItems and LLScrollListCells. Add the + // cells (column entries) to each item, and add the item to the LLScrollListCtrl. + // + // The LLScrollListCtrl owns its items and is responsible for deleting them + // (except in the case that the addItem() call fails, in which case it is up + // to the caller to delete the item) + + // returns FALSE if item faile to be added to list, does NOT delete 'item' + BOOL addItem( LLScrollListItem* item, EAddPosition pos = ADD_BOTTOM ); void selectPrevItem(BOOL extend_selection); void selectNextItem(BOOL extend_selection); void drawItems(); @@ -482,6 +582,7 @@ protected: void selectItem(LLScrollListItem* itemp, BOOL single_select = TRUE); void deselectItem(LLScrollListItem* itemp); void commitIfChanged(); + void setSorted(BOOL sorted); protected: S32 mCurIndex; // For get[First/Next]Data @@ -492,7 +593,6 @@ protected: S32 mPageLines; // max number of lines is it possible to see on the screen given mRect and mLineHeight S32 mHeadingHeight; // the height of the column header buttons, if visible U32 mMaxSelectable; - const LLFontGL* mHeadingFont; // the font to use for column head buttons, if visible LLScrollbar* mScrollbar; BOOL mAllowMultipleSelection; BOOL mAllowKeyboardMovement; @@ -500,7 +600,7 @@ protected: BOOL mCommitOnSelectionChange; BOOL mSelectionChanged; BOOL mCanSelect; - BOOL mDisplayColumnButtons; + BOOL mDisplayColumnHeaders; BOOL mCollapseEmptyColumns; BOOL mIsPopup; @@ -544,8 +644,9 @@ protected: S32 mNumDynamicWidthColumns; S32 mTotalStaticColumnWidth; - U32 mSortColumn; - BOOL mSortAscending; + S32 mSortColumn; + BOOL mSortAscending; + BOOL mSorted; std::map mColumns; std::vector mColumnsIndexed; diff --git a/linden/indra/llui/llslider.cpp b/linden/indra/llui/llslider.cpp index 20d77bf..8c0d2a1 100644 --- a/linden/indra/llui/llslider.cpp +++ b/linden/indra/llui/llslider.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -117,7 +118,7 @@ F32 LLSlider::getValueF32() const BOOL LLSlider::handleHover(S32 x, S32 y, MASK mask) { - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { S32 left_edge = THUMB_WIDTH/2; S32 right_edge = mRect.getWidth() - (THUMB_WIDTH/2); @@ -144,9 +145,9 @@ BOOL LLSlider::handleMouseUp(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); if( mMouseUpCallback ) { @@ -194,7 +195,7 @@ BOOL LLSlider::handleMouseDown(S32 x, S32 y, MASK mask) // Start dragging the thumb // No handler needed for focus lost since this class has no state that depends on it. - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); mDragStartThumbRect = mThumbRect; } make_ui_sound("UISndClick"); @@ -261,12 +262,12 @@ void LLSlider::draw() if (!thumb_imagep) { gl_rect_2d(mThumbRect, mThumbCenterColor, TRUE); - if (gFocusMgr.getMouseCapture() == this) + if (hasMouseCapture()) { gl_rect_2d(mDragStartThumbRect, mThumbCenterColor % opacity, FALSE); } } - else if( gFocusMgr.getMouseCapture() == this ) + else if( hasMouseCapture() ) { gl_draw_scaled_image_with_border(mDragStartThumbRect.mLeft, mDragStartThumbRect.mBottom, 16, 16, mDragStartThumbRect.getWidth(), mDragStartThumbRect.getHeight(), thumb_imagep, mThumbCenterColor % 0.3f, TRUE); diff --git a/linden/indra/llui/llslider.h b/linden/indra/llui/llslider.h index 1cf1a90..4f42a56 100644 --- a/linden/indra/llui/llslider.h +++ b/linden/indra/llui/llslider.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llsliderctrl.cpp b/linden/indra/llui/llsliderctrl.cpp index c62ec9a..9a67bca 100644 --- a/linden/indra/llui/llsliderctrl.cpp +++ b/linden/indra/llui/llsliderctrl.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -205,7 +206,7 @@ void LLSliderCtrl::clear() BOOL LLSliderCtrl::isMouseHeldDown() { - return gFocusMgr.getMouseCapture() == mSlider; + return mSlider->hasMouseCapture(); } void LLSliderCtrl::updateText() @@ -319,7 +320,7 @@ void LLSliderCtrl::onSliderCommit( LLUICtrl* caller, void *userdata ) void LLSliderCtrl::setEnabled(BOOL b) { - LLUICtrl::setEnabled( b ); + LLView::setEnabled( b ); if( mLabelBox ) { diff --git a/linden/indra/llui/llsliderctrl.h b/linden/indra/llui/llsliderctrl.h index baa0c42..26c9dee 100644 --- a/linden/indra/llui/llsliderctrl.h +++ b/linden/indra/llui/llsliderctrl.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llspinctrl.cpp b/linden/indra/llui/llspinctrl.cpp index 1f33279..668ddfa 100644 --- a/linden/indra/llui/llspinctrl.cpp +++ b/linden/indra/llui/llspinctrl.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -142,6 +143,23 @@ LLSpinCtrl::~LLSpinCtrl() } +F32 clamp_precision(F32 value, S32 decimal_precision) +{ + // pow() isn't perfect + + F64 clamped_value = value; + for (S32 i = 0; i < decimal_precision; i++) + clamped_value *= 10.0; + + clamped_value = llround((F32)clamped_value); + + for (S32 i = 0; i < decimal_precision; i++) + clamped_value /= 10.0; + + return (F32)clamped_value; +} + + // static void LLSpinCtrl::onUpBtn( void *userdata ) { @@ -150,6 +168,7 @@ void LLSpinCtrl::onUpBtn( void *userdata ) { // use getValue()/setValue() to force reload from/to control F32 val = (F32)self->getValue().asReal() + self->mIncrement; + val = clamp_precision(val, self->mPrecision); val = llmin( val, self->mMaxValue ); if( self->mValidateCallback ) @@ -182,6 +201,7 @@ void LLSpinCtrl::onDownBtn( void *userdata ) if( self->getEnabled() ) { F32 val = (F32)self->getValue().asReal() - self->mIncrement; + val = clamp_precision(val, self->mPrecision); val = llmax( val, self->mMinValue ); if( self->mValidateCallback ) @@ -243,12 +263,13 @@ void LLSpinCtrl::clear() } + void LLSpinCtrl::updateEditor() { LLLocale locale(LLLocale::USER_LOCALE); // Don't display very small negative values as -0.000 - F32 displayed_value = (F32)floor(getValue().asReal() * pow(10.0, (F64)mPrecision) + 0.5) / (F32)pow(10.0, (F64)mPrecision); + F32 displayed_value = clamp_precision((F32)getValue().asReal(), mPrecision); // if( S32( displayed_value * pow( 10, mPrecision ) ) == 0 ) // { @@ -320,7 +341,7 @@ void LLSpinCtrl::setFocus(BOOL b) void LLSpinCtrl::setEnabled(BOOL b) { - LLUICtrl::setEnabled( b ); + LLView::setEnabled( b ); mEditor->setEnabled( b ); } @@ -335,8 +356,8 @@ void LLSpinCtrl::setTentative(BOOL b) BOOL LLSpinCtrl::isMouseHeldDown() { return - gFocusMgr.getMouseCapture() == mDownBtn || - gFocusMgr.getMouseCapture() == mUpBtn; + mDownBtn->hasMouseCapture() + || mUpBtn->hasMouseCapture(); } void LLSpinCtrl::onCommit() diff --git a/linden/indra/llui/llspinctrl.h b/linden/indra/llui/llspinctrl.h index 46776ed..dcc305e 100644 --- a/linden/indra/llui/llspinctrl.h +++ b/linden/indra/llui/llspinctrl.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llstyle.cpp b/linden/indra/llui/llstyle.cpp index aaacb46..1efb4cc 100644 --- a/linden/indra/llui/llstyle.cpp +++ b/linden/indra/llui/llstyle.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llstyle.h b/linden/indra/llui/llstyle.h index 424db40..e6e88e7 100644 --- a/linden/indra/llui/llstyle.h +++ b/linden/indra/llui/llstyle.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/lltabcontainer.cpp b/linden/indra/llui/lltabcontainer.cpp index 4687414..db09717 100644 --- a/linden/indra/llui/lltabcontainer.cpp +++ b/linden/indra/llui/lltabcontainer.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -476,6 +477,24 @@ void LLTabContainerCommon::onPrevBtn( void* userdata ) self->mScrolled = FALSE; } + +void LLTabContainerCommon::onJumpFirstBtn( void* userdata ) +{ + LLTabContainer* self = (LLTabContainer*) userdata; + + self->mScrollPos = 0; + +} + + +void LLTabContainerCommon::onJumpLastBtn( void* userdata ) +{ + LLTabContainer* self = (LLTabContainer*) userdata; + + self->mScrollPos = self->mMaxScrollPos; +} + + // static void LLTabContainerCommon::onPrevBtnHeld( void* userdata ) { @@ -692,6 +711,8 @@ LLTabContainer::LLTabContainer( LLTabContainerCommon(name, rect, pos, close_callback, callback_userdata, bordered), mLeftArrowBtn(NULL), mRightArrowBtn(NULL), + mJumpLeftArrowBtn(NULL), + mJumpRightArrowBtn(NULL), mRightTabBtnOffset(0), mMinTabWidth(TABCNTR_TAB_MIN_WIDTH), mMaxTabWidth(TABCNTR_TAB_MAX_WIDTH), @@ -708,6 +729,8 @@ LLTabContainer::LLTabContainer( LLTabContainerCommon(name, rect_control, pos, close_callback, callback_userdata, bordered), mLeftArrowBtn(NULL), mRightArrowBtn(NULL), + mJumpLeftArrowBtn(NULL), + mJumpRightArrowBtn(NULL), mRightTabBtnOffset(0), mMinTabWidth(TABCNTR_TAB_MIN_WIDTH), mMaxTabWidth(TABCNTR_TAB_MAX_WIDTH), @@ -739,14 +762,35 @@ void LLTabContainer::initButtons() S32 btn_top = (mTabPosition == TOP ) ? mRect.getHeight() - mTopBorderHeight : TABCNTR_ARROW_BTN_SIZE + 1; LLRect left_arrow_btn_rect; - left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1, btn_top + arrow_fudge, TABCNTR_ARROW_BTN_SIZE, TABCNTR_ARROW_BTN_SIZE ); + left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1+TABCNTR_ARROW_BTN_SIZE, btn_top + arrow_fudge, TABCNTR_ARROW_BTN_SIZE, TABCNTR_ARROW_BTN_SIZE ); + + LLRect jump_left_arrow_btn_rect; + jump_left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1, btn_top + arrow_fudge, TABCNTR_ARROW_BTN_SIZE, TABCNTR_ARROW_BTN_SIZE ); S32 right_pad = TABCNTR_ARROW_BTN_SIZE + LLPANEL_BORDER_WIDTH + 1; + LLRect right_arrow_btn_rect; - right_arrow_btn_rect.setLeftTopAndSize( mRect.getWidth() - mRightTabBtnOffset - right_pad, + right_arrow_btn_rect.setLeftTopAndSize( mRect.getWidth() - mRightTabBtnOffset - right_pad - TABCNTR_ARROW_BTN_SIZE, btn_top + arrow_fudge, TABCNTR_ARROW_BTN_SIZE, TABCNTR_ARROW_BTN_SIZE ); + + LLRect jump_right_arrow_btn_rect; + jump_right_arrow_btn_rect.setLeftTopAndSize( mRect.getWidth() - mRightTabBtnOffset - right_pad, + btn_top + arrow_fudge, + TABCNTR_ARROW_BTN_SIZE, TABCNTR_ARROW_BTN_SIZE ); + + out_id = "UIImgBtnJumpLeftOutUUID"; + in_id = "UIImgBtnJumpLeftInUUID"; + mJumpLeftArrowBtn = new LLButton( + "Jump Left Arrow", jump_left_arrow_btn_rect, + out_id, in_id, "", + &LLTabContainer::onJumpFirstBtn, this, LLFontGL::sSansSerif ); + mJumpLeftArrowBtn->setFollowsLeft(); + mJumpLeftArrowBtn->setSaveToXML(false); + mJumpLeftArrowBtn->setTabStop(FALSE); + addChild(mJumpLeftArrowBtn); + out_id = "UIImgBtnScrollLeftOutUUID"; in_id = "UIImgBtnScrollLeftInUUID"; mLeftArrowBtn = new LLButton( @@ -758,6 +802,18 @@ void LLTabContainer::initButtons() mLeftArrowBtn->setSaveToXML(false); mLeftArrowBtn->setTabStop(FALSE); addChild(mLeftArrowBtn); + + out_id = "UIImgBtnJumpRightOutUUID"; + in_id = "UIImgBtnJumpRightInUUID"; + mJumpRightArrowBtn = new LLButton( + "Jump Right Arrow", jump_right_arrow_btn_rect, + out_id, in_id, "", + &LLTabContainer::onJumpLastBtn, this, + LLFontGL::sSansSerif); + mJumpRightArrowBtn->setFollowsRight(); + mJumpRightArrowBtn->setSaveToXML(false); + mJumpRightArrowBtn->setTabStop(FALSE); + addChild(mJumpRightArrowBtn); out_id = "UIImgBtnScrollRightOutUUID"; in_id = "UIImgBtnScrollRightInUUID"; @@ -772,15 +828,20 @@ void LLTabContainer::initButtons() mRightArrowBtn->setTabStop(FALSE); addChild(mRightArrowBtn); + if( mTabPosition == TOP ) { mRightArrowBtn->setFollowsTop(); mLeftArrowBtn->setFollowsTop(); + mJumpLeftArrowBtn->setFollowsTop(); + mJumpRightArrowBtn->setFollowsTop(); } else { mRightArrowBtn->setFollowsBottom(); mLeftArrowBtn->setFollowsBottom(); + mJumpLeftArrowBtn->setFollowsBottom(); + mJumpRightArrowBtn->setFollowsBottom(); } // set default tab group to be panel contents @@ -971,7 +1032,7 @@ void LLTabContainer::updateMaxScrollPos() if( tab_space > available_space ) { - S32 available_width_with_arrows = mRect.getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + TABCNTR_ARROW_BTN_SIZE + 1); + S32 available_width_with_arrows = mRect.getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + TABCNTR_ARROW_BTN_SIZE + TABCNTR_ARROW_BTN_SIZE + 1); // subtract off reserved portion on left available_width_with_arrows -= TABCNTR_TAB_PARTIAL_WIDTH; @@ -1002,7 +1063,7 @@ void LLTabContainer::updateMaxScrollPos() void LLTabContainer::commitHoveredButton(S32 x, S32 y) { - if (gFocusMgr.getMouseCapture() == this) + if (hasMouseCapture()) { for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter) { @@ -1078,7 +1139,7 @@ BOOL LLTabContainer::selectTab(S32 which) } else { - S32 available_width_with_arrows = mRect.getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + TABCNTR_ARROW_BTN_SIZE + 1); + S32 available_width_with_arrows = mRect.getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + TABCNTR_ARROW_BTN_SIZE + TABCNTR_ARROW_BTN_SIZE + 1); S32 running_tab_width = tuple->mButton->getRect().getWidth(); S32 j = i - 1; S32 min_scroll_pos = i; @@ -1120,7 +1181,7 @@ void LLTabContainer::draw() S32 cur_scroll_pos = mScrollPos; if (cur_scroll_pos > 0) { - S32 available_width_with_arrows = mRect.getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + TABCNTR_ARROW_BTN_SIZE + 1); + S32 available_width_with_arrows = mRect.getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + TABCNTR_ARROW_BTN_SIZE + TABCNTR_ARROW_BTN_SIZE + 1); for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter) { if (cur_scroll_pos == 0) @@ -1141,11 +1202,13 @@ void LLTabContainer::draw() if( getVisible() ) { BOOL has_scroll_arrows = (mMaxScrollPos > 0) || (mScrollPosPixels > 0); + mJumpLeftArrowBtn->setVisible( has_scroll_arrows ); + mJumpRightArrowBtn->setVisible( has_scroll_arrows ); mLeftArrowBtn->setVisible( has_scroll_arrows ); mRightArrowBtn->setVisible( has_scroll_arrows ); // Set the leftmost position of the tab buttons. - S32 left = LLPANEL_BORDER_WIDTH + (has_scroll_arrows ? TABCNTR_ARROW_BTN_SIZE : TABCNTR_TAB_H_PAD); + S32 left = LLPANEL_BORDER_WIDTH + (has_scroll_arrows ? (TABCNTR_ARROW_BTN_SIZE * 2) : TABCNTR_TAB_H_PAD); left -= mScrollPosPixels; // Hide all the buttons @@ -1234,7 +1297,19 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask ) BOOL has_scroll_arrows = (mMaxScrollPos > 0); if (has_scroll_arrows) - { + { + if (mJumpLeftArrowBtn->getRect().pointInRect(x, y)) + { + S32 local_x = x - mJumpLeftArrowBtn->getRect().mLeft; + S32 local_y = y - mJumpLeftArrowBtn->getRect().mBottom; + handled = mJumpLeftArrowBtn->handleMouseDown(local_x, local_y, mask); + } + if (mJumpRightArrowBtn->getRect().pointInRect(x, y)) + { + S32 local_x = x - mJumpRightArrowBtn->getRect().mLeft; + S32 local_y = y - mJumpRightArrowBtn->getRect().mBottom; + handled = mJumpRightArrowBtn->handleMouseDown(local_x, local_y, mask); + } if (mLeftArrowBtn->getRect().pointInRect(x, y)) { S32 local_x = x - mLeftArrowBtn->getRect().mLeft; @@ -1256,14 +1331,14 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask ) if (mTabList.size() > 0) { LLTabTuple* firsttuple = mTabList[0]; - LLRect tab_rect(has_scroll_arrows ? mLeftArrowBtn->getRect().mRight : mLeftArrowBtn->getRect().mLeft, + LLRect tab_rect(has_scroll_arrows ? mLeftArrowBtn->getRect().mRight : mJumpLeftArrowBtn->getRect().mLeft, firsttuple->mButton->getRect().mTop, - has_scroll_arrows ? mRightArrowBtn->getRect().mLeft : mRightArrowBtn->getRect().mRight, + has_scroll_arrows ? mRightArrowBtn->getRect().mLeft : mJumpRightArrowBtn->getRect().mRight, firsttuple->mButton->getRect().mBottom ); if( tab_rect.pointInRect( x, y ) ) { LLButton* tab_button = mTabList[getCurrentPanelIndex()]->mButton; - gFocusMgr.setMouseCapture(this, NULL); + gFocusMgr.setMouseCapture(this); gFocusMgr.setKeyboardFocus(tab_button, NULL); } } @@ -1276,7 +1351,19 @@ BOOL LLTabContainer::handleHover( S32 x, S32 y, MASK mask ) BOOL has_scroll_arrows = (mMaxScrollPos > 0); if (has_scroll_arrows) - { + { + if (mJumpLeftArrowBtn->getRect().pointInRect(x, y)) + { + S32 local_x = x - mJumpLeftArrowBtn->getRect().mLeft; + S32 local_y = y - mJumpLeftArrowBtn->getRect().mBottom; + handled = mJumpLeftArrowBtn->handleHover(local_x, local_y, mask); + } + if (mJumpRightArrowBtn->getRect().pointInRect(x, y)) + { + S32 local_x = x - mJumpRightArrowBtn->getRect().mLeft; + S32 local_y = y - mJumpRightArrowBtn->getRect().mBottom; + handled = mJumpRightArrowBtn->handleHover(local_x, local_y, mask); + } if (mLeftArrowBtn->getRect().pointInRect(x, y)) { S32 local_x = x - mLeftArrowBtn->getRect().mLeft; @@ -1306,6 +1393,18 @@ BOOL LLTabContainer::handleMouseUp( S32 x, S32 y, MASK mask ) if (has_scroll_arrows) { + if (mJumpLeftArrowBtn->getRect().pointInRect(x, y)) + { + S32 local_x = x - mJumpLeftArrowBtn->getRect().mLeft; + S32 local_y = y - mJumpLeftArrowBtn->getRect().mBottom; + handled = mJumpLeftArrowBtn->handleMouseUp(local_x, local_y, mask); + } + if (mJumpRightArrowBtn->getRect().pointInRect(x, y)) + { + S32 local_x = x - mJumpRightArrowBtn->getRect().mLeft; + S32 local_y = y - mJumpRightArrowBtn->getRect().mBottom; + handled = mJumpRightArrowBtn->handleMouseUp(local_x, local_y, mask); + } if (mLeftArrowBtn->getRect().pointInRect(x, y)) { S32 local_x = x - mLeftArrowBtn->getRect().mLeft; @@ -1326,7 +1425,7 @@ BOOL LLTabContainer::handleMouseUp( S32 x, S32 y, MASK mask ) commitHoveredButton(x, y); LLPanel* cur_panel = getCurrentPanel(); - if (gFocusMgr.getMouseCapture() == this) + if (hasMouseCapture()) { if (cur_panel) { @@ -1337,7 +1436,7 @@ BOOL LLTabContainer::handleMouseUp( S32 x, S32 y, MASK mask ) mTabList[getCurrentPanelIndex()]->mButton->setFocus(TRUE); } } - gFocusMgr.setMouseCapture(NULL, NULL); + gFocusMgr.setMouseCapture(NULL); } return handled; } @@ -1351,7 +1450,7 @@ BOOL LLTabContainer::handleToolTip( S32 x, S32 y, LLString& msg, LLRect* sticky_ BOOL has_scroll_arrows = (mMaxScrollPos > 0); LLRect clip( - has_scroll_arrows ? mLeftArrowBtn->getRect().mRight : mLeftArrowBtn->getRect().mLeft, + has_scroll_arrows ? mJumpLeftArrowBtn->getRect().mRight : mJumpLeftArrowBtn->getRect().mLeft, firsttuple->mButton->getRect().mTop, has_scroll_arrows ? mRightArrowBtn->getRect().mLeft : mRightArrowBtn->getRect().mRight, 0 ); @@ -1457,6 +1556,18 @@ BOOL LLTabContainer::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDrag if (has_scroll_arrows) { + if (mJumpLeftArrowBtn->getRect().pointInRect(x, y)) + { + S32 local_x = x - mJumpLeftArrowBtn->getRect().mLeft; + S32 local_y = y - mJumpLeftArrowBtn->getRect().mBottom; + mJumpLeftArrowBtn->handleHover(local_x, local_y, mask); + } + if (mJumpRightArrowBtn->getRect().pointInRect(x, y)) + { + S32 local_x = x - mJumpRightArrowBtn->getRect().mLeft; + S32 local_y = y - mJumpRightArrowBtn->getRect().mBottom; + mJumpRightArrowBtn->handleHover(local_x, local_y, mask); + } if (mLeftArrowBtn->getRect().pointInRect(x, y)) { S32 local_x = x - mLeftArrowBtn->getRect().mLeft; diff --git a/linden/indra/llui/lltabcontainer.h b/linden/indra/llui/lltabcontainer.h index c3146a1..5fe6bc5 100644 --- a/linden/indra/llui/lltabcontainer.h +++ b/linden/indra/llui/lltabcontainer.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -128,6 +129,8 @@ public: static void onNextBtnHeld(void* userdata); static void onPrevBtn(void* userdata); static void onPrevBtnHeld(void* userdata); + static void onJumpFirstBtn( void* userdata ); + static void onJumpLastBtn( void* userdata ); virtual void setRightTabBtnOffset( S32 offset ) { } virtual void setPanelTitle(S32 index, const LLString& title) { } @@ -242,7 +245,9 @@ public: protected: LLButton* mLeftArrowBtn; + LLButton* mJumpLeftArrowBtn; LLButton* mRightArrowBtn; + LLButton* mJumpRightArrowBtn; S32 mRightTabBtnOffset; // Extra room to the right of the tab buttons. diff --git a/linden/indra/llui/lltabcontainervertical.cpp b/linden/indra/llui/lltabcontainervertical.cpp index 121adf1..a921b4b 100644 --- a/linden/indra/llui/lltabcontainervertical.cpp +++ b/linden/indra/llui/lltabcontainervertical.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -279,7 +280,7 @@ void LLTabContainerVertical::updateMaxScrollPos() void LLTabContainerVertical::commitHoveredButton(S32 x, S32 y) { - if (gFocusMgr.getMouseCapture() == this) + if (hasMouseCapture()) { for(std::vector::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter) { @@ -473,7 +474,7 @@ BOOL LLTabContainerVertical::handleMouseDown( S32 x, S32 y, MASK mask ) if( tab_rect.pointInRect( x, y ) ) { LLButton* tab_button = mTabList[getCurrentPanelIndex()]->mButton; - gFocusMgr.setMouseCapture(this, NULL); + gFocusMgr.setMouseCapture(this); gFocusMgr.setKeyboardFocus(tab_button, NULL); } } @@ -536,7 +537,7 @@ BOOL LLTabContainerVertical::handleMouseUp( S32 x, S32 y, MASK mask ) commitHoveredButton(x, y); LLPanel* cur_panel = getCurrentPanel(); - if (gFocusMgr.getMouseCapture() == this) + if (hasMouseCapture()) { if (cur_panel) { @@ -545,7 +546,7 @@ BOOL LLTabContainerVertical::handleMouseUp( S32 x, S32 y, MASK mask ) mTabList[getCurrentPanelIndex()]->mButton->setFocus(TRUE); } } - gFocusMgr.setMouseCapture(NULL, NULL); + gFocusMgr.setMouseCapture(NULL); } return handled; diff --git a/linden/indra/llui/lltabcontainervertical.h b/linden/indra/llui/lltabcontainervertical.h index 81b2331..77817c2 100644 --- a/linden/indra/llui/lltabcontainervertical.h +++ b/linden/indra/llui/lltabcontainervertical.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/lltextbox.cpp b/linden/indra/llui/lltextbox.cpp index d70f223..884d638 100644 --- a/linden/indra/llui/lltextbox.cpp +++ b/linden/indra/llui/lltextbox.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -113,7 +114,7 @@ BOOL LLTextBox::handleMouseDown(S32 x, S32 y, MASK mask) handled = TRUE; // Route future Mouse messages here preemptively. (Release on mouse up.) - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); if (mSoundFlags & MOUSE_DOWN) { @@ -134,12 +135,12 @@ BOOL LLTextBox::handleMouseUp(S32 x, S32 y, MASK mask) // HACK: Only do this if there actually is a click callback, so that // overly large text boxes in the older UI won't start eating clicks. if (mClickedCallback - && this == gFocusMgr.getMouseCapture()) + && hasMouseCapture()) { handled = TRUE; // Release the mouse - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); if (mSoundFlags & MOUSE_UP) { @@ -347,7 +348,7 @@ void LLTextBox::draw() void LLTextBox::reshape(S32 width, S32 height, BOOL called_from_parent) { // reparse line lengths - setText(mText); + setLineLengths(); LLView::reshape(width, height, called_from_parent); } diff --git a/linden/indra/llui/lltextbox.h b/linden/indra/llui/lltextbox.h index 7e445e1..45d6acb 100644 --- a/linden/indra/llui/lltextbox.h +++ b/linden/indra/llui/lltextbox.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/lltexteditor.cpp b/linden/indra/llui/lltexteditor.cpp index 8f22545..787eba5 100644 --- a/linden/indra/llui/lltexteditor.cpp +++ b/linden/indra/llui/lltexteditor.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -812,6 +813,31 @@ LLWString LLTextEditor::getWSubString(S32 pos, S32 len) return mWText.substr(pos, len); } +LLTextSegment* LLTextEditor::getCurrentSegment() +{ + return getSegmentAtOffset(mCursorPos); +} + +LLTextSegment* LLTextEditor::getPreviousSegment() +{ + // find segment index at character to left of cursor (or rightmost edge of selection) + S32 idx = llmax(0, getSegmentIdxAtOffset(mCursorPos) - 1); + return idx >= 0 ? mSegments[idx] : NULL; +} + +void LLTextEditor::getSelectedSegments(std::vector& segments) +{ + S32 left = hasSelection() ? llmin(mSelectionStart, mSelectionEnd) : mCursorPos; + S32 right = hasSelection() ? llmax(mSelectionStart, mSelectionEnd) : mCursorPos; + S32 first_idx = llmax(0, getSegmentIdxAtOffset(left)); + S32 last_idx = llmax(0, first_idx, getSegmentIdxAtOffset(right)); + + for (S32 idx = first_idx; idx <= last_idx; ++idx) + { + segments.push_back(mSegments[idx]); + } +} + S32 LLTextEditor::getCursorPosFromLocalCoord( S32 local_x, S32 local_y, BOOL round ) { // If round is true, if the position is on the right half of a character, the cursor @@ -1201,7 +1227,7 @@ BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask) setCursorAtLocalPos( x, y, TRUE ); startSelection(); } - gFocusMgr.setMouseCapture( this, &LLTextEditor::onMouseCaptureLost ); + gFocusMgr.setMouseCapture( this ); } handled = TRUE; @@ -1227,7 +1253,7 @@ BOOL LLTextEditor::handleHover(S32 x, S32 y, MASK mask) mHoverSegment = NULL; if( getVisible() ) { - if(gFocusMgr.getMouseCapture() == this ) + if(hasMouseCapture() ) { if( mIsSelecting ) { @@ -1360,9 +1386,9 @@ BOOL LLTextEditor::handleMouseUp(S32 x, S32 y, MASK mask) // Delay cursor flashing mKeystrokeTimer.reset(); - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); handled = TRUE; } @@ -2473,6 +2499,8 @@ void LLTextEditor::onFocusLost() // Make sure cursor is shown again getWindow()->showCursorFromMouseMove(); + + LLUICtrl::onFocusLost(); } void LLTextEditor::setEnabled(BOOL enabled) @@ -3753,11 +3781,9 @@ S32 LLTextEditor::getSegmentIdxAtOffset(S32 offset) } } -//static -void LLTextEditor::onMouseCaptureLost( LLMouseHandler* old_captor ) +void LLTextEditor::onMouseCaptureLost() { - LLTextEditor* self = (LLTextEditor*) old_captor; - self->endSelection(); + endSelection(); } void LLTextEditor::setOnScrollEndCallback(void (*callback)(void*), void* userdata) diff --git a/linden/indra/llui/lltexteditor.h b/linden/indra/llui/lltexteditor.h index e5ba8ca..32375be 100644 --- a/linden/indra/llui/lltexteditor.h +++ b/linden/indra/llui/lltexteditor.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -94,6 +95,8 @@ public: virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, LLString& tooltip_msg); + virtual void onMouseCaptureLost(); + // view overrides virtual void reshape(S32 width, S32 height, BOOL called_from_parent); @@ -209,7 +212,6 @@ public: void setHandleEditKeysDirectly( BOOL b ) { mHandleEditKeysDirectly = b; } // Callbacks - static void onMouseCaptureLost( LLMouseHandler* old_captor ); static void setLinkColor(LLColor4 color) { mLinkColor = color; } static void setURLCallbacks( void (*callback1) (const char* url), BOOL (*callback2) (LLString url) ) @@ -239,6 +241,10 @@ public: llwchar getWChar(S32 pos); LLWString getWSubString(S32 pos, S32 len); + LLTextSegment* getCurrentSegment(); + LLTextSegment* getPreviousSegment(); + void getSelectedSegments(std::vector& segments); + protected: S32 getLength() const; void getSegmentAndOffset( S32 startpos, S32* segidxp, S32* offsetp ); diff --git a/linden/indra/llui/llui.cpp b/linden/indra/llui/llui.cpp index 61dede2..9d689b5 100644 --- a/linden/indra/llui/llui.cpp +++ b/linden/indra/llui/llui.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -74,6 +75,7 @@ LLImageProviderInterface* LLUI::sImageProvider = NULL; LLUIAudioCallback LLUI::sAudioCallback = NULL; LLVector2 LLUI::sGLScaleFactor(1.f, 1.f); LLWindow* LLUI::sWindow = NULL; +LLHtmlHelp* LLUI::sHtmlHelp = NULL; BOOL LLUI::sShowXUINames = FALSE; // // Functions @@ -406,7 +408,7 @@ void gl_corners_2d(S32 left, S32 top, S32 right, S32 bottom, S32 length, F32 max void gl_draw_image( S32 x, S32 y, LLImageGL* image, const LLColor4& color ) { - gl_draw_scaled_rotated_image( x, y, image->getWidth(), image->getHeight(), 0.f, image, color ); + gl_draw_scaled_rotated_image( x, y, image->getWidth(0), image->getHeight(0), 0.f, image, color ); } void gl_draw_scaled_image(S32 x, S32 y, S32 width, S32 height, LLImageGL* image, const LLColor4& color) @@ -458,8 +460,8 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border glColor4fv(color.mV); - F32 border_width_fraction = (F32)border_width / (F32)image->getWidth(); - F32 border_height_fraction = (F32)border_height / (F32)image->getHeight(); + F32 border_width_fraction = (F32)border_width / (F32)image->getWidth(0); + F32 border_height_fraction = (F32)border_height / (F32)image->getHeight(0); glBegin(GL_QUADS); { @@ -592,7 +594,7 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border void gl_draw_rotated_image(S32 x, S32 y, F32 degrees, LLImageGL* image, const LLColor4& color) { - gl_draw_scaled_rotated_image( x, y, image->getWidth(), image->getHeight(), degrees, image, color ); + gl_draw_scaled_rotated_image( x, y, image->getWidth(0), image->getHeight(0), degrees, image, color ); } void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degrees, LLImageGL* image, const LLColor4& color) @@ -1742,6 +1744,10 @@ LLString LLUI::locateSkin(const LLString& filename) if (!gDirUtilp->fileExists(found_file)) { LLString localization(sConfigGroup->getString("Language")); + if(localization == "default") + { + localization = sConfigGroup->getString("SystemLanguage"); + } LLString local_skin = "xui" + slash + localization + slash + filename; found_file = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, local_skin); } @@ -1781,3 +1787,9 @@ LLUUID LLUI::findAssetUUIDByName(const LLString &asset_name) } return LLUUID( foundValue ); } + +// static +void LLUI::setHtmlHelp(LLHtmlHelp* html_help) +{ + LLUI::sHtmlHelp = html_help; +} diff --git a/linden/indra/llui/llui.h b/linden/indra/llui/llui.h index cd57990..6b8a86a 100644 --- a/linden/indra/llui/llui.h +++ b/linden/indra/llui/llui.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -34,6 +35,7 @@ #include "llcontrol.h" #include "llrect.h" #include "llcoord.h" +#include "llhtmlhelp.h" class LLColor4; class LLVector3; @@ -170,6 +172,7 @@ public: static void setLineWidth(F32 width); static LLUUID findAssetUUIDByName(const LLString& name); static LLVector2 getWindowSize(); + static void setHtmlHelp(LLHtmlHelp* html_help); public: static LLControlGroup* sConfigGroup; static LLControlGroup* sColorsGroup; @@ -179,6 +182,7 @@ public: static LLVector2 sGLScaleFactor; static LLWindow* sWindow; static BOOL sShowXUINames; + static LLHtmlHelp* sHtmlHelp; }; // UI widgets diff --git a/linden/indra/llui/llui.vcproj b/linden/indra/llui/llui.vcproj index e3d0da6..37428d2 100644 --- a/linden/indra/llui/llui.vcproj +++ b/linden/indra/llui/llui.vcproj @@ -310,6 +310,9 @@ RelativePath=".\llfocusmgr.h"> + + getString("Language"); + if(language == "default") + { + language = LLUI::sConfigGroup->getString("SystemLanguage"); + } } path_val_ui.setArg("[Language]", language); LLString fullpath = app_dir + path_val_ui.getString(); diff --git a/linden/indra/llui/lluictrlfactory.h b/linden/indra/llui/lluictrlfactory.h index b96dc5d..18b0ba9 100644 --- a/linden/indra/llui/lluictrlfactory.h +++ b/linden/indra/llui/lluictrlfactory.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/lluistring.cpp b/linden/indra/llui/lluistring.cpp index 5029082..49b6fca 100755 --- a/linden/indra/llui/lluistring.cpp +++ b/linden/indra/llui/lluistring.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/lluistring.h b/linden/indra/llui/lluistring.h index efd200a..37792aa 100755 --- a/linden/indra/llui/lluistring.h +++ b/linden/indra/llui/lluistring.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/lluixmltags.h b/linden/indra/llui/lluixmltags.h index 5de4d90..08c5f67 100644 --- a/linden/indra/llui/lluixmltags.h +++ b/linden/indra/llui/lluixmltags.h @@ -3,6 +3,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llundo.cpp b/linden/indra/llui/llundo.cpp index b662a1a..4e62bad 100644 --- a/linden/indra/llui/llundo.cpp +++ b/linden/indra/llui/llundo.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llundo.h b/linden/indra/llui/llundo.h index 10d556f..9a4bece 100644 --- a/linden/indra/llui/llundo.h +++ b/linden/indra/llui/llundo.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llview.cpp b/linden/indra/llui/llview.cpp index 13f1ddc..d150e10 100644 --- a/linden/indra/llui/llview.cpp +++ b/linden/indra/llui/llview.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -174,18 +175,12 @@ LLView::~LLView() gFocusMgr.removeKeyboardFocusWithoutCallback( this ); } - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { llwarns << "View holding mouse capture deleted: " << getName() << ". Mouse capture removed." << llendl; gFocusMgr.removeMouseCaptureWithoutCallback( this ); } - if( gFocusMgr.getTopView() == this ) - { - llwarns << "View holding top view deleted: " << getName() << ". Top view removed." << llendl; - gFocusMgr.removeTopViewWithoutCallback( this ); - } - sViewHandleMap.erase(mViewHandle); deleteAllChildren(); @@ -752,9 +747,9 @@ void LLView::setEnabled(BOOL enabled) // virtual void LLView::setVisible(BOOL visible) { - if( !visible && (gFocusMgr.getTopView() == this) ) + if( !visible && (gFocusMgr.getTopCtrl() == this) ) { - gFocusMgr.setTopView( NULL, NULL ); + gFocusMgr.setTopCtrl( NULL ); } if ( mVisible != visible ) @@ -1053,7 +1048,14 @@ LLView* LLView::childrenHandleDragAndDrop(S32 x, S32 y, MASK mask, return handled_view; } +void LLView::onMouseCaptureLost() +{ +} +BOOL LLView::hasMouseCapture() +{ + return gFocusMgr.getMouseCapture() == this; +} BOOL LLView::handleMouseUp(S32 x, S32 y, MASK mask) { @@ -1610,6 +1612,13 @@ const LLRect LLView::getLocalRect() const return local_rect; } +const LLRect LLView::getLocalSnapRect() const +{ + LLRect local_snap_rect = getSnapRect(); + local_snap_rect.translate(-mRect.mLeft, -mRect.mBottom); + return local_snap_rect; +} + void LLView::updateRect() { if (mSpanChildren && mChildList.size()) @@ -2106,6 +2115,12 @@ const LLCtrlQuery & LLView::getFocusRootsQuery() } +void LLView::userSetShape(const LLRect& new_rect) +{ + reshape(new_rect.getWidth(), new_rect.getHeight()); + translate(new_rect.mLeft - mRect.mLeft, new_rect.mBottom - mRect.mBottom); +} + LLView* LLView::findSnapRect(LLRect& new_rect, const LLCoordGL& mouse_dir, LLView::ESnapType snap_type, S32 threshold, S32 padding) { @@ -2127,8 +2142,7 @@ LLView* LLView::findSnapRect(LLRect& new_rect, const LLCoordGL& mouse_dir, BOOL snapped_x = FALSE; BOOL snapped_y = FALSE; - LLRect parent_local_snap_rect = mParentView->getSnapRect(); - parent_local_snap_rect.translate(-mParentView->getRect().mLeft, -mParentView->getRect().mBottom); + LLRect parent_local_snap_rect = mParentView->getLocalSnapRect(); if (snap_type == SNAP_PARENT || snap_type == SNAP_PARENT_AND_SIBLINGS) { @@ -2303,8 +2317,7 @@ LLView* LLView::findSnapEdge(S32& new_edge_val, const LLCoordGL& mouse_dir, ESna BOOL snapped_x = FALSE; BOOL snapped_y = FALSE; - LLRect parent_local_snap_rect = mParentView->getSnapRect(); - parent_local_snap_rect.translate(-mParentView->getRect().mLeft, -mParentView->getRect().mBottom); + LLRect parent_local_snap_rect = mParentView->getLocalSnapRect(); if (snap_type == SNAP_PARENT || snap_type == SNAP_PARENT_AND_SIBLINGS) { diff --git a/linden/indra/llui/llview.h b/linden/indra/llui/llview.h index 3885789..cb9a35c 100644 --- a/linden/indra/llui/llview.h +++ b/linden/indra/llui/llview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -313,6 +314,7 @@ public: const LLRect getScreenRect() const; const LLRect getLocalRect() const; virtual const LLRect getSnapRect() const { return mRect; } + virtual const LLRect getLocalSnapRect() const; virtual LLRect getRequiredRect(); // Get required size for this object. 0 for width/height means don't care. virtual void updateRect(); // apply procedural updates to own rectangle @@ -334,12 +336,13 @@ public: // Default behavior is to use reshape flags to resize child views virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); - virtual void translate( S32 x, S32 y ); virtual void setOrigin( S32 x, S32 y ) { mRect.translate( x - mRect.mLeft, y - mRect.mBottom ); } BOOL translateIntoRect( const LLRect& constraint, BOOL allow_partial_outside ); - LLView* findSnapRect(LLRect& new_rect, const LLCoordGL& mouse_dir, LLView::ESnapType snap_type, S32 threshold, S32 padding = 0); - LLView* findSnapEdge(S32& new_edge_val, const LLCoordGL& mouse_dir, ESnapEdge snap_edge, ESnapType snap_type, S32 threshold, S32 padding = 0); + + virtual void userSetShape(const LLRect& new_rect); + virtual LLView* findSnapRect(LLRect& new_rect, const LLCoordGL& mouse_dir, LLView::ESnapType snap_type, S32 threshold, S32 padding = 0); + virtual LLView* findSnapEdge(S32& new_edge_val, const LLCoordGL& mouse_dir, ESnapEdge snap_edge, ESnapType snap_type, S32 threshold, S32 padding = 0); // Defaults to other_view->getVisible() virtual BOOL canSnapTo(LLView* other_view); @@ -364,6 +367,8 @@ public: /*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); /*virtual*/ BOOL handleRightMouseUp(S32 x, S32 y, MASK mask); + /*virtual*/ void onMouseCaptureLost(); + /*virtual*/ BOOL hasMouseCapture(); // Default behavior is to pass the tooltip event to children, // then display mToolTipMsg if no child handled it. diff --git a/linden/indra/llui/llviewborder.cpp b/linden/indra/llui/llviewborder.cpp index c26a818..4c2b602 100644 --- a/linden/indra/llui/llviewborder.cpp +++ b/linden/indra/llui/llviewborder.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llviewborder.h b/linden/indra/llui/llviewborder.h index 2795a71..7e5de4b 100644 --- a/linden/indra/llui/llviewborder.h +++ b/linden/indra/llui/llviewborder.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llviewquery.cpp b/linden/indra/llui/llviewquery.cpp index 89b2192..3f9ccf4 100644 --- a/linden/indra/llui/llviewquery.cpp +++ b/linden/indra/llui/llviewquery.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llui/llviewquery.h b/linden/indra/llui/llviewquery.h index 7ab401a..a35726a 100644 --- a/linden/indra/llui/llviewquery.h +++ b/linden/indra/llui/llviewquery.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llvfs/lldir.cpp b/linden/indra/llvfs/lldir.cpp index 6d0e956..d71224a 100644 --- a/linden/indra/llvfs/lldir.cpp +++ b/linden/indra/llvfs/lldir.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llvfs/lldir.h b/linden/indra/llvfs/lldir.h index 60188f3..86d4e15 100644 --- a/linden/indra/llvfs/lldir.h +++ b/linden/indra/llvfs/lldir.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llvfs/lldir_linux.cpp b/linden/indra/llvfs/lldir_linux.cpp index f46ccf2..e3aada6 100644 --- a/linden/indra/llvfs/lldir_linux.cpp +++ b/linden/indra/llvfs/lldir_linux.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -90,7 +91,7 @@ LLDir_Linux::LLDir_Linux() // *NOTE: /proc/%d/exe doesn't work on FreeBSD. But that's ok, // because this is the linux implementation. - snprintf (path, sizeof(path), "/proc/%d/exe", (int) getpid ()); /* Flawfinder: ignore */ + snprintf (path, sizeof(path), "/proc/%d/exe", (int) getpid ()); int rc = readlink (path, tmp_str, sizeof (tmp_str)-1); /* Flawfinder: ignore */ if ( (rc != -1) && (rc <= ((int) sizeof (tmp_str)-1)) ) { diff --git a/linden/indra/llvfs/lldir_linux.h b/linden/indra/llvfs/lldir_linux.h index 488fda0..dd56239 100644 --- a/linden/indra/llvfs/lldir_linux.h +++ b/linden/indra/llvfs/lldir_linux.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llvfs/lldir_mac.cpp b/linden/indra/llvfs/lldir_mac.cpp index 7ed7697..d257ce0 100644 --- a/linden/indra/llvfs/lldir_mac.cpp +++ b/linden/indra/llvfs/lldir_mac.cpp @@ -1,9 +1,10 @@ /** * @file lldir_mac.cpp - * @brief Implementation of directory utilities for linux + * @brief Implementation of directory utilities for Mac OS X * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llvfs/lldir_mac.h b/linden/indra/llvfs/lldir_mac.h index 83c22b3..925691e 100644 --- a/linden/indra/llvfs/lldir_mac.h +++ b/linden/indra/llvfs/lldir_mac.h @@ -1,9 +1,10 @@ /** * @file lldir_mac.h - * @brief Definition of directory utilities class for Mac OS X + * @brief Definition of directory utilities class for Mac OS X * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llvfs/lldir_win32.cpp b/linden/indra/llvfs/lldir_win32.cpp index fd264a7..9411c71 100644 --- a/linden/indra/llvfs/lldir_win32.cpp +++ b/linden/indra/llvfs/lldir_win32.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llvfs/lldir_win32.h b/linden/indra/llvfs/lldir_win32.h index 40eac36..0eacc5e 100644 --- a/linden/indra/llvfs/lldir_win32.h +++ b/linden/indra/llvfs/lldir_win32.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llvfs/lllfsthread.cpp b/linden/indra/llvfs/lllfsthread.cpp index 25edb52..fdfb0ce 100644 --- a/linden/indra/llvfs/lllfsthread.cpp +++ b/linden/indra/llvfs/lllfsthread.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llvfs/lllfsthread.h b/linden/indra/llvfs/lllfsthread.h index 06c53aa..48c5a5c 100644 --- a/linden/indra/llvfs/lllfsthread.h +++ b/linden/indra/llvfs/lllfsthread.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llvfs/llvfile.cpp b/linden/indra/llvfs/llvfile.cpp index e958b33..f3db189 100644 --- a/linden/indra/llvfs/llvfile.cpp +++ b/linden/indra/llvfs/llvfile.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llvfs/llvfile.h b/linden/indra/llvfs/llvfile.h index c574cbc..0c4950b 100644 --- a/linden/indra/llvfs/llvfile.h +++ b/linden/indra/llvfs/llvfile.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llvfs/llvfs.cpp b/linden/indra/llvfs/llvfs.cpp index 88476eb..a41aa78 100644 --- a/linden/indra/llvfs/llvfs.cpp +++ b/linden/indra/llvfs/llvfs.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llvfs/llvfs.h b/linden/indra/llvfs/llvfs.h index 4598c07..2c1b8de 100644 --- a/linden/indra/llvfs/llvfs.h +++ b/linden/indra/llvfs/llvfs.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llvfs/llvfsthread.cpp b/linden/indra/llvfs/llvfsthread.cpp index 9226230..d93b312 100644 --- a/linden/indra/llvfs/llvfsthread.cpp +++ b/linden/indra/llvfs/llvfsthread.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llvfs/llvfsthread.h b/linden/indra/llvfs/llvfsthread.h index 3c90808..76ce5ee 100644 --- a/linden/indra/llvfs/llvfsthread.h +++ b/linden/indra/llvfs/llvfsthread.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/lldxhardware.cpp b/linden/indra/llwindow/lldxhardware.cpp index b2e1b04..82d80ec 100644 --- a/linden/indra/llwindow/lldxhardware.cpp +++ b/linden/indra/llwindow/lldxhardware.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/lldxhardware.h b/linden/indra/llwindow/lldxhardware.h index 5d8b925..0574880 100644 --- a/linden/indra/llwindow/lldxhardware.h +++ b/linden/indra/llwindow/lldxhardware.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llgl.cpp b/linden/indra/llwindow/llgl.cpp index aabe9da..07348b7 100644 --- a/linden/indra/llwindow/llgl.cpp +++ b/linden/indra/llwindow/llgl.cpp @@ -1,9 +1,10 @@ /** * @file llgl.cpp -* @brief LLGL implementation + * @brief LLGL implementation * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -44,8 +45,6 @@ #include "llglheaders.h" -#define LL_DEBUG_GL 1 - #if LL_LINUX && !LL_MESA_HEADLESS // The __APPLE__ hack is to make glh_extensions.h not symbol-clash horribly # define __APPLE__ @@ -123,6 +122,25 @@ PFNGLGETQUERYOBJECTUIVARBPROC glGetQueryObjectuivARB = NULL; PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB = NULL; PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB = NULL; +// GL_EXT_framebuffer_object +PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT = NULL; +PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT = NULL; +PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT = NULL; +PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT = NULL; +PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT = NULL; +PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT = NULL; +PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT = NULL; +PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT = NULL; +PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT = NULL; +PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT = NULL; +PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT = NULL; +PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT = NULL; +PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT = NULL; +PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT = NULL; + //shader object prototypes PFNGLDELETEOBJECTARBPROC glDeleteObjectARB = NULL; PFNGLGETHANDLEARBPROC glGetHandleARB = NULL; @@ -253,17 +271,10 @@ LLGLManager::LLGLManager() mIsDisabled = FALSE; mHasCubeMap = FALSE; mHasMultitexture = FALSE; - mHasAnyAGP = FALSE; mHasMipMapGeneration = FALSE; mHasAnisotropic = FALSE; mHasCompressedTextures = FALSE; - mHasNVVertexArrayRange = FALSE; - mHasNVFence = FALSE; mHasARBEnvCombine = FALSE; - mHasATIVAO = FALSE; - mIsRadeon8500 = FALSE; - mIsRadeon9700 = FALSE; - mIsMobilityRadeon9000 = FALSE; mIsGF2or4MX = FALSE; mIsGF3 = FALSE; mIsGFFX = FALSE; @@ -377,31 +388,8 @@ bool LLGLManager::initGL() mobile = TRUE; } mIsATI = TRUE; - if ( mGLRenderer.find("9500") != LLString::npos - || mGLRenderer.find("9600") != LLString::npos - || mGLRenderer.find("9700") != LLString::npos - || mGLRenderer.find("9800") != LLString::npos ) - { - mIsRadeon9700 = TRUE; - } - else if (mGLRenderer.find("8500") != LLString::npos - || mGLRenderer.find( "9000") != LLString::npos - || mGLRenderer.find("9100") != LLString::npos - || mGLRenderer.find("9200") != LLString::npos) - { - mIsRadeon8500 = TRUE; - if (mobile && mGLRenderer.find("9000") != LLString::npos) - { - mIsMobilityRadeon9000 = TRUE; - } - } #if LL_WINDOWS && !LL_MESA_HEADLESS - if (mIsRadeon9700 && mDriverVersionRelease < 3833) - { - return false; // Unsupported hardware - } - if (mDriverVersionRelease < 3842) { mATIOffsetVerticalLines = TRUE; @@ -532,14 +520,16 @@ void LLGLManager::initExtensions() # else mHasVertexBufferObject = FALSE; # endif +# if GL_EXT_framebuffer_object + mHasFramebufferObject = TRUE; +# else + mHasFramebufferObject = FALSE; +# endif mHasMipMapGeneration = FALSE; mHasPalettedTextures = FALSE; - mHasNVVertexArrayRange = FALSE; - mHasNVFence = FALSE; mHasSeparateSpecularColor = FALSE; mHasAnisotropic = FALSE; mHasCubeMap = FALSE; - mHasATIVAO = FALSE; mHasOcclusionQuery = FALSE; mHasPointParameters = FALSE; mHasShaderObjects = FALSE; @@ -549,17 +539,15 @@ void LLGLManager::initExtensions() mHasMultitexture = glh_init_extensions("GL_ARB_multitexture"); mHasMipMapGeneration = glh_init_extensions("GL_SGIS_generate_mipmap"); mHasPalettedTextures = glh_init_extension("GL_EXT_paletted_texture"); - mHasNVVertexArrayRange = glh_init_extensions("GL_NV_vertex_array_range"); - mHasNVFence = glh_init_extensions("GL_NV_fence"); mHasSeparateSpecularColor = glh_init_extensions("GL_EXT_separate_specular_color"); mHasAnisotropic = glh_init_extensions("GL_EXT_texture_filter_anisotropic"); glh_init_extensions("GL_ARB_texture_cube_map"); mHasCubeMap = ExtensionExists("GL_ARB_texture_cube_map", gGLHExts.mSysExts); mHasARBEnvCombine = ExtensionExists("GL_ARB_texture_env_combine", gGLHExts.mSysExts); mHasCompressedTextures = glh_init_extensions("GL_ARB_texture_compression"); - mHasATIVAO = ExtensionExists("GL_ATI_vertex_array_object", gGLHExts.mSysExts); mHasOcclusionQuery = ExtensionExists("GL_ARB_occlusion_query", gGLHExts.mSysExts); mHasVertexBufferObject = ExtensionExists("GL_ARB_vertex_buffer_object", gGLHExts.mSysExts); + mHasFramebufferObject = ExtensionExists("GL_EXT_framebuffer_object", gGLHExts.mSysExts); #if !LL_DARWIN mHasPointParameters = !mIsATI && ExtensionExists("GL_ARB_point_parameters", gGLHExts.mSysExts); #endif @@ -578,14 +566,12 @@ void LLGLManager::initExtensions() mHasARBEnvCombine = FALSE; mHasCompressedTextures = FALSE; mHasVertexBufferObject = FALSE; + mHasFramebufferObject = FALSE; mHasMipMapGeneration = FALSE; mHasPalettedTextures = FALSE; - mHasNVVertexArrayRange = FALSE; - mHasNVFence = FALSE; mHasSeparateSpecularColor = FALSE; mHasAnisotropic = FALSE; mHasCubeMap = FALSE; - mHasATIVAO = FALSE; mHasOcclusionQuery = FALSE; mHasPointParameters = FALSE; mHasShaderObjects = FALSE; @@ -602,11 +588,8 @@ void LLGLManager::initExtensions() // proper blacklist/whitelist on Linux. mHasMipMapGeneration = FALSE; mHasPalettedTextures = FALSE; - mHasNVVertexArrayRange = FALSE; - mHasNVFence = FALSE; mHasAnisotropic = FALSE; mHasCubeMap = FALSE; // apparently fatal on Intel 915 & similar - mHasATIVAO = FALSE; mHasOcclusionQuery = FALSE; // source of many ATI system hangs mHasShaderObjects = FALSE; mHasVertexShader = FALSE; @@ -626,17 +609,18 @@ void LLGLManager::initExtensions() if (strchr(blacklist,'c')) mHasVertexBufferObject = FALSE; if (strchr(blacklist,'d')) mHasMipMapGeneration = FALSE;//S if (strchr(blacklist,'e')) mHasPalettedTextures = FALSE;//S - if (strchr(blacklist,'f')) mHasNVVertexArrayRange = FALSE;//S - if (strchr(blacklist,'g')) mHasNVFence = FALSE;//S +// if (strchr(blacklist,'f')) mHasNVVertexArrayRange = FALSE;//S +// if (strchr(blacklist,'g')) mHasNVFence = FALSE;//S if (strchr(blacklist,'h')) mHasSeparateSpecularColor = FALSE; if (strchr(blacklist,'i')) mHasAnisotropic = FALSE;//S if (strchr(blacklist,'j')) mHasCubeMap = FALSE;//S - if (strchr(blacklist,'k')) mHasATIVAO = FALSE;//S +// if (strchr(blacklist,'k')) mHasATIVAO = FALSE;//S if (strchr(blacklist,'l')) mHasOcclusionQuery = FALSE; if (strchr(blacklist,'m')) mHasShaderObjects = FALSE;//S if (strchr(blacklist,'n')) mHasVertexShader = FALSE;//S if (strchr(blacklist,'o')) mHasFragmentShader = FALSE;//S if (strchr(blacklist,'p')) mHasPointParameters = FALSE;//S + if (strchr(blacklist,'q')) mHasFramebufferObject = FALSE;//S } #endif // LL_LINUX @@ -663,14 +647,6 @@ void LLGLManager::initExtensions() { llinfos << "Couldn't initialize GL_EXT_paletted_texture" << llendl; } - if (!mHasNVVertexArrayRange) - { - llinfos << "Couldn't initialize GL_NV_vertex_array_range" << llendl; - } - if (!mHasNVFence) - { - llinfos << "Couldn't initialize GL_NV_fence" << llendl; - } if (!mHasSeparateSpecularColor) { llinfos << "Couldn't initialize separate specular color" << llendl; @@ -717,10 +693,6 @@ void LLGLManager::initExtensions() } // Misc - if (mHasNVFence || mHasATIVAO) - { - mHasAnyAGP = TRUE; - } glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange); glGetIntegerv(GL_MAX_ELEMENTS_INDICES, (GLint*) &mGLMaxIndexRange); @@ -744,10 +716,6 @@ void LLGLManager::initExtensions() llinfos << "Has GL_APPLE_vertex_array_object!" << llendl; } - if(mHasAPPLEFence) - { - mHasAnyAGP = TRUE; - } #endif // LL_DARWIN #if (LL_WINDOWS || LL_LINUX) && !LL_MESA_HEADLESS @@ -773,23 +741,25 @@ void LLGLManager::initExtensions() mHasVertexBufferObject = FALSE; } } - if (mHasATIVAO) - { - // Initialize the extension. - llinfos << "Has ATI_vertex_array_object!" << llendl; - glNewObjectBufferATI = (PFNGLNEWOBJECTBUFFERATIPROC)GLH_EXT_GET_PROC_ADDRESS("glNewObjectBufferATI"); - glIsObjectBufferATI = (PFNGLISOBJECTBUFFERATIPROC)GLH_EXT_GET_PROC_ADDRESS("glIsObjectBufferATI"); - glUpdateObjectBufferATI = (PFNGLUPDATEOBJECTBUFFERATIPROC)GLH_EXT_GET_PROC_ADDRESS("glUpdateObjectBufferATI"); - glGetObjectBufferfvATI = (PFNGLGETOBJECTBUFFERFVATIPROC)GLH_EXT_GET_PROC_ADDRESS("glGetObjectBufferfvATI"); - glGetObjectBufferivATI = (PFNGLGETOBJECTBUFFERIVATIPROC)GLH_EXT_GET_PROC_ADDRESS("glGetObjectBufferivATI"); - glFreeObjectBufferATI = (PFNGLFREEOBJECTBUFFERATIPROC)GLH_EXT_GET_PROC_ADDRESS("glFreeObjectBufferATI"); - glArrayObjectATI = (PFNGLARRAYOBJECTATIPROC)GLH_EXT_GET_PROC_ADDRESS("glArrayObjectATI"); - glVertexAttribArrayObjectATI = (PFNGLVERTEXATTRIBARRAYOBJECTATIPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribArrayObjectATI"); - glGetArrayObjectfvATI = (PFNGLGETARRAYOBJECTFVATIPROC)GLH_EXT_GET_PROC_ADDRESS("glGetArrayObjectfvATI"); - glGetArrayObjectivATI = (PFNGLGETARRAYOBJECTIVATIPROC)GLH_EXT_GET_PROC_ADDRESS("glGetArrayObjectivATI"); - glVariantObjectArrayATI = (PFNGLVARIANTARRAYOBJECTATIPROC)GLH_EXT_GET_PROC_ADDRESS("glVariantObjectArrayATI"); - glGetVariantArrayObjectfvATI = (PFNGLGETVARIANTARRAYOBJECTFVATIPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVariantArrayObjectfvATI"); - glGetVariantArrayObjectivATI = (PFNGLGETVARIANTARRAYOBJECTIVATIPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVariantArrayObjectivATI"); + if (mHasFramebufferObject) + { + glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glIsRenderbufferEXT"); + glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBindRenderbufferEXT"); + glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteRenderbuffersEXT"); + glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGenRenderbuffersEXT"); + glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glRenderbufferStorageEXT"); + glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGetRenderbufferParameterivEXT"); + glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glIsFramebufferEXT"); + glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBindFramebufferEXT"); + glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteFramebuffersEXT"); + glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGenFramebuffersEXT"); + glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glCheckFramebufferStatusEXT"); + glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture1DEXT"); + glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture2DEXT"); + glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture3DEXT"); + glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferRenderbufferEXT"); + glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGetFramebufferAttachmentParameterivEXT"); + glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGenerateMipmapEXT"); } #if !LL_LINUX // This is expected to be a static symbol on Linux GL implementations @@ -1005,6 +975,20 @@ void LLGLState::restoreGL() initClass(); } +//static +// Really shouldn't be needed, but seems we sometimes do. +void LLGLState::resetTextureStates() +{ + GLint maxTextureUnits; + glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &maxTextureUnits); + for (S32 j = maxTextureUnits-1; j >=0; j--) + { + glActiveTextureARB(GL_TEXTURE0_ARB+j); + glClientActiveTextureARB(GL_TEXTURE0_ARB+j); + j == 0 ? glEnable(GL_TEXTURE_2D) : glDisable(GL_TEXTURE_2D); + } +} + void LLGLState::dumpStates() { llinfos << "GL States:" << llendl; diff --git a/linden/indra/llwindow/llgl.h b/linden/indra/llwindow/llgl.h index 34bf400..c83ccb8 100644 --- a/linden/indra/llwindow/llgl.h +++ b/linden/indra/llwindow/llgl.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -40,6 +41,8 @@ #include "v4math.h" #include "llgltypes.h" +#define LL_DEBUG_GL 1 + #define LL_GL_ERRS llerrs // Manage GL extensions... @@ -62,10 +65,10 @@ public: BOOL mHasMultitexture; S32 mNumTextureUnits; BOOL mHasMipMapGeneration; - BOOL mHasAnyAGP; BOOL mHasPalettedTextures; BOOL mHasCompressedTextures; - + BOOL mHasFramebufferObject; + // ARB Extensions BOOL mHasVertexBufferObject; BOOL mHasPBuffer; @@ -75,25 +78,19 @@ public: BOOL mHasOcclusionQuery; BOOL mHasPointParameters; - // nVidia extensions. + // Other extensions. BOOL mHasAnisotropic; - BOOL mHasNVVertexArrayRange; - BOOL mHasNVFence; BOOL mHasARBEnvCombine; + BOOL mHasCubeMap; - // ATI extensions. - BOOL mHasATIVAO; - BOOL mIsRadeon8500; // Radeon 8500/9000 - BOOL mIsRadeon9700; - BOOL mIsMobilityRadeon9000; + // Vender specific extensions + BOOL mIsATI; + BOOL mIsNVIDIA; + BOOL mIsIntel; BOOL mIsGF2or4MX; BOOL mIsGF3; BOOL mIsGFFX; - BOOL mIsATI; BOOL mATIOffsetVerticalLines; - BOOL mIsNVIDIA; - BOOL mIsIntel; - BOOL mHasCubeMap; #if LL_WINDOWS BOOL mHasWGLARBPixelFormat; @@ -220,6 +217,7 @@ public: static void initClass(); static void restoreGL(); + static void resetTextureStates(); static void dumpStates(); static void checkStates(); static void checkTextureChannels(); diff --git a/linden/indra/llwindow/llglheaders.h b/linden/indra/llwindow/llglheaders.h index 7c4d8fd..1d815ee 100644 --- a/linden/indra/llwindow/llglheaders.h +++ b/linden/indra/llwindow/llglheaders.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -137,7 +138,7 @@ extern PFNGLGETUNIFORMFVARBPROC glGetUniformfvARB; extern PFNGLGETUNIFORMIVARBPROC glGetUniformivARB; extern PFNGLGETSHADERSOURCEARBPROC glGetShaderSourceARB; -// GL_ARB;_vertex_shader +// GL_ARB_vertex_shader extern PFNGLVERTEXATTRIB1DARBPROC glVertexAttrib1dARB; extern PFNGLVERTEXATTRIB1DVARBPROC glVertexAttrib1dvARB; extern PFNGLVERTEXATTRIB1FARBPROC glVertexAttrib1fARB; @@ -209,6 +210,26 @@ extern PFNGLGETCOMPRESSEDTEXIMAGEARBPROC glGetCompressedTexImageARB; extern PFNGLCOLORTABLEEXTPROC glColorTableEXT; +//GL_EXT_framebuffer_object +extern PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT; +extern PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT; +extern PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT; +extern PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT; +extern PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT; +extern PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT; +extern PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT; +extern PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT; +extern PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT; +extern PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT; +extern PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT; +extern PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT; +extern PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT; +extern PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT; +extern PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT; +extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT; +extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT; + + #elif LL_WINDOWS //---------------------------------------------------------------------------- #include @@ -304,7 +325,7 @@ extern PFNGLGETUNIFORMFVARBPROC glGetUniformfvARB; extern PFNGLGETUNIFORMIVARBPROC glGetUniformivARB; extern PFNGLGETSHADERSOURCEARBPROC glGetShaderSourceARB; -// GL_ARB;_vertex_shader +// GL_ARB_vertex_shader extern PFNGLVERTEXATTRIB1DARBPROC glVertexAttrib1dARB; extern PFNGLVERTEXATTRIB1DVARBPROC glVertexAttrib1dvARB; extern PFNGLVERTEXATTRIB1FARBPROC glVertexAttrib1fARB; @@ -371,6 +392,25 @@ extern PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB; extern PFNGLGETACTIVEATTRIBARBPROC glGetActiveAttribARB; extern PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB; +//GL_EXT_framebuffer_object +extern PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT; +extern PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT; +extern PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT; +extern PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT; +extern PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT; +extern PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT; +extern PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT; +extern PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT; +extern PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT; +extern PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT; +extern PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT; +extern PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT; +extern PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT; +extern PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT; +extern PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT; +extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT; +extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT; + #elif LL_DARWIN //---------------------------------------------------------------------------- @@ -384,6 +424,30 @@ extern PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB; #include "GL/glh_extensions.h" +// These symbols don't exist on 10.3.9, so they have to be declared weak. Redeclaring them here fixes the problem. +// Note that they also must not be called on 10.3.9. This should be taken care of by a runtime check for the existence of the GL extension. +#include + +// GL_EXT_framebuffer_object +extern GLboolean glIsRenderbufferEXT(GLuint renderbuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +extern void glBindRenderbufferEXT(GLenum target, GLuint renderbuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +extern void glDeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +extern void glGenRenderbuffersEXT(GLsizei n, GLuint *renderbuffers) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +extern void glRenderbufferStorageEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +extern void glGetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint *params) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +extern GLboolean glIsFramebufferEXT(GLuint framebuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +extern void glBindFramebufferEXT(GLenum target, GLuint framebuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +extern void glDeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +extern void glGenFramebuffersEXT(GLsizei n, GLuint *framebuffers) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +extern GLenum glCheckFramebufferStatusEXT(GLenum target) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +extern void glFramebufferTexture1DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +extern void glFramebufferTexture2DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +extern void glFramebufferTexture3DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +extern void glFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +extern void glGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint *params) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +extern void glGenerateMipmapEXT(GLenum target) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; + + #ifdef __cplusplus extern "C" { #endif diff --git a/linden/indra/llwindow/llglstates.h b/linden/indra/llwindow/llglstates.h index 8e67e33..887d099 100644 --- a/linden/indra/llwindow/llglstates.h +++ b/linden/indra/llwindow/llglstates.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llglstubs.h b/linden/indra/llwindow/llglstubs.h index d7f0d94..1d70400 100644 --- a/linden/indra/llwindow/llglstubs.h +++ b/linden/indra/llwindow/llglstubs.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llgltypes.h b/linden/indra/llwindow/llgltypes.h index fffa979..d130a42 100644 --- a/linden/indra/llwindow/llgltypes.h +++ b/linden/indra/llwindow/llgltypes.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llkeyboard.cpp b/linden/indra/llwindow/llkeyboard.cpp index 0da1644..213fe85 100644 --- a/linden/indra/llwindow/llkeyboard.cpp +++ b/linden/indra/llwindow/llkeyboard.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llkeyboard.h b/linden/indra/llwindow/llkeyboard.h index e262ab6..61ae2ea 100644 --- a/linden/indra/llwindow/llkeyboard.h +++ b/linden/indra/llwindow/llkeyboard.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llkeyboardmacosx.cpp b/linden/indra/llwindow/llkeyboardmacosx.cpp index 961bb66..6d06d53 100644 --- a/linden/indra/llwindow/llkeyboardmacosx.cpp +++ b/linden/indra/llwindow/llkeyboardmacosx.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llkeyboardmacosx.h b/linden/indra/llwindow/llkeyboardmacosx.h index a4d9115..899b011 100644 --- a/linden/indra/llwindow/llkeyboardmacosx.h +++ b/linden/indra/llwindow/llkeyboardmacosx.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llkeyboardsdl.cpp b/linden/indra/llwindow/llkeyboardsdl.cpp index 07db986..027f6a4 100644 --- a/linden/indra/llwindow/llkeyboardsdl.cpp +++ b/linden/indra/llwindow/llkeyboardsdl.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llkeyboardsdl.h b/linden/indra/llwindow/llkeyboardsdl.h index b582e21..7546496 100644 --- a/linden/indra/llwindow/llkeyboardsdl.h +++ b/linden/indra/llwindow/llkeyboardsdl.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llkeyboardwin32.cpp b/linden/indra/llwindow/llkeyboardwin32.cpp index 33664b9..f9db941 100644 --- a/linden/indra/llwindow/llkeyboardwin32.cpp +++ b/linden/indra/llwindow/llkeyboardwin32.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llkeyboardwin32.h b/linden/indra/llwindow/llkeyboardwin32.h index 1501e8f..33233c9 100644 --- a/linden/indra/llwindow/llkeyboardwin32.h +++ b/linden/indra/llwindow/llkeyboardwin32.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llmousehandler.h b/linden/indra/llwindow/llmousehandler.h index 4e9b882..3091920 100644 --- a/linden/indra/llwindow/llmousehandler.h +++ b/linden/indra/llwindow/llmousehandler.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -34,8 +35,6 @@ // Intended for use via multiple inheritance. // A class may have as many interfaces as it likes, but never needs to inherit one more than once. -#include "llstring.h" - class LLMouseHandler { public: @@ -52,11 +51,15 @@ public: virtual BOOL handleToolTip(S32 x, S32 y, LLString& msg, LLRect* sticky_rect_screen) = 0; virtual const LLString& getName() const = 0; + virtual void onMouseCaptureLost() = 0; + // Hack to support LLFocusMgr virtual BOOL isView() = 0; virtual void screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const = 0; virtual void localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const = 0; + + virtual BOOL hasMouseCapture() = 0; }; #endif diff --git a/linden/indra/llwindow/llwindow.cpp b/linden/indra/llwindow/llwindow.cpp index 20fc84e..134e606 100644 --- a/linden/indra/llwindow/llwindow.cpp +++ b/linden/indra/llwindow/llwindow.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -232,6 +233,15 @@ LLWindow::LLWindow(BOOL fullscreen, U32 flags) mHideCursorPermanent(FALSE), mFlags(flags) { + for (U32 i = 0; i < 6; i++) + { + mJoyAxis[i] = 0; + } + + for (U32 i = 0; i < 16; i++) + { + mJoyButtonState[i] = 0; + } } // virtual @@ -249,6 +259,24 @@ void LLWindow::decBusyCount() } } +F32 LLWindow::getJoystickAxis(U32 axis) +{ + if (axis < 6) + { + return mJoyAxis[axis]; + } + return 0.f; +} + +U8 LLWindow::getJoystickButton(U32 button) +{ + if (button < 16) + { + return mJoyButtonState[button]; + } + return 0; +} + void LLWindow::setCallbacks(LLWindowCallbacks *callbacks) { mCallbacks = callbacks; diff --git a/linden/indra/llwindow/llwindow.h b/linden/indra/llwindow/llwindow.h index f4bb147..a52aff6 100644 --- a/linden/indra/llwindow/llwindow.h +++ b/linden/indra/llwindow/llwindow.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -200,6 +201,9 @@ public: virtual F32 getNativeAspectRatio() = 0; virtual F32 getPixelAspectRatio() = 0; virtual void setNativeAspectRatio(F32 aspect) = 0; + + F32 getJoystickAxis(U32 axis); + U8 getJoystickButton(U32 button); void setCallbacks(LLWindowCallbacks *callbacks); @@ -238,7 +242,9 @@ protected: ESwapMethod mSwapMethod; BOOL mHideCursorPermanent; U32 mFlags; - + F32 mJoyAxis[6]; + U8 mJoyButtonState[16]; + friend class LLWindowManager; }; diff --git a/linden/indra/llwindow/llwindowheadless.cpp b/linden/indra/llwindow/llwindowheadless.cpp index 821632d..62306f1 100644 --- a/linden/indra/llwindow/llwindowheadless.cpp +++ b/linden/indra/llwindow/llwindowheadless.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llwindowheadless.h b/linden/indra/llwindow/llwindowheadless.h index cc7fa06..c474a5a 100644 --- a/linden/indra/llwindow/llwindowheadless.h +++ b/linden/indra/llwindow/llwindowheadless.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llwindowlinux.cpp b/linden/indra/llwindow/llwindowlinux.cpp index e266efc..79f4d48 100644 --- a/linden/indra/llwindow/llwindowlinux.cpp +++ b/linden/indra/llwindow/llwindowlinux.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llwindowlinux.h b/linden/indra/llwindow/llwindowlinux.h index 9550cdd..0465ef4 100644 --- a/linden/indra/llwindow/llwindowlinux.h +++ b/linden/indra/llwindow/llwindowlinux.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llwindowmacosx-objc.h b/linden/indra/llwindow/llwindowmacosx-objc.h index d055729..d17fa61 100644 --- a/linden/indra/llwindow/llwindowmacosx-objc.h +++ b/linden/indra/llwindow/llwindowmacosx-objc.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llwindowmacosx-objc.mm b/linden/indra/llwindow/llwindowmacosx-objc.mm index bde3841..241f821 100644 --- a/linden/indra/llwindow/llwindowmacosx-objc.mm +++ b/linden/indra/llwindow/llwindowmacosx-objc.mm @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llwindowmacosx.cpp b/linden/indra/llwindow/llwindowmacosx.cpp index 7313fd3..b2a1ccf 100644 --- a/linden/indra/llwindow/llwindowmacosx.cpp +++ b/linden/indra/llwindow/llwindowmacosx.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -91,7 +92,7 @@ BOOL check_for_card(const char* RENDERER, const char* bad_card) if (!strnicmp(RENDERER, bad_card, strlen(bad_card))) { char buffer[1024];/* Flawfinder: ignore */ - snprintf(buffer, sizeof(buffer), /* Flawfinder: ignore */ + snprintf(buffer, sizeof(buffer), "Your video card appears to be a %s, which Second Life does not support.\n" "\n" "Second Life requires a video card with 32 Mb of memory or more, as well as\n" @@ -426,7 +427,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits mFullscreenRefresh = -1; char error[256]; /* Flawfinder: ignore */ - snprintf(error, sizeof(error), "Unable to run fullscreen at %d x %d.\nRunning in window.", width, height); /* Flawfinder: ignore */ + snprintf(error, sizeof(error), "Unable to run fullscreen at %d x %d.\nRunning in window.", width, height); OSMessageBox(error, "Error", OSMB_OK); } } diff --git a/linden/indra/llwindow/llwindowmacosx.h b/linden/indra/llwindow/llwindowmacosx.h index 7425077..63d846e 100644 --- a/linden/indra/llwindow/llwindowmacosx.h +++ b/linden/indra/llwindow/llwindowmacosx.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llwindowmesaheadless.cpp b/linden/indra/llwindow/llwindowmesaheadless.cpp index 7e5f4b0..f10d7cd 100644 --- a/linden/indra/llwindow/llwindowmesaheadless.cpp +++ b/linden/indra/llwindow/llwindowmesaheadless.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llwindowmesaheadless.h b/linden/indra/llwindow/llwindowmesaheadless.h index f8599c6..599db72 100644 --- a/linden/indra/llwindow/llwindowmesaheadless.h +++ b/linden/indra/llwindow/llwindowmesaheadless.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llwindowsdl.cpp b/linden/indra/llwindow/llwindowsdl.cpp index 85836af..c375e32 100644 --- a/linden/indra/llwindow/llwindowsdl.cpp +++ b/linden/indra/llwindow/llwindowsdl.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -205,7 +206,7 @@ BOOL check_for_card(const char* RENDERER, const char* bad_card) if (!strncasecmp(RENDERER, bad_card, strlen(bad_card))) { char buffer[1024]; /* Flawfinder: ignore */ - snprintf(buffer, sizeof(buffer), /* Flawfinder: ignore */ + snprintf(buffer, sizeof(buffer), "Your video card appears to be a %s, which Second Life does not support.\n" "\n" "Second Life requires a video card with 32 Mb of memory or more, as well as\n" @@ -314,7 +315,7 @@ static SDL_Surface *Load_BMP_Resource(const char *basename) char path_buffer[PATH_BUFFER_SIZE]; /* Flawfinder: ignore */ // Figure out where our BMP is living on the disk - snprintf(path_buffer, PATH_BUFFER_SIZE-1, "%s%sres-sdl%s%s", /* Flawfinder: ignore */ + snprintf(path_buffer, PATH_BUFFER_SIZE-1, "%s%sres-sdl%s%s", gDirUtilp->getAppRODataDir().c_str(), gDirUtilp->getDirDelimiter().c_str(), gDirUtilp->getDirDelimiter().c_str(), @@ -485,7 +486,7 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B mFullscreenRefresh = -1; char error[256]; /* Flawfinder: ignore */ - snprintf(error, sizeof(error), "Unable to run fullscreen at %d x %d.\nRunning in window.", width, height); /* Flawfinder: ignore */ + snprintf(error, sizeof(error), "Unable to run fullscreen at %d x %d.\nRunning in window.", width, height); OSMessageBox(error, "Error", OSMB_OK); } } @@ -1184,7 +1185,7 @@ x11clipboard_type convert_format(int type) these right now, and support is skeletal. */ char format[sizeof(FORMAT_PREFIX)+8+1]; /* Flawfinder: ignore */ - snprintf(format, sizeof(format), "%s%08lx", FORMAT_PREFIX, (unsigned long)type); /* Flawfinder: ignore */ + snprintf(format, sizeof(format), "%s%08lx", FORMAT_PREFIX, (unsigned long)type); return XInternAtom(gWindowImplementation->mSDL_Display, format, False); } @@ -1871,7 +1872,7 @@ void LLWindowSDL::gatherInput() // the locale to protect it, as exotic/non-C locales // causes our code lots of general critical weirdness // and crashness. (SL-35450) - char *saved_locale = setlocale(LC_ALL, NULL); + std::string saved_locale = setlocale(LC_ALL, NULL); // Do a limited number of pumps so SL doesn't starve! // FIXME - this should ideally be time-limited, not count-limited. @@ -1880,8 +1881,7 @@ void LLWindowSDL::gatherInput() if (gtk_events_pending()) gtk_main_iteration(); - if (saved_locale) - setlocale(LC_ALL, saved_locale); + setlocale(LC_ALL, saved_locale.c_str() ); } #endif // LL_GTK && LL_LIBXUL_ENABLED diff --git a/linden/indra/llwindow/llwindowsdl.h b/linden/indra/llwindow/llwindowsdl.h index ed529a2..2e75239 100644 --- a/linden/indra/llwindow/llwindowsdl.h +++ b/linden/indra/llwindow/llwindowsdl.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/llwindow/llwindowwin32.cpp b/linden/indra/llwindow/llwindowwin32.cpp index 1d084d2..7c3ec01 100644 --- a/linden/indra/llwindow/llwindowwin32.cpp +++ b/linden/indra/llwindow/llwindowwin32.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -763,8 +764,6 @@ LLWindowWin32::LLWindowWin32(char *title, char *name, S32 x, S32 y, S32 width, } SetTimer( mWindowHandle, 0, 1000 / 30, NULL ); // 30 fps timer - mJoyStickState = 0; - mJoyButtonState = 0; } @@ -2815,89 +2814,16 @@ void LLWindowWin32::updateJoystick( ) if( FAILED( hr = g_pJoystick->GetDeviceState( sizeof(DIJOYSTATE), &js ) ) ) return; // The device should have been acquired during the Poll() - if (js.lX <= -500) - { - if (!(mJoyStickState & 0x1)) - { - gKeyboard->handleTranslatedKeyDown(KEY_PAD_LEFT, 0); - mJoyStickState |= 0x1; - } - } - else - { - if (mJoyStickState & 0x1) - { - gKeyboard->handleTranslatedKeyUp(KEY_PAD_LEFT, 0); - mJoyStickState &= ~0x1; - } - } - if (js.lX >= 500) - { - if (!(mJoyStickState & 0x2)) - { - gKeyboard->handleTranslatedKeyDown(KEY_PAD_RIGHT, 0); - mJoyStickState |= 0x2; - } - } - else - { - if (mJoyStickState & 0x2) - { - gKeyboard->handleTranslatedKeyUp(KEY_PAD_RIGHT, 0); - mJoyStickState &= ~0x2; - } - } - if (js.lY <= -500) - { - if (!(mJoyStickState & 0x4)) - { - gKeyboard->handleTranslatedKeyDown(KEY_PAD_UP, 0); - mJoyStickState |= 0x4; - } - } - else - { - if (mJoyStickState & 0x4) - { - gKeyboard->handleTranslatedKeyUp(KEY_PAD_UP, 0); - mJoyStickState &= ~0x4; - } - } - if (js.lY >= 500) - { - if (!(mJoyStickState & 0x8)) - { - gKeyboard->handleTranslatedKeyDown(KEY_PAD_DOWN, 0); - mJoyStickState |= 0x8; - } - } - else - { - if (mJoyStickState & 0x8) - { - gKeyboard->handleTranslatedKeyUp(KEY_PAD_DOWN, 0); - mJoyStickState &= ~0x8; - } - } + mJoyAxis[0] = js.lX/1000.f; + mJoyAxis[1] = js.lY/1000.f; + mJoyAxis[2] = js.lZ/1000.f; + mJoyAxis[3] = js.lRx/1000.f; + mJoyAxis[4] = js.lRy/1000.f; + mJoyAxis[5] = js.lRz/1000.f; - for( int i = 0; i < 15; i++ ) + for (U32 i = 0; i < 16; i++) { - if ( js.rgbButtons[i] & 0x80 ) - { - if (!(mJoyButtonState & (1<handleTranslatedKeyDown(KEY_BUTTON1+i, 0); - mJoyButtonState |= (1<handleTranslatedKeyUp(KEY_BUTTON1+i, 0); - mJoyButtonState &= ~(1<recurse(fp, tabs, tabsize, LSCP_TO_STACK, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); chunk->addByte(LSCRIPTOpCodes[LOPC_JUMPNIF]); @@ -8067,9 +8067,9 @@ void LLScriptIfElse::recurse(FILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass case LSCP_EMIT_BYTE_CODE: { char jumpname1[32]; /*Flawfinder: ignore*/ - snprintf(jumpname1, sizeof(jumpname1), "##Temp Jump %d##", gTempJumpCount++); /*Flawfinder: ignore*/ + snprintf(jumpname1, sizeof(jumpname1), "##Temp Jump %d##", gTempJumpCount++); /* Flawfinder: ignore */ char jumpname2[32]; /*Flawfinder: ignore*/ - snprintf(jumpname2, sizeof(jumpname2), "##Temp Jump %d##", gTempJumpCount++); /*Flawfinder: ignore*/ + snprintf(jumpname2, sizeof(jumpname2), "##Temp Jump %d##", gTempJumpCount++); /* Flawfinder: ignore */ mExpression->recurse(fp, tabs, tabsize, LSCP_TO_STACK, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); chunk->addByte(LSCRIPTOpCodes[LOPC_JUMPNIF]); @@ -8170,9 +8170,9 @@ void LLScriptFor::recurse(FILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pa case LSCP_EMIT_BYTE_CODE: { char jumpname1[32]; /*Flawfinder: ignore*/ - snprintf(jumpname1, sizeof(jumpname1), "##Temp Jump %d##", gTempJumpCount++); /*Flawfinder: ignore*/ + snprintf(jumpname1, sizeof(jumpname1), "##Temp Jump %d##", gTempJumpCount++); /* Flawfinder: ignore */ char jumpname2[32]; /*Flawfinder: ignore*/ - snprintf(jumpname2, sizeof(jumpname2), "##Temp Jump %d##", gTempJumpCount++); /*Flawfinder: ignore*/ + snprintf(jumpname2, sizeof(jumpname2), "##Temp Jump %d##", gTempJumpCount++); /* Flawfinder: ignore */ if(mSequence) mSequence->recurse(fp, tabs, tabsize, LSCP_TO_STACK, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); @@ -8267,7 +8267,7 @@ void LLScriptDoWhile::recurse(FILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePas case LSCP_EMIT_BYTE_CODE: { char jumpname1[32]; /*Flawfinder: ignore*/ - snprintf(jumpname1, sizeof(jumpname1), "##Temp Jump %d##", gTempJumpCount++); /*Flawfinder: ignore*/ + snprintf(jumpname1, sizeof(jumpname1), "##Temp Jump %d##", gTempJumpCount++); /* Flawfinder: ignore */ chunk->addLabel(jumpname1); mStatement->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); @@ -8341,9 +8341,9 @@ void LLScriptWhile::recurse(FILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass case LSCP_EMIT_BYTE_CODE: { char jumpname1[32]; /*Flawfinder: ignore*/ - snprintf(jumpname1, sizeof(jumpname1), "##Temp Jump %d##", gTempJumpCount++); /*Flawfinder: ignore*/ + snprintf(jumpname1, sizeof(jumpname1), "##Temp Jump %d##", gTempJumpCount++); /* Flawfinder: ignore */ char jumpname2[32]; /*Flawfinder: ignore*/ - snprintf(jumpname2, sizeof(jumpname2), "##Temp Jump %d##", gTempJumpCount++); /*Flawfinder: ignore*/ + snprintf(jumpname2, sizeof(jumpname2), "##Temp Jump %d##", gTempJumpCount++); /* Flawfinder: ignore */ chunk->addLabel(jumpname1); mExpression->recurse(fp, tabs, tabsize, LSCP_TO_STACK, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); diff --git a/linden/indra/lscript/lscript_compile/lscript_tree.h b/linden/indra/lscript/lscript_compile/lscript_tree.h index 11be92d..a70db87 100644 --- a/linden/indra/lscript/lscript_compile/lscript_tree.h +++ b/linden/indra/lscript/lscript_compile/lscript_tree.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/lscript/lscript_compile/lscript_typecheck.cpp b/linden/indra/lscript/lscript_compile/lscript_typecheck.cpp index fbef711..9fa7720 100644 --- a/linden/indra/lscript/lscript_compile/lscript_typecheck.cpp +++ b/linden/indra/lscript/lscript_compile/lscript_typecheck.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/lscript/lscript_compile/lscript_typecheck.h b/linden/indra/lscript/lscript_compile/lscript_typecheck.h index 4867a25..c10d11b 100644 --- a/linden/indra/lscript/lscript_compile/lscript_typecheck.h +++ b/linden/indra/lscript/lscript_compile/lscript_typecheck.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/lscript/lscript_execute.h b/linden/indra/lscript/lscript_execute.h index 736095a..82109fd 100644 --- a/linden/indra/lscript/lscript_execute.h +++ b/linden/indra/lscript/lscript_execute.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/lscript/lscript_execute/lscript_execute.cpp b/linden/indra/lscript/lscript_execute/lscript_execute.cpp index b5d395e..cc2c141 100644 --- a/linden/indra/lscript/lscript_execute/lscript_execute.cpp +++ b/linden/indra/lscript/lscript_execute/lscript_execute.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -3015,7 +3016,7 @@ BOOL run_cast(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id) case LST_STRING: { S32 address, source = lscript_pop_int(buffer); - snprintf(caststr, sizeof(caststr), "%d", source); /*Flawfinder: ignore*/ + snprintf(caststr, sizeof(caststr), "%d", source); /* Flawfinder: ignore */ address = lsa_heap_add_data(buffer, new LLScriptLibData(caststr), get_max_heap_size(buffer), TRUE); lscript_push(buffer, address); } @@ -3052,7 +3053,7 @@ BOOL run_cast(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id) { S32 address; F32 source = lscript_pop_float(buffer); - snprintf(caststr, sizeof(caststr), "%f", source); /*Flawfinder: ignore*/ + snprintf(caststr, sizeof(caststr), "%f", source); /* Flawfinder: ignore */ address = lsa_heap_add_data(buffer, new LLScriptLibData(caststr), get_max_heap_size(buffer), TRUE); lscript_push(buffer, address); } @@ -3261,7 +3262,7 @@ BOOL run_cast(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id) S32 address; LLVector3 source; lscript_pop_vector(buffer, source); - snprintf(caststr, sizeof(caststr), "<%5.5f, %5.5f, %5.5f>", source.mV[VX], source.mV[VY], source.mV[VZ]); /*Flawfinder: ignore*/ + snprintf(caststr, sizeof(caststr), "<%5.5f, %5.5f, %5.5f>", source.mV[VX], source.mV[VY], source.mV[VZ]); /* Flawfinder: ignore */ address = lsa_heap_add_data(buffer, new LLScriptLibData(caststr), get_max_heap_size(buffer), TRUE); lscript_push(buffer, address); } @@ -3294,7 +3295,7 @@ BOOL run_cast(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id) S32 address; LLQuaternion source; lscript_pop_quaternion(buffer, source); - snprintf(caststr, sizeof(caststr), "<%5.5f, %5.5f, %5.5f, %5.5f>", source.mQ[VX], source.mQ[VY], source.mQ[VZ], source.mQ[VS]); /*Flawfinder: ignore*/ + snprintf(caststr, sizeof(caststr), "<%5.5f, %5.5f, %5.5f, %5.5f>", source.mQ[VX], source.mQ[VY], source.mQ[VZ], source.mQ[VS]); /* Flawfinder: ignore */ address = lsa_heap_add_data(buffer, new LLScriptLibData(caststr), get_max_heap_size(buffer), TRUE); lscript_push(buffer, address); } @@ -3356,6 +3357,7 @@ BOOL run_cast(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id) BOOL run_stacktos(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id) { + offset++; S32 length = lscript_pop_int(buffer); S32 i; char *arg = new char[length]; diff --git a/linden/indra/lscript/lscript_execute/lscript_heapruntime.cpp b/linden/indra/lscript/lscript_execute/lscript_heapruntime.cpp index 791fa1b..073a736 100644 --- a/linden/indra/lscript/lscript_execute/lscript_heapruntime.cpp +++ b/linden/indra/lscript/lscript_execute/lscript_heapruntime.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/lscript/lscript_execute/lscript_heapruntime.h b/linden/indra/lscript/lscript_execute/lscript_heapruntime.h index 3e65f58..8431ea5 100644 --- a/linden/indra/lscript/lscript_execute/lscript_heapruntime.h +++ b/linden/indra/lscript/lscript_execute/lscript_heapruntime.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/lscript/lscript_execute/lscript_readlso.cpp b/linden/indra/lscript/lscript_execute/lscript_readlso.cpp index ea40892..d750535 100644 --- a/linden/indra/lscript/lscript_execute/lscript_readlso.cpp +++ b/linden/indra/lscript/lscript_execute/lscript_readlso.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/lscript/lscript_execute/lscript_readlso.h b/linden/indra/lscript/lscript_execute/lscript_readlso.h index 7f72dfd..8fa5211 100644 --- a/linden/indra/lscript/lscript_execute/lscript_readlso.h +++ b/linden/indra/lscript/lscript_execute/lscript_readlso.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/lscript/lscript_export.h b/linden/indra/lscript/lscript_export.h index c53948f..d9f7f18 100644 --- a/linden/indra/lscript/lscript_export.h +++ b/linden/indra/lscript/lscript_export.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/lscript/lscript_http.h b/linden/indra/lscript/lscript_http.h index e92148c..c562093 100644 --- a/linden/indra/lscript/lscript_http.h +++ b/linden/indra/lscript/lscript_http.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/lscript/lscript_library.h b/linden/indra/lscript/lscript_library.h index 33fc9d6..8c4a3d0 100644 --- a/linden/indra/lscript/lscript_library.h +++ b/linden/indra/lscript/lscript_library.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -426,11 +427,11 @@ public: } } - LLScriptLibData(LLVector3 &vec) : mType(LST_VECTOR), mInteger(0), mFP(0.f), mKey(NULL), mString(NULL), mVec(vec), mQuat(), mListp(NULL) + LLScriptLibData(const LLVector3 &vec) : mType(LST_VECTOR), mInteger(0), mFP(0.f), mKey(NULL), mString(NULL), mVec(vec), mQuat(), mListp(NULL) { } - LLScriptLibData(LLQuaternion &quat) : mType(LST_QUATERNION), mInteger(0), mFP(0.f), mKey(NULL), mString(NULL), mVec(), mQuat(quat), mListp(NULL) + LLScriptLibData(const LLQuaternion &quat) : mType(LST_QUATERNION), mInteger(0), mFP(0.f), mKey(NULL), mString(NULL), mVec(), mQuat(quat), mListp(NULL) { } diff --git a/linden/indra/lscript/lscript_library/lscript_alloc.cpp b/linden/indra/lscript/lscript_library/lscript_alloc.cpp index b39cd1f..99e6917 100644 --- a/linden/indra/lscript/lscript_library/lscript_alloc.cpp +++ b/linden/indra/lscript/lscript_library/lscript_alloc.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/lscript/lscript_library/lscript_export.cpp b/linden/indra/lscript/lscript_library/lscript_export.cpp index d0a23aa..be95d30 100644 --- a/linden/indra/lscript/lscript_library/lscript_export.cpp +++ b/linden/indra/lscript/lscript_library/lscript_export.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/lscript/lscript_library/lscript_library.cpp b/linden/indra/lscript/lscript_library/lscript_library.cpp index 7263ec3..ec1cc03 100644 --- a/linden/indra/lscript/lscript_library/lscript_library.cpp +++ b/linden/indra/lscript/lscript_library/lscript_library.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -515,7 +516,7 @@ void LLScriptLibData::print(std::ostream &s, BOOL b_prepend_comma) s << mInteger; break; case LST_FLOATINGPOINT: - snprintf(tmp, 1024, "%f", mFP); /*Flawfinder: ignore*/ + snprintf(tmp, 1024, "%f", mFP); /* Flawfinder: ignore */ s << tmp; break; case LST_KEY: diff --git a/linden/indra/lscript/lscript_rt_interface.h b/linden/indra/lscript/lscript_rt_interface.h index c8dceff..f595cbe 100644 --- a/linden/indra/lscript/lscript_rt_interface.h +++ b/linden/indra/lscript/lscript_rt_interface.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/mac_crash_logger/mac_crash_logger.cpp b/linden/indra/mac_crash_logger/mac_crash_logger.cpp index 4af95fe..b1f70e0 100644 --- a/linden/indra/mac_crash_logger/mac_crash_logger.cpp +++ b/linden/indra/mac_crash_logger/mac_crash_logger.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/mac_updater/FSCopyObject.h b/linden/indra/mac_updater/FSCopyObject.h index 6cbbf94..c39b2d9 100644 --- a/linden/indra/mac_updater/FSCopyObject.h +++ b/linden/indra/mac_updater/FSCopyObject.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/mac_updater/GenLinkedList.h b/linden/indra/mac_updater/GenLinkedList.h index b5aa572..23f2165 100644 --- a/linden/indra/mac_updater/GenLinkedList.h +++ b/linden/indra/mac_updater/GenLinkedList.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/mac_updater/MoreFilesX.h b/linden/indra/mac_updater/MoreFilesX.h index ce3be86..6e4718f 100644 --- a/linden/indra/mac_updater/MoreFilesX.h +++ b/linden/indra/mac_updater/MoreFilesX.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/mac_updater/mac_updater.cpp b/linden/indra/mac_updater/mac_updater.cpp index d05b73f..58819a2 100644 --- a/linden/indra/mac_updater/mac_updater.cpp +++ b/linden/indra/mac_updater/mac_updater.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -65,9 +66,8 @@ EventHandlerRef gEventHandler = NULL; OSStatus gFailure = noErr; Boolean gCancelled = false; -char *gUserServer; +char *gUpdateURL; char *gProductName; -char gUpdateURL[2048]; /* Flawfinder: ignore */ void *updatethreadproc(void*); @@ -324,20 +324,13 @@ int curl_progress_callback_func(void *clientp, int parse_args(int argc, char **argv) { - // Check for old-type arguments. - if (2 == argc) - { - gUserServer = argv[1]; - return 0; - } - int j; for (j = 1; j < argc; j++) { - if ((!strcmp(argv[j], "-userserver")) && (++j < argc)) + if ((!strcmp(argv[j], "-url")) && (++j < argc)) { - gUserServer = argv[j]; + gUpdateURL = argv[j]; } else if ((!strcmp(argv[j], "-name")) && (++j < argc)) { @@ -357,17 +350,17 @@ int main(int argc, char **argv) // // Process command line arguments // - gUserServer = NULL; + gUpdateURL = NULL; gProductName = NULL; parse_args(argc, argv); - if (!gUserServer) + if (!gUpdateURL) { - llinfos << "Usage: mac_updater -userserver [-name ] [-program ]" << llendl; + llinfos << "Usage: mac_updater -url [-name ] [-program ]" << llendl; exit(1); } else { - llinfos << "User server is: " << gUserServer << llendl; + llinfos << "Update url is: " << gUpdateURL << llendl; if (gProductName) { llinfos << "Product name is: " << gProductName << llendl; @@ -380,9 +373,6 @@ int main(int argc, char **argv) llinfos << "Starting " << gProductName << " Updater" << llendl; - // Build the URL to download the update - snprintf(gUpdateURL, sizeof(gUpdateURL), "http://secondlife.com/update-macos.php?userserver=%s", gUserServer); /* Flawfinder: ignore */ - // Real UI... OSStatus err; IBNibRef nib = NULL; @@ -390,7 +380,7 @@ int main(int argc, char **argv) err = CreateNibReference(CFSTR("AutoUpdater"), &nib); char windowTitle[MAX_PATH]; /* Flawfinder: ignore */ - snprintf(windowTitle, sizeof(windowTitle), "%s Updater", gProductName); /* Flawfinder: ignore */ + snprintf(windowTitle, sizeof(windowTitle), "%s Updater", gProductName); CFStringRef windowTitleRef = NULL; windowTitleRef = CFStringCreateWithCString(NULL, windowTitle, kCFStringEncodingUTF8); @@ -564,8 +554,8 @@ int restoreObject(const char* aside, const char* target, const char* path, const { char source[PATH_MAX]; /* Flawfinder: ignore */ char dest[PATH_MAX]; /* Flawfinder: ignore */ - snprintf(source, sizeof(source), "%s/%s/%s", aside, path, object); /* Flawfinder: ignore */ - snprintf(dest, sizeof(dest), "%s/%s", target, path); /* Flawfinder: ignore */ + snprintf(source, sizeof(source), "%s/%s/%s", aside, path, object); + snprintf(dest, sizeof(dest), "%s/%s", target, path); FSRef sourceRef; FSRef destRef; OSStatus err; @@ -599,11 +589,11 @@ void filterFile(const char* filename) { char temp[PATH_MAX]; /* Flawfinder: ignore */ // First copy the target's version, so we can run it through sed. - snprintf(temp, sizeof(temp), "cp '%s' '%s.tmp'", filename, filename); /* Flawfinder: ignore */ + snprintf(temp, sizeof(temp), "cp '%s' '%s.tmp'", filename, filename); system(temp); /* Flawfinder: ignore */ // Now run it through sed. - snprintf(temp, sizeof(temp), /* Flawfinder: ignore */ + snprintf(temp, sizeof(temp), "sed 's/Second Life/%s/g' '%s.tmp' > '%s'", gProductName, filename, filename); system(temp); /* Flawfinder: ignore */ } @@ -759,7 +749,7 @@ void *updatethreadproc(void*) throw 0; } - snprintf(target, sizeof(target), "/Applications/%s.app", gProductName); /* Flawfinder: ignore */ + snprintf(target, sizeof(target), "/Applications/%s.app", gProductName); memset(&targetRef, 0, sizeof(targetRef)); err = FSPathMakeRef((UInt8*)target, &targetRef, NULL); @@ -855,7 +845,7 @@ void *updatethreadproc(void*) chdir(tempDir); - snprintf(temp, sizeof(temp), "SecondLife.dmg"); /* Flawfinder: ignore */ + snprintf(temp, sizeof(temp), "SecondLife.dmg"); downloadFile = fopen(temp, "wb"); /* Flawfinder: ignore */ if(downloadFile == NULL) @@ -953,7 +943,7 @@ void *updatethreadproc(void*) // Get an FSRef to the new application on the disk image FSRef sourceRef; - snprintf(temp, sizeof(temp), "%s/mnt/Second Life.app", tempDir); /* Flawfinder: ignore */ + snprintf(temp, sizeof(temp), "%s/mnt/Second Life.app", tempDir); llinfos << "Source application is: " << temp << llendl; @@ -986,7 +976,7 @@ void *updatethreadproc(void*) { // Construct the name of the target based on the product name char appName[MAX_PATH]; /* Flawfinder: ignore */ - snprintf(appName, sizeof(appName), "%s.app", gProductName); /* Flawfinder: ignore */ + snprintf(appName, sizeof(appName), "%s.app", gProductName); utf8str_to_HFSUniStr255( &appNameUniStr, appName ); } @@ -1035,7 +1025,7 @@ void *updatethreadproc(void*) llinfos << "Clearing cache..." << llendl; char mask[LL_MAX_PATH]; /* Flawfinder: ignore */ - snprintf(mask, LL_MAX_PATH, "%s*.*", gDirUtilp->getDirDelimiter().c_str()); /* Flawfinder: ignore */ + snprintf(mask, LL_MAX_PATH, "%s*.*", gDirUtilp->getDirDelimiter().c_str()); gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""),mask); llinfos << "Clear complete." << llendl; @@ -1067,7 +1057,7 @@ void *updatethreadproc(void*) { llinfos << "Detaching disk image." << llendl; - snprintf(temp, sizeof(temp), "hdiutil detach '%s'", deviceNode); /* Flawfinder: ignore */ + snprintf(temp, sizeof(temp), "hdiutil detach '%s'", deviceNode); system(temp); /* Flawfinder: ignore */ } @@ -1092,12 +1082,12 @@ void *updatethreadproc(void*) { llinfos << "Touching application bundle." << llendl; - snprintf(temp, sizeof(temp), "touch '%s'", target); /* Flawfinder: ignore */ + snprintf(temp, sizeof(temp), "touch '%s'", target); system(temp); /* Flawfinder: ignore */ llinfos << "Launching updated application." << llendl; - snprintf(temp, sizeof(temp), "open '%s'", target); /* Flawfinder: ignore */ + snprintf(temp, sizeof(temp), "open '%s'", target); system(temp); /* Flawfinder: ignore */ } diff --git a/linden/indra/newview/English.lproj/InfoPlist.strings b/linden/indra/newview/English.lproj/InfoPlist.strings index 6efc60a..54687b1 100644 --- a/linden/indra/newview/English.lproj/InfoPlist.strings +++ b/linden/indra/newview/English.lproj/InfoPlist.strings @@ -1,5 +1,5 @@ /* Localized versions of Info.plist keys */ CFBundleName = "Second Life"; -CFBundleShortVersionString = "Second Life version 1.14.0.0"; -CFBundleGetInfoString = "Second Life version 1.14.0.0, Copyright 2004-2007 Linden Research, Inc."; +CFBundleShortVersionString = "Second Life version 1.15.0.2"; +CFBundleGetInfoString = "Second Life version 1.15.0.2, Copyright 2004-2007 Linden Research, Inc."; diff --git a/linden/indra/newview/Info-SecondLife.plist b/linden/indra/newview/Info-SecondLife.plist index fbfd040..0908e18 100644 --- a/linden/indra/newview/Info-SecondLife.plist +++ b/linden/indra/newview/Info-SecondLife.plist @@ -32,7 +32,7 @@ CFBundleVersion - 1.14.0.0 + 1.15.0.2 CSResourcesFileMapped diff --git a/linden/indra/newview/VertexCache.h b/linden/indra/newview/VertexCache.h index 1c9783d..76ad3cc 100644 --- a/linden/indra/newview/VertexCache.h +++ b/linden/indra/newview/VertexCache.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/VorbisFramework.h b/linden/indra/newview/VorbisFramework.h index 8d4369d..6af4a14 100644 --- a/linden/indra/newview/VorbisFramework.h +++ b/linden/indra/newview/VorbisFramework.h @@ -6,6 +6,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/app_settings/keywords.ini b/linden/indra/newview/app_settings/keywords.ini index bf49c2c..f53a384 100644 --- a/linden/indra/newview/app_settings/keywords.ini +++ b/linden/indra/newview/app_settings/keywords.ini @@ -438,6 +438,10 @@ PARCEL_FLAG_USE_BAN_LIST Used with llGetParcelFlags to find if a parcel uses a PARCEL_FLAG_USE_LAND_PASS_LIST Used with llGetParcelFlags to find if a parcel allows passes to be purchased PARCEL_FLAG_LOCAL_SOUND_ONLY Used with llGetParcelFlags to find if a parcel restricts spacialized sound to the parcel PARCEL_FLAG_RESTRICT_PUSHOBJECT Used with llGetParcelFlags to find if a parcel restricts llPushObject() calls +PARCEL_FLAG_LOCAL_SOUND_ONLY Used with llGetParcelFlags to find if a parcel restricts spacialized sound to the parcel +PARCEL_FLAG_RESTRICT_PUSHOBJECT Used with llGetParcelFlags to find if a parcel restricts llPushObject() calls +PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY Used with llGetParcelFlags to find if a parcel allows all objects to enter +PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY Used with llGetParcelFlags to find if a parcel only allows group (and owner) objects to enter REGION_FLAG_ALLOW_DAMAGE Used with llGetRegionFlags to find if a region is entirely damage enabled REGION_FLAG_FIXED_SUN Used with llGetRegionFlags to find if a region has a fixed sun position diff --git a/linden/indra/newview/app_settings/message.xml b/linden/indra/newview/app_settings/message.xml new file mode 100644 index 0000000..5402a64 --- /dev/null +++ b/linden/indra/newview/app_settings/message.xml @@ -0,0 +1,228 @@ + + + + serverDefaults + + + simulator + template + + userserver + template + + spaceserver + template + + dataserver + template + + logDataserver + template + + inventoryDataserver + template + + viewer + template + + + messages + + + + PacketAck + + builder + template + trusted-sender + false + + + OpenCircuit + + builder + template + trusted-sender + false + + + CloseCircuit + + builder + template + trusted-sender + false + + + StartPingCheck + + builder + template + trusted-sender + false + + + CompletePingCheck + + builder + template + trusted-sender + false + + + AddCircuitCode + + builder + template + trusted-sender + true + + + UseCircuitCode + + builder + template + trusted-sender + false + + + CreateTrustedCircuit + + builder + template + trusted-sender + false + + + + ConnectAgentToUserserver + + builder + template + trusted-sender + false + + + + SecuredTemplateChecksumRequest + + builder + template + trusted-sender + false + + + CompleteAgentMovement + + builder + template + trusted-sender + false + + + EconomyDataRequest + + builder + template + trusted-sender + false + + + ViewerEffect + + builder + template + trusted-sender + false + + + + AgentUpdate + + builder + template + trusted-sender + false + + + + ImagePacket + + builder + template + trusted-sender + false + + + LayerData + + builder + template + trusted-sender + false + + + ObjectUpdateCached + + builder + template + trusted-sender + false + + + ObjectUpdateCompressed + + builder + template + trusted-sender + false + + + ObjectUpdate + + builder + template + trusted-sender + false + + + ImprovedTerseObjectUpdate + + builder + template + trusted-sender + false + + + AvatarAnimation + + builder + template + trusted-sender + false + + + AvatarAppearance + + builder + template + trusted-sender + false + + + + diff --git a/linden/indra/newview/app_settings/shaders/class1/environment/glowF.glsl b/linden/indra/newview/app_settings/shaders/class1/environment/glowF.glsl new file mode 100644 index 0000000..670b976 --- /dev/null +++ b/linden/indra/newview/app_settings/shaders/class1/environment/glowF.glsl @@ -0,0 +1,14 @@ +uniform sampler2D diffuseMap; + +void main() +{ + vec4 color1 = texture2D(diffuseMap, gl_TexCoord[0].xy); + vec4 color2 = texture2D(diffuseMap, gl_TexCoord[1].xy); + vec4 color3 = texture2D(diffuseMap, gl_TexCoord[2].xy); + vec4 color4 = texture2D(diffuseMap, gl_TexCoord[3].xy); + vec4 color5 = texture2D(diffuseMap, gl_TexCoord[4].xy); + + vec4 col = (color1+color2+color3+color4+color5)*0.21; + col = max(col, col*0.25 + color5*0.75); + gl_FragColor = col; +} diff --git a/linden/indra/newview/app_settings/shaders/class1/environment/glowV.glsl b/linden/indra/newview/app_settings/shaders/class1/environment/glowV.glsl new file mode 100644 index 0000000..3b1a72e --- /dev/null +++ b/linden/indra/newview/app_settings/shaders/class1/environment/glowV.glsl @@ -0,0 +1,10 @@ +uniform float delta; +void main() +{ + gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + gl_TexCoord[0].xy = gl_MultiTexCoord0.xy + vec2(delta, delta); + gl_TexCoord[1].xy = gl_MultiTexCoord0.xy + vec2(-delta, delta); + gl_TexCoord[2].xy = gl_MultiTexCoord0.xy + vec2(-delta, -delta); + gl_TexCoord[3].xy = gl_MultiTexCoord0.xy + vec2(delta, -delta); + gl_TexCoord[4].xy = gl_MultiTexCoord0.xy; +} diff --git a/linden/indra/newview/app_settings/shaders/class2/environment/waterF.glsl b/linden/indra/newview/app_settings/shaders/class2/environment/waterF.glsl index e0e79e9..11a057b 100644 --- a/linden/indra/newview/app_settings/shaders/class2/environment/waterF.glsl +++ b/linden/indra/newview/app_settings/shaders/class2/environment/waterF.glsl @@ -132,5 +132,7 @@ void main() //apply fog applyScatter(color.rgb); + color.a = spec*0.5+fb.a; + gl_FragColor = color; } diff --git a/linden/indra/newview/audiosettings.h b/linden/indra/newview/audiosettings.h index 1bf3129..714d02a 100644 --- a/linden/indra/newview/audiosettings.h +++ b/linden/indra/newview/audiosettings.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/character/avatar_eye.llm b/linden/indra/newview/character/avatar_eye.llm deleted file mode 100644 index 8c6e74e..0000000 Binary files a/linden/indra/newview/character/avatar_eye.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_eye_1.llm b/linden/indra/newview/character/avatar_eye_1.llm deleted file mode 100644 index 7a3b0d6..0000000 Binary files a/linden/indra/newview/character/avatar_eye_1.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_eyelashes.llm b/linden/indra/newview/character/avatar_eyelashes.llm deleted file mode 100644 index 99995b5..0000000 Binary files a/linden/indra/newview/character/avatar_eyelashes.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_hair.llm b/linden/indra/newview/character/avatar_hair.llm deleted file mode 100644 index df99de8..0000000 Binary files a/linden/indra/newview/character/avatar_hair.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_hair_1.llm b/linden/indra/newview/character/avatar_hair_1.llm deleted file mode 100644 index 6de31fd..0000000 Binary files a/linden/indra/newview/character/avatar_hair_1.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_hair_2.llm b/linden/indra/newview/character/avatar_hair_2.llm deleted file mode 100644 index 47d02ba..0000000 Binary files a/linden/indra/newview/character/avatar_hair_2.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_hair_3.llm b/linden/indra/newview/character/avatar_hair_3.llm deleted file mode 100644 index 107f9e2..0000000 Binary files a/linden/indra/newview/character/avatar_hair_3.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_hair_4.llm b/linden/indra/newview/character/avatar_hair_4.llm deleted file mode 100644 index 1b9a12a..0000000 Binary files a/linden/indra/newview/character/avatar_hair_4.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_hair_5.llm b/linden/indra/newview/character/avatar_hair_5.llm deleted file mode 100644 index 1b9a12a..0000000 Binary files a/linden/indra/newview/character/avatar_hair_5.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_head.llm b/linden/indra/newview/character/avatar_head.llm deleted file mode 100644 index 9577b4c..0000000 Binary files a/linden/indra/newview/character/avatar_head.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_head_1.llm b/linden/indra/newview/character/avatar_head_1.llm deleted file mode 100644 index 26291e6..0000000 Binary files a/linden/indra/newview/character/avatar_head_1.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_head_2.llm b/linden/indra/newview/character/avatar_head_2.llm deleted file mode 100644 index c2b808b..0000000 Binary files a/linden/indra/newview/character/avatar_head_2.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_head_3.llm b/linden/indra/newview/character/avatar_head_3.llm deleted file mode 100644 index a0676b1..0000000 Binary files a/linden/indra/newview/character/avatar_head_3.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_head_4.llm b/linden/indra/newview/character/avatar_head_4.llm deleted file mode 100644 index 5035585..0000000 Binary files a/linden/indra/newview/character/avatar_head_4.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_lad.xml b/linden/indra/newview/character/avatar_lad.xml deleted file mode 100644 index 3b81fa2..0000000 --- a/linden/indra/newview/character/avatar_lad.xml +++ /dev/null @@ -1,11223 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/linden/indra/newview/character/avatar_lower_body.llm b/linden/indra/newview/character/avatar_lower_body.llm deleted file mode 100644 index 0420899..0000000 Binary files a/linden/indra/newview/character/avatar_lower_body.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_lower_body_1.llm b/linden/indra/newview/character/avatar_lower_body_1.llm deleted file mode 100644 index 1394eb8..0000000 Binary files a/linden/indra/newview/character/avatar_lower_body_1.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_lower_body_2.llm b/linden/indra/newview/character/avatar_lower_body_2.llm deleted file mode 100644 index 0da9c12..0000000 Binary files a/linden/indra/newview/character/avatar_lower_body_2.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_lower_body_3.llm b/linden/indra/newview/character/avatar_lower_body_3.llm deleted file mode 100644 index f3c49a1..0000000 Binary files a/linden/indra/newview/character/avatar_lower_body_3.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_lower_body_4.llm b/linden/indra/newview/character/avatar_lower_body_4.llm deleted file mode 100644 index e717210..0000000 Binary files a/linden/indra/newview/character/avatar_lower_body_4.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_skeleton.xml b/linden/indra/newview/character/avatar_skeleton.xml deleted file mode 100644 index 5e73804..0000000 --- a/linden/indra/newview/character/avatar_skeleton.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/linden/indra/newview/character/avatar_skirt.llm b/linden/indra/newview/character/avatar_skirt.llm deleted file mode 100644 index 08ce3d1..0000000 Binary files a/linden/indra/newview/character/avatar_skirt.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_skirt_1.llm b/linden/indra/newview/character/avatar_skirt_1.llm deleted file mode 100644 index 88076c3..0000000 Binary files a/linden/indra/newview/character/avatar_skirt_1.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_skirt_2.llm b/linden/indra/newview/character/avatar_skirt_2.llm deleted file mode 100644 index 73b3eff..0000000 Binary files a/linden/indra/newview/character/avatar_skirt_2.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_skirt_3.llm b/linden/indra/newview/character/avatar_skirt_3.llm deleted file mode 100644 index ded546f..0000000 Binary files a/linden/indra/newview/character/avatar_skirt_3.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_skirt_4.llm b/linden/indra/newview/character/avatar_skirt_4.llm deleted file mode 100644 index b9d5cb9..0000000 Binary files a/linden/indra/newview/character/avatar_skirt_4.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_upper_body.llm b/linden/indra/newview/character/avatar_upper_body.llm deleted file mode 100644 index da7d990..0000000 Binary files a/linden/indra/newview/character/avatar_upper_body.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_upper_body_1.llm b/linden/indra/newview/character/avatar_upper_body_1.llm deleted file mode 100644 index 31e104c..0000000 Binary files a/linden/indra/newview/character/avatar_upper_body_1.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_upper_body_2.llm b/linden/indra/newview/character/avatar_upper_body_2.llm deleted file mode 100644 index c1f4199..0000000 Binary files a/linden/indra/newview/character/avatar_upper_body_2.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_upper_body_3.llm b/linden/indra/newview/character/avatar_upper_body_3.llm deleted file mode 100644 index 9e89ed8..0000000 Binary files a/linden/indra/newview/character/avatar_upper_body_3.llm and /dev/null differ diff --git a/linden/indra/newview/character/avatar_upper_body_4.llm b/linden/indra/newview/character/avatar_upper_body_4.llm deleted file mode 100644 index ec836d1..0000000 Binary files a/linden/indra/newview/character/avatar_upper_body_4.llm and /dev/null differ diff --git a/linden/indra/newview/character/blush_alpha.tga b/linden/indra/newview/character/blush_alpha.tga deleted file mode 100644 index 05be7e7..0000000 Binary files a/linden/indra/newview/character/blush_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/body_skingrain.tga b/linden/indra/newview/character/body_skingrain.tga deleted file mode 100644 index 7264baa..0000000 Binary files a/linden/indra/newview/character/body_skingrain.tga and /dev/null differ diff --git a/linden/indra/newview/character/bodyfreckles_alpha.tga b/linden/indra/newview/character/bodyfreckles_alpha.tga deleted file mode 100644 index d30ab3d..0000000 Binary files a/linden/indra/newview/character/bodyfreckles_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/bump_face_wrinkles.tga b/linden/indra/newview/character/bump_face_wrinkles.tga deleted file mode 100644 index 54bf7a5..0000000 Binary files a/linden/indra/newview/character/bump_face_wrinkles.tga and /dev/null differ diff --git a/linden/indra/newview/character/bump_head_base.tga b/linden/indra/newview/character/bump_head_base.tga deleted file mode 100644 index fa35685..0000000 Binary files a/linden/indra/newview/character/bump_head_base.tga and /dev/null differ diff --git a/linden/indra/newview/character/bump_lowerbody_base.tga b/linden/indra/newview/character/bump_lowerbody_base.tga deleted file mode 100644 index 498ea3c..0000000 Binary files a/linden/indra/newview/character/bump_lowerbody_base.tga and /dev/null differ diff --git a/linden/indra/newview/character/bump_pants_wrinkles.tga b/linden/indra/newview/character/bump_pants_wrinkles.tga deleted file mode 100644 index cca7241..0000000 Binary files a/linden/indra/newview/character/bump_pants_wrinkles.tga and /dev/null differ diff --git a/linden/indra/newview/character/bump_shirt_wrinkles.tga b/linden/indra/newview/character/bump_shirt_wrinkles.tga deleted file mode 100644 index 9e0d757..0000000 Binary files a/linden/indra/newview/character/bump_shirt_wrinkles.tga and /dev/null differ diff --git a/linden/indra/newview/character/bump_upperbody_base.tga b/linden/indra/newview/character/bump_upperbody_base.tga deleted file mode 100644 index e57d635..0000000 Binary files a/linden/indra/newview/character/bump_upperbody_base.tga and /dev/null differ diff --git a/linden/indra/newview/character/eyebrows_alpha.tga b/linden/indra/newview/character/eyebrows_alpha.tga deleted file mode 100644 index c363e48..0000000 Binary files a/linden/indra/newview/character/eyebrows_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/eyeliner_alpha.tga b/linden/indra/newview/character/eyeliner_alpha.tga deleted file mode 100644 index 1611eb3..0000000 Binary files a/linden/indra/newview/character/eyeliner_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/eyeshadow_inner_alpha.tga b/linden/indra/newview/character/eyeshadow_inner_alpha.tga deleted file mode 100644 index 37d7919..0000000 Binary files a/linden/indra/newview/character/eyeshadow_inner_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/eyeshadow_outer_alpha.tga b/linden/indra/newview/character/eyeshadow_outer_alpha.tga deleted file mode 100644 index 00eef9d..0000000 Binary files a/linden/indra/newview/character/eyeshadow_outer_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/eyewhite.tga b/linden/indra/newview/character/eyewhite.tga deleted file mode 100644 index a720496..0000000 Binary files a/linden/indra/newview/character/eyewhite.tga and /dev/null differ diff --git a/linden/indra/newview/character/facehair_chincurtains_alpha.tga b/linden/indra/newview/character/facehair_chincurtains_alpha.tga deleted file mode 100644 index b103970..0000000 Binary files a/linden/indra/newview/character/facehair_chincurtains_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/facehair_moustache_alpha.tga b/linden/indra/newview/character/facehair_moustache_alpha.tga deleted file mode 100644 index 4068c4f..0000000 Binary files a/linden/indra/newview/character/facehair_moustache_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/facehair_sideburns_alpha.tga b/linden/indra/newview/character/facehair_sideburns_alpha.tga deleted file mode 100644 index acddc2d..0000000 Binary files a/linden/indra/newview/character/facehair_sideburns_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/facehair_soulpatch_alpha.tga b/linden/indra/newview/character/facehair_soulpatch_alpha.tga deleted file mode 100644 index 687091a..0000000 Binary files a/linden/indra/newview/character/facehair_soulpatch_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/freckles_alpha.tga b/linden/indra/newview/character/freckles_alpha.tga deleted file mode 100644 index a9a4ec0..0000000 Binary files a/linden/indra/newview/character/freckles_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/genepool.xml b/linden/indra/newview/character/genepool.xml deleted file mode 100644 index 52300c2..0000000 --- a/linden/indra/newview/character/genepool.xml +++ /dev/null @@ -1,7107 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/linden/indra/newview/character/glove_length_alpha.tga b/linden/indra/newview/character/glove_length_alpha.tga deleted file mode 100644 index db89ad5..0000000 Binary files a/linden/indra/newview/character/glove_length_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/gloves_fingers_alpha.tga b/linden/indra/newview/character/gloves_fingers_alpha.tga deleted file mode 100644 index dba2eec..0000000 Binary files a/linden/indra/newview/character/gloves_fingers_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/head_alpha.tga b/linden/indra/newview/character/head_alpha.tga deleted file mode 100644 index 8164525..0000000 Binary files a/linden/indra/newview/character/head_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/head_color.tga b/linden/indra/newview/character/head_color.tga deleted file mode 100644 index 74b1b30..0000000 Binary files a/linden/indra/newview/character/head_color.tga and /dev/null differ diff --git a/linden/indra/newview/character/head_hair.tga b/linden/indra/newview/character/head_hair.tga deleted file mode 100644 index 5321f35..0000000 Binary files a/linden/indra/newview/character/head_hair.tga and /dev/null differ diff --git a/linden/indra/newview/character/head_highlights_alpha.tga b/linden/indra/newview/character/head_highlights_alpha.tga deleted file mode 100644 index 8dc5239..0000000 Binary files a/linden/indra/newview/character/head_highlights_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/head_shading_alpha.tga b/linden/indra/newview/character/head_shading_alpha.tga deleted file mode 100644 index e8ea490..0000000 Binary files a/linden/indra/newview/character/head_shading_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/head_skingrain.tga b/linden/indra/newview/character/head_skingrain.tga deleted file mode 100644 index b42dee0..0000000 Binary files a/linden/indra/newview/character/head_skingrain.tga and /dev/null differ diff --git a/linden/indra/newview/character/jacket_length_lower_alpha.tga b/linden/indra/newview/character/jacket_length_lower_alpha.tga deleted file mode 100644 index 722bc19..0000000 Binary files a/linden/indra/newview/character/jacket_length_lower_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/jacket_length_upper_alpha.tga b/linden/indra/newview/character/jacket_length_upper_alpha.tga deleted file mode 100644 index e9db7e7..0000000 Binary files a/linden/indra/newview/character/jacket_length_upper_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/jacket_open_lower_alpha.tga b/linden/indra/newview/character/jacket_open_lower_alpha.tga deleted file mode 100644 index db0c2fb..0000000 Binary files a/linden/indra/newview/character/jacket_open_lower_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/jacket_open_upper_alpha.tga b/linden/indra/newview/character/jacket_open_upper_alpha.tga deleted file mode 100644 index 71b8a0b..0000000 Binary files a/linden/indra/newview/character/jacket_open_upper_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/lipgloss_alpha.tga b/linden/indra/newview/character/lipgloss_alpha.tga deleted file mode 100644 index 78ceeca..0000000 Binary files a/linden/indra/newview/character/lipgloss_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/lips_mask.tga b/linden/indra/newview/character/lips_mask.tga deleted file mode 100644 index ae1401c..0000000 Binary files a/linden/indra/newview/character/lips_mask.tga and /dev/null differ diff --git a/linden/indra/newview/character/lipstick_alpha.tga b/linden/indra/newview/character/lipstick_alpha.tga deleted file mode 100644 index 2795f1b..0000000 Binary files a/linden/indra/newview/character/lipstick_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/lowerbody_color.tga b/linden/indra/newview/character/lowerbody_color.tga deleted file mode 100644 index a63aa12..0000000 Binary files a/linden/indra/newview/character/lowerbody_color.tga and /dev/null differ diff --git a/linden/indra/newview/character/lowerbody_highlights_alpha.tga b/linden/indra/newview/character/lowerbody_highlights_alpha.tga deleted file mode 100644 index ae3413a..0000000 Binary files a/linden/indra/newview/character/lowerbody_highlights_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/lowerbody_shading_alpha.tga b/linden/indra/newview/character/lowerbody_shading_alpha.tga deleted file mode 100644 index 0242663..0000000 Binary files a/linden/indra/newview/character/lowerbody_shading_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/nailpolish_alpha.tga b/linden/indra/newview/character/nailpolish_alpha.tga deleted file mode 100644 index 91af762..0000000 Binary files a/linden/indra/newview/character/nailpolish_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/pants_length_alpha.tga b/linden/indra/newview/character/pants_length_alpha.tga deleted file mode 100644 index 3c4f21c..0000000 Binary files a/linden/indra/newview/character/pants_length_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/pants_waist_alpha.tga b/linden/indra/newview/character/pants_waist_alpha.tga deleted file mode 100644 index 35658c0..0000000 Binary files a/linden/indra/newview/character/pants_waist_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/rosyface_alpha.tga b/linden/indra/newview/character/rosyface_alpha.tga deleted file mode 100644 index a0c8513..0000000 Binary files a/linden/indra/newview/character/rosyface_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/rouge_alpha.tga b/linden/indra/newview/character/rouge_alpha.tga deleted file mode 100644 index a0c8513..0000000 Binary files a/linden/indra/newview/character/rouge_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/shirt_bottom_alpha.tga b/linden/indra/newview/character/shirt_bottom_alpha.tga deleted file mode 100644 index 7cce03d..0000000 Binary files a/linden/indra/newview/character/shirt_bottom_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/shirt_collar_alpha.tga b/linden/indra/newview/character/shirt_collar_alpha.tga deleted file mode 100644 index f55f635..0000000 Binary files a/linden/indra/newview/character/shirt_collar_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/shirt_collar_back_alpha.tga b/linden/indra/newview/character/shirt_collar_back_alpha.tga deleted file mode 100644 index 43a6453..0000000 Binary files a/linden/indra/newview/character/shirt_collar_back_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/shirt_sleeve_alpha.tga b/linden/indra/newview/character/shirt_sleeve_alpha.tga deleted file mode 100644 index e3b18f4..0000000 Binary files a/linden/indra/newview/character/shirt_sleeve_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/shoe_height_alpha.tga b/linden/indra/newview/character/shoe_height_alpha.tga deleted file mode 100644 index d08dd75..0000000 Binary files a/linden/indra/newview/character/shoe_height_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/skirt_length_alpha.tga b/linden/indra/newview/character/skirt_length_alpha.tga deleted file mode 100644 index c867994..0000000 Binary files a/linden/indra/newview/character/skirt_length_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/skirt_slit_back_alpha.tga b/linden/indra/newview/character/skirt_slit_back_alpha.tga deleted file mode 100644 index 0e49688..0000000 Binary files a/linden/indra/newview/character/skirt_slit_back_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/skirt_slit_front_alpha.tga b/linden/indra/newview/character/skirt_slit_front_alpha.tga deleted file mode 100644 index 888bbf7..0000000 Binary files a/linden/indra/newview/character/skirt_slit_front_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/skirt_slit_left_alpha.tga b/linden/indra/newview/character/skirt_slit_left_alpha.tga deleted file mode 100644 index 210feac..0000000 Binary files a/linden/indra/newview/character/skirt_slit_left_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/skirt_slit_right_alpha.tga b/linden/indra/newview/character/skirt_slit_right_alpha.tga deleted file mode 100644 index ce11c64..0000000 Binary files a/linden/indra/newview/character/skirt_slit_right_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/underpants_trial_female.tga b/linden/indra/newview/character/underpants_trial_female.tga deleted file mode 100644 index 96bf732..0000000 Binary files a/linden/indra/newview/character/underpants_trial_female.tga and /dev/null differ diff --git a/linden/indra/newview/character/underpants_trial_male.tga b/linden/indra/newview/character/underpants_trial_male.tga deleted file mode 100644 index 095695c..0000000 Binary files a/linden/indra/newview/character/underpants_trial_male.tga and /dev/null differ diff --git a/linden/indra/newview/character/undershirt_trial_female.tga b/linden/indra/newview/character/undershirt_trial_female.tga deleted file mode 100644 index e17a309..0000000 Binary files a/linden/indra/newview/character/undershirt_trial_female.tga and /dev/null differ diff --git a/linden/indra/newview/character/upperbody_color.tga b/linden/indra/newview/character/upperbody_color.tga deleted file mode 100644 index 85fcc41..0000000 Binary files a/linden/indra/newview/character/upperbody_color.tga and /dev/null differ diff --git a/linden/indra/newview/character/upperbody_highlights_alpha.tga b/linden/indra/newview/character/upperbody_highlights_alpha.tga deleted file mode 100644 index 2d8102b..0000000 Binary files a/linden/indra/newview/character/upperbody_highlights_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/upperbody_shading_alpha.tga b/linden/indra/newview/character/upperbody_shading_alpha.tga deleted file mode 100644 index b420506..0000000 Binary files a/linden/indra/newview/character/upperbody_shading_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/character/upperbodyfreckles_alpha.tga b/linden/indra/newview/character/upperbodyfreckles_alpha.tga deleted file mode 100644 index 76c7ce8..0000000 Binary files a/linden/indra/newview/character/upperbodyfreckles_alpha.tga and /dev/null differ diff --git a/linden/indra/newview/featuretable.txt b/linden/indra/newview/featuretable.txt index 17e2427..28b1ddc 100644 --- a/linden/indra/newview/featuretable.txt +++ b/linden/indra/newview/featuretable.txt @@ -153,21 +153,8 @@ RenderLighting 1 0 RenderParticleCount 1 2048 RenderTerrainDetail 1 0 -list GeForce3 - -list ATI - -list Radeon8500 -RenderLighting 1 0 -RenderParticleCount 1 4096 - -// Hacked to be paranoid "safe" -list Radeon9700 -RenderParticleCount 1 4096 - -// Hacked to be paranoid "safe" -list MobilityRadeon9000 -RenderLighting 1 0 -RenderParticleCount 1 4096 +list ATI_Mobility_Radeon_X3xx +VertexShaderEnable 1 0 -list GeForceFX +list ATI_Mobility_Radeon_X6xx +VertexShaderEnable 1 0 diff --git a/linden/indra/newview/files.lst b/linden/indra/newview/files.lst index 000799d..8fdd239 100644 --- a/linden/indra/newview/files.lst +++ b/linden/indra/newview/files.lst @@ -12,6 +12,7 @@ newview/llbox.cpp newview/llcallbacklist.cpp newview/llcallingcard.cpp newview/llcameraview.cpp +newview/llcaphttpsender.cpp newview/llcape.cpp newview/llchatbar.cpp newview/llclassifiedinfo.cpp @@ -97,7 +98,6 @@ newview/llfloaterpermissionsmgr.cpp newview/llfloaterpostcard.cpp newview/llfloaterpreference.cpp newview/llfloaterproperties.cpp -newview/llfloaterrate.cpp newview/llfloaterregioninfo.cpp newview/llfloaterreporter.cpp newview/llfloatersaveavatar.cpp @@ -118,6 +118,7 @@ newview/llgenepool.cpp newview/llgesturemgr.cpp newview/llgivemoney.cpp newview/llglsandbox.cpp +newview/llglslshader.cpp newview/llgroupmgr.cpp newview/llgroupnotify.cpp newview/llhippo.cpp @@ -268,6 +269,7 @@ newview/llviewerassetstorage.cpp newview/llviewercamera.cpp newview/llviewercontrol.cpp newview/llviewerdisplay.cpp +newview/llviewergenericmessage.cpp newview/llviewergesture.cpp newview/llviewerimage.cpp newview/llviewerimagelist.cpp @@ -276,6 +278,7 @@ newview/llviewerjointattachment.cpp newview/llviewerjoint.cpp newview/llviewerjointmesh.cpp newview/llviewerjointshape.cpp +newview/llviewerjoystick.cpp newview/llviewerkeyboard.cpp newview/llviewerlayer.cpp newview/llviewermenu.cpp @@ -289,7 +292,6 @@ newview/llviewerpartsim.cpp newview/llviewerpartsource.cpp newview/llviewerprecompiledheaders.cpp newview/llviewerregion.cpp -newview/llviewerreputation.cpp newview/llviewerstats.cpp newview/llviewertexteditor.cpp newview/llviewertextureanim.cpp diff --git a/linden/indra/newview/fmod_hidden_symbols.exp b/linden/indra/newview/fmod_hidden_symbols.exp index c0d5bed..1e79025 100644 --- a/linden/indra/newview/fmod_hidden_symbols.exp +++ b/linden/indra/newview/fmod_hidden_symbols.exp @@ -1,3 +1,5 @@ +_CarbonSndPlayDoubleBuffer +_ConvertFromIeeeExtended __book_maptype1_quantvals __book_unquantize __float32_pack @@ -138,3 +140,101 @@ _ov_pcm_seek_page_lap _ov_raw_seek_lap _ov_time_seek_lap _ov_time_seek_page_lap +_II_step_one +_II_step_two +_MyRecComp +_SampleRates +_Sinfo +_ValidStepIndex +__Z11fmodwrapperv +__Z11fmodwrapperv.eh +__floor_P +__mapping_P +__residue_P +__ve_envelope_clear +__ve_envelope_init +__ve_envelope_mark +__ve_envelope_search +__ve_envelope_shift +__vi_gpsy_free +__vi_psy_free +__vorbis_window_init +__vp_ampmax_decay +__vp_couple +__vp_global_free +__vp_global_look +__vp_noise_normalize +__vp_noise_normalize_sort +__vp_noisemask +__vp_offset_and_mix +__vp_psy_clear +__vp_psy_init +__vp_quantize_couple_memo +__vp_quantize_couple_sort +__vp_remove_floor +__vp_tonemask +_alloc_0 +_alloc_1 +_alloc_2 +_alloc_3 +_alloc_4 +_bandInfo +_cdcallback +_cdchannel +_cdmode +_cdnumtracks +_cdstream +_cdtrack +_drft_backward +_drft_clear +_drft_forward +_drft_init +_eatwhite +_floor0_exportbundle +_floor1_exportbundle +_gFreeList +_gNMRecBusy +_gNMRecPtr +_gSilenceOnes +_gSilenceTwos +_longLimit +_mapping0_exportbundle +_mdct_backward +_mdct_clear +_mdct_forward +_mdct_init +_muls +_mystrdup +_res0_free_info +_res0_free_look +_res0_inverse +_res0_look +_res0_unpack +_res1_class +_res1_inverse +_res2_inverse +_residue0_exportbundle +_residue1_exportbundle +_residue2_exportbundle +_scale +_shortLimit +_tabsel_123 +_F_Free +_F_Malloc +_F_ReAlloc +_F_memcmp +_F_memmove +_F_strcat +_F_strchr +_F_strcmp +_F_strcpy +_F_stricmp +_F_strlen +_F_strncat +_F_strncmp +_F_strncpy +_F_strnicmp +_F_strstr +_F_strupr +_F_tolower +_F_toupper diff --git a/linden/indra/newview/fmodwrapper.cpp b/linden/indra/newview/fmodwrapper.cpp index 403a942..6d74325 100644 --- a/linden/indra/newview/fmodwrapper.cpp +++ b/linden/indra/newview/fmodwrapper.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/fonts/MtBdLfRg.ttf b/linden/indra/newview/fonts/MtBdLfRg.ttf deleted file mode 100644 index 86c344e..0000000 Binary files a/linden/indra/newview/fonts/MtBdLfRg.ttf and /dev/null differ diff --git a/linden/indra/newview/fonts/MtBkLfRg.ttf b/linden/indra/newview/fonts/MtBkLfRg.ttf deleted file mode 100644 index 5940d4d..0000000 Binary files a/linden/indra/newview/fonts/MtBkLfRg.ttf and /dev/null differ diff --git a/linden/indra/newview/fonts/profontdoc.txt b/linden/indra/newview/fonts/profontdoc.txt deleted file mode 100644 index 0a7c32d..0000000 --- a/linden/indra/newview/fonts/profontdoc.txt +++ /dev/null @@ -1,176 +0,0 @@ -########################################################################## -# IMPORTANT NOTE # -# # -# This is the readme file of the ProFont distribution for # -# Apple Macintosh. I've added it because it felt wrong to distribute # -# a Windows version of ProFont without the words of the original # -# authors. # -# !! Please note that some of the information provided below is # -# NOT valid for ProFont/Windows !! Just figure it out ... ;-) # -# The Windows version was created using the files from the # -# ÒProFontWindows 2.2 ÄÓ folder mentioned below. # -# # -# Comparing Mac + Win version, you'll see that all font sizes are # -# off by 1. This means that Win 8pt version displays like Mac 9pt # -# version. # -# # -# For questions about the windows version of ProFont, contact: # -# mail@tobias-jung.de (please write in english or german language) # -# Tobias Jung, August 2002 # -########################################################################## -# Version 2 # -# This version hopefully fixes the problem that some text editors # -# (VIM, MultiEdit) wouldn't recognize ProFont as a monospaced font. # -########################################################################## - - -ProFont Distribution 2.2 -21 July 1997 -SQ Software -Ê - - - - - - -¥ What is ProFont? - - ProFont began life as a better version of ÒMonaco 9Ó which is especially good for programmers. It was created circa 1987 by Andrew Welch. - - In version 1.1 of the ProFont distribution, ProFont ceased being just a 9 point bitmap font. Carl Osterwald contributed bitmaps at several larger sizes and an outline version of ProFont in both TrueType and Adobe Type 1 (ATM) formats. - - In version 1.2 of the ProFont distribution, Carl extended ProFont to include the entire Macintosh character set including accented characters with ASCII codes from 0x80 to 0xFF. - - In version 2.0 of the ProFont distribution, Carl provided an ISOLatin1 encoded version of ProFont. The shapes of several of the characters have been modified for improved readability, and a 7 pt bitmap version of ProFont is included. - - In version 2.2 of the ProFont distribution, Carl produced a version of ProFont that uses the Windows character set. Once again the shapes of several of the characters have been modified for improved readability--especially when the fonts are anti-aliased. - -¥ What is the ProFont Distribution? - - ProFont was originally released as shareware by Andrew Welch. At that time, it was distributed inside an installer application which could replace AppleÕs Monaco 9 with ProFont 9. This made using ProFont as a substitute for Monaco 9 very easy. When the Mac II and SE came out, the magic used by the original installer became ineffective. Over the years I (Steve Gilardi) have figured out how to install ProFont 9 in place of Monaco 9 through the various releases of the System Software. After a time I asked Andrew for permission to distribute ProFont along with my instructions and he agreed and also decided to change ProFontÕs status from shareware to freeware. - - The methods for accomplishing the substitution for Monaco 9 have gone through significant changes over the years as the Macintosh font architecture has evolved. The various releases of what has become the ÒProFont DistributionÓ have been my effort to share my knowledge of how to use ProFont as a replacement for Monaco 9. - - Since Carl Osterwald became involved with the project, ProFont has blossomed into a full-fledged font in its own right and most recently into a suite of related fonts. ProFont is unusual among fonts in that the outline version was designed to closely follow the original 9 pt bitmap version. More often, fonts are conceived as outlines and then rendered at the various point sizes. - - Earlier versions of the ProFont Distribution have included very involved instructions and utility programs to allow installation of ProFont as a replacement for Monaco 9. Release 2.2 contains none of those instructions. Instead, I have developed a control panel called ÒMonaco TunerÓ which allows you to substitute a font of your choosing for Monaco. The substitution can be just for Monaco 9 or for all sizes of Monaco. Of course, I think the best substitute font to use is ProFont! See the information in the ÒMonaco Tuner 1.1.1 ÄÓ folder for details. - -¥ What does ProFont 2.2 look like? - -HereÕs a sample: -[ see "provsmonaco.gif" and "profomac.gif" ] - - -Also, each font folder in the ProFont distribution contains a file showing the fontÕs character set at 9 and 18 point sizes. You donÕt need to install the corresponding font to see the character set. - -¥ What is included in this distribution? - -The distribution includes 7 items: - -+ ÒAbout ProFont Distribution 2.2Ó SimpleText document - This is the file you are reading now. - -+ ÒProFont Quick StartÓ SimpleText document - Quick instructions for installing ProFont and Monaco Tuner. - -+ ÒProFont 2.2 ÄÓ folder - Version 2.2 of the ÒProFontÓ font. This includes both TrueType and ATM versions of ProFont. - -+ ÒProFontISOLatin1 2.2 ÄÓ folder - Version 2.2 of the ÒProFontISOLatin1Ó font. TrueType and ATM versions of ProFontISOLatin1 are included. - -+ ÒProFontClassic 1.2 ÄÓ folder - ProFontClassic 1.2 is the 9 pt size of ProFont from the 1.2 release of the ProFont distribution. ItÕs included mainly for those who prefer the look of ProFont 1.2 to that of ProFont 2.2 and who are only interested in substituting ProFontClassic for Monaco 9 using Monaco Tuner. - -+ ÒProFontWindows 2.2 ÄÓ folder - Version 2.2 of the ÒProFontWindowsÓ font. This is the first release of this font, but it is version 2.2 to keep its version number in sync with that of the ÒProFontÓ font. TrueType and ATM versions of ProFontWindows are included. This font can be useful for viewing files that originate on Windows machines. - -+ ÒMonaco Tuner 1.1.1 ÄÓ folder - ÒMonaco TunerÓ is a control panel which replaces the complicated instructions for installing ÒProFont(Monaco)Ó included in previous releases. It lets you pick a font (such as ProFont) to be substituted for Monaco in all applications. See the file ÒAbout Monaco TunerÓ inside this folder for details. - -¥ What kind of Macintosh and System Software do I need to use ProFont? - - The family of ProFont fonts are standard Macintosh fonts and should work on any Macintosh (or compatible) running any version of System 7 or Mac OS 8. The fonts may be compatible with System 6.0.8, but that has not been tested. Monaco Tuner requires System 7 or better and has been tested on several machines including a PowerBook 100 running System 7.0.1 and a PowerMac 8100/100 running System 7.5.3 and Mac OS 8 with and without QuickDraw GX. - -¥ What happens if I have problems with ProFont Distribution? - - ÒProFont DistributionÓ is provided in the hope that it will be useful. However, it is provided AS IS and carries NO WARRANTY that it will do anything good and NO WARRANTY that it will not do anything bad. Your use of the fonts and software that make up ÒProFont DistributionÓ is ENTIRELY AT YOUR OWN RISK. SQ Software, Stephen C. Gilardi, Carl R. Osterwald and Tobias Jung hereby disclaim any and all liability for any difficulty you may have as a result of using any part of ÒProFont DistributionÓ. If these terms are not acceptable to you, then you must not use any part of ÒProFont DistributionÓ. - -That being said, if you do have any difficulties or any suggestions, IÕll be very appreciative if you let me know about them so I can attempt to improve future releases of ProFont Distribution. - -¥ How do I install the various versions of ProFont? - - The various versions of ProFont included in this release are standard Macintosh fonts. You install them into any version of System 7 or Mac OS 8 by dragging the font suitcase containing the font you want to install onto the System Folder icon on your startup disk. - - ÒProFont 2.2Ó, ÒProFontISOLatin1 2.2Ó, and ÒProFontWindows 2.2Ó also include ATM versions. Since the System Software prefers TrueType fonts to ATM fonts, special suitcases are included in the distribution which do not contain the TrueType outline version of the font. These suitcases and the corresponding PostScript font files are inside a folder called ÒATM VersionÓ within each fontÕs folder. To install the ATM version of one of these fonts, drag the two files contained in its ÒATM VersionÓ folder onto the System Folder icon on your startup disk. - -Note: During testing it was discovered that some internal tables in ÒProFontISOLatin1Ó suitcase can be damaged if you use the Finder to remove the TrueType version by dragging it out of the suitcase. Fortunately, you donÕt need to do that because ProFont Distribution includes the suitcase called ÒProFontISOLatin1 BitmapsÓ which is does not contain the TrueType version. As the instructions above indicate, please use the ÒProFontISOLatin1 BitmapsÓ suitcase if you want to use ProFontISOLatin1 with ATM. - -¥ Can I redistribute ProFont Distribution? - -ÒProFont DistributionÓ is Copyright © 1997, SQ Software. The ProFont fonts are Copyright © 1997, Carl R. Osterwald. It is our intention that ÒProFont DistributionÓ get the widest possible distribution. You may redistribute unmodified copies of ÒProFont DistriubtionÓ as long as it is accompanied by an unmodified copy of ÒAbout ProFont Distribution 2.2Ó (this file). You may not charge anyone money for the ÒProFont DistributionÓ package itself. The ÒProFont DistributionÓ package can be distributed for free along with products for which you do charge money. The ÒProFont DistributionÓ package can also be distributed for free as part of collections of more than 10 third party products sold as a collection (such as on the Apprentice CD series). If you do distribute ÒProFont DistributionÓ along with another product or as part of a collection, Stephen C. Gilardi and Carl R. Osterwald would appreciate very much each receiving a complimentary copy of the whole distribution (e.g., any CD-ROM it appears on), but this is not a requirement. If you have questions about redistribution, please contact Stephen C. Gilardi at squeegee@usa.net. - -¥ Who is responsible for ProFont? - -+ Andrew Welch - The original ÒProFontÓ was created by Andrew Welch. It was originally shareware. Andrew generously gave his permission for it to be distributed freely: ÒletÕs make it free though [...] just credit me for making the font in the first place, and youÕre good to go!Ó AndrewÕs ProFont 9 font is no longer distributed in the ProFont Distribution, but the fonts included in ProFont Distribution 2.2 are based on it. - - Thanks Andrew! - -+ Carl Osterwald - The fonts included in ProFont Distribution 2.2 were created by Carl Osterwald. Carl created the outline versions of ProFont and implemented the Macintosh Extended ASCII Character Set for all versions of ProFont. Most recently Carl created the ProFontWindows font and did the modifications of the character shapes for ProFont 2.2. Please send praise, comments, etc., about the fonts in ÒProFont Distribution 2.2Ó to him. - - Thanks Carl! - - Carl can be reached at Òcarl_osterwald@usa.netÓ. - -+ Steve Gilardi - I am the author of the ÒmodernÓ (post Mac II/Mac SE era) ProFont distributions. I have gotten ProFont to work with successive System releases for my personal use, and have shared the methods with other folks from time to time through these distributions. Most recently I developed the ÒMonaco TunerÓ control panel to ease the use of ProFont as a replacement for Monaco 9. Please send comments, suggestions, and questions about Monaco Tuner, ProFont in general, or the ProFont Distribution as a whole to me. - - I can be reached at Òsqueegee@usa.netÓ. - -Enjoy ProFont! - ---Steve - -Stephen C. Gilardi -SQ Software -21 July 1997 - -¥ Version History: - - Version 2.2: - + ProFont 2.2 and ProFontISOLatin1 2.2 include modifications to several characters - for improved readability especially when anti-aliased. - + Several small bugs fixed in the fonts. - + Improved QuickDraw GX compatibility - + ProFontWindows 2.2 introduced. - + Monaco Tuner version bumped to 1.1.1 for minor documentation updates. - - Version 2.1: - + Monaco Tuner 1.1 adds ÒResizing of Monaco 9Ó and works around a bug which - affected desk accessories on Power Macs. - - Version 2.0: - + ProFont 2.0 includes modifications to several characters - + ProFont 2.0 includes a 7 pt bitmap version - + ProFontISOLatin1 2.0 released in response to requests from international users - + Monaco Tuner 1.0 replaces far-too-complicated ÒProFont(Monaco)Ó installation - instructions - + ProFontClassic 1.2 is the 9 pt size of ProFont from the version 1.2 release - - Version 1.2: - + Both versions of ProFont now implement the full Macintosh Extended ASCII - character set. - - Version 1.1.1: - + ÒProFont InfoÓ (this file) now actually prints on LaserWriters. Sorry! - + Added item labeled ÒWhat about Monaco 12?Ó - + Minor editing of ÒProFont InfoÓ - - Version 1.1: - + ÒProFont (ProFont)Ó now includes TrueType and Type 1 Outline Fonts! - + Includes instructions for installation under System 7.5.1. - + I think ProFont needs an installer. If you agree, please read the bullet item labeled - ÒArenÕt those instructions a little bit too complicated?Ó. diff --git a/linden/indra/newview/fonts/profontwindows.ttf b/linden/indra/newview/fonts/profontwindows.ttf deleted file mode 100644 index b3d66b2..0000000 Binary files a/linden/indra/newview/fonts/profontwindows.ttf and /dev/null differ diff --git a/linden/indra/newview/gpu_table.txt b/linden/indra/newview/gpu_table.txt index 92f9b44..4e6373d 100644 --- a/linden/indra/newview/gpu_table.txt +++ b/linden/indra/newview/gpu_table.txt @@ -22,6 +22,11 @@ ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3 ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3 ATI ASUS X1xxx .*ASUS X1.* 3 ATI Mobility Radeon X1xxx .*ATI.*Mobility.*X1.* 2 +// HACK: We crash on startup on some Mobility Radeon chips, with 1.15.0 +// in FMOD (!). Try defaulting them to class 0. JC +ATI Mobility Radeon X3xx .*ATI.*Mobility.*X3.* 0 +ATI Mobility Radeon X6xx .*ATI.*Mobility.*X6.* 0 +ATI Mobility Radeon X7xx .*ATI.*Mobility.*X7.* 0 ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 3 ATI Diamond X1xxx .*ATI.*Diamond.*X1.* 3 ATI FireGL 5xxx .*ATI.*FireGL V5.* 3 diff --git a/linden/indra/newview/head.cpp b/linden/indra/newview/head.cpp index 527170b..5bec318 100644 --- a/linden/indra/newview/head.cpp +++ b/linden/indra/newview/head.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/head.h b/linden/indra/newview/head.h index 5df0920..234f718 100644 --- a/linden/indra/newview/head.h +++ b/linden/indra/newview/head.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/installers/windows/installer_template_multilang.nsi b/linden/indra/newview/installers/windows/installer_template_multilang.nsi new file mode 100644 index 0000000..b722a0f --- /dev/null +++ b/linden/indra/newview/installers/windows/installer_template_multilang.nsi @@ -0,0 +1,938 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; secondlife setup.nsi +;; Copyright 2004-2007, Linden Research, Inc. +;; For info, see http://www.nullsoft.com/free/nsis/ +;; +;; NSIS 2.22 or higher required +;; Author: James Cook, Don Kjer, Callum Prentice +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Detect NSIS compiler version +!define "NSIS${NSIS_VERSION}" +!ifdef "NSISv2.02" | "NSISv2.03" | "NSISv2.04" | "NSISv2.05" | "NSISv2.06" + ;; before 2.07 defaulted lzma to solid (whole file) + SetCompressor lzma +!else + ;; after 2.07 required /solid for whole file compression + SetCompressor /solid lzma +!endif + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Compiler flags +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +SetOverwrite on ; overwrite files +SetCompress auto ; compress iff saves space +SetDatablockOptimize off ; only saves us 0.1%, not worth it +XPStyle on ; add an XP manifest to the installer + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Project flags +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +%%VERSION%% + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; - language files - one for each language (or flavor thereof) +;; (these files are in the same place as the nsi template but the python script generates a new nsi file in the +;; application directory so we have to add a path to these include files) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +!include "installers\windows\lang_de.nsi" +!include "installers\windows\lang_en-us.nsi" +!include "installers\windows\lang_ja.nsi" +!include "installers\windows\lang_ko.nsi" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Tweak for different servers/builds (this placeholder is replaced by viewer_manifest.py) +%%GRID_VARS%% + +Name ${INSTNAME} + +SubCaption 0 $(LicenseSubTitleSetup) ; override "license agreement" text + +BrandingText " " ; bottom of window text +Icon res\install_icon.ico ; our custom icon +UninstallIcon res\uninstall_icon.ico ; our custom icon +WindowIcon on ; show our icon in left corner +BGGradient off ; no big background window +CRCCheck on ; make sure CRC is OK +InstProgressFlags smooth colored ; new colored smooth look +ShowInstDetails nevershow ; no details, no "show" button +SetOverwrite on ; stomp files by default +AutoCloseWindow true ; after all files install, close window + +!ifdef UPDATE +LicenseText $(LicenseDescUpdate) $(LicenseDescNext) +!else +LicenseText $(LicenseDescSetup) $(LicenseDescNext) +!endif + +LicenseData "releasenotes.txt" + +InstallDir "$PROGRAMFILES\${INSTNAME}" +InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "" +!ifdef UPDATE +DirText $(DirectoryChooseTitle) $(DirectoryChooseUpdate) +!else +DirText $(DirectoryChooseTitle) $(DirectoryChooseSetup) +!endif + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Variables +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Var INSTPROG +Var INSTEXE +Var INSTFLAGS +Var LANGFLAGS +Var INSTSHORTCUT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Sections +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Section "" ; (default section) + +SetShellVarContext all ; install for all users (if you change this, change it in the uninstall as well) + +; Start with some default values. +StrCpy $INSTFLAGS "${INSTFLAGS}" +StrCpy $INSTFLAGS "$INSTFLAGS $LANGFLAGS" +StrCpy $INSTPROG "${INSTNAME}" +StrCpy $INSTEXE "${INSTEXE}" +StrCpy $INSTSHORTCUT "${SHORTCUT}" + +IfSilent +2 +Goto NOT_SILENT + Call CheckStartupParams ; Figure out where, what and how to install. +NOT_SILENT: +Call CheckWindowsVersion ; warn if on Windows 98/ME +Call CheckIfAdministrator ; Make sure the user can install/uninstall +Call CheckIfAlreadyCurrent ; Make sure that we haven't already installed this version +Call CloseSecondLife ; Make sure we're not running +Call RemoveNSIS ; Check for old NSIS install to remove + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Don't remove cache files during a regular install, removing the inventory cache on upgrades results in lots of damage to the servers. +;Call RemoveCacheFiles ; Installing over removes potentially corrupted + ; VFS and cache files. + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Files +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; This placeholder is replaced by the complete list of all the files in the installer, by viewer_manifest.py +%%INSTALL_FILES%% + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; If this is a silent update, we don't need to re-create these shortcuts or registry entries. +IfSilent POST_INSTALL + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Shortcuts in start menu +CreateDirectory "$SMPROGRAMS\$INSTSHORTCUT" +SetOutPath "$INSTDIR" +CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT.lnk" \ + "$INSTDIR\$INSTEXE" "$INSTFLAGS" + +!ifdef MUSEUM +CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT Museum.lnk" \ + + "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple" +CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT Museum Spanish.lnk" \ + + "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple -spanish" +!endif + +WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Create Trial Account.url" \ + "InternetShortcut" "URL" \ + "http://www.secondlife.com/registration/" +WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Your Account.url" \ + "InternetShortcut" "URL" \ + "http://www.secondlife.com/account/" +CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\SL Release Notes.lnk" \ + "$INSTDIR\releasenotes.txt" +CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\SL Scripting Language Help.lnk" \ + "$INSTDIR\lsl_guide.html" +CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\Uninstall $INSTSHORTCUT.lnk" \ + '"$INSTDIR\uninst.exe"' '/P="$INSTPROG"' + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Other shortcuts +SetOutPath "$INSTDIR" +CreateShortCut "$DESKTOP\$INSTSHORTCUT.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS" +CreateShortCut "$INSTDIR\$INSTSHORTCUT.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS" +CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \ + '"$INSTDIR\uninst.exe"' '/P="$INSTPROG"' + +!ifdef MUSEUM +CreateShortCut "$DESKTOP\$INSTSHORTCUT Museum.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple" + +CreateShortCut "$DESKTOP\$INSTSHORTCUT Museum Spanish.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple -spanish" + +CreateShortCut "$INSTDIR\$INSTSHORTCUT Museum.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple" + +CreateShortCut "$INSTDIR\$INSTSHORTCUT Museum Spanish.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple -spanish" + +!endif + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Write registry +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" "$INSTDIR" +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" "${VERSION_LONG}" +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Flags" "$INSTFLAGS" +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut" "$INSTSHORTCUT" +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe" "$INSTEXE" +WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayName" "$INSTPROG (remove only)" +WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "UninstallString" '"$INSTDIR\uninst.exe" /P="$INSTPROG"' + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Write URL registry info +WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "(default)" "URL:Second Life" +WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "URL Protocol" "" +WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}\DefaultIcon" "" '"$INSTDIR\$INSTEXE"' +WriteRegExpandStr HKEY_CLASSES_ROOT "${URLNAME}\shell\open\command" "" '"$INSTDIR\$INSTEXE" $INSTFLAGS -url "%1"' + +Goto WRITE_UNINST + +POST_INSTALL: +; Run a post-executable script if necessary. +Call PostInstallExe + +WRITE_UNINST: +; write out uninstaller +WriteUninstaller "$INSTDIR\uninst.exe" + +; end of default section +SectionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; PostInstallExe +; This just runs any post installation scripts. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function PostInstallExe +push $0 + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "PostInstallExe" + ;MessageBox MB_OK '$0' + ExecWait '$0' +pop $0 +FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; CheckStartupParameters +; Sets INSTFLAGS, INSTPROG, and INSTEXE. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function CheckStartupParams +push $0 +push $R0 + + ; Look for a registry entry with info about where to update. + Call GetProgramName + pop $R0 + StrCpy $INSTPROG "$R0" + StrCpy $INSTEXE "$R0.exe" + + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" + ; If key doesn't exist, skip install + IfErrors ABORT + StrCpy $INSTDIR "$0" + + ; We now have a directory to install to. Get the startup parameters and shortcut as well. + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Flags" + IfErrors +2 + StrCpy $INSTFLAGS "$0" + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut" + IfErrors +2 + StrCpy $INSTSHORTCUT "$0" + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe" + IfErrors +2 + StrCpy $INSTEXE "$0" + Goto FINISHED + +ABORT: + MessageBox MB_OK $(CheckStartupParamsMB) + Quit + +FINISHED: + ;MessageBox MB_OK "INSTPROG: $INSTPROG, INSTEXE: $INSTEXE, INSTFLAGS: $INSTFLAGS" +pop $R0 +pop $0 +FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function un.CheckStartupParams +push $0 +push $R0 + + ; Look for a registry entry with info about where to update. + Call un.GetProgramName + pop $R0 + StrCpy $INSTPROG "$R0" + StrCpy $INSTEXE "$R0.exe" + + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" + ; If key doesn't exist, skip install + IfErrors ABORT + StrCpy $INSTDIR "$0" + + ; We now have a directory to install to. Get the startup parameters and shortcut as well. + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Flags" + IfErrors +2 + StrCpy $INSTFLAGS "$0" + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut" + IfErrors +2 + StrCpy $INSTSHORTCUT "$0" + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe" + IfErrors +2 + StrCpy $INSTEXE "$0" + Goto FINISHED + +ABORT: + MessageBox MB_OK $(CheckStartupParamsMB) + Quit + +FINISHED: + ;MessageBox MB_OK "INSTPROG: $INSTPROG, INSTEXE: $INSTEXE, INSTFLAGS: $INSTFLAGS" +pop $R0 +pop $0 +FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; After install completes, offer readme file +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function .onInstSuccess + MessageBox MB_YESNO \ + $(InstSuccesssQuestion) /SD IDYES IDNO NoReadme + ; Assumes SetOutPath $INSTDIR + Exec '"$INSTDIR\$INSTEXE" $INSTFLAGS' + NoReadme: +FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Remove old NSIS version. Modifies no variables. +; Does NOT delete the LindenWorld directory, or any +; user files in that directory. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function RemoveNSIS + Push $0 + ; Grab the installation directory of the old version + DetailPrint $(RemoveOldNSISVersion) + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" + + ; If key doesn't exist, skip uninstall + IfErrors NO_NSIS + + ; Clean up legacy beta shortcuts + Delete "$SMPROGRAMS\Second Life Beta.lnk" + Delete "$DESKTOP\Second Life Beta.lnk" + Delete "$SMPROGRAMS\Second Life.lnk" + + ; Clean up old newview.exe file + Delete "$INSTDIR\newview.exe" + + ; Intentionally don't delete the stuff in + ; Documents and Settings, so we keep the user's settings + + NO_NSIS: + Pop $0 +FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Make sure we're not on Windows 98 / ME +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function CheckWindowsVersion + DetailPrint "Checking Windows version..." + Call GetWindowsVersion + Pop $R0 + ; Just get first two characters, ignore 4.0 part of "NT 4.0" + StrCpy $R0 $R0 2 + ; Blacklist certain OS versions + StrCmp $R0 "95" win_ver_bad + StrCmp $R0 "98" win_ver_bad + StrCmp $R0 "ME" win_ver_bad + StrCmp $R0 "NT" win_ver_bad + Return +win_ver_bad: + MessageBox MB_YESNO $(CheckWindowsVersionMB) IDNO win_ver_abort + Return +win_ver_abort: + Quit +FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Make sure the user can install/uninstall +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function CheckIfAdministrator + DetailPrint $(CheckAdministratorInstDP) + UserInfo::GetAccountType + Pop $R0 + StrCmp $R0 "Admin" is_admin + MessageBox MB_OK $(CheckAdministratorInstMB) + Quit +is_admin: + Return +FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function un.CheckIfAdministrator + DetailPrint $(CheckAdministratorUnInstDP) + UserInfo::GetAccountType + Pop $R0 + StrCmp $R0 "Admin" is_admin + MessageBox MB_OK $(CheckAdministratorUnInstMB) + Quit +is_admin: + Return +FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Checks to see if the current version has already been installed (according to the registry). +; If it has, allow user to bail out of install process. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function CheckIfAlreadyCurrent + Push $0 + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" + StrCmp $0 ${VERSION_LONG} 0 DONE + MessageBox MB_OKCANCEL $(CheckIfCurrentMB) /SD IDOK IDOK DONE + Quit + + DONE: + Pop $0 + Return +FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Close the program, if running. Modifies no variables. +; Allows user to bail out of install process. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function CloseSecondLife + Push $0 + FindWindow $0 "Second Life" "" + IntCmp $0 0 DONE + MessageBox MB_OKCANCEL $(CloseSecondLifeInstMB) IDOK CLOSE IDCANCEL CANCEL_INSTALL + + CANCEL_INSTALL: + Quit + + CLOSE: + DetailPrint $(CloseSecondLifeInstDP) + SendMessage $0 16 0 0 + + LOOP: + FindWindow $0 "Second Life" "" + IntCmp $0 0 DONE + Sleep 500 + Goto LOOP + + DONE: + Pop $0 + Return +FunctionEnd + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Delete files in Documents and Settings\\SecondLife\cache +; Delete files in Documents and Settings\All Users\SecondLife\cache +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Function RemoveCacheFiles +; +;; Delete files in Documents and Settings\\SecondLife +;Push $0 +;Push $1 +;Push $2 +; DetailPrint $(RemoveCacheFilesDP) +; +; StrCpy $0 0 ; Index number used to iterate via EnumRegKey +; +; LOOP: +; EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0 +; StrCmp $1 "" DONE ; no more users +; +; ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath" +; StrCmp $2 "" CONTINUE 0 ; "ProfileImagePath" value is missing +; +; ; Required since ProfileImagePath is of type REG_EXPAND_SZ +; ExpandEnvStrings $2 $2 +; +; ; When explicitly uninstalling, everything goes away +; RMDir /r "$2\Application Data\SecondLife\cache" +; +; CONTINUE: +; IntOp $0 $0 + 1 +; Goto LOOP +; DONE: +;Pop $2 +;Pop $1 +;Pop $0 +; +;; Delete files in Documents and Settings\All Users\SecondLife +;Push $0 +; ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData" +; StrCmp $0 "" +2 +; RMDir /r "$0\SecondLife\cache" +;Pop $0 +; +;; Delete filse in C:\Windows\Application Data\SecondLife +;; If the user is running on a pre-NT system, Application Data lives here instead of +;; in Documents and Settings. +;RMDir /r "$WINDIR\Application Data\SecondLife\cache" +; +;FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Delete files in Documents and Settings\\SecondLife +; Delete files in Documents and Settings\All Users\SecondLife +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Function un.DocumentsAndSettingsFolder +; +;; Delete files in Documents and Settings\\SecondLife +;Push $0 +;Push $1 +;Push $2 +; +; DetailPrint "Deleting files in Documents and Settings folder" +; +; StrCpy $0 0 ; Index number used to iterate via EnumRegKey +; +; LOOP: +; EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0 +; StrCmp $1 "" DONE ; no more users +; +; ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath" +; StrCmp $2 "" CONTINUE 0 ; "ProfileImagePath" value is missing +; +; ; Required since ProfileImagePath is of type REG_EXPAND_SZ +; ExpandEnvStrings $2 $2 +; +; ; If uninstalling a normal install remove everything +; ; Otherwise (preview/dmz etc) just remove cache +; StrCmp $INSTFLAGS "" RM_ALL RM_CACHE +; RM_ALL: +; RMDir /r "$2\Application Data\SecondLife" +; GoTo CONTINUE +; RM_CACHE: +; RMDir /r "$2\Application Data\SecondLife\Cache" +; +; CONTINUE: +; IntOp $0 $0 + 1 +; Goto LOOP +; DONE: +; +;Pop $2 +;Pop $1 +;Pop $0 +; +;; Delete files in Documents and Settings\All Users\SecondLife +;Push $0 +; ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData" +; StrCmp $0 "" +2 +; RMDir /r "$0\SecondLife" +;Pop $0 +; +;; Delete filse in C:\Windows\Application Data\SecondLife +;; If the user is running on a pre-NT system, Application Data lives here instead of +;; in Documents and Settings. +;RMDir /r "$WINDIR\Application Data\SecondLife" +; +;FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Close the program, if running. Modifies no variables. +; Allows user to bail out of uninstall process. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function un.CloseSecondLife + Push $0 + FindWindow $0 "Second Life" "" + IntCmp $0 0 DONE + MessageBox MB_OKCANCEL $(CloseSecondLifeUnInstMB) IDOK CLOSE IDCANCEL CANCEL_UNINSTALL + + CANCEL_UNINSTALL: + Quit + + CLOSE: + DetailPrint $(CloseSecondLifeUnInstDP) + SendMessage $0 16 0 0 + + LOOP: + FindWindow $0 "Second Life" "" + IntCmp $0 0 DONE + Sleep 500 + Goto LOOP + + DONE: + Pop $0 + Return +FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Delete the installed files +;;; This deletes the uninstall executable, but it works +;;; because it is copied to temp directory before running +;;; +;;; Note: You must list all files here, because we only +;;; want to delete our files, not things users left in the +;;; application directories. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function un.ProgramFiles + +;; Remove mozilla file first so recursive directory deletion doesn't get hung up +Delete "$INSTDIR\app_settings\mozilla\components" + +;; This placeholder is replaced by the complete list of files to uninstall by viewer_manifest.py +%%DELETE_FILES%% + +;; Optional/obsolete files. Delete won't fail if they don't exist. +Delete "$INSTDIR\dronesettings.ini" +Delete "$INSTDIR\message_template.msg" +Delete "$INSTDIR\newview.pdb" +Delete "$INSTDIR\newview.map" +Delete "$INSTDIR\SecondLife.pdb" +Delete "$INSTDIR\SecondLife.map" +Delete "$INSTDIR\comm.dat" +Delete "$INSTDIR\*.glsl" +Delete "$INSTDIR\motions\*.lla" +Delete "$INSTDIR\trial\*.html" +Delete "$INSTDIR\newview.exe" +;; Remove entire help directory +Delete "$INSTDIR\help\Advanced\*" +RMDir "$INSTDIR\help\Advanced" +Delete "$INSTDIR\help\basics\*" +RMDir "$INSTDIR\help\basics" +Delete "$INSTDIR\help\Concepts\*" +RMDir "$INSTDIR\help\Concepts" +Delete "$INSTDIR\help\welcome\*" +RMDir "$INSTDIR\help\welcome" +Delete "$INSTDIR\help\*" +RMDir "$INSTDIR\help" + +Delete "$INSTDIR\uninst.exe" +RMDir "$INSTDIR" + +IfFileExists "$INSTDIR" FOLDERFOUND NOFOLDER + +FOLDERFOUND: + MessageBox MB_YESNO $(DeleteProgramFilesMB) IDNO NOFOLDER + RMDir /r "$INSTDIR" + +NOFOLDER: + +FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Uninstall settings +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +UninstallText $(UninstallTextMsg) +ShowUninstDetails show + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Uninstall section +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Section Uninstall + +; Start with some default values. +StrCpy $INSTFLAGS "" +StrCpy $INSTPROG "${INSTNAME}" +StrCpy $INSTEXE "${INSTEXE}" +StrCpy $INSTSHORTCUT "${SHORTCUT}" +Call un.CheckStartupParams ; Figure out where, what and how to uninstall. +Call un.CheckIfAdministrator ; Make sure the user can install/uninstall + +; uninstall for all users (if you change this, change it in the install as well) +SetShellVarContext all + +; Make sure we're not running +Call un.CloseSecondLife + +; Clean up registry keys +DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" +DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" + +; Clean up shortcuts +Delete "$SMPROGRAMS\$INSTSHORTCUT\*.*" +RMDir "$SMPROGRAMS\$INSTSHORTCUT" + +Delete "$DESKTOP\$INSTSHORTCUT.lnk" +Delete "$INSTDIR\$INSTSHORTCUT.lnk" +Delete "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" + +; Clean up cache and log files. +; Leave them in-place for non AGNI installs. + +!ifdef UNINSTALL_SETTINGS +Call un.DocumentsAndSettingsFolder +!endif + +Call un.ProgramFiles + +SectionEnd ; end of uninstall section + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; (From the NSIS wiki, DK) +; GetParameterValue +; +; Usage: +; !insertmacro GetParameterValue "/L=" "1033" +; pop $R0 +; +; Returns on top of stack +; +; Example command lines: +; foo.exe /S /L=1033 /D=C:\Program Files\Foo +; or: +; foo.exe /S "/L=1033" /D="C:\Program Files\Foo" +; gpv "/L=" "1033" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + !macro GetParameterValue SWITCH DEFAULT + Push $0 + Push $1 + Push $2 + Push $3 + Push $4 + + ;$CMDLINE='"My Setup\Setup.exe" /L=1033 /S' + Push "$CMDLINE" + Push '${SWITCH}"' + !insertmacro StrStr + Pop $0 + StrCmp "$0" "" gpv_notquoted + ;$0='/L="1033" /S' + StrLen $2 "$0" + Strlen $1 "${SWITCH}" + IntOp $1 $1 + 1 + StrCpy $0 "$0" $2 $1 + ;$0='1033" /S' + Push "$0" + Push '"' + !insertmacro StrStr + Pop $1 + StrLen $2 "$0" + StrLen $3 "$1" + IntOp $4 $2 - $3 + StrCpy $0 $0 $4 0 + Goto gpv_done + + gpv_notquoted: + Push "$CMDLINE" + Push "${SWITCH}" + !insertmacro StrStr + Pop $0 + StrCmp "$0" "" gpv_done + ;$0='/L="1033" /S' + StrLen $2 "$0" + Strlen $1 "${SWITCH}" + StrCpy $0 "$0" $2 $1 + ;$0=1033 /S' + Push "$0" + Push ' ' + !insertmacro StrStr + Pop $1 + StrLen $2 "$0" + StrLen $3 "$1" + IntOp $4 $2 - $3 + StrCpy $0 $0 $4 0 + Goto gpv_done + + gpv_done: + StrCmp "$0" "" 0 +2 + StrCpy $0 "${DEFAULT}" + + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch $0 + !macroend + +; And I had to modify StrStr a tiny bit. +; Possible upgrade switch the goto's to use ${__LINE__} + +!macro STRSTR + Exch $R1 ; st=haystack,old$R1, $R1=needle + Exch ; st=old$R1,haystack + Exch $R2 ; st=old$R1,old$R2, $R2=haystack + Push $R3 + Push $R4 + Push $R5 + StrLen $R3 $R1 + StrCpy $R4 0 + ; $R1=needle + ; $R2=haystack + ; $R3=len(needle) + ; $R4=cnt + ; $R5=tmp + ; loop; + StrCpy $R5 $R2 $R3 $R4 + StrCmp $R5 $R1 +4 + StrCmp $R5 "" +3 + IntOp $R4 $R4 + 1 + Goto -4 + ; done; + StrCpy $R1 $R2 "" $R4 + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Exch $R1 +!macroend + +Function GetProgramName + !insertmacro GetParameterValue "/P=" "SecondLife" +FunctionEnd + +Function un.GetProgramName + !insertmacro GetParameterValue "/P=" "SecondLife" +FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; (From the NSIS documentation, JC) +; GetWindowsVersion +; +; Based on Yazno's function, http://yazno.tripod.com/powerpimpit/ +; Updated by Joost Verburg +; +; Returns on top of stack +; +; Windows Version (95, 98, ME, NT x.x, 2000, XP, 2003) +; or +; '' (Unknown Windows Version) +; +; Usage: +; Call GetWindowsVersion +; Pop $R0 +; ; at this point $R0 is "NT 4.0" or whatnot +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function GetWindowsVersion + + Push $R0 + Push $R1 + + ReadRegStr $R0 HKLM \ + "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion + + IfErrors 0 lbl_winnt + + ; we are not NT + ReadRegStr $R0 HKLM \ + "SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber + + StrCpy $R1 $R0 1 + StrCmp $R1 '4' 0 lbl_error + + StrCpy $R1 $R0 3 + + StrCmp $R1 '4.0' lbl_win32_95 + StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98 + + lbl_win32_95: + StrCpy $R0 '95' + Goto lbl_done + + lbl_win32_98: + StrCpy $R0 '98' + Goto lbl_done + + lbl_win32_ME: + StrCpy $R0 'ME' + Goto lbl_done + + lbl_winnt: + + StrCpy $R1 $R0 1 + + StrCmp $R1 '3' lbl_winnt_x + StrCmp $R1 '4' lbl_winnt_x + + StrCpy $R1 $R0 3 + + StrCmp $R1 '5.0' lbl_winnt_2000 + StrCmp $R1 '5.1' lbl_winnt_XP + StrCmp $R1 '5.2' lbl_winnt_2003 lbl_error + + lbl_winnt_x: + StrCpy $R0 "NT $R0" 6 + Goto lbl_done + + lbl_winnt_2000: + Strcpy $R0 '2000' + Goto lbl_done + + lbl_winnt_XP: + Strcpy $R0 'XP' + Goto lbl_done + + lbl_winnt_2003: + Strcpy $R0 '2003' + Goto lbl_done + + lbl_error: + Strcpy $R0 '' + lbl_done: + + Pop $R1 + Exch $R0 + +FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +!define LANGUAGE_SELECTION_REGISTRY_ROOT "HKCU" +!define LANGUAGE_SELECTION_REGISTRY_KEY "Software\Linden Research, Inc." +!define LANGUAGE_SELECTION_REGISTRY_VALUENAME "Installer Language" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Note: to add new languages, add an entry to the menu +;; and then add an entry to the language ID selector below +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function .onInit + + ; read the language from registry (ok if not there) and set langauge menu + ReadRegStr $0 '${LANGUAGE_SELECTION_REGISTRY_ROOT}' '${LANGUAGE_SELECTION_REGISTRY_KEY}' '${LANGUAGE_SELECTION_REGISTRY_VALUENAME}' + StrCpy $LANGUAGE $0 + + Push "" + Push ${LANG_ENGLISH} + Push English + Push ${LANG_GERMAN} + Push German + Push ${LANG_JAPANESE} + Push Japanese + Push ${LANG_KOREAN} + Push Korean + Push A ; A means auto count languages for the auto count to work the first empty push (Push "") must remain + LangDLL::LangDialog "Installer Language" "Please select the language of the installer" + Pop $LANGUAGE + StrCmp $LANGUAGE "cancel" 0 +2 + Abort + + ; save language in registry + WriteRegStr '${LANGUAGE_SELECTION_REGISTRY_ROOT}' '${LANGUAGE_SELECTION_REGISTRY_KEY}' '${LANGUAGE_SELECTION_REGISTRY_VALUENAME}' $LANGUAGE + + ; generate language ID that will be used as a command line arg + StrCmp $LANGUAGE "1042" 0 +3 + StrCpy $LANGFLAGS " -set SystemLanguage ko" + Goto EndOfFunc + StrCmp $LANGUAGE "1041" 0 +3 + StrCpy $LANGFLAGS " -set SystemLanguage ja" + Goto EndOfFunc + StrCmp $LANGUAGE "1031" 0 +3 + StrCpy $LANGFLAGS " -set SystemLanguage de" + Goto EndOfFunc + StrCmp $LANGUAGE "1033" 0 +3 + StrCpy $LANGFLAGS " -set SystemLanguage en-us" + Goto EndOfFunc + + EndOfFunc: + +FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function un.onInit + + ; read language from registry and set for ininstaller + ReadRegStr $0 '${LANGUAGE_SELECTION_REGISTRY_ROOT}' '${LANGUAGE_SELECTION_REGISTRY_KEY}' '${LANGUAGE_SELECTION_REGISTRY_VALUENAME}' + StrCpy $LANGUAGE $0 + +FunctionEnd + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EOF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; \ No newline at end of file diff --git a/linden/indra/newview/installers/windows/lang_de.nsi b/linden/indra/newview/installers/windows/lang_de.nsi new file mode 100644 index 0000000..71d2138 --- /dev/null +++ b/linden/indra/newview/installers/windows/lang_de.nsi @@ -0,0 +1,57 @@ +; First is default +LoadLanguageFile "${NSISDIR}\Contrib\Language files\German.nlf" + +; subtitle on license text caption (setup new version or update current one +LangString LicenseSubTitleUpdate ${LANG_GERMAN} " Update" +LangString LicenseSubTitleSetup ${LANG_GERMAN} " Setup" + +; description on license page +LangString LicenseDescUpdate ${LANG_GERMAN} "Dieses Paket wird Second Life auf Version ${VERSION_LONG}.updaten" +LangString LicenseDescSetup ${LANG_GERMAN} "Dieses Paket installiert Second Life auf Ihrem Computer." +LangString LicenseDescNext ${LANG_GERMAN} "Nächster Schritt" + +; installation directory text +LangString DirectoryChooseTitle ${LANG_GERMAN} "Installations Ordner" +LangString DirectoryChooseUpdate ${LANG_GERMAN} "Wählen Sie den Second Life Ordner für dieses Update:" +LangString DirectoryChooseSetup ${LANG_GERMAN} "Wählen Sie den Pfad, in den Sie Second Life installieren möchten:" + +; CheckStartupParams message box +LangString CheckStartupParamsMB ${LANG_GERMAN} "Konnte Programm '$INSTPROG' nicht finden. Stilles Update fehlgeschlagen." + +; installation success dialog +LangString InstSuccesssQuestion ${LANG_GERMAN} "Second Life jetzt starten?" + +; remove old NSIS version +LangString RemoveOldNSISVersion ${LANG_GERMAN} "Überprüfe alte Version..." + +; check windows version +LangString CheckWindowsVersionDP ${LANG_GERMAN} "Überprüfe Windows Version..." +LangString CheckWindowsVersionMB ${LANG_GERMAN} 'Second Life unterstützt nur Windows XP, Windows 2000 und Mac OS X.$\n$\nDer Versuch es auf Windows $R0 zu installieren, könnte in unvorhersehbaren Abstürtzen und zu Datenverlust führen.$\n$\nTrotzdem installieren?' + +; checkifadministrator function (install) +LangString CheckAdministratorInstDP ${LANG_GERMAN} "Überprüfe nach Genehmigung zur Installation..." +LangString CheckAdministratorInstMB ${LANG_GERMAN} 'Es scheint so, als würden Sie einen "limited" Account verwenden.$\nSie müssen ein"administrator" sein, um Second Life installieren zu können..' + +; checkifadministrator function (uninstall) +LangString CheckAdministratorUnInstDP ${LANG_GERMAN} "Überprüfe Genehmigung zum Deinstallieren..." +LangString CheckAdministratorUnInstMB ${LANG_GERMAN} 'Es scheint so, als würden Sie einen "limited" Account verwenden.$\nSie müssen ein"administrator" sein, um Second Life installieren zu können..' + +; checkifalreadycurrent +LangString CheckIfCurrentMB ${LANG_GERMAN} "Es scheint so, als hätten Sie Second Life ${VERSION_LONG} bereits installiert.$\n$\nWürden Sie es gerne erneut installieren?" + +; closesecondlife function (install) +LangString CloseSecondLifeInstDP ${LANG_GERMAN} "Warte darauf, dass Second Life beendet wird..." +LangString CloseSecondLifeInstMB ${LANG_GERMAN} "Second Life kann nicht installiert werden, wenn es bereits läuft.$\n$\nBeenden Sie, was Sie gerade tun und wählen Sie OK, um Second Life zu beenden oder Continue .$\nSelect CANCEL, um abzubrechen." + +; closesecondlife function (uninstall) +LangString CloseSecondLifeUnInstDP ${LANG_GERMAN} "Warte darauf, dass Second Life beendet wird..." +LangString CloseSecondLifeUnInstMB ${LANG_GERMAN} "Second Life kann nicht installiert werden, wenn es bereits läuft.$\n$\nBeenden Sie, was Sie gerade tun und wählen Sie OK, um Second Life zu beenden oder Continue .$\nSelect CANCEL, um abzubrechen." + +; removecachefiles +LangString RemoveCacheFilesDP ${LANG_GERMAN} "Lösche alle Cache Files in Dokumente und Einstellungen" + +; delete program files +LangString DeleteProgramFilesMB ${LANG_GERMAN} "Es bestehen weiterhin Dateien in Ihrem SecondLife Programm Ordner.$\n$\nDies sind möglicherweise Dateien, die sie modifiziert oder bewegt haben:$\n$INSTDIR$\n$\nMöchten Sie diese ebenfalls löschen?" + +; uninstall text +LangString UninstallTextMsg ${LANG_GERMAN} "Dies wird Second Life ${VERSION_LONG} von Ihrem System entfernen." \ No newline at end of file diff --git a/linden/indra/newview/installers/windows/lang_en-us.nsi b/linden/indra/newview/installers/windows/lang_en-us.nsi new file mode 100644 index 0000000..c26af12 --- /dev/null +++ b/linden/indra/newview/installers/windows/lang_en-us.nsi @@ -0,0 +1,57 @@ +; First is default +LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf" + +; subtitle on license text caption +LangString LicenseSubTitleUpdate ${LANG_ENGLISH} " Update" +LangString LicenseSubTitleSetup ${LANG_ENGLISH} " Setup" + +; description on license page +LangString LicenseDescUpdate ${LANG_ENGLISH} "This package will update Second Life to version ${VERSION_LONG}.(XXX)" +LangString LicenseDescSetup ${LANG_ENGLISH} "This package will install Second Life on your computer." +LangString LicenseDescNext ${LANG_ENGLISH} "Next" + +; installation directory text +LangString DirectoryChooseTitle ${LANG_ENGLISH} "Installation Directory" +LangString DirectoryChooseUpdate ${LANG_ENGLISH} "Select the Second Life directory to update:" +LangString DirectoryChooseSetup ${LANG_ENGLISH} "Select the directory to install Second Life in:" + +; CheckStartupParams message box +LangString CheckStartupParamsMB ${LANG_ENGLISH} "Could not find the program '$INSTPROG'. Silent update failed." + +; installation success dialog +LangString InstSuccesssQuestion ${LANG_ENGLISH} "Start Second Life now?" + +; remove old NSIS version +LangString RemoveOldNSISVersion ${LANG_ENGLISH} "Checking for old version..." + +; check windows version +LangString CheckWindowsVersionDP ${LANG_ENGLISH} "Checking Windows version..." +LangString CheckWindowsVersionMB ${LANG_ENGLISH} 'Second Life only supports Windows XP, Windows 2000, and Mac OS X.$\n$\nAttempting to install on Windows $R0 can result in crashes and data loss.$\n$\nInstall anyway?' + +; checkifadministrator function (install) +LangString CheckAdministratorInstDP ${LANG_ENGLISH} "Checking for permission to install..." +LangString CheckAdministratorInstMB ${LANG_ENGLISH} 'You appear to be using a "limited" account.$\nYou must be an "administrator" to install Second Life.' + +; checkifadministrator function (uninstall) +LangString CheckAdministratorUnInstDP ${LANG_ENGLISH} "Checking for permission to uninstall..." +LangString CheckAdministratorUnInstMB ${LANG_ENGLISH} 'You appear to be using a "limited" account.$\nYou must be an "administrator" to uninstall Second Life.' + +; checkifalreadycurrent +LangString CheckIfCurrentMB ${LANG_ENGLISH} "It appears that Second Life ${VERSION_LONG} is already installed.$\n$\nWould you like to install it again?" + +; closesecondlife function (install) +LangString CloseSecondLifeInstDP ${LANG_ENGLISH} "Waiting for Second Life to shut down..." +LangString CloseSecondLifeInstMB ${LANG_ENGLISH} "Second Life can't be installed while it is already running.$\n$\nFinish what you're doing then select OK to close Second Life and continue.$\nSelect CANCEL to cancel installation." + +; closesecondlife function (uninstall) +LangString CloseSecondLifeUnInstDP ${LANG_ENGLISH} "Waiting for Second Life to shut down..." +LangString CloseSecondLifeUnInstMB ${LANG_ENGLISH} "Second Life can't be uninstalled while it is already running.$\n$\nFinish what you're doing then select OK to close Second Life and continue.$\nSelect CANCEL to cancel." + +; removecachefiles +LangString RemoveCacheFilesDP ${LANG_ENGLISH} "Deleting cache files in Documents and Settings folder" + +; delete program files +LangString DeleteProgramFilesMB ${LANG_ENGLISH} "There are still files in your SecondLife program directory.$\n$\nThese are possibly files you created or moved to:$\n$INSTDIR$\n$\nDo you want to remove them?" + +; uninstall text +LangString UninstallTextMsg ${LANG_ENGLISH} "This will uninstall Second Life ${VERSION_LONG} from your system." diff --git a/linden/indra/newview/installers/windows/lang_ja.nsi b/linden/indra/newview/installers/windows/lang_ja.nsi new file mode 100644 index 0000000..43cb492 --- /dev/null +++ b/linden/indra/newview/installers/windows/lang_ja.nsi @@ -0,0 +1,57 @@ +; First is default +LoadLanguageFile "${NSISDIR}\Contrib\Language files\Japanese.nlf" + +; subtitle on license text caption +LangString LicenseSubTitleUpdate ${LANG_JAPANESE} " ƒAƒbƒvƒf[ƒg" +LangString LicenseSubTitleSetup ${LANG_JAPANESE} " ƒZƒbƒgƒAƒbƒv" + +; description on license page +LangString LicenseDescUpdate ${LANG_JAPANESE} "‚±‚̃pƒbƒP[ƒW‚̓ZƒJƒ“ƒhƒ‰ƒCƒt‚ðƒo[ƒWƒ‡ƒ“${VERSION_LONG}.‚ɃAƒbƒvƒf[ƒg‚µ‚Ü‚·B" +LangString LicenseDescSetup ${LANG_JAPANESE} "‚±‚̃pƒbƒP[ƒW‚Í‚ ‚È‚½‚̃Rƒ“ƒsƒ…[ƒ^‚ɃZƒJƒ“ƒhƒ‰ƒCƒt‚ðƒCƒ“ƒXƒg[ƒ‹‚µ‚Ü‚·B" +LangString LicenseDescNext ${LANG_JAPANESE} "ŽŸ" + +; installation directory text +LangString DirectoryChooseTitle ${LANG_JAPANESE} "ƒCƒ“ƒXƒg[ƒ‹EƒfƒBƒŒƒNƒgƒŠ" +LangString DirectoryChooseUpdate ${LANG_JAPANESE} "ƒAƒbƒvƒf[ƒg‚·‚éƒZƒJƒ“ƒhƒ‰ƒCƒt‚̃fƒBƒŒƒNƒgƒŠ‚ð‘I‘ð‚µ‚Ä‚­‚¾‚³‚¢B:" +LangString DirectoryChooseSetup ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚éƒfƒBƒŒƒNƒgƒŠ‚ð‘I‘ð‚µ‚Ä‚­‚¾‚³‚¢B: " + +; CheckStartupParams message box +LangString CheckStartupParamsMB ${LANG_JAPANESE} "ƒvƒƒOƒ‰ƒ€–¼'$INSTPROG'‚ªŒ©‚‚©‚è‚Ü‚¹‚ñBƒTƒCƒŒƒ“ƒgEƒAƒbƒvƒf[ƒg‚ÉŽ¸”s‚µ‚Ü‚µ‚½B" + +; installation success dialog +LangString InstSuccesssQuestion ${LANG_JAPANESE} "’¼‚¿‚ɃZƒJƒ“ƒhƒ‰ƒCƒt‚ðŠJŽn‚µ‚Ü‚·‚©H " + +; remove old NSIS version +LangString RemoveOldNSISVersion ${LANG_JAPANESE} "ŒÃ‚¢ƒo[ƒWƒ‡ƒ“î•ñ‚ðƒ`ƒFƒbƒN’†‚Å‚·c" + +; check windows version +LangString CheckWindowsVersionDP ${LANG_JAPANESE} "ƒEƒBƒ“ƒhƒEƒY‚̃o[ƒWƒ‡ƒ“î•ñ‚ðƒ`ƒFƒbƒN’†‚Å‚·..." +LangString CheckWindowsVersionMB ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚ÍWindows XPAWindows 2000AMac OS X‚Ì‚Ý‚ðƒTƒ|[ƒg‚µ‚Ä‚¢‚Ü‚·BWindows $R0‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚鎖‚ÍAƒf[ƒ^‚ÌÁŽ¸‚âƒNƒ‰ƒbƒVƒ…‚ÌŒ´ˆö‚É‚È‚é‰Â”\«‚ª‚ ‚è‚Ü‚·BƒCƒ“ƒXƒg[ƒ‹‚𑱂¯‚Ü‚·‚©H" + +; checkifadministrator function (install) +LangString CheckAdministratorInstDP ${LANG_JAPANESE} "ƒCƒ“ƒXƒg[ƒ‹‚Ì‚½‚ß‚ÌŒ ŒÀ‚ðƒ`ƒFƒbƒN’†‚Å‚·..." +LangString CheckAdministratorInstMB ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚é‚É‚ÍŠÇ—ŽÒŒ ŒÀ‚ª•K—v‚Å‚·B" + +; checkifadministrator function (uninstall) +LangString CheckAdministratorUnInstDP ${LANG_JAPANESE} "ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚Ì‚½‚ß‚ÌŒ ŒÀ‚ðƒ`ƒFƒbƒN’†‚Å‚·..." +LangString CheckAdministratorUnInstMB ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚·‚é‚É‚ÍŠÇ—ŽÒŒ ŒÀ‚ª•K—v‚Å‚·B" + +; checkifalreadycurrent +LangString CheckIfCurrentMB ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt${VERSION_LONG} ‚̓Cƒ“ƒXƒg[ƒ‹Ï‚Ý‚Å‚·BÄ“xƒCƒ“ƒXƒg[ƒ‹‚µ‚Ü‚·‚©H " + +; closesecondlife function (install) +LangString CloseSecondLifeInstDP ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚ðI—¹’†‚Å‚·..." +LangString CloseSecondLifeInstMB ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚Ì‹N“®’†‚ɃCƒ“ƒXƒg[ƒ‹‚Ío—ˆ‚Ü‚¹‚ñB’¼‚¿‚ɃZƒJƒ“ƒhƒ‰ƒCƒt‚ðI—¹‚µ‚ăCƒ“ƒXƒg[ƒ‹‚ðŠJŽn‚·‚éꇂÍOKƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ä‚­‚¾‚³‚¢BCANCEL‚ð‰Ÿ‚·‚Æ’†Ž~‚µ‚Ü‚·B" + +; closesecondlife function (uninstall) +LangString CloseSecondLifeUnInstDP ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚ðI—¹’†‚Å‚·..." +LangString CloseSecondLifeUnInstMB ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚Ì‹N“®’†‚ɃAƒ“ƒCƒ“ƒXƒg[ƒ‹‚Ío—ˆ‚Ü‚¹‚ñB’¼‚¿‚ɃZƒJƒ“ƒhƒ‰ƒCƒt‚ðI—¹‚µ‚ăAƒ“ƒCƒ“ƒXƒg[ƒ‹‚ðŠJŽn‚·‚éꇂÍOKƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ä‚­‚¾‚³‚¢BCANCEL‚ð‰Ÿ‚·‚Æ’†Ž~‚µ‚Ü‚·B" + +; removecachefiles +LangString RemoveCacheFilesDP ${LANG_JAPANESE} " Documents and Settings ƒtƒHƒ‹ƒ_‚̃LƒƒƒbƒVƒ…ƒtƒ@ƒCƒ‹‚ðƒfƒŠ[ƒg’†‚Å‚·B" + +; delete program files +LangString DeleteProgramFilesMB ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚̃fƒBƒŒƒNƒgƒŠ‚É‚ÍA‚Ü‚¾ƒtƒ@ƒCƒ‹‚ªŽc‚³‚ê‚Ä‚¢‚Ü‚·B$\n$INSTDIR$\n‚É‚ ‚È‚½‚ªì¬A‚Ü‚½‚͈ړ®‚³‚¹‚½ƒtƒ@ƒCƒ‹‚ª‚ ‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B‘S‚Ä휂µ‚Ü‚·‚©H " + +; uninstall text +LangString UninstallTextMsg ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt${VERSION_LONG}‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚µ‚Ü‚·B" diff --git a/linden/indra/newview/installers/windows/lang_ko.nsi b/linden/indra/newview/installers/windows/lang_ko.nsi new file mode 100644 index 0000000..4e6b5ec --- /dev/null +++ b/linden/indra/newview/installers/windows/lang_ko.nsi @@ -0,0 +1,57 @@ +; First is default +LoadLanguageFile "${NSISDIR}\Contrib\Language files\Korean.nlf" + +; subtitle on license text caption +LangString LicenseSubTitleUpdate ${LANG_KOREAN} "¾÷µ¥ÀÌÆ®" +LangString LicenseSubTitleSetup ${LANG_KOREAN} " ¼³Ä¡Çϱâ" + +; description on license page +LangString LicenseDescUpdate ${LANG_KOREAN} "ÀÌ ÆÑÅ°Áö´Â ¼¼ÄÁµå¶óÀÌÇÁ¸¦ ¹öÀü${VERSION_LONG}.À¸·Î ¾÷µ¥ÀÌÆ® ÇÕ´Ï´Ù. " +LangString LicenseDescSetup ${LANG_KOREAN} "ÀÌ ÆÑÅ°Áö´Â ¼¼ÄÁµå¶óÀÌÇÁ¸¦ ÄÄÇ»ÅÍ¿¡ ¼³Ä¡ÇÕ´Ï´Ù." +LangString LicenseDescNext ${LANG_KOREAN} "´ÙÀ½" + +; installation directory text +LangString DirectoryChooseTitle ${LANG_KOREAN} "¼³Ä¡ µð·ºÅ丮" +LangString DirectoryChooseUpdate ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ¸¦ ¾÷µ¥ÀÌÆ®ÇÒ µð·ºÅ丮¸¦ ¼±ÅÃÇϼ¼¿ä. " +LangString DirectoryChooseSetup ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ¸¦ ¼³Ä¡ÇÒ µð·ºÅ丮¸¦ ¼±ÅÃÇϼ¼¿ä:" + +; CheckStartupParams message box +LangString CheckStartupParamsMB ${LANG_KOREAN} " ¡®$INSTPROG¡¯ ÇÁ·Î±×·¥À» ãÁö ¸øÇß½À´Ï´Ù. ÀÚµ¿ ¾÷µ¥ÀÌÆ®¿¡ ½ÇÆÐÇß½À´Ï´Ù." + +; installation success dialog +LangString InstSuccesssQuestion ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ¸¦ ½ÃÀÛÇÏ°Ú½À´Ï±î?" + +; remove old NSIS version +LangString RemoveOldNSISVersion ${LANG_KOREAN} "ÀÌÀü ¹öÀüÀ» ã°í ÀÖ½À´Ï´Ù¡¦ " + +; check windows version +LangString CheckWindowsVersionDP ${LANG_KOREAN} "À©µµ¿ì ¹öÀüÀ» È®ÀÎÇÏ°í ÀÖ½À´Ï´Ù." +LangString CheckWindowsVersionMB ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ´Â À©µµ¿ì XP, À©µµ¿ì 2000, ±×¸®°í ¸Æ OS X¸¦ Áö¿øÇÕ´Ï´Ù. À©µµ¿ì $R0¿¡ ¼³Ä¡¸¦ ½ÃµµÇÏ¸é ¿ÀÀÛµ¿°ú µ¥ÀÌÅÍ ºÐ½ÇÀÌ ÀϾ ¼ö ÀÖ½À´Ï´Ù. °è¼Ó ¼³Ä¡ÇÏ°Ú½À´Ï±î? " + +; checkifadministrator function (install) +LangString CheckAdministratorInstDP ${LANG_KOREAN} "¼³Ä¡ ±ÇÇÑÀ» È®ÀÎ ÁßÀÔ´Ï´Ù... " +LangString CheckAdministratorInstMB ${LANG_KOREAN} "ÇöÀç ¡®¼Õ´Ô¡¯°èÁ¤À» »ç¿ë ÁßÀÔ´Ï´Ù. ¼¼ÄÁµå¶óÀÌÇÁ¸¦ ¼³Ä¡Çϱâ À§Çؼ± ¡®¿î¿µÀÚ¡± °èÁ¤À» »ç¿ëÇØ¾ß ÇÕ´Ï´Ù." + +; checkifadministrator function (uninstall) +LangString CheckAdministratorUnInstDP ${LANG_KOREAN} "Á¦°Å ±ÇÇÑÀ» È®ÀÎ ÁßÀÔ´Ï´Ù. " +LangString CheckAdministratorUnInstMB ${LANG_KOREAN} " ÇöÀç ¡®¼Õ´Ô¡¯°èÁ¤À» »ç¿ë ÁßÀÔ´Ï´Ù. ¼¼ÄÁµå¶óÀÌÇÁ¸¦ Á¦°ÅÇϱâ À§Çؼ± ¡®¿î¿µÀÚ¡± °èÁ¤À» »ç¿ëÇØ¾ß ÇÕ´Ï´Ù. " + +; checkifalreadycurrent +LangString CheckIfCurrentMB ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ ¹öÀü ${VERSION_LONG}ÀÌ ÀÌ¹Ì ¼³Ä¡µÇ¾î ÀÖ½À´Ï´Ù. ´Ù½Ã ¼³Ä¡ÇϽðڽÀ´Ï±î? " + +; closesecondlife function (install) +LangString CloseSecondLifeInstDP ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ¸¦ Á¾·áÇÒ ¶§ ±îÁö ´ë±â Áß¡¦ " +LangString CloseSecondLifeInstMB ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ°¡ ÀÌ¹Ì ÀÛµ¿ ÁßÀÏ °æ¿ì ¼³Ä¡¸¦ °è¼Ó ÇÒ ¼ö ¾ø½À´Ï´Ù. ÇöÀç ÀÛ¾÷À» ¸ØÃß°í ¡®È®ÀΡ¯À» ´­·¯ ¼¼ÄÁµå¶óÀÌÇÁ¸¦ Á¾·áÇÑ ´ÙÀ½ ÁøÇàÇϱ⠹ٶø´Ï´Ù. ¼³Ä¡¸¦ Ãë¼ÒÇÏ·Á¸é ¡®Ãë¼Ò¡¯¸¦ ´©¸£¼¼¿ä." + +; closesecondlife function (uninstall) +LangString CloseSecondLifeUnInstDP ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ¸¦ Á¾·áÇÒ ¶§ ±îÁö ´ë±â Áß¡¦¡±" +LangString CloseSecondLifeUnInstMB ${LANG_KOREAN} " ¼¼ÄÁµå¶óÀÌÇÁ°¡ ÀÌ¹Ì ÀÛµ¿ ÁßÀÏ °æ¿ì Á¦°Å¸¦ °è¼Ó ÇÒ ¼ö ¾ø½À´Ï´Ù. ÇöÀç ÀÛ¾÷À» ¸ØÃß°í ¡®È®ÀΡ¯À» ´­·¯ ¼¼ÄÁµå¶óÀÌÇÁ¸¦ Á¾·áÇÑ ´ÙÀ½ ÁøÇàÇϱ⠹ٶø´Ï´Ù. ¼³Ä¡¸¦ ÃëÇÏ·Á¸é ¡®Ãë¼Ò¡¯¸¦ ´©¸£¼¼¿ä. " + +; removecachefiles +LangString RemoveCacheFilesDP ${LANG_KOREAN} " Documents and Settings Æú´õ ³»ÀÇ Ä³½Ã ÆÄÀϵéÀ» Áö¿ó´Ï´Ù." + +; delete program files +LangString DeleteProgramFilesMB ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ ÇÁ·Î±×·¥ µð·ºÅ丮¿¡ ¾ÆÁ÷ ÆÄÀϵéÀÌ ³²¾Æ ÀÖ½À´Ï´Ù. ÀÌ ÆÄÀϵéÀº »ç¿ëÀÚ°¡ ¸¸µç °ÍµéÀ̰ųª$\n$INSTDIR$\n$\n·Î À̵¿ÇÑ ÆÄÀϵéÀÏ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ÆÄÀϵéÀ» Á¦°ÅÇÏ°Ú½À´Ï±î?" + +; uninstall text +LangString UninstallTextMsg ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ${VERSION_LONG}À» ½Ã½ºÅÛ¿¡¼­ Á¦°ÅÇÕ´Ï´Ù." diff --git a/linden/indra/newview/licenses-linux.txt b/linden/indra/newview/licenses-linux.txt index 20b76c8..a0dc048 100644 --- a/linden/indra/newview/licenses-linux.txt +++ b/linden/indra/newview/licenses-linux.txt @@ -159,6 +159,20 @@ FreeType License Portions of this software are copyright (c) 2003 The FreeType Project (www.freetype.org). All rights reserved. +========================== +FSI FontShop International +========================== + +Certain of the fonts in the Meta family of copyrighted typefaces are +used in Second Life under license from FSI FontShop +International. Copies of such Meta fonts that are included in the +Viewer are not themselves open source and are not available under the +GPL license, and they may not be copied. Developers may use those +fonts solely to the extent necessary to use or customize the Linden +Software in Second Life and to develop and distribute content solely +for use in the Second Life environment, and for no other purposes. +Second Life developers who wish to make other uses of Meta fonts must +obtain a license from FSI FontShop International at www.fontfont.com. ========== GL License diff --git a/linden/indra/newview/licenses-mac.txt b/linden/indra/newview/licenses-mac.txt index 77541ba..6fcf461 100644 --- a/linden/indra/newview/licenses-mac.txt +++ b/linden/indra/newview/licenses-mac.txt @@ -159,6 +159,20 @@ FreeType License Portions of this software are copyright (c) 2003 The FreeType Project (www.freetype.org). All rights reserved. +========================== +FSI FontShop International +========================== + +Certain of the fonts in the Meta family of copyrighted typefaces are +used in Second Life under license from FSI FontShop +International. Copies of such Meta fonts that are included in the +Viewer are not themselves open source and are not available under the +GPL license, and they may not be copied. Developers may use those +fonts solely to the extent necessary to use or customize the Linden +Software in Second Life and to develop and distribute content solely +for use in the Second Life environment, and for no other purposes. +Second Life developers who wish to make other uses of Meta fonts must +obtain a license from FSI FontShop International at www.fontfont.com. ========== GL License diff --git a/linden/indra/newview/licenses-win32.txt b/linden/indra/newview/licenses-win32.txt index 77541ba..6fcf461 100644 --- a/linden/indra/newview/licenses-win32.txt +++ b/linden/indra/newview/licenses-win32.txt @@ -159,6 +159,20 @@ FreeType License Portions of this software are copyright (c) 2003 The FreeType Project (www.freetype.org). All rights reserved. +========================== +FSI FontShop International +========================== + +Certain of the fonts in the Meta family of copyrighted typefaces are +used in Second Life under license from FSI FontShop +International. Copies of such Meta fonts that are included in the +Viewer are not themselves open source and are not available under the +GPL license, and they may not be copied. Developers may use those +fonts solely to the extent necessary to use or customize the Linden +Software in Second Life and to develop and distribute content solely +for use in the Second Life environment, and for no other purposes. +Second Life developers who wish to make other uses of Meta fonts must +obtain a license from FSI FontShop International at www.fontfont.com. ========== GL License diff --git a/linden/indra/newview/linux_tools/client-readme.txt b/linden/indra/newview/linux_tools/client-readme.txt index 7c972bb..cabb034 100644 --- a/linden/indra/newview/linux_tools/client-readme.txt +++ b/linden/indra/newview/linux_tools/client-readme.txt @@ -10,8 +10,16 @@ Life itself - please see . 3. Installing & Running 4. Known Issues 5. Troubleshooting + 5.1. 'Error creating window.' + 5.2. System hangs + 5.3. 'Shiny' and client performance + 5.4. Audio + 5.5. 'Alt' key for camera controls doesn't work 6. Advanced Troubleshooting -7. Getting more help, and reporting problems + 6.1. Audio + 6.2. OpenGL +7. Obtaining and working with the client source code +8. Getting more help, and reporting problems 1. INTRODUCTION @@ -28,6 +36,11 @@ with your system. Be aware that although the client itself is provided for testing purposes, any changes you make within the Second Life world are permanent. +You will have either obtained this client from secondlife.com (the official +site) or from a third-party packager; if you encounter any problems then +we recommend trying the latest official builds from secondlife.com which are +updated often. + Please enjoy! @@ -37,10 +50,10 @@ Please enjoy! Minimum requirements: * Internet Connection: Cable or DSL * Computer Processor: 800MHz Pentium III or Athlon, or better - * Computer Memory: 256MB or better + * Computer Memory: 256MB or better (strongly recommend more!) * Linux Operating System: A reasonably modern 32-bit Linux environment - is required. If you are running a 64-bit Linux distribution, you - may need a set of 32-bit compatibility libraries. + is required. If you are running a 64-bit Linux distribution then + you will need its 32-bit compatibility environment installed. * Video/Graphics Card: o nVidia GeForce 2, GeForce 4mx, or better o OR ATI Radeon 8500, 9250, or better @@ -125,7 +138,7 @@ SOLUTION:- Usually this indicates that your graphics card does not meet PROBLEM 2:- My whole system seems to hang when running Second Life. SOLUTION:- This is typically a hardware/driver issue. The first thing to do is to check that you have the most recent official drivers for your - graphics card. + graphics card (see PROBLEM 1). SOLUTION:- Some residents with ATI cards have reported that running 'sudo aticonfig --locked-userpages=off' before running Second Life solves their stability issues. @@ -147,6 +160,9 @@ SOLUTION:- Some graphics performance features in Second Life are disabled automatically used, and some new options in Preferences will now be available to you; there is no guarantee, however, that they will positively affect performance! +SOLUTION:- If you are not running an official Second Life client obtained from + secondlife.com, you should consider doing so as you may find its + performance to be superior to third-party versions. PROBLEM 4:- Sound effects seem to 'lag' a fraction of a second behind actions. @@ -154,6 +170,13 @@ SOLUTION:- You may uncomment the 'LL_BAD_ESD' line in the 'secondlife' script to get more responsive audio. However, if you do this then you may encounter audio issues or a hang during login, so beware. +PROBLEM 5:- Using the 'Alt' key to control the camera doesn't work or just + moves the Second Life window. +SOLUTION:- Some window managers eat the Alt key for their own purposes; you + can configure your window manager to use a different key instead (for + example, the 'Windows' key!) which will allow the Alt key to function + properly with mouse actions in Second Life and other applications. + 6. ADVANCED TROUBLESHOOTING -=-=-=-=-=-=-=-=-=-=-=-=-=- @@ -178,15 +201,28 @@ configuration options for advanced troubleshooters. LL_GL_BASICEXT and LL_GL_NOEXT should be commented-out for this to be useful. -7. GETTING MORE HELP AND REPORTING PROBLEMS +7. OBTAINING AND WORKING WITH THE CLIENT SOURCE CODE +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +We're pleased to have released the Second Life client's source code under +an Open Source license compatible with the 'GPL'. To get involved with client +development, please see: + + + +8. GETTING MORE HELP AND REPORTING PROBLEMS -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- For general help and support with Second Life: +For problems and discussion concerning unofficial (not secondlife.com) +releases, please contact your packager or the SLDev mailing list: + + In-world help: Please use the 'Help' menu in the client for general non-Linux-specific Second Life help including live support from the fabulous -Live Help team. +'Help Request' team. In-world discussion: There is a 'Linux Client Users' group inside Second Life which is free to join. You can find it by pressing diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp index a6ec948..ff16682 100644 --- a/linden/indra/newview/llagent.cpp +++ b/linden/indra/newview/llagent.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -222,6 +223,9 @@ BOOL LLAgent::sDebugDisplayTarget = FALSE; const F32 LLAgent::TYPING_TIMEOUT_SECS = 5.f; +std::map LLAgent::sTeleportErrorMessages; +std::map LLAgent::sTeleportProgressMessages; + class LLAgentFriendObserver : public LLFriendObserver { public: @@ -328,9 +332,6 @@ LLAgent::LLAgent() mbJump(FALSE), - mWanderTimer(), - mWanderTargetGlobal( LLVector3d::zero ), - mAutoPilot(FALSE), mAutoPilotFlyOnStop(FALSE), mAutoPilotTargetGlobal(), @@ -2116,36 +2117,6 @@ BOOL LLAgent::getBusy() const //----------------------------------------------------------------------------- -// updateWanderTarget() -//----------------------------------------------------------------------------- -void LLAgent::updateWanderTarget() -{ - S32 num_regions; - LLViewerRegion* rand_region; - F32 rand_x; - F32 rand_y; - - if (mWanderTimer.checkExpirationAndReset(ll_frand(MAX_WANDER_TIME))) - { - // Pick a random spot to wander towards - num_regions = gWorldPointer->mActiveRegionList.getLength(); - S32 region_num = llround(ll_frand() * num_regions); - rand_region = gWorldPointer->mActiveRegionList.getFirstData(); - S32 i = 0; - while (i < region_num) - { - rand_region = gWorldPointer->mActiveRegionList.getNextData(); - i++; - } - rand_x = ll_frand(rand_region->getWidth()); - rand_y = ll_frand(rand_region->getWidth()); - - stopAutoPilot(); - startAutoPilotGlobal(rand_region->getPosGlobalFromRegion(LLVector3(rand_x, rand_y, 0.f))); - } -} - -//----------------------------------------------------------------------------- // startAutoPilotGlobal() //----------------------------------------------------------------------------- void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::string& behavior_name, const LLQuaternion *target_rotation, void (*finish_callback)(BOOL, void *), void *callback_data, F32 stop_distance, F32 rot_threshold) @@ -4062,10 +4033,6 @@ void LLAgent::changeCameraToFollow(BOOL animate) mbFlagsDirty = TRUE; } - //RN: this doesn't seem to be necessary and destroys the UE for script-driven cameras - //gViewerWindow->setKeyboardFocus( NULL, NULL ); - //gViewerWindow->setMouseCapture( NULL, NULL ); - if (animate) { startCameraAnimation(); @@ -4129,9 +4096,6 @@ void LLAgent::changeCameraToThirdPerson(BOOL animate) mbFlagsDirty = TRUE; } - //RN: this doesn't seem to be necessary and destroys the UE for script-driven cameras - //gViewerWindow->setKeyboardFocus( NULL, NULL ); - //gViewerWindow->setMouseCapture( NULL, NULL ); } // Remove any pitch from the avatar @@ -4204,7 +4168,7 @@ void LLAgent::changeCameraToCustomizeAvatar(BOOL animate) } gViewerWindow->setKeyboardFocus( NULL, NULL ); - gViewerWindow->setMouseCapture( NULL, NULL ); + gViewerWindow->setMouseCapture( NULL ); LLVOAvatar::onCustomizeStart(); } @@ -5531,6 +5495,8 @@ bool LLAgent::teleportCore(bool is_local) LLFloaterWorldMap::hide(NULL); LLFloaterDirectory::hide(NULL); + gParcelMgr->deselectLand(); + // Close all pie menus, deselect land, etc. // Don't change the camera until we know teleport succeeded. JC resetView(FALSE); @@ -7256,4 +7222,57 @@ void LLAgent::observeFriends() } } +void LLAgent::parseTeleportMessages(const LLString& xml_filename) +{ + LLXMLNodePtr root; + BOOL success = LLUICtrlFactory::getLayeredXMLNode(xml_filename, root); + + if (!success || !root || !root->hasName( "teleport_messages" )) + { + llerrs << "Problem reading teleport string XML file: " + << xml_filename << llendl; + return; + } + + for (LLXMLNode* message_set = root->getFirstChild(); + message_set != NULL; + message_set = message_set->getNextSibling()) + { + if ( !message_set->hasName("message_set") ) continue; + + std::map *teleport_msg_map = NULL; + LLString message_set_name; + + if ( message_set->getAttributeString("name", message_set_name) ) + { + //now we loop over all the string in the set and add them + //to the appropriate set + if ( message_set_name == "errors" ) + { + teleport_msg_map = &sTeleportErrorMessages; + } + else if ( message_set_name == "progress" ) + { + teleport_msg_map = &sTeleportProgressMessages; + } + } + + if ( !teleport_msg_map ) continue; + + LLString message_name; + for (LLXMLNode* message_node = message_set->getFirstChild(); + message_node != NULL; + message_node = message_node->getNextSibling()) + { + if ( message_node->hasName("message") && + message_node->getAttributeString("name", message_name) ) + { + (*teleport_msg_map)[message_name] = + message_node->getTextContents(); + } //end if ( message exists and has a name) + } //end for (all message in set) + }//end for (all message sets in xml file) +} + + // EOF diff --git a/linden/indra/newview/llagent.h b/linden/indra/newview/llagent.h index faf94ab..af593e0 100644 --- a/linden/indra/newview/llagent.h +++ b/linden/indra/newview/llagent.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -417,8 +418,6 @@ public: void propagate(const F32 dt); // BUG: should roll into updateAgentPosition - void updateWanderTarget(); // drones will pick points in the world to autopilot towards - void startAutoPilotGlobal(const LLVector3d &pos_global, const std::string& behavior_name = "", const LLQuaternion *target_rotation = NULL, void (*finish_callback)(BOOL, void *) = NULL, void *callback_data = NULL, F32 stop_distance = 0.f, F32 rotation_threshold = 0.03f); @@ -693,6 +692,13 @@ public: BOOL mForceMouselook; + static void parseTeleportMessages(const LLString& xml_filename); + //we should really define ERROR and PROGRESS enums here + //but I don't really feel like doing that, so I am just going + //to expose the mappings....yup + static std::map sTeleportErrorMessages; + static std::map sTeleportProgressMessages; + private: ETeleportState mTeleportState; LLString mTeleportMessage; @@ -790,9 +796,6 @@ private: BOOL mbJump; - LLFrameTimer mWanderTimer; - LLVector3d mWanderTargetGlobal; - BOOL mAutoPilot; BOOL mAutoPilotFlyOnStop; LLVector3d mAutoPilotTargetGlobal; diff --git a/linden/indra/newview/llagentdata.cpp b/linden/indra/newview/llagentdata.cpp index c42d0a0..464a37b 100644 --- a/linden/indra/newview/llagentdata.cpp +++ b/linden/indra/newview/llagentdata.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llagentdata.h b/linden/indra/newview/llagentdata.h index 7ce43b9..eba2a29 100644 --- a/linden/indra/newview/llagentdata.h +++ b/linden/indra/newview/llagentdata.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llagentpilot.cpp b/linden/indra/newview/llagentpilot.cpp index 45d29cc..0ccfd45 100644 --- a/linden/indra/newview/llagentpilot.cpp +++ b/linden/indra/newview/llagentpilot.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llagentpilot.h b/linden/indra/newview/llagentpilot.h index cdf505c..9f1a3c9 100644 --- a/linden/indra/newview/llagentpilot.h +++ b/linden/indra/newview/llagentpilot.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llanimalcontrols.cpp b/linden/indra/newview/llanimalcontrols.cpp index 2e047ae..da3c6e8 100644 --- a/linden/indra/newview/llanimalcontrols.cpp +++ b/linden/indra/newview/llanimalcontrols.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llanimalcontrols.h b/linden/indra/newview/llanimalcontrols.h index a5a62bf..73e8679 100644 --- a/linden/indra/newview/llanimalcontrols.h +++ b/linden/indra/newview/llanimalcontrols.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llappearance.h b/linden/indra/newview/llappearance.h index 9c23e90..2a6a95e 100644 --- a/linden/indra/newview/llappearance.h +++ b/linden/indra/newview/llappearance.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llassetuploadresponders.cpp b/linden/indra/newview/llassetuploadresponders.cpp index 7c615dd..821bb2a 100644 --- a/linden/indra/newview/llassetuploadresponders.cpp +++ b/linden/indra/newview/llassetuploadresponders.cpp @@ -79,7 +79,7 @@ void LLAssetUploadResponder::error(U32 statusNum, const std::string& reason) default: args["[FILE]"] = (mFileName.empty() ? mVFileID.asString() : mFileName); args["[REASON]"] = "The server is experiencing unexpected " - "difficulties. Please try again later."; + "difficulties."; gViewerWindow->alertXml("CannotUploadReason", args); break; } diff --git a/linden/indra/newview/llasynchostbyname.cpp b/linden/indra/newview/llasynchostbyname.cpp index 1d660bd..8eebe8b 100644 --- a/linden/indra/newview/llasynchostbyname.cpp +++ b/linden/indra/newview/llasynchostbyname.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llasynchostbyname.h b/linden/indra/newview/llasynchostbyname.h index 351fc2a..30dedd0 100644 --- a/linden/indra/newview/llasynchostbyname.h +++ b/linden/indra/newview/llasynchostbyname.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llaudiosourcevo.cpp b/linden/indra/newview/llaudiosourcevo.cpp index cbb1c78..084d532 100644 --- a/linden/indra/newview/llaudiosourcevo.cpp +++ b/linden/indra/newview/llaudiosourcevo.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llaudiosourcevo.h b/linden/indra/newview/llaudiosourcevo.h index c5649f9..ac208a3 100644 --- a/linden/indra/newview/llaudiosourcevo.h +++ b/linden/indra/newview/llaudiosourcevo.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llaudiostatus.cpp b/linden/indra/newview/llaudiostatus.cpp index 397f7e4..f24d939 100644 --- a/linden/indra/newview/llaudiostatus.cpp +++ b/linden/indra/newview/llaudiostatus.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llaudiostatus.h b/linden/indra/newview/llaudiostatus.h index e2c8740..fe7b67f 100644 --- a/linden/indra/newview/llaudiostatus.h +++ b/linden/indra/newview/llaudiostatus.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llbbox.cpp b/linden/indra/newview/llbbox.cpp index aa3d892..29bcf86 100644 --- a/linden/indra/newview/llbbox.cpp +++ b/linden/indra/newview/llbbox.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llbbox.h b/linden/indra/newview/llbbox.h index b8d1d4e..e04de42 100644 --- a/linden/indra/newview/llbbox.h +++ b/linden/indra/newview/llbbox.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llbox.cpp b/linden/indra/newview/llbox.cpp index 8f51c4f..4eb5fa2 100644 --- a/linden/indra/newview/llbox.cpp +++ b/linden/indra/newview/llbox.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llbox.h b/linden/indra/newview/llbox.h index e7e7164..304916b 100644 --- a/linden/indra/newview/llbox.h +++ b/linden/indra/newview/llbox.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcallbacklist.cpp b/linden/indra/newview/llcallbacklist.cpp index 3931371..c5a7e28 100644 --- a/linden/indra/newview/llcallbacklist.cpp +++ b/linden/indra/newview/llcallbacklist.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcallbacklist.h b/linden/indra/newview/llcallbacklist.h index b2e6f51..84dccfa 100644 --- a/linden/indra/newview/llcallbacklist.h +++ b/linden/indra/newview/llcallbacklist.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcallingcard.cpp b/linden/indra/newview/llcallingcard.cpp index d1fdda6..22e7f23 100644 --- a/linden/indra/newview/llcallingcard.cpp +++ b/linden/indra/newview/llcallingcard.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcallingcard.h b/linden/indra/newview/llcallingcard.h index 1b2a643..2d36324 100644 --- a/linden/indra/newview/llcallingcard.h +++ b/linden/indra/newview/llcallingcard.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcameraview.cpp b/linden/indra/newview/llcameraview.cpp index 6c63359..d9bd282 100644 --- a/linden/indra/newview/llcameraview.cpp +++ b/linden/indra/newview/llcameraview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -28,6 +29,7 @@ #include "llviewerprecompiledheaders.h" #include "llcameraview.h" +#include "llvieweruictrlfactory.h" // Library includes #include "llfontgl.h" @@ -36,6 +38,8 @@ #include "llagent.h" #include "lljoystickbutton.h" #include "llviewercontrol.h" +#include "llviewerwindow.h" +#include "viewer.h" // Constants const char *CAMERA_TITLE = ""; @@ -158,4 +162,95 @@ BOOL LLFloaterCamera::visible(void*) } } -// EOF +LLFloaterJoystick *LLFloaterJoystick::sInstance = NULL; + + +LLFloaterJoystick::LLFloaterJoystick( ) +: LLFloater("Joystick floater") +{ + sInstance = this; +} + +LLFloaterJoystick::~LLFloaterJoystick() +{ + sInstance = NULL; +} + +void LLFloaterJoystick::draw() +{ + for (U32 i = 0; i < 6; i++) + { + F32 value = gViewerWindow->getWindow()->getJoystickAxis(i); + mAxis[i]->addValue(value*gFrameIntervalSeconds); + + if (mAxisBar[i]->mMinBar > value) + { + mAxisBar[i]->mMinBar = value; + } + if (mAxisBar[i]->mMaxBar < value) + { + mAxisBar[i]->mMaxBar = value; + } + } + + LLFloater::draw(); +} + +// static +void LLFloaterJoystick::show(void*) +{ + if (sInstance) + { + sInstance->open(); /*Flawfinder: ignore*/ + } + else + { + LLFloaterJoystick* floater = new LLFloaterJoystick(); + + gUICtrlFactory->buildFloater(floater, "floater_joystick.xml"); + F32 range = gSavedSettings.getBOOL("FlycamAbsolute") ? 1024.f : 2.f; + LLUIString axis = floater->childGetText("Axis"); + LLUIString joystick = floater->childGetText("JoystickMonitor"); + + LLView* child = floater->getChildByName("ZoomLabel"); + LLRect rect; + + if (child) + { + LLRect r = child->getRect(); + LLRect f = floater->getRect(); + rect = LLRect(150, r.mTop, r.mRight, 0); + } + + floater->mAxisStats = new LLStatView("axis values", joystick, "", rect); + floater->mAxisStats->setDisplayChildren(TRUE); + + for (U32 i = 0; i < 6; i++) + { + axis.setArg("[NUM]", llformat("%d", i)); + floater->mAxis[i] = new LLStat(4); + floater->mAxisBar[i] = floater->mAxisStats->addStat(axis, floater->mAxis[i]); + floater->mAxisBar[i]->mMinBar = -range; + floater->mAxisBar[i]->mMaxBar = range; + floater->mAxisBar[i]->mLabelSpacing = range * 0.5f; + floater->mAxisBar[i]->mTickSpacing = range * 0.25f; + } + + + + floater->addChild(floater->mAxisStats); + floater->open(); /*Flawfinder: ignore*/ + } +} + +//static +LLFloaterJoystick* LLFloaterJoystick::getInstance() +{ + return sInstance; +} + +// static +BOOL LLFloaterJoystick::visible(void*) +{ + return (sInstance != NULL); +} diff --git a/linden/indra/newview/llcameraview.h b/linden/indra/newview/llcameraview.h index 9283043..32c29e8 100644 --- a/linden/indra/newview/llcameraview.h +++ b/linden/indra/newview/llcameraview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -35,6 +36,7 @@ // Library includes #include "llfloater.h" +#include "llstatview.h" class LLJoystickCameraRotate; class LLJoystickCameraZoom; @@ -62,6 +64,26 @@ public: LLJoystickCameraTrack* mTrack; }; +class LLFloaterJoystick +: public LLFloater +{ +protected: + LLFloaterJoystick(); + ~LLFloaterJoystick(); + +public: + static void show(void*); + static LLFloaterJoystick* getInstance(); + static BOOL visible(void*); + virtual void draw(); + +protected: + static LLFloaterJoystick* sInstance; + LLStatView* mAxisStats; + LLStat* mAxis[6]; + LLStatBar* mAxisBar[6]; +}; + extern LLFloaterCamera *gFloaterCamera; #endif diff --git a/linden/indra/newview/llcape.cpp b/linden/indra/newview/llcape.cpp index 327a0d0..91f4ee7 100644 --- a/linden/indra/newview/llcape.cpp +++ b/linden/indra/newview/llcape.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcape.h b/linden/indra/newview/llcape.h index 584cc19..64cf2c4 100644 --- a/linden/indra/newview/llcape.h +++ b/linden/indra/newview/llcape.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcaphttpsender.cpp b/linden/indra/newview/llcaphttpsender.cpp new file mode 100644 index 0000000..cea8198 --- /dev/null +++ b/linden/indra/newview/llcaphttpsender.cpp @@ -0,0 +1,50 @@ +/** + * @file llcaphttpsender.cpp + * @brief Abstracts details of sending messages via UntrustedMessage cap. + * + * Copyright (c) 2007-2007, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + */ + +#include "llviewerprecompiledheaders.h" + +#include "linden_common.h" +#include "llcaphttpsender.h" + +LLCapHTTPSender::LLCapHTTPSender(const std::string& cap) : + mCap(cap) +{ +} + +//virtual +void LLCapHTTPSender::send(const LLHost& host, const char* message, + const LLSD& body, + LLHTTPClient::ResponderPtr response) const +{ + llinfos << "LLCapHTTPSender::send: message " << message + << " to host " << host << llendl; + LLSD llsd; + llsd["message"] = message; + llsd["body"] = body; + LLHTTPClient::post(mCap, llsd, response); +} diff --git a/linden/indra/newview/llcaphttpsender.h b/linden/indra/newview/llcaphttpsender.h new file mode 100644 index 0000000..c482c41 --- /dev/null +++ b/linden/indra/newview/llcaphttpsender.h @@ -0,0 +1,50 @@ +/** + * @file llcaphttpsender.h + * @brief Abstracts details of sending messages via the + * UntrustedMessage capability. + * + * Copyright (c) 2007-2007, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + */ + +#ifndef LL_CAP_HTTP_SENDER_H +#define LL_CAP_HTTP_SENDER_H + +#include "llhttpsender.h" + +class LLCapHTTPSender : public LLHTTPSender +{ +public: + LLCapHTTPSender(const std::string& cap); + + /** @brief Send message via UntrustedMessage capability with body, + call response when done */ + virtual void send(const LLHost& host, + const char* message, const LLSD& body, + LLHTTPClient::ResponderPtr response) const; + +private: + std::string mCap; +}; + +#endif // LL_CAP_HTTP_SENDER_H diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp index 394399e..02bed33 100644 --- a/linden/indra/newview/llchatbar.cpp +++ b/linden/indra/newview/llchatbar.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -602,7 +603,7 @@ void LLChatBar::onInputEditorKeystroke( LLLineEditor* caller, void* userdata ) } // static -void LLChatBar::onInputEditorFocusLost( LLLineEditor* caller, void* userdata) +void LLChatBar::onInputEditorFocusLost( LLUICtrl* caller, void* userdata) { // stop typing animation gAgent.stopTyping(); diff --git a/linden/indra/newview/llchatbar.h b/linden/indra/newview/llchatbar.h index 0af5469..32b0018 100644 --- a/linden/indra/newview/llchatbar.h +++ b/linden/indra/newview/llchatbar.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -86,7 +87,7 @@ public: static void onTabClick( void* userdata ); static void onInputEditorKeystroke(LLLineEditor* caller, void* userdata); - static void onInputEditorFocusLost(LLLineEditor* caller,void* userdata); + static void onInputEditorFocusLost(LLUICtrl* caller,void* userdata); static void onInputEditorGainFocus(LLUICtrl* caller,void* userdata); static void onCommitGesture(LLUICtrl* ctrl, void* data); diff --git a/linden/indra/newview/llclassifiedinfo.cpp b/linden/indra/newview/llclassifiedinfo.cpp index 3115e30..5d35dcc 100644 --- a/linden/indra/newview/llclassifiedinfo.cpp +++ b/linden/indra/newview/llclassifiedinfo.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llclassifiedinfo.h b/linden/indra/newview/llclassifiedinfo.h index ed2fa0a..6314fff 100644 --- a/linden/indra/newview/llclassifiedinfo.h +++ b/linden/indra/newview/llclassifiedinfo.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcloud.cpp b/linden/indra/newview/llcloud.cpp index b14f6d5..ec148cc 100644 --- a/linden/indra/newview/llcloud.cpp +++ b/linden/indra/newview/llcloud.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcloud.h b/linden/indra/newview/llcloud.h index 0b670ee..52bbdaf 100644 --- a/linden/indra/newview/llcloud.h +++ b/linden/indra/newview/llcloud.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcolorscheme.cpp b/linden/indra/newview/llcolorscheme.cpp index 1381cad..8b271b0 100644 --- a/linden/indra/newview/llcolorscheme.cpp +++ b/linden/indra/newview/llcolorscheme.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcolorscheme.h b/linden/indra/newview/llcolorscheme.h index 3c5a880..5fd7c93 100644 --- a/linden/indra/newview/llcolorscheme.h +++ b/linden/indra/newview/llcolorscheme.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcolorswatch.cpp b/linden/indra/newview/llcolorswatch.cpp index a7f5ae7..19490a2 100644 --- a/linden/indra/newview/llcolorswatch.cpp +++ b/linden/indra/newview/llcolorswatch.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -167,7 +168,7 @@ BOOL LLColorSwatchCtrl::handleMouseDown(S32 x, S32 y, MASK mask) { // Route future Mouse messages here preemptively. (Release on mouse up.) // No handler is needed for capture lost since this object has no state that depends on it. - gViewerWindow->setMouseCapture( this, NULL ); + gViewerWindow->setMouseCapture( this ); return TRUE; } @@ -176,10 +177,10 @@ BOOL LLColorSwatchCtrl::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLColorSwatchCtrl::handleMouseUp(S32 x, S32 y, MASK mask) { // We only handle the click if the click both started and ended within us - if( gViewerWindow->hasMouseCapture( this ) ) + if( hasMouseCapture() ) { // Release the mouse - gViewerWindow->setMouseCapture( NULL, NULL ); + gViewerWindow->setMouseCapture( NULL ); // If mouseup in the widget, it's been clicked if ( pointInView(x, y) ) @@ -245,7 +246,7 @@ void LLColorSwatchCtrl::draw() void LLColorSwatchCtrl::setEnabled( BOOL enabled ) { mCaption->setEnabled( enabled ); - LLUICtrl::setEnabled( enabled ); + LLView::setEnabled( enabled ); if (!enabled) { diff --git a/linden/indra/newview/llcolorswatch.h b/linden/indra/newview/llcolorswatch.h index b52d6ac..b80a0e6 100644 --- a/linden/indra/newview/llcolorswatch.h +++ b/linden/indra/newview/llcolorswatch.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcompass.cpp b/linden/indra/newview/llcompass.cpp index b3847d6..125ae10 100644 --- a/linden/indra/newview/llcompass.cpp +++ b/linden/indra/newview/llcompass.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcompass.h b/linden/indra/newview/llcompass.h index f454f6c..d23046d 100644 --- a/linden/indra/newview/llcompass.h +++ b/linden/indra/newview/llcompass.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcompilequeue.cpp b/linden/indra/newview/llcompilequeue.cpp index c5ad2b9..12b52c4 100644 --- a/linden/indra/newview/llcompilequeue.cpp +++ b/linden/indra/newview/llcompilequeue.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -198,7 +199,7 @@ BOOL LLFloaterScriptQueue::start() { //llinfos << "LLFloaterCompileQueue::start()" << llendl; char buffer[MAX_STRING]; /*Flawfinder: ignore*/ - snprintf(buffer, sizeof(buffer), "Starting %s of %d items.", mStartString, mObjectIDs.count()); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "Starting %s of %d items.", mStartString, mObjectIDs.count()); /* Flawfinder: ignore */ LLScrollListCtrl* list = LLUICtrlFactory::getScrollListByName(this, "queue output"); list->addSimpleItem(buffer); @@ -238,7 +239,7 @@ BOOL LLFloaterScriptQueue::nextObject() mDone = TRUE; char buffer[MAX_STRING]; /*Flawfinder: ignore*/ - snprintf(buffer, sizeof(buffer), "Done."); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "Done."); /* Flawfinder: ignore */ list->addSimpleItem(buffer); childSetEnabled("close",TRUE); } @@ -383,7 +384,7 @@ void LLFloaterCompileQueue::scriptArrived(LLVFS *vfs, const LLUUID& asset_id, LLVFile file(vfs, asset_id, type); char uuid_str[UUID_STR_LENGTH]; /*Flawfinder: ignore*/ asset_id.toString(uuid_str); - snprintf(filename, sizeof(filename), "%s.%s",gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str).c_str(),LLAssetType::lookup(type)); /*Flawfinder: ignore*/ + snprintf(filename, sizeof(filename), "%s.%s",gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str).c_str(),LLAssetType::lookup(type)); /* Flawfinder: ignore */ FILE *fp = LLFile::fopen(filename, "wb"); /*Flawfinder: ignore*/ if (fp) @@ -403,7 +404,7 @@ void LLFloaterCompileQueue::scriptArrived(LLVFS *vfs, const LLUUID& asset_id, } // It's now in the file, now compile it. - snprintf(buffer, sizeof(buffer), "Downloaded, now compiling '%s'.", data->mScriptName.c_str()); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "Downloaded, now compiling '%s'.", data->mScriptName.c_str()); /* Flawfinder: ignore */ queue->compile(filename, asset_id); // Delete it after we're done compiling? @@ -420,19 +421,19 @@ void LLFloaterCompileQueue::scriptArrived(LLVFS *vfs, const LLUUID& asset_id, { LLChat chat("Script not found on server."); LLFloaterChat::addChat(chat); - snprintf(buffer, sizeof(buffer), "Problem downloading %s.", /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "Problem downloading %s.", /* Flawfinder: ignore */ data->mScriptName.c_str()); } else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status) { LLChat chat("Insufficient permissions to download a script."); LLFloaterChat::addChat(chat); - snprintf(buffer, sizeof(buffer), "Insufficient permissions for '%s'.", /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "Insufficient permissions for '%s'.", /* Flawfinder: ignore */ data->mScriptName.c_str()); } else { - snprintf(buffer, sizeof(buffer), "Unknown failure to download %s.", /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "Unknown failure to download %s.", /* Flawfinder: ignore */ data->mScriptName.c_str()); } @@ -496,9 +497,9 @@ void LLFloaterCompileQueue::compile(const char* filename, char uuid_string[UUID_STR_LENGTH]; /*Flawfinder: ignore*/ new_asset_id.toString(uuid_string); char dst_filename[LL_MAX_PATH]; /*Flawfinder: ignore*/ - snprintf(dst_filename, sizeof(dst_filename), "%s.lso", gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_string).c_str()); /*Flawfinder: ignore*/ + snprintf(dst_filename, sizeof(dst_filename), "%s.lso", gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_string).c_str()); /* Flawfinder: ignore */ char err_filename[LL_MAX_PATH]; /*Flawfinder: ignore*/ - snprintf(err_filename, sizeof(err_filename), "%s.out", gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_string).c_str()); /*Flawfinder: ignore*/ + snprintf(err_filename, sizeof(err_filename), "%s.out", gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_string).c_str()); /* Flawfinder: ignore */ gAssetStorage->storeAssetData(filename, tid, LLAssetType::AT_LSL_TEXT, @@ -622,7 +623,7 @@ void LLFloaterResetQueue::handleInventory(LLViewerObject* viewer_obj, LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it)); LLScrollListCtrl* list = LLUICtrlFactory::getScrollListByName(this, "queue output"); char buffer[MAX_STRING]; /*Flawfinder: ignore*/ - snprintf(buffer, sizeof(buffer), "Resetting '%s'.", item->getName().c_str()); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "Resetting '%s'.", item->getName().c_str()); /* Flawfinder: ignore */ list->addSimpleItem(buffer); LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_ScriptReset); @@ -685,7 +686,7 @@ void LLFloaterRunQueue::handleInventory(LLViewerObject* viewer_obj, LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it)); LLScrollListCtrl* list = LLUICtrlFactory::getScrollListByName(this, "queue output"); char buffer[MAX_STRING]; /*Flawfinder: ignore*/ - snprintf(buffer, sizeof(buffer), "Running '%s'.", item->getName().c_str()); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "Running '%s'.", item->getName().c_str()); /* Flawfinder: ignore */ list->addSimpleItem(buffer); LLMessageSystem* msg = gMessageSystem; @@ -750,7 +751,7 @@ void LLFloaterNotRunQueue::handleInventory(LLViewerObject* viewer_obj, LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it)); LLScrollListCtrl* list = LLUICtrlFactory::getScrollListByName(this, "queue output"); char buffer[MAX_STRING]; /*Flawfinder: ignore*/ - snprintf(buffer, sizeof(buffer), "Not running '%s'.", item->getName().c_str()); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "Not running '%s'.", item->getName().c_str()); /* Flawfinder: ignore */ list->addSimpleItem(buffer); LLMessageSystem* msg = gMessageSystem; diff --git a/linden/indra/newview/llcompilequeue.h b/linden/indra/newview/llcompilequeue.h index 72d91ef..c28b92c 100644 --- a/linden/indra/newview/llcompilequeue.h +++ b/linden/indra/newview/llcompilequeue.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llconfirmationmanager.cpp b/linden/indra/newview/llconfirmationmanager.cpp index b3a50f0..705e306 100644 --- a/linden/indra/newview/llconfirmationmanager.cpp +++ b/linden/indra/newview/llconfirmationmanager.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llconfirmationmanager.h b/linden/indra/newview/llconfirmationmanager.h index 01de803..46d9992 100644 --- a/linden/indra/newview/llconfirmationmanager.h +++ b/linden/indra/newview/llconfirmationmanager.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llconsole.cpp b/linden/indra/newview/llconsole.cpp index ce092a7..112f8ab 100644 --- a/linden/indra/newview/llconsole.cpp +++ b/linden/indra/newview/llconsole.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llconsole.h b/linden/indra/newview/llconsole.h index 525cab3..20fb545 100644 --- a/linden/indra/newview/llconsole.h +++ b/linden/indra/newview/llconsole.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcontainerview.cpp b/linden/indra/newview/llcontainerview.cpp index 058d19c..3afc63f 100644 --- a/linden/indra/newview/llcontainerview.cpp +++ b/linden/indra/newview/llcontainerview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcontainerview.h b/linden/indra/newview/llcontainerview.h index bd468d5..a25439c 100644 --- a/linden/indra/newview/llcontainerview.h +++ b/linden/indra/newview/llcontainerview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcontroldef.cpp b/linden/indra/newview/llcontroldef.cpp index cd4cf4d..7989791 100644 --- a/linden/indra/newview/llcontroldef.cpp +++ b/linden/indra/newview/llcontroldef.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -239,6 +240,8 @@ void declare_settings() // Other.... //------------------------------------------------------------------------ + gSavedSettings.declareBOOL("ScriptHelpFollowsCursor", FALSE, "Scripting help window updates contents based on script editor contents under text cursor"); + gSavedSettings.declareS32("LastFeatureVersion", 0, "[DO NOT MODIFY] Version number for tracking hardware changes", TRUE); gSavedSettings.declareS32("NumSessions", 0, "Number of successful logins to Second Life"); gSavedSettings.declareBOOL("ShowInventory", FALSE, "Open inventory window on login"); @@ -272,8 +275,9 @@ void declare_settings() gSavedSettings.declareS32("LastPrefTab", 0, "Last selected tab in preferences window"); - //gSavedSettings.declareString("LSLHelpURL", "http://www.lslwiki.com/lslwiki/wakka.php?wakka=[LSL_STRING]", "URL that points to LSL help files, with [LSL_STRING] corresponding to the referenced LSL function or keyword"); - //gSavedSettings.declareString("LSLHelpURL", "file://[APP_DIRECTORY]/lsl_guide.html#[LSL_STRING]", "URL that points to LSL help files, with [LSL_STRING] corresponding to the referenced LSL function or keyword"); + gSavedSettings.declareString("LSLHelpURL", "http://wiki.secondlife.com/wiki/[LSL_STRING]", "URL that points to LSL help files, with [LSL_STRING] corresponding to the referenced LSL function or keyword"); + // link for editable wiki (https doesn't seem to work right now with our embedded browser) + //gSavedSettings.declareString("LSLHelpURL", "https://wiki.secondlife.com/wiki/[LSL_STRING]", "URL that points to LSL help files, with [LSL_STRING] corresponding to the referenced LSL function or keyword"); // Wearable default images // const char* UI_IMG_BLACK_UUID = "e2244626-f22f-4839-8123-1e7baddeb659"; const char* UI_IMG_WHITE_UUID = "5748decc-f629-461c-9a36-a35a221fe21f"; @@ -447,6 +451,11 @@ void declare_settings() gSavedSettings.declareString("UIImgBtnScrollRightOutUUID", "3d700d19-e708-465d-87f2-46c8c0ee7938", "", NO_PERSIST); gSavedSettings.declareString("UIImgBtnScrollRightInUUID", "b749de64-e903-4c3c-ac0b-25fb6fa39cb5", "", NO_PERSIST); + gSavedSettings.declareString("UIImgBtnJumpLeftOutUUID", "3c18c87e-5f50-14e2-e744-f44734aa365f", "", NO_PERSIST); + gSavedSettings.declareString("UIImgBtnJumpLeftInUUID", "9cad3e6d-2d6d-107d-f8ab-5ba272b5bfe1", "", NO_PERSIST); + gSavedSettings.declareString("UIImgBtnJumpRightOutUUID", "ff9a71eb-7414-4cf8-866e-a701deb7c3cf", "", NO_PERSIST); + gSavedSettings.declareString("UIImgBtnJumpRightInUUID", "7dabc040-ec13-2309-ddf7-4f161f6de2f4", "", NO_PERSIST); + // Spin control gSavedSettings.declareString("UIImgBtnSpinUpOutUUID", "56576e6e-6710-4e66-89f9-471b59122794", "", NO_PERSIST); gSavedSettings.declareString("UIImgBtnSpinUpInUUID", "c8450082-96a0-4319-8090-d3ff900b4954", "", NO_PERSIST); @@ -502,7 +511,8 @@ void declare_settings() gSavedSettings.declareBOOL("ShowCrosshairs", TRUE, "Display crosshairs when in mouselook mode"); gSavedSettings.declareString("UIImgCrosshairsUUID", "6e1a3980-bf2d-4274-8970-91e60d85fb52", "Image to use for crosshair display (UUID texture reference)"); - gSavedSettings.declareString("Language", "en-us", "Language specifier (for XUI)" ); + gSavedSettings.declareString("Language", "default", "Language specifier (for XUI)" ); + gSavedSettings.declareString("SystemLanguage", "en-us", "Language indicated by system settings (for XUI)" ); ///////////////////////////////////////////////// // Other booleans @@ -625,6 +635,10 @@ void declare_settings() gSavedSettings.declareBOOL("OpenDebugStatRender", TRUE, "Expand render stats display"); gSavedSettings.declareBOOL("OpenDebugStatSim", TRUE, "Expand simulator performance stats display"); gSavedSettings.declareBOOL("ShowDepthBuffer", FALSE, "Show depth buffer contents"); + + gSavedSettings.declareBOOL("DebugShowTime", FALSE, "Show depth buffer contents"); + gSavedSettings.declareBOOL("DebugShowRenderInfo", FALSE, "Show depth buffer contents"); + // gSavedSettings.declareBOOL("ShowHUD", TRUE); //gSavedSettings.declareBOOL("ShowHUDText", TRUE, "[NOT USED]"); //gSavedSettings.declareBOOL("ShowHeadlight", FALSE, "[NOT USED]"); @@ -669,12 +683,18 @@ void declare_settings() gSavedSettings.declareF32( "RenderBumpmapMinDistanceSquared", 100.f, "Maximum distance at which to render bumpmapped primitives (distance in meters, squared)" ); gSavedSettings.declareS32( "RenderMaxPartCount", 4096, "Maximum number of particles to display on screen"); gSavedSettings.declareBOOL("RenderVBOEnable", TRUE, "Use GL Vertex Buffer Objects" ); + gSavedSettings.declareS32("RenderReflectionRes", 64, "Reflection map resolution."); //gSavedSettings.declareBOOL("RenderUseTriStrips", FALSE, "[NOT USED]"); //gSavedSettings.declareBOOL("RenderCullBySize", FALSE, "[NOT USED]" ); gSavedSettings.declareF32("RenderTerrainScale", 12.f, "Terrain detail texture scale"); gSavedSettings.declareBOOL("VertexShaderEnable", FALSE, "Enable/disable all GLSL shaders (debug)"); + gSavedSettings.declareBOOL("RenderInitError", FALSE, "Error occured while initializing GL"); gSavedSettings.declareBOOL("RenderRippleWater", FALSE, "Display more realistic water, with refraction (requires pixel shader support on your video card)"); gSavedSettings.declareBOOL("RenderDynamicReflections", FALSE, "Generate a dynamic cube map for reflections (objects reflect their environment, experimental)."); + gSavedSettings.declareBOOL("RenderGlow", FALSE, "Make light sources glow."); + gSavedSettings.declareF32("RenderGlowStrength", 1.25f, "Strength of glow"); + gSavedSettings.declareS32("RenderGlowSize", 5, "Size of glow (in pixels)"); + gSavedSettings.declareS32("RenderGlowResolution", 256, "Glow map resolution."); gSavedSettings.declareBOOL("RenderObjectBump", TRUE, "Show bumpmapping on primitives"); gSavedSettings.declareS32("RenderAvatarMode", 1, "Controls how avatars are rendered (0 = normal, 1 = bump mapped, 2 = bump mapped and wavy cloth)"); gSavedSettings.declareBOOL("RenderAvatarVP", TRUE, "Use vertex programs to perform hardware skinning of avatar"); @@ -682,6 +702,7 @@ void declare_settings() //gSavedSettings.declareBOOL("RenderForceGetTexImage", FALSE, "[NOT USED]"); gSavedSettings.declareBOOL("RenderFastUI", FALSE, "[NOT USED]"); gSavedSettings.declareBOOL("RenderUseSharedDrawables", TRUE, "Collapse transforms on moving linked objects for faster updates"); + gSavedSettings.declareS32("DebugBeaconLineWidth", 1, "Size of lines for Debug Beacons"); // Snapshot params gSavedSettings.declareBOOL("RenderUIInSnapshot", FALSE, "Display user interface in snapshot" ); @@ -769,6 +790,8 @@ void declare_settings() // Build options floater gSavedSettings.declareRect("FloaterBuildOptionsRect", LLRect(0,0,0,0), "Rectangle for build options window."); + gSavedSettings.declareRect("FloaterJoystickRect", LLRect(0,0,0,0), "Rectangle for joystick controls window."); + // Map floater gSavedSettings.declareRect("FloaterMapRect", LLRect(0, 225, 200, 0), "Rectangle for world map"); @@ -810,6 +833,7 @@ void declare_settings() // Previews - only width and height are used gSavedSettings.declareRect("PreviewTextureRect", LLRect(0, 400, 400, 0), "Rectangle for texture preview window" ); // Only width and height are used gSavedSettings.declareRect("PreviewScriptRect", LLRect(0, 550, 500, 0), "Rectangle for script preview window" ); // Only width and height are used + gSavedSettings.declareRect("LSLHelpRect", LLRect(0, 500, 600, 0), "Rectangle for LSL help window" ); // Only width and height are used gSavedSettings.declareRect("PreviewLandmarkRect", LLRect(0, 90, 300, 0), "Rectangle for landmark preview window" ); // Only width and height are used gSavedSettings.declareRect("PreviewSoundRect", LLRect(0, 85, 300, 0), "Rectangle for sound preview window" ); // Only width and height are used gSavedSettings.declareRect("PreviewObjectRect", LLRect(0, 85, 300, 0), "Rectangle for object preview window" ); // Only width and height are used @@ -961,6 +985,10 @@ void declare_settings() //------------------------------------------------------------------------ gSavedSettings.declareString("HelpHomeURL", "help/index.html", "URL of initial help page"); gSavedSettings.declareString("HelpLastVisitedURL", "help/index.html", "URL of last help page, will be shown next time help is accessed"); + + // HTML dialog (general purpose) + gSavedSettings.declareRect("HtmlFloaterRect", LLRect(100,460,370,100), "Rectangle for HTML Floater window"); + // HTML help gSavedSettings.declareString("HtmlHelpLastPage", "", "Last URL visited via help system"); gSavedSettings.declareRect("HtmlHelpRect", LLRect(16,650,600,128), "Rectangle for HTML help window"); @@ -1161,7 +1189,7 @@ void declare_settings() //gSavedSettings.declareBOOL("FindLandAuction", TRUE); // Default for Find -> Land combo box - gSavedSettings.declareString("FindLandType", "All", "Controls which type of land you are searching for in Find Land interface (\"All\", \"Auction\", \"For Sale\", \"First Land\")"); + gSavedSettings.declareString("FindLandType", "All", "Controls which type of land you are searching for in Find Land interface (\"All\", \"Auction\", \"For Sale\")"); gSavedSettings.declareBOOL("FindLandPrice", TRUE, "Enables filtering of land search results by price"); gSavedSettings.declareBOOL("FindLandArea", FALSE, "Enables filtering of land search results by area"); @@ -1172,6 +1200,7 @@ void declare_settings() gSavedSettings.declareBOOL("ShowMatureSims", FALSE, "Display results of find places or find popular that are in mature sims"); gSavedSettings.declareBOOL("ShowMatureEvents", FALSE, "Display results of find events that are flagged as mature"); gSavedSettings.declareBOOL("ShowMatureClassifieds", FALSE, "Display results of find classifieds that are flagged as mature"); + gSavedSettings.declareBOOL("ShowMatureGroups", TRUE, "Display results of find groups that are in flagged as mature"); gSavedSettings.declareBOOL("FindPlacesPictures", TRUE, "Display only results of find places that have pictures"); @@ -1199,6 +1228,7 @@ void declare_settings() gSavedSettings.declareBOOL("UseDefaultColorPicker", FALSE, "Use color picker supplied by operating system"); gSavedSettings.declareF32("PickerContextOpacity", 0.35f, "Controls overall opacity of context frustrum connecting color and texture pickers with their swatches"); + gSavedSettings.declareF32("ColumnHeaderDropDownDelay", 0.3f, "Time in seconds of mouse click before column header shows sort options list"); // support for avatar exporter //gSavedSettings.declareString("AvExportPath", "", "[NOT USED]"); //gSavedSettings.declareString("AvExportBaseName", "", "[NOT USED]"); @@ -1234,6 +1264,36 @@ void declare_settings() //cheesy beacon effects gSavedSettings.declareBOOL("CheesyBeacon", FALSE, "Enable cheesy beacon effects"); + //flycam controls and joystick mapping + gSavedSettings.declareS32("FlycamAxis0", 0, "Flycam hardware axis mapping for internal axis 0 ([0, 5])."); + gSavedSettings.declareS32("FlycamAxis1", 1, "Flycam hardware axis mapping for internal axis 1 ([0, 5])."); + gSavedSettings.declareS32("FlycamAxis2", 2, "Flycam hardware axis mapping for internal axis 2 ([0, 5])."); + gSavedSettings.declareS32("FlycamAxis3", 3, "Flycam hardware axis mapping for internal axis 3 ([0, 5])."); + gSavedSettings.declareS32("FlycamAxis4", 4, "Flycam hardware axis mapping for internal axis 4 ([0, 5])."); + gSavedSettings.declareS32("FlycamAxis5", 5, "Flycam hardware axis mapping for internal axis 5 ([0, 5])."); + gSavedSettings.declareS32("FlycamAxis6", -1, "Flycam hardware axis mapping for internal axis 6 ([0, 5])."); + + gSavedSettings.declareF32("FlycamAxisScale0", 1, "Flycam axis 0 scaler."); + gSavedSettings.declareF32("FlycamAxisScale1", 1, "Flycam axis 1 scaler."); + gSavedSettings.declareF32("FlycamAxisScale2", 1, "Flycam axis 2 scaler."); + gSavedSettings.declareF32("FlycamAxisScale3", 1, "Flycam axis 3 scaler."); + gSavedSettings.declareF32("FlycamAxisScale4", 1, "Flycam axis 4 scaler."); + gSavedSettings.declareF32("FlycamAxisScale5", 1, "Flycam axis 5 scaler."); + gSavedSettings.declareF32("FlycamAxisScale6", 1, "Flycam axis 6 scaler."); + + gSavedSettings.declareF32("FlycamAxisDeadZone0", 0.1f, "Flycam axis 0 dead zone."); + gSavedSettings.declareF32("FlycamAxisDeadZone1", 0.1f, "Flycam axis 1 dead zone."); + gSavedSettings.declareF32("FlycamAxisDeadZone2", 0.1f, "Flycam axis 2 dead zone."); + gSavedSettings.declareF32("FlycamAxisDeadZone3", 0.1f, "Flycam axis 3 dead zone."); + gSavedSettings.declareF32("FlycamAxisDeadZone4", 0.1f, "Flycam axis 4 dead zone."); + gSavedSettings.declareF32("FlycamAxisDeadZone5", 0.1f, "Flycam axis 5 dead zone."); + gSavedSettings.declareF32("FlycamAxisDeadZone6", 0.1f, "Flycam axis 6 dead zone."); + + gSavedSettings.declareF32("FlycamFeathering", 16.f, "Flycam feathering (less is softer)"); + gSavedSettings.declareBOOL("FlycamAutoLeveling", TRUE, "Keep Flycam level."); + gSavedSettings.declareBOOL("FlycamAbsolute", FALSE, "Treat Flycam values as absolute positions (not deltas)."); + gSavedSettings.declareBOOL("FlycamZoomDirect", FALSE, "Map flycam zoom axis directly to camera zoom."); + // // crash_settings.xml // @@ -1243,14 +1303,10 @@ void declare_settings() "(0 = ask before sending crash report, 1 = always send crash report, 2 = never send crash report)"); } -void settings_version_fixup() +void fixup_settings() { #if LL_RELEASE_FOR_DOWNLOAD - if (gCurrentVersion == "1.13.3" || gCurrentVersion == "1.13.4") - { - // In case these were set to true in an early 'First Look' version: - gSavedSettings.setBOOL("RenderDynamicReflections", FALSE); - gSavedSettings.setBOOL("ImagePipelineUseHTTP", FALSE); - } + // Force some settings on startup + gSavedSettings.setBOOL("AnimateTextures", TRUE); // Force AnimateTextures to always be on #endif } diff --git a/linden/indra/newview/llcountdown.cpp b/linden/indra/newview/llcountdown.cpp index de54c61..42dc440 100644 --- a/linden/indra/newview/llcountdown.cpp +++ b/linden/indra/newview/llcountdown.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcountdown.h b/linden/indra/newview/llcountdown.h index 9daebb0..06f6167 100644 --- a/linden/indra/newview/llcountdown.h +++ b/linden/indra/newview/llcountdown.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcubemap.cpp b/linden/indra/newview/llcubemap.cpp index 415b849..74af3da 100644 --- a/linden/indra/newview/llcubemap.cpp +++ b/linden/indra/newview/llcubemap.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -166,6 +167,11 @@ void LLCubeMap::init(const std::vector >& rawimages) } } +GLuint LLCubeMap::getGLName() +{ + return mImages[0]->getTexName(); +} + void LLCubeMap::bind() { if (gGLManager.mHasCubeMap) @@ -206,7 +212,7 @@ void LLCubeMap::disable() if (gGLManager.mHasCubeMap && mTextureStage >= 0) { glActiveTextureARB(GL_TEXTURE0_ARB + mTextureStage); - + glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_R); @@ -219,13 +225,9 @@ void LLCubeMap::setMatrix(S32 stage) mMatrixStage = stage; glActiveTextureARB(GL_TEXTURE0_ARB+stage); - F32 mat[16]; - - glGetFloatv(GL_MODELVIEW_MATRIX, mat); - - LLVector3 x(mat); - LLVector3 y(mat+4); - LLVector3 z(mat+8); + LLVector3 x(LLVector3d(gGLModelView+0)); + LLVector3 y(LLVector3d(gGLModelView+4)); + LLVector3 z(LLVector3d(gGLModelView+8)); LLMatrix3 mat3; mat3.setRows(x,y,z); diff --git a/linden/indra/newview/llcubemap.h b/linden/indra/newview/llcubemap.h index 7be6706..d75d6e7 100644 --- a/linden/indra/newview/llcubemap.h +++ b/linden/indra/newview/llcubemap.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -54,6 +55,8 @@ public: void finishPaint(); + GLuint getGLName(); + LLVector3 map(U8 side, U16 v_val, U16 h_val) const; BOOL project(F32& v_val, F32& h_val, BOOL& outside, U8 side, const LLVector3& dir) const; diff --git a/linden/indra/newview/llcurrencyuimanager.cpp b/linden/indra/newview/llcurrencyuimanager.cpp index 615d9fb..0469d5f 100644 --- a/linden/indra/newview/llcurrencyuimanager.cpp +++ b/linden/indra/newview/llcurrencyuimanager.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcurrencyuimanager.h b/linden/indra/newview/llcurrencyuimanager.h index 39211ab..25e8334 100644 --- a/linden/indra/newview/llcurrencyuimanager.h +++ b/linden/indra/newview/llcurrencyuimanager.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcylinder.cpp b/linden/indra/newview/llcylinder.cpp index 9f76648..e7bb75a 100644 --- a/linden/indra/newview/llcylinder.cpp +++ b/linden/indra/newview/llcylinder.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llcylinder.h b/linden/indra/newview/llcylinder.h index fbd1298..ff44128 100644 --- a/linden/indra/newview/llcylinder.h +++ b/linden/indra/newview/llcylinder.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldebugmessagebox.cpp b/linden/indra/newview/lldebugmessagebox.cpp index e6c1bf1..af500da 100644 --- a/linden/indra/newview/lldebugmessagebox.cpp +++ b/linden/indra/newview/lldebugmessagebox.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -210,14 +211,14 @@ void LLDebugVarMessageBox::draw() switch(mVarType) { case VAR_TYPE_F32: - snprintf(text, sizeof(text), "%.3f", *((F32*)mVarData)); /*Flawfinder: ignore*/ + snprintf(text, sizeof(text), "%.3f", *((F32*)mVarData)); /* Flawfinder: ignore */ break; case VAR_TYPE_S32: - snprintf(text, sizeof(text), "%d", *((S32*)mVarData)); /*Flawfinder: ignore*/ + snprintf(text, sizeof(text), "%d", *((S32*)mVarData)); /* Flawfinder: ignore */ break; case VAR_TYPE_VEC3: LLVector3* vec_p = (LLVector3*)mVarData; - snprintf(text, sizeof(text), "%.3f %.3f %.3f", vec_p->mV[VX], vec_p->mV[VY], vec_p->mV[VZ]); /*Flawfinder: ignore*/ + snprintf(text, sizeof(text), "%.3f %.3f %.3f", vec_p->mV[VX], vec_p->mV[VY], vec_p->mV[VZ]); /* Flawfinder: ignore */ break; } mText->setText(text); diff --git a/linden/indra/newview/lldebugmessagebox.h b/linden/indra/newview/lldebugmessagebox.h index 5537670..6eb34d2 100644 --- a/linden/indra/newview/lldebugmessagebox.h +++ b/linden/indra/newview/lldebugmessagebox.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldebugview.cpp b/linden/indra/newview/lldebugview.cpp index 871afb7..dc179cc 100644 --- a/linden/indra/newview/lldebugview.cpp +++ b/linden/indra/newview/lldebugview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldebugview.h b/linden/indra/newview/lldebugview.h index b7e368b..b82fc10 100644 --- a/linden/indra/newview/lldebugview.h +++ b/linden/indra/newview/lldebugview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldirpicker.cpp b/linden/indra/newview/lldirpicker.cpp index 75f8056..fba3782 100644 --- a/linden/indra/newview/lldirpicker.cpp +++ b/linden/indra/newview/lldirpicker.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldirpicker.h b/linden/indra/newview/lldirpicker.h index 71a65fd..1b9664f 100644 --- a/linden/indra/newview/lldirpicker.h +++ b/linden/indra/newview/lldirpicker.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldrawable.cpp b/linden/indra/newview/lldrawable.cpp index 4d9083e..a39416c 100644 --- a/linden/indra/newview/lldrawable.cpp +++ b/linden/indra/newview/lldrawable.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -101,7 +102,6 @@ void LLDrawable::init() mVObjp = NULL; // mFaces mSpatialGroupp = NULL; - mSpatialGroupOffset = -1; mVisible = 0; mRadius = 0.f; mSunShadowFactor = 1.f; @@ -273,7 +273,8 @@ LLFace* LLDrawable::addFace(LLFacePool *poolp, LLViewerImage *texturep) LLMemType mt(LLMemType::MTYPE_DRAWABLE); LLFace *face = new LLFace(this, mVObjp); - + if (!face) llerrs << "Allocating new Face: " << mFaces.size() << llendl; + if (face) { mFaces.push_back(face); @@ -1044,18 +1045,13 @@ void LLDrawable::updateUVMinMax() { } -void LLDrawable::setSpatialGroup(LLSpatialGroup *groupp, const S32 offset) +void LLDrawable::setSpatialGroup(LLSpatialGroup *groupp) { - mSpatialGroupp = groupp; - - if (mSpatialGroupp) + if (mSpatialGroupp && (groupp != mSpatialGroupp)) { - mSpatialGroupOffset = offset; + mSpatialGroupp->setState(LLSpatialGroup::GEOM_DIRTY); } - else - { - mSpatialGroupOffset = -1; - } + mSpatialGroupp = groupp; } LLSpatialPartition* LLDrawable::getSpatialPartition() @@ -1429,13 +1425,13 @@ void LLSpatialBridge::cleanupReferences() LLDrawable::cleanupReferences(); if (mDrawable) { - mDrawable->setSpatialGroup(NULL, -1); + mDrawable->setSpatialGroup(NULL); for (U32 i = 0; i < mDrawable->getChildCount(); i++) { LLDrawable* drawable = mDrawable->getChild(i); - if (drawable && drawable->getVOVolume()) + if (drawable) { - drawable->setSpatialGroup(NULL, -1); + drawable->setSpatialGroup(NULL); } } diff --git a/linden/indra/newview/lldrawable.h b/linden/indra/newview/lldrawable.h index 6ff4d1e..3bb5525 100644 --- a/linden/indra/newview/lldrawable.h +++ b/linden/indra/newview/lldrawable.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -189,7 +190,7 @@ public: // Debugging methods S32 findReferences(LLDrawable *drawablep); // Not const because of @#$! iterators... - void setSpatialGroup(LLSpatialGroup *groupp, const S32 offset); + void setSpatialGroup(LLSpatialGroup *groupp); LLSpatialGroup *getSpatialGroup() const { return mSpatialGroupp; } LLSpatialPartition* getSpatialPartition(); @@ -306,7 +307,6 @@ protected: face_list_t mFaces; LLSpatialGroup* mSpatialGroupp; LLPointer mSpatialBridge; - S32 mSpatialGroupOffset; mutable U32 mVisible; F32 mRadius; diff --git a/linden/indra/newview/lldrawpool.cpp b/linden/indra/newview/lldrawpool.cpp index dc2e6ba..4a1794e 100644 --- a/linden/indra/newview/lldrawpool.cpp +++ b/linden/indra/newview/lldrawpool.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -62,6 +63,9 @@ LLDrawPool *LLDrawPool::createPool(const U32 type, LLViewerImage *tex0) case POOL_SIMPLE: poolp = new LLDrawPoolSimple(); break; + case POOL_GLOW: + poolp = new LLDrawPoolGlow(); + break; case POOL_ALPHA: poolp = new LLDrawPoolAlpha(); break; diff --git a/linden/indra/newview/lldrawpool.h b/linden/indra/newview/lldrawpool.h index 6cd5f8e..ecedc4c 100644 --- a/linden/indra/newview/lldrawpool.h +++ b/linden/indra/newview/lldrawpool.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -57,6 +58,7 @@ public: POOL_BUMP, POOL_AVATAR, POOL_TREE, + POOL_GLOW, POOL_ALPHA, POOL_WATER, POOL_ALPHA_POST_WATER, @@ -105,8 +107,8 @@ public: enum { PASS_SIMPLE = NUM_POOL_TYPES, - PASS_FULLBRIGHT, PASS_GLOW, + PASS_FULLBRIGHT, PASS_INVISIBLE, PASS_SHINY, PASS_BUMP, diff --git a/linden/indra/newview/lldrawpoolalpha.cpp b/linden/indra/newview/lldrawpoolalpha.cpp index b50be95..8866c1e 100644 --- a/linden/indra/newview/lldrawpoolalpha.cpp +++ b/linden/indra/newview/lldrawpoolalpha.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -45,6 +46,7 @@ #include "llviewerwindow.h" #include "pipeline.h" #include "llviewerregion.h" +#include "llglslshader.h" BOOL LLDrawPoolAlpha::sShowDebugAlpha = FALSE; @@ -66,7 +68,7 @@ LLDrawPoolAlpha::~LLDrawPoolAlpha() void LLDrawPoolAlpha::prerender() { - mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_OBJECT); + mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT); } void LLDrawPoolAlpha::beginRenderPass(S32 pass) @@ -290,12 +292,20 @@ void LLDrawPoolAlpha::renderGroupAlpha(LLSpatialGroup* group, U32 type, U32 mask { gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); light_enabled = FALSE; + if (LLPipeline::sRenderGlow) + { + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + } } } else if (!light_enabled) { gPipeline.enableLightsDynamic(1.f); light_enabled = TRUE; + if (LLPipeline::sRenderGlow) + { + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); + } } /*if (params.mParticle) @@ -328,6 +338,11 @@ void LLDrawPoolAlpha::renderGroupAlpha(LLSpatialGroup* group, U32 type, U32 mask if (!light_enabled) { gPipeline.enableLightsDynamic(1.f); + + if (LLPipeline::sRenderGlow) + { + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); + } } /*glPointSize(1.f); diff --git a/linden/indra/newview/lldrawpoolalpha.h b/linden/indra/newview/lldrawpoolalpha.h index f7012d6..12a3242 100644 --- a/linden/indra/newview/lldrawpoolalpha.h +++ b/linden/indra/newview/lldrawpoolalpha.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldrawpoolavatar.cpp b/linden/indra/newview/lldrawpoolavatar.cpp index fc4f64b..debcfe2 100644 --- a/linden/indra/newview/lldrawpoolavatar.cpp +++ b/linden/indra/newview/lldrawpoolavatar.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -40,6 +41,7 @@ #include "llviewerregion.h" #include "noise.h" #include "pipeline.h" +#include "llglslshader.h" static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK; static U32 sBufferUsage = GL_STREAM_DRAW_ARB; @@ -97,16 +99,15 @@ LLDrawPool *LLDrawPoolAvatar::instancePool() } BOOL gRenderAvatar = TRUE; -static LLMatrix4 sModelViewMatrix = LLMatrix4(); S32 LLDrawPoolAvatar::getVertexShaderLevel() const { - return (S32) gPipeline.getVertexShaderLevel(LLPipeline::SHADER_AVATAR); + return (S32) LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR); } void LLDrawPoolAvatar::prerender() { - mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_AVATAR); + mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR); sShaderLevel = mVertexShaderLevel; if (sShaderLevel > 0) @@ -121,7 +122,14 @@ void LLDrawPoolAvatar::prerender() LLMatrix4& LLDrawPoolAvatar::getModelView() { - return sModelViewMatrix; + static LLMatrix4 ret; + + ret.initRows(LLVector4(gGLModelView+0), + LLVector4(gGLModelView+4), + LLVector4(gGLModelView+8), + LLVector4(gGLModelView+12)); + + return ret; } //----------------------------------------------------------------------------- @@ -150,7 +158,6 @@ void LLDrawPoolAvatar::beginRenderPass(S32 pass) beginFootShadow(); break; case 1: - glGetFloatv(GL_MODELVIEW_MATRIX, (F32*) sModelViewMatrix.mMatrix); beginRigid(); break; case 2: @@ -190,15 +197,15 @@ void LLDrawPoolAvatar::endFootShadow() void LLDrawPoolAvatar::beginRigid() { - sVertexProgram = &gPipeline.mAvatarEyeballProgram; + sVertexProgram = &gAvatarEyeballProgram; glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); if (sShaderLevel > 0) { //eyeballs render with the specular shader - gPipeline.mAvatarEyeballProgram.bind(); - gPipeline.mMaterialIndex = gPipeline.mAvatarEyeballProgram.mAttribute[LLPipeline::GLSL_MATERIAL_COLOR]; - gPipeline.mSpecularIndex = gPipeline.mAvatarEyeballProgram.mAttribute[LLPipeline::GLSL_SPECULAR_COLOR]; + gAvatarEyeballProgram.bind(); + gMaterialIndex = gAvatarEyeballProgram.mAttribute[LLShaderMgr::MATERIAL_COLOR]; + gSpecularIndex = gAvatarEyeballProgram.mAttribute[LLShaderMgr::SPECULAR_COLOR]; } } @@ -213,7 +220,7 @@ void LLDrawPoolAvatar::beginSkinned() glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); - sVertexProgram = &gPipeline.mAvatarProgram; + sVertexProgram = &gAvatarProgram; if (sShaderLevel > 0) // for hardware blending { @@ -221,22 +228,22 @@ void LLDrawPoolAvatar::beginSkinned() glClientActiveTextureARB(GL_TEXTURE1_ARB); if (sShaderLevel >= SHADER_LEVEL_BUMP) { - gPipeline.mMaterialIndex = sVertexProgram->mAttribute[LLPipeline::GLSL_MATERIAL_COLOR]; - gPipeline.mSpecularIndex = sVertexProgram->mAttribute[LLPipeline::GLSL_SPECULAR_COLOR]; + gMaterialIndex = sVertexProgram->mAttribute[LLShaderMgr::MATERIAL_COLOR]; + gSpecularIndex = sVertexProgram->mAttribute[LLShaderMgr::SPECULAR_COLOR]; } sVertexProgram->bind(); if (sShaderLevel >= SHADER_LEVEL_CLOTH) { - enable_cloth_weights(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_CLOTHING]); + enable_cloth_weights(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_CLOTHING]); } - enable_vertex_weighting(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_WEIGHT]); + enable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]); if (sShaderLevel >= SHADER_LEVEL_BUMP) { - enable_binormals(sVertexProgram->mAttribute[LLPipeline::GLSL_BINORMAL]); + enable_binormals(sVertexProgram->mAttribute[LLShaderMgr::BINORMAL]); } - sVertexProgram->enableTexture(LLPipeline::GLSL_BUMP_MAP); + sVertexProgram->enableTexture(LLShaderMgr::BUMP_MAP); glActiveTextureARB(GL_TEXTURE0_ARB); } } @@ -247,17 +254,17 @@ void LLDrawPoolAvatar::endSkinned() if (sShaderLevel > 0) { sRenderingSkinned = FALSE; - sVertexProgram->disableTexture(LLPipeline::GLSL_BUMP_MAP); + sVertexProgram->disableTexture(LLShaderMgr::BUMP_MAP); glActiveTextureARB(GL_TEXTURE0_ARB); glClientActiveTextureARB(GL_TEXTURE0_ARB); - disable_vertex_weighting(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_WEIGHT]); + disable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]); if (sShaderLevel >= SHADER_LEVEL_BUMP) { - disable_binormals(sVertexProgram->mAttribute[LLPipeline::GLSL_BINORMAL]); + disable_binormals(sVertexProgram->mAttribute[LLShaderMgr::BINORMAL]); } if ((sShaderLevel >= SHADER_LEVEL_CLOTH)) { - disable_cloth_weights(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_CLOTHING]); + disable_cloth_weights(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_CLOTHING]); } sVertexProgram->unbind(); @@ -373,7 +380,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) if (sShaderLevel > 0) { - gPipeline.mAvatarMatrixParam = sVertexProgram->mUniform[LLPipeline::GLSL_AVATAR_MATRIX]; + gAvatarMatrixParam = sVertexProgram->mUniform[LLShaderMgr::AVATAR_MATRIX]; } if ((sShaderLevel >= SHADER_LEVEL_CLOTH)) @@ -389,16 +396,16 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) wind = wind * rot_mat; wind.mV[VW] = avatarp->mWindVec.mV[VW]; - sVertexProgram->vertexAttrib4fv(LLPipeline::GLSL_AVATAR_WIND, wind.mV); + sVertexProgram->vertexAttrib4fv(LLShaderMgr::AVATAR_WIND, wind.mV); F32 phase = -1.f * (avatarp->mRipplePhase); F32 freq = 7.f + (noise1(avatarp->mRipplePhase) * 2.f); LLVector4 sin_params(freq, freq, freq, phase); - sVertexProgram->vertexAttrib4fv(LLPipeline::GLSL_AVATAR_SINWAVE, sin_params.mV); + sVertexProgram->vertexAttrib4fv(LLShaderMgr::AVATAR_SINWAVE, sin_params.mV); LLVector4 gravity(0.f, 0.f, -CLOTHING_GRAVITY_EFFECT, 0.f); gravity = gravity * rot_mat; - sVertexProgram->vertexAttrib4fv(LLPipeline::GLSL_AVATAR_GRAVITY, gravity.mV); + sVertexProgram->vertexAttrib4fv(LLShaderMgr::AVATAR_GRAVITY, gravity.mV); } if( !single_avatar || (avatarp == single_avatar) ) @@ -525,11 +532,10 @@ void LLDrawPoolAvatar::renderForSelect() glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glGetFloatv(GL_MODELVIEW_MATRIX, (F32*) sModelViewMatrix.mMatrix); - sVertexProgram = &gPipeline.mAvatarPickProgram; + sVertexProgram = &gAvatarPickProgram; if (sShaderLevel > 0) { - gPipeline.mAvatarMatrixParam = sVertexProgram->mUniform[LLPipeline::GLSL_AVATAR_MATRIX]; + gAvatarMatrixParam = sVertexProgram->mUniform[LLShaderMgr::AVATAR_MATRIX]; } glAlphaFunc(GL_GEQUAL, 0.2f); glBlendFunc(GL_ONE, GL_ZERO); @@ -546,7 +552,7 @@ void LLDrawPoolAvatar::renderForSelect() glClientActiveTextureARB(GL_TEXTURE0_ARB); sRenderingSkinned = TRUE; sVertexProgram->bind(); - enable_vertex_weighting(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_WEIGHT]); + enable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]); } mIndicesDrawn += avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE); @@ -556,7 +562,7 @@ void LLDrawPoolAvatar::renderForSelect() { sRenderingSkinned = FALSE; sVertexProgram->unbind(); - disable_vertex_weighting(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_WEIGHT]); + disable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]); } glAlphaFunc(GL_GREATER, 0.01f); @@ -596,7 +602,7 @@ LLColor3 LLDrawPoolAvatar::getDebugColor() const LLVertexBufferAvatar::LLVertexBufferAvatar() : LLVertexBuffer(sDataMask, - gPipeline.getVertexShaderLevel(LLPipeline::SHADER_AVATAR) > 0 ? + LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR) > 0 ? GL_STATIC_DRAW_ARB : GL_STREAM_DRAW_ARB) { @@ -618,16 +624,16 @@ void LLVertexBufferAvatar::setupVertexBuffer(U32 data_mask) const glClientActiveTextureARB(GL_TEXTURE0_ARB); glTexCoordPointer(2,GL_FLOAT, mStride, (void*)(base + mOffsets[TYPE_TEXCOORD])); - set_vertex_weights(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_WEIGHT], mStride, (F32*)(base + mOffsets[TYPE_WEIGHT])); + set_vertex_weights(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT], mStride, (F32*)(base + mOffsets[TYPE_WEIGHT])); if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_BUMP) { - set_binormals(sVertexProgram->mAttribute[LLPipeline::GLSL_BINORMAL], mStride, (LLVector3*)(base + mOffsets[TYPE_BINORMAL])); + set_binormals(sVertexProgram->mAttribute[LLShaderMgr::BINORMAL], mStride, (LLVector3*)(base + mOffsets[TYPE_BINORMAL])); } if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH) { - set_vertex_clothing_weights(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_CLOTHING], mStride, (LLVector4*)(base + mOffsets[TYPE_CLOTHWEIGHT])); + set_vertex_clothing_weights(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_CLOTHING], mStride, (LLVector4*)(base + mOffsets[TYPE_CLOTHWEIGHT])); } } else diff --git a/linden/indra/newview/lldrawpoolavatar.h b/linden/indra/newview/lldrawpoolavatar.h index 32c02b5..59bc797 100644 --- a/linden/indra/newview/lldrawpoolavatar.h +++ b/linden/indra/newview/lldrawpoolavatar.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldrawpoolbump.cpp b/linden/indra/newview/lldrawpoolbump.cpp index 916454c..b0b8b02 100644 --- a/linden/indra/newview/lldrawpoolbump.cpp +++ b/linden/indra/newview/lldrawpoolbump.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -35,6 +36,7 @@ #include "llimagegl.h" #include "m3math.h" #include "m4math.h" +#include "v4math.h" #include "llagent.h" #include "llcubemap.h" @@ -46,7 +48,7 @@ #include "llviewercamera.h" #include "llviewerimagelist.h" #include "pipeline.h" - +#include "llglslshader.h" //#include "llimagebmp.h" //#include "../tools/imdebug/imdebug.h" @@ -160,7 +162,7 @@ LLDrawPoolBump::LLDrawPoolBump() void LLDrawPoolBump::prerender() { - mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_OBJECT); + mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT); } // static @@ -201,6 +203,11 @@ void LLDrawPoolBump::render(S32 pass) { LLFastTimer t(LLFastTimer::FTM_RENDER_BUMP); + if (!gPipeline.hasRenderType(LLDrawPool::POOL_SIMPLE)) + { + return; + } + switch( pass ) { case 0: @@ -253,14 +260,17 @@ void LLDrawPoolBump::beginShiny() cube_map->setMatrix(0); cube_map->bind(); - if (gPipeline.getVertexShaderLevel(LLPipeline::SHADER_OBJECT) > 0) + if (LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT) > 0) { LLMatrix4 mat; - glGetFloatv(GL_MODELVIEW_MATRIX, (F32*) mat.mMatrix); - gPipeline.mObjectShinyProgram.bind(); - LLVector3 vec = LLVector3(gPipeline.mShinyOrigin) * mat; - LLVector4 vec4(vec, gPipeline.mShinyOrigin.mV[3]); - glUniform4fvARB(gPipeline.mObjectShinyProgram.mUniform[LLPipeline::GLSL_SHINY_ORIGIN], 1, + mat.initRows(LLVector4(gGLModelView+0), + LLVector4(gGLModelView+4), + LLVector4(gGLModelView+8), + LLVector4(gGLModelView+12)); + gObjectShinyProgram.bind(); + LLVector3 vec = LLVector3(gShinyOrigin) * mat; + LLVector4 vec4(vec, gShinyOrigin.mV[3]); + glUniform4fvARB(gObjectShinyProgram.mUniform[LLShaderMgr::SHINY_ORIGIN], 1, vec4.mV); } else @@ -380,9 +390,9 @@ void LLDrawPoolBump::endShiny() cube_map->disable(); cube_map->restoreMatrix(); - if (gPipeline.getVertexShaderLevel(LLPipeline::SHADER_OBJECT) > 0) + if (LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT) > 0) { - gPipeline.mObjectShinyProgram.unbind(); + gObjectShinyProgram.unbind(); } glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); diff --git a/linden/indra/newview/lldrawpoolbump.h b/linden/indra/newview/lldrawpoolbump.h index bb8de40..c41325c 100644 --- a/linden/indra/newview/lldrawpoolbump.h +++ b/linden/indra/newview/lldrawpoolbump.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -46,7 +47,7 @@ public: LLDrawPoolBump(); - /*virtual*/ void render(S32 pass = 0); + virtual void render(S32 pass = 0); /*virtual*/ void beginRenderPass( S32 pass ); /*virtual*/ void endRenderPass( S32 pass ); /*virtual*/ S32 getNumPasses(); diff --git a/linden/indra/newview/lldrawpoolclouds.cpp b/linden/indra/newview/lldrawpoolclouds.cpp index 83ef2b3..9598f3b 100644 --- a/linden/indra/newview/lldrawpoolclouds.cpp +++ b/linden/indra/newview/lldrawpoolclouds.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldrawpoolclouds.h b/linden/indra/newview/lldrawpoolclouds.h index 795b0a6..00faea3 100644 --- a/linden/indra/newview/lldrawpoolclouds.h +++ b/linden/indra/newview/lldrawpoolclouds.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldrawpoolground.cpp b/linden/indra/newview/lldrawpoolground.cpp index bc66757..d0557d4 100644 --- a/linden/indra/newview/lldrawpoolground.cpp +++ b/linden/indra/newview/lldrawpoolground.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -40,6 +41,7 @@ #include "pipeline.h" #include "llagent.h" #include "llviewerregion.h" +#include "llglslshader.h" LLDrawPoolGround::LLDrawPoolGround() : LLFacePool(POOL_GROUND) @@ -53,7 +55,7 @@ LLDrawPool *LLDrawPoolGround::instancePool() void LLDrawPoolGround::prerender() { - mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT); + mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_ENVIRONMENT); } void LLDrawPoolGround::render(S32 pass) diff --git a/linden/indra/newview/lldrawpoolground.h b/linden/indra/newview/lldrawpoolground.h index 6bf358e..97938d8 100644 --- a/linden/indra/newview/lldrawpoolground.h +++ b/linden/indra/newview/lldrawpoolground.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldrawpoolsimple.cpp b/linden/indra/newview/lldrawpoolsimple.cpp index ec8929e..3af8bc2 100644 --- a/linden/indra/newview/lldrawpoolsimple.cpp +++ b/linden/indra/newview/lldrawpoolsimple.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -28,43 +29,92 @@ #include "llviewerprecompiledheaders.h" #include "lldrawpoolsimple.h" +#include "lldrawpoolbump.h" +#include "llviewercamera.h" #include "llagent.h" #include "lldrawable.h" #include "llface.h" #include "llsky.h" #include "pipeline.h" +#include "llglslshader.h" -class LLRenderPassGlow : public LLRenderPass +class LLRenderShinyGlow : public LLDrawPoolBump { public: - LLRenderPassGlow(): LLRenderPass(LLRenderPass::PASS_GLOW) { } + LLRenderShinyGlow() { } - enum + void render(S32 pass = 0) { - VERTEX_DATA_MASK = LLVertexBuffer::MAP_VERTEX | - LLVertexBuffer::MAP_TEXCOORD - }; - - virtual U32 getVertexDataMask() { return VERTEX_DATA_MASK; } + LLCubeMap* cube_map = gSky.mVOSkyp->getCubeMap(); + if( cube_map ) + { + cube_map->enable(0); + cube_map->setMatrix(0); + cube_map->bind(); + glEnableClientState(GL_NORMAL_ARRAY); + + glColor4f(1,1,1,1); + + U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL; + renderStatic(LLRenderPass::PASS_SHINY, mask); + renderActive(LLRenderPass::PASS_SHINY, mask); + + glDisableClientState(GL_NORMAL_ARRAY); + cube_map->disable(); + cube_map->restoreMatrix(); + } + } +}; - virtual void prerender() { } +void LLDrawPoolGlow::render(S32 pass) +{ + LLGLEnable blend(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + renderTexture(LLRenderPass::PASS_GLOW, getVertexDataMask()); + renderActive(LLRenderPass::PASS_GLOW, getVertexDataMask()); - void render(S32 pass = 0) + if (gSky.mVOSkyp) { - LLGLEnable blend(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE); - renderTexture(LLRenderPass::PASS_GLOW, getVertexDataMask()); - renderActive(LLRenderPass::PASS_GLOW, getVertexDataMask()); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glPushMatrix(); + LLVector3 origin = gCamera->getOrigin(); + glTranslatef(origin.mV[0], origin.mV[1], origin.mV[2]); + + LLFace* facep = gSky.mVOSkyp->mFace[LLVOSky::FACE_BLOOM]; + + if (facep) + { + LLGLDisable cull(GL_CULL_FACE); + facep->getTexture()->bind(); + glColor4f(1,1,1,1); + facep->renderIndexed(getVertexDataMask()); + } + + glPopMatrix(); } - void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture = TRUE) + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + + if (LLPipeline::sDynamicReflections) { - glColor4ubv(params.mGlowColor.mV); - LLRenderPass::pushBatch(params, mask, texture); + LLRenderShinyGlow glow; + glow.render(); } -}; + + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + +} + +void LLDrawPoolGlow::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture) +{ + glColor4ubv(params.mGlowColor.mV); + LLRenderPass::pushBatch(params, mask, texture); +} + LLDrawPoolSimple::LLDrawPoolSimple() : LLRenderPass(POOL_SIMPLE) @@ -73,7 +123,7 @@ LLDrawPoolSimple::LLDrawPoolSimple() : void LLDrawPoolSimple::prerender() { - mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_OBJECT); + mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT); } void LLDrawPoolSimple::beginRenderPass(S32 pass) @@ -117,20 +167,14 @@ void LLDrawPoolSimple::render(S32 pass) } { - LLFastTimer t(LLFastTimer::FTM_RENDER_GLOW); - glDisableClientState(GL_COLOR_ARRAY); - LLRenderPassGlow glow; - glow.render(); - } - - { LLFastTimer t(LLFastTimer::FTM_RENDER_INVISIBLE); U32 invisi_mask = LLVertexBuffer::MAP_VERTEX; + glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); renderInvisible(invisi_mask); renderActive(LLRenderPass::PASS_INVISIBLE, invisi_mask); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); } } diff --git a/linden/indra/newview/lldrawpoolsimple.h b/linden/indra/newview/lldrawpoolsimple.h index 85dcacf..a482b28 100644 --- a/linden/indra/newview/lldrawpoolsimple.h +++ b/linden/indra/newview/lldrawpoolsimple.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -50,4 +51,24 @@ public: }; +class LLDrawPoolGlow : public LLRenderPass +{ +public: + LLDrawPoolGlow(): LLRenderPass(LLDrawPool::POOL_GLOW) { } + + enum + { + VERTEX_DATA_MASK = LLVertexBuffer::MAP_VERTEX | + LLVertexBuffer::MAP_TEXCOORD + }; + + virtual U32 getVertexDataMask() { return VERTEX_DATA_MASK; } + + virtual void prerender() { } + + void render(S32 pass = 0); + void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture = TRUE); + +}; + #endif // LL_LLDRAWPOOLSIMPLE_H diff --git a/linden/indra/newview/lldrawpoolsky.cpp b/linden/indra/newview/lldrawpoolsky.cpp index 8266892..328b802 100644 --- a/linden/indra/newview/lldrawpoolsky.cpp +++ b/linden/indra/newview/lldrawpoolsky.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -42,6 +43,7 @@ #include "llvosky.h" #include "llworld.h" // To get water height #include "pipeline.h" +#include "llglslshader.h" LLDrawPoolSky::LLDrawPoolSky() : LLFacePool(POOL_SKY) @@ -55,7 +57,7 @@ LLDrawPool *LLDrawPoolSky::instancePool() void LLDrawPoolSky::prerender() { - mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT); + mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_ENVIRONMENT); } void LLDrawPoolSky::render(S32 pass) diff --git a/linden/indra/newview/lldrawpoolsky.h b/linden/indra/newview/lldrawpoolsky.h index b9c1dda..2f11c67 100644 --- a/linden/indra/newview/lldrawpoolsky.h +++ b/linden/indra/newview/lldrawpoolsky.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldrawpoolstars.cpp b/linden/indra/newview/lldrawpoolstars.cpp index 3d4eebb..d5d57e6 100644 --- a/linden/indra/newview/lldrawpoolstars.cpp +++ b/linden/indra/newview/lldrawpoolstars.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -34,6 +35,7 @@ #include "llvostars.h" #include "pipeline.h" #include "llviewercamera.h" +#include "llglslshader.h" LLDrawPoolStars::LLDrawPoolStars() : LLFacePool(POOL_STARS) @@ -47,7 +49,7 @@ LLDrawPool *LLDrawPoolStars::instancePool() void LLDrawPoolStars::prerender() { - mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT); + mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_ENVIRONMENT); } void LLDrawPoolStars::render(S32 pass) @@ -73,9 +75,7 @@ void LLDrawPoolStars::render(S32 pass) gPipeline.disableLights(); - GLint viewport[4]; - - glGetIntegerv(GL_VIEWPORT, viewport); + GLint* viewport = (GLint*) gGLViewport; if (viewport[2] > 512 && viewport[3] > 512) { diff --git a/linden/indra/newview/lldrawpoolstars.h b/linden/indra/newview/lldrawpoolstars.h index 1eade29..d4ddcf4 100644 --- a/linden/indra/newview/lldrawpoolstars.h +++ b/linden/indra/newview/lldrawpoolstars.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldrawpoolterrain.cpp b/linden/indra/newview/lldrawpoolterrain.cpp index 8ac053c..7586b76 100644 --- a/linden/indra/newview/lldrawpoolterrain.cpp +++ b/linden/indra/newview/lldrawpoolterrain.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -47,6 +48,7 @@ #include "llviewerimagelist.h" // To get alpha gradients #include "llworld.h" #include "pipeline.h" +#include "llglslshader.h" const F32 DETAIL_SCALE = 1.f/16.f; int DebugDetailMap = 0; @@ -168,10 +170,10 @@ void LLDrawPoolTerrain::render(S32 pass) gPipeline.disableLights(); if ((mVertexShaderLevel > 0)) { - gPipeline.mHighlightProgram.bind(); - gPipeline.mHighlightProgram.vertexAttrib4f(LLPipeline::GLSL_MATERIAL_COLOR,1,1,1,1); + gHighlightProgram.bind(); + gHighlightProgram.vertexAttrib4f(LLShaderMgr::MATERIAL_COLOR,1,1,1,1); renderOwnership(); - gPipeline.mTerrainProgram.bind(); + gTerrainProgram.bind(); } else { @@ -222,9 +224,9 @@ void LLDrawPoolTerrain::renderFull4TUShader() // Stage 0: detail texture 0 // - S32 detailTex0 = gPipeline.mTerrainProgram.enableTexture(LLPipeline::GLSL_TERRAIN_DETAIL0); - S32 detailTex1 = gPipeline.mTerrainProgram.enableTexture(LLPipeline::GLSL_TERRAIN_DETAIL1); - S32 rampTex = gPipeline.mTerrainProgram.enableTexture(LLPipeline::GLSL_TERRAIN_ALPHARAMP); + S32 detailTex0 = gTerrainProgram.enableTexture(LLShaderMgr::TERRAIN_DETAIL0); + S32 detailTex1 = gTerrainProgram.enableTexture(LLShaderMgr::TERRAIN_DETAIL1); + S32 rampTex = gTerrainProgram.enableTexture(LLShaderMgr::TERRAIN_ALPHARAMP); LLViewerImage::bindTexture(detail_texture0p,detailTex0); @@ -341,9 +343,9 @@ void LLDrawPoolTerrain::renderFull4TUShader() } // Disable multitexture - gPipeline.mTerrainProgram.disableTexture(LLPipeline::GLSL_TERRAIN_ALPHARAMP); - gPipeline.mTerrainProgram.disableTexture(LLPipeline::GLSL_TERRAIN_DETAIL0); - gPipeline.mTerrainProgram.disableTexture(LLPipeline::GLSL_TERRAIN_DETAIL1); + gTerrainProgram.disableTexture(LLShaderMgr::TERRAIN_ALPHARAMP); + gTerrainProgram.disableTexture(LLShaderMgr::TERRAIN_DETAIL0); + gTerrainProgram.disableTexture(LLShaderMgr::TERRAIN_DETAIL1); glClientActiveTextureARB(GL_TEXTURE3_ARB); glActiveTextureARB(GL_TEXTURE3_ARB); @@ -1080,5 +1082,5 @@ LLColor3 LLDrawPoolTerrain::getDebugColor() const S32 LLDrawPoolTerrain::getMaterialAttribIndex() { - return gPipeline.mTerrainProgram.mAttribute[LLPipeline::GLSL_MATERIAL_COLOR]; + return gTerrainProgram.mAttribute[LLShaderMgr::MATERIAL_COLOR]; } diff --git a/linden/indra/newview/lldrawpoolterrain.h b/linden/indra/newview/lldrawpoolterrain.h index 57fab9e..16fb4ab 100644 --- a/linden/indra/newview/lldrawpoolterrain.h +++ b/linden/indra/newview/lldrawpoolterrain.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldrawpooltree.cpp b/linden/indra/newview/lldrawpooltree.cpp index 36a4393..2f380f8 100644 --- a/linden/indra/newview/lldrawpooltree.cpp +++ b/linden/indra/newview/lldrawpooltree.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -36,6 +37,7 @@ #include "llvotree.h" #include "pipeline.h" #include "llviewercamera.h" +#include "llglslshader.h" S32 LLDrawPoolTree::sDiffTex = 0; @@ -286,5 +288,5 @@ LLColor3 LLDrawPoolTree::getDebugColor() const S32 LLDrawPoolTree::getMaterialAttribIndex() { - return gPipeline.mObjectSimpleProgram.mAttribute[LLPipeline::GLSL_MATERIAL_COLOR]; + return gObjectSimpleProgram.mAttribute[LLShaderMgr::MATERIAL_COLOR]; } diff --git a/linden/indra/newview/lldrawpooltree.h b/linden/indra/newview/lldrawpooltree.h index 6e00460..82bc235 100644 --- a/linden/indra/newview/lldrawpooltree.h +++ b/linden/indra/newview/lldrawpooltree.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldrawpoolwater.cpp b/linden/indra/newview/lldrawpoolwater.cpp index cd2a615..343f14c 100644 --- a/linden/indra/newview/lldrawpoolwater.cpp +++ b/linden/indra/newview/lldrawpoolwater.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -47,21 +48,12 @@ #include "llworld.h" #include "pipeline.h" #include "viewer.h" // gSunTextureID, gMoonTextureID +#include "llglslshader.h" const LLUUID WATER_TEST("2bfd3884-7e27-69b9-ba3a-3e673f680004"); static float sTime; -int nhpo2(int v) -{ - int r = 1; - while (r < v) { - r *= 2; - } - return r; -} - -static GLuint sScreenTex = 0; BOOL LLDrawPoolWater::sSkipScreenCopy = FALSE; LLDrawPoolWater::LLDrawPoolWater() : @@ -88,30 +80,9 @@ LLDrawPoolWater::~LLDrawPoolWater() //static void LLDrawPoolWater::restoreGL() { - if (gPipeline.getVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT) >= SHADER_LEVEL_RIPPLE) - { - //build screen texture - glClientActiveTextureARB(GL_TEXTURE0_ARB); - glActiveTextureARB(GL_TEXTURE0_ARB); - glGenTextures(1, &sScreenTex); - LLGLEnable gl_texture_2d(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, sScreenTex); - GLint viewport[4]; - glGetIntegerv(GL_VIEWPORT, viewport); - GLuint resX = nhpo2(viewport[2]); - GLuint resY = nhpo2(viewport[3]); - - gImageList.updateMaxResidentTexMem(-1, resX*resY*3); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, resX, resY, 0, GL_RGB, GL_FLOAT, NULL); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - } + } - LLDrawPool *LLDrawPoolWater::instancePool() { llerrs << "Should never be calling instancePool on a water pool!" << llendl; @@ -121,12 +92,9 @@ LLDrawPool *LLDrawPoolWater::instancePool() void LLDrawPoolWater::prerender() { -#if 1 // 1.9.1 mVertexShaderLevel = gSavedSettings.getBOOL("RenderRippleWater") ? - gPipeline.getVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT) : 0; -#else - mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT); -#endif + LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_ENVIRONMENT) : 0; + } extern LLColor4U MAX_WATER_COLOR; @@ -149,7 +117,7 @@ void LLDrawPoolWater::render(S32 pass) std::sort(mDrawFace.begin(), mDrawFace.end(), LLFace::CompareDistanceGreater()); - LLGLSPipelineAlpha alphaState; + LLGLEnable blend(GL_BLEND); if ((mVertexShaderLevel >= SHADER_LEVEL_RIPPLE)) { @@ -343,7 +311,6 @@ void LLDrawPoolWater::render(S32 pass) glDisableClientState(GL_NORMAL_ARRAY); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - } @@ -370,7 +337,7 @@ void LLDrawPoolWater::renderShaderSimple() glEnableClientState(GL_NORMAL_ARRAY); // Set up second pass first - S32 bumpTex = gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_BUMP_MAP); + S32 bumpTex = gWaterProgram.enableTexture(LLShaderMgr::BUMP_MAP); mWaterImagep->addTextureStats(1024.f*1024.f); mWaterImagep->bind(bumpTex); @@ -419,7 +386,7 @@ void LLDrawPoolWater::renderShaderSimple() if (gSky.mVOSkyp->getCubeMap()) { - envTex = gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); + envTex = gWaterProgram.enableTexture(LLShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); gSky.mVOSkyp->getCubeMap()->bind(); glMatrixMode(GL_TEXTURE); @@ -433,9 +400,9 @@ void LLDrawPoolWater::renderShaderSimple() glMatrixMode(GL_MODELVIEW); } - S32 diffTex = gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_DIFFUSE_MAP); + S32 diffTex = gWaterProgram.enableTexture(LLShaderMgr::DIFFUSE_MAP); - gPipeline.mWaterProgram.bind(); + gWaterProgram.bind(); for (std::vector::iterator iter = mDrawFace.begin(); iter != mDrawFace.end(); iter++) @@ -452,21 +419,21 @@ void LLDrawPoolWater::renderShaderSimple() if (gSky.mVOSkyp->getCubeMap()) { - gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); + gWaterProgram.disableTexture(LLShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); glMatrixMode(GL_TEXTURE); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); } // Now, disable texture coord generation on texture state 1 - gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_BUMP_MAP); + gWaterProgram.disableTexture(LLShaderMgr::BUMP_MAP); LLImageGL::unbindTexture(bumpTex, GL_TEXTURE_2D); glActiveTextureARB(GL_TEXTURE1_ARB); glDisable(GL_TEXTURE_GEN_S); //texture unit 1 glDisable(GL_TEXTURE_GEN_T); //texture unit 1 - gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_DIFFUSE_MAP); + gWaterProgram.disableTexture(LLShaderMgr::DIFFUSE_MAP); // Disable texture coordinate and color arrays LLImageGL::unbindTexture(diffTex, GL_TEXTURE_2D); @@ -527,50 +494,10 @@ void LLDrawPoolWater::renderReflection(LLFace* face) glDisableClientState(GL_TEXTURE_COORD_ARRAY); } -void bindScreenToTexture() -{ - if (LLDrawPoolWater::sSkipScreenCopy) - { - glBindTexture(GL_TEXTURE_2D, 0); - } - else - { - - GLint viewport[4]; - glGetIntegerv(GL_VIEWPORT, viewport); - GLuint resX = nhpo2(viewport[2]); - GLuint resY = nhpo2(viewport[3]); - - glBindTexture(GL_TEXTURE_2D, sScreenTex); - GLint cResX; - GLint cResY; - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &cResX); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &cResY); - - if (cResX != (GLint)resX || cResY != (GLint)resY) - { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, resX, resY, 0, GL_RGB, GL_FLOAT, NULL); - gImageList.updateMaxResidentTexMem(-1, resX*resY*3); - } - - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, viewport[0], viewport[1], 0, 0, viewport[2], viewport[3]); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - float scale[2]; - scale[0] = (float) viewport[2]/resX; - scale[1] = (float) viewport[3]/resY; - glUniform2fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_FBSCALE], 1, scale); - - LLImageGL::sBoundTextureMemory += resX * resY * 3; - } -} - void LLDrawPoolWater::shade() { + glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); + static LLVector2 d1( 0.5f, -0.17f ); static LLVector2 d2( 0.58f, -0.67f ); static LLVector2 d3( 0.5f, 0.25f ); @@ -637,31 +564,41 @@ void LLDrawPoolWater::shade() LLCubeMap* skyMap = gSky.mVOSkyp->getCubeMap(); - gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); + gWaterProgram.enableTexture(LLShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); skyMap->bind(); //bind normal map - S32 bumpTex = gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_BUMP_MAP); + S32 bumpTex = gWaterProgram.enableTexture(LLShaderMgr::BUMP_MAP); mWaterNormp->addTextureStats(1024.f*1024.f); mWaterNormp->bind(bumpTex); - gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_WATER_SCREENTEX); + gWaterProgram.enableTexture(LLShaderMgr::WATER_SCREENTEX); - gPipeline.mWaterProgram.bind(); + gWaterProgram.bind(); - bindScreenToTexture(); + if (!sSkipScreenCopy) + { + gPipeline.bindScreenToTexture(); + } + else + { + glBindTexture(GL_TEXTURE_2D, 0); + } - S32 diffTex = gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_DIFFUSE_MAP); + glUniform2fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_FBSCALE], 1, + gPipeline.mScreenScale.mV); + + S32 diffTex = gWaterProgram.enableTexture(LLShaderMgr::DIFFUSE_MAP); LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); - glUniform1fARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_TIME], sTime); - glUniform3fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_SPECULAR], 1, light_diffuse.mV); - glUniform1fARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_SPECULAR_EXP], light_exp); - glUniform3fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_EYEVEC], 1, gCamera->getOrigin().mV); - glUniform2fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_WAVE_DIR1], 1, d1.mV); - glUniform2fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_WAVE_DIR2], 1, d2.mV); - glUniform3fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_LIGHT_DIR], 1, light_dir.mV); + glUniform1fARB(gWaterProgram.mUniform[LLShaderMgr::WATER_TIME], sTime); + glUniform3fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_SPECULAR], 1, light_diffuse.mV); + glUniform1fARB(gWaterProgram.mUniform[LLShaderMgr::WATER_SPECULAR_EXP], light_exp); + glUniform3fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_EYEVEC], 1, gCamera->getOrigin().mV); + glUniform2fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_WAVE_DIR1], 1, d1.mV); + glUniform2fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_WAVE_DIR2], 1, d2.mV); + glUniform3fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_LIGHT_DIR], 1, light_dir.mV); LLColor4 water_color; LLVector3 camera_up = gCamera->getUpAxis(); @@ -669,12 +606,12 @@ void LLDrawPoolWater::shade() if (gCamera->cameraUnderWater()) { water_color.setVec(1.f, 1.f, 1.f, 0.4f); - glUniform1fARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_REFSCALE], 0.25f); + glUniform1fARB(gWaterProgram.mUniform[LLShaderMgr::WATER_REFSCALE], 0.25f); } else { water_color.setVec(1.f, 1.f, 1.f, 0.5f*(1.f + up_dot)); - glUniform1fARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_REFSCALE], 0.01f); + glUniform1fARB(gWaterProgram.mUniform[LLShaderMgr::WATER_REFSCALE], 0.01f); } if (water_color.mV[3] > 0.9f) { @@ -701,10 +638,10 @@ void LLDrawPoolWater::shade() } } - gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); - gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_WATER_SCREENTEX); - gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_BUMP_MAP); - gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_DIFFUSE_MAP); + gWaterProgram.disableTexture(LLShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); + gWaterProgram.disableTexture(LLShaderMgr::WATER_SCREENTEX); + gWaterProgram.disableTexture(LLShaderMgr::BUMP_MAP); + gWaterProgram.disableTexture(LLShaderMgr::DIFFUSE_MAP); glActiveTextureARB(GL_TEXTURE0_ARB); glEnable(GL_TEXTURE_2D); @@ -712,6 +649,7 @@ void LLDrawPoolWater::shade() glClientActiveTextureARB(GL_TEXTURE0_ARB); glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_FALSE); } void LLDrawPoolWater::renderForSelect() diff --git a/linden/indra/newview/lldrawpoolwater.h b/linden/indra/newview/lldrawpoolwater.h index 2e45868..cdd3e3b 100644 --- a/linden/indra/newview/lldrawpoolwater.h +++ b/linden/indra/newview/lldrawpoolwater.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldriverparam.cpp b/linden/indra/newview/lldriverparam.cpp index 3e0409e..ce42ad5 100644 --- a/linden/indra/newview/lldriverparam.cpp +++ b/linden/indra/newview/lldriverparam.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldriverparam.h b/linden/indra/newview/lldriverparam.h index b40d5d9..e96d5ce 100644 --- a/linden/indra/newview/lldriverparam.h +++ b/linden/indra/newview/lldriverparam.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldynamictexture.cpp b/linden/indra/newview/lldynamictexture.cpp index 90ebd74..4944415 100644 --- a/linden/indra/newview/lldynamictexture.cpp +++ b/linden/indra/newview/lldynamictexture.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lldynamictexture.h b/linden/indra/newview/lldynamictexture.h index b11bed3..9833ecc 100644 --- a/linden/indra/newview/lldynamictexture.h +++ b/linden/indra/newview/lldynamictexture.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llemote.cpp b/linden/indra/newview/llemote.cpp index 28f56b5..09ba389 100644 --- a/linden/indra/newview/llemote.cpp +++ b/linden/indra/newview/llemote.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llemote.h b/linden/indra/newview/llemote.h index 6296b66..a0aa353 100644 --- a/linden/indra/newview/llemote.h +++ b/linden/indra/newview/llemote.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lleventinfo.cpp b/linden/indra/newview/lleventinfo.cpp index 103450e..f49b91a 100644 --- a/linden/indra/newview/lleventinfo.cpp +++ b/linden/indra/newview/lleventinfo.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lleventinfo.h b/linden/indra/newview/lleventinfo.h index 950e32e..9fd6f99 100644 --- a/linden/indra/newview/lleventinfo.h +++ b/linden/indra/newview/lleventinfo.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lleventnotifier.cpp b/linden/indra/newview/lleventnotifier.cpp index 0487223..ec4d95f 100644 --- a/linden/indra/newview/lleventnotifier.cpp +++ b/linden/indra/newview/lleventnotifier.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lleventnotifier.h b/linden/indra/newview/lleventnotifier.h index 61b164d..1db2e2f 100644 --- a/linden/indra/newview/lleventnotifier.h +++ b/linden/indra/newview/lleventnotifier.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lleventpoll.cpp b/linden/indra/newview/lleventpoll.cpp index 5407ee2..9c5a19d 100644 --- a/linden/indra/newview/lleventpoll.cpp +++ b/linden/indra/newview/lleventpoll.cpp @@ -1,9 +1,10 @@ -/** +/** * @file lleventpoll.cpp - * @brief Implementation of the LLEventPoll class. + * @brief Implementation of the LLEventPoll class. * - * Copyright (c) 2006-2007, Linden Research, Inc. + * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -27,156 +28,160 @@ #include "llviewerprecompiledheaders.h" +#include "llagent.h" #include "lleventpoll.h" #include "llhttpclient.h" -#include "llhttpnode.h" #include "llsdserialize.h" +#include "llviewerregion.h" +#include "message.h" +class LLEventPoll::Impl : LLHTTPClient::Responder +{ +public: + static Impl& start(const std::string& pollURL); + void stop(); + +private: + Impl(const std::string& pollURL); + ~Impl(); + + void makeRequest(); + void handleMessage(const LLSD& content); + virtual void error(U32 status, const std::string& reason); + virtual void result(const LLSD& content); +private: + typedef LLHTTPClient::ResponderPtr Ptr; -class LLEventPoll::Impl : LLHTTPClient::Responder + Ptr mPtr; + bool mDone; + + std::string mPollURL; + std::string mSender; + + LLSD mAcknowledge; + + // these are only here for debugging so we can see which poller is which + static int sCount; + int mCount; +}; + +//static +LLEventPoll::Impl& LLEventPoll::Impl::start( + const std::string& pollURL) { -public: - static Impl& start( - const std::string& pollURL, const LLHTTPNode& treeRoot) - { - Impl* i = new Impl(pollURL, treeRoot); - llinfos << "LLEventPoll::Impl::start <" << i->mCount << "> " + Impl* i = new Impl(pollURL); + llinfos << "LLEventPoll::Impl::start <" << i->mCount << "> " << pollURL << llendl; - return *i; - } - - void stop() + return *i; +} + +void LLEventPoll::Impl::stop() +{ + llinfos << "LLEventPoll::Impl::stop <" << mCount << "> " + << mPollURL << llendl; + // there should be a way to stop a LLHTTPClient request in progress + mDone = true; + mPtr = NULL; +} + +int LLEventPoll::Impl::sCount = 0; + +LLEventPoll::Impl::Impl(const std::string& pollURL) + : mPtr(NULL), mDone(false), + mPollURL(pollURL), + mCount(++sCount) +{ + mPtr = this; + //extract host and port of simulator to set as sender + LLViewerRegion *regionp = gAgent.getRegion(); + if (!regionp) { - lldebugs << "LLEventPoll::Impl::stop <" << mCount << "> " - << mPollURL << llendl; - // there should be a way to stop a LLHTTPClient request in progress - mDone = true; - mPtr = NULL; + llerrs << "LLEventPoll initialized before region is added." << llendl; } + mSender = regionp->getHost().getIPandPort(); + llinfos << "LLEventPoll initialized with sender " << mSender << llendl; + makeRequest(); +} + +LLEventPoll::Impl::~Impl() +{ + lldebugs << "LLEventPoll::Impl::~Impl <" << mCount << "> " + << mPollURL << llendl; +} + +void LLEventPoll::Impl::makeRequest() +{ + LLSD request; + request["ack"] = mAcknowledge; + request["done"] = mDone; -private: - Impl(const std::string& pollURL, const LLHTTPNode& treeRoot) - : mPtr(NULL), mDone(false), - mPollURL(pollURL), mTreeRoot(treeRoot), - mCount(++sCount) - { - mPtr = this; - makeRequest(); - } - - ~Impl() - { - lldebugs << "LLEventPoll::Impl::~Impl <" << mCount << "> " - << mPollURL << llendl; - } + lldebugs << "LLEventPoll::Impl::makeRequest <" << mCount << "> ack = " + << LLSDXMLStreamer(mAcknowledge) << llendl; + LLHTTPClient::post(mPollURL, request, mPtr); +} + +void LLEventPoll::Impl::handleMessage(const LLSD& content) +{ + std::string msg_name = content["message"]; + LLSD message; + message["sender"] = mSender; + message["body"] = content["body"]; + LLMessageSystem::dispatch(msg_name, message); +} +//virtual +void LLEventPoll::Impl::error(U32 status, const std::string& reason) +{ + if (mDone) return; - void makeRequest() + if(status != 499) { - LLSD request; - request["ack"] = mAcknowledge; - request["done"] = mDone; - - lldebugs << "LLEventPoll::Impl::makeRequest <" << mCount << "> ack = " - << LLSDXMLStreamer(mAcknowledge) << llendl; - LLHTTPClient::post(mPollURL, request, mPtr); + llwarns << "LLEventPoll::Impl::error: <" << mCount << "> got " + << status << ": " << reason + << (mDone ? " -- done" : "") << llendl; + stop(); + return; } + + makeRequest(); +} + +//virtual +void LLEventPoll::Impl::result(const LLSD& content) +{ + lldebugs << "LLEventPoll::Impl::result <" << mCount << ">" + << (mDone ? " -- done" : "") << llendl; - void handleMessage(const LLSD& content) - { - std::string message = content["message"]; - if (message.empty()) - { - llwarns << "LLEventPoll::Impl::handleMessage <" << mCount - << "> empty message name" << llendl; - return; - } - - std::string path = "/message/" + message; - - LLSD context; - const LLHTTPNode* handler = mTreeRoot.traverse(path, context); - if (!handler) - { - llwarns << "LLEventPoll::Impl::handleMessage <" << mCount - << "> no handler for " << path << llendl; - return; - } - LLPointer responsep = LLSimpleResponse::create(); - handler->post((LLHTTPNode::ResponsePtr)responsep, context, content["body"]); - - lldebugs << "LLEventPoll::Impl::handleMessage handled <" << mCount << "> " - << message << ": " << *responsep << llendl; - } + if (mDone) return; + + mAcknowledge = content["id"]; + LLSD events = content["events"]; - virtual void error(U32 status, const std::string& reason) + if(mAcknowledge.isUndefined()) { - lldebugs << "LLEventPoll::Impl::error <" << mCount << "> got " - << status << ": " << reason - << (mDone ? " -- done" : "") << llendl; - - if (mDone) return; - - if (status == 404) - { - // the capability has been revoked - stop(); - return; - } - - makeRequest(); + llwarns << "LLEventPoll::Impl: id undefined" << llendl; } + llinfos << "LLEventPoll::Impl::completed <" << mCount << "> " << events.size() << "events (id " + << LLSDXMLStreamer(mAcknowledge) << ")" << llendl; - virtual void result(const LLSD& content) + LLSD::array_const_iterator i = events.beginArray(); + LLSD::array_const_iterator end = events.endArray(); + for (; i != end; ++i) { - lldebugs << "LLEventPoll::Impl::result <" << mCount << ">" - << (mDone ? " -- done" : "") << llendl; - - if (mDone) return; - - mAcknowledge = content["id"]; - LLSD events = content["events"]; - - lldebugs << "LLEventPoll::Impl::completed <" << mCount << "> ack = " - << LLSDXMLStreamer(mAcknowledge) << llendl; - - LLSD::array_const_iterator i = events.beginArray(); - LLSD::array_const_iterator end = events.endArray(); - for (; i != end; ++i) + if (i->has("message")) { - if (i->has("message")) - { - handleMessage(*i); - } + handleMessage(*i); } - - makeRequest(); } - -private: - typedef LLHTTPClient::ResponderPtr Ptr; - - Ptr mPtr; - bool mDone; - - std::string mPollURL; - const LLHTTPNode& mTreeRoot; - LLSD mAcknowledge; - - // these are only here for debugging so we can see which poller is which - static int sCount; - int mCount; -}; - -int LLEventPoll::Impl::sCount = 0; - + makeRequest(); +} -LLEventPoll::LLEventPoll(const std::string& pollURL, const LLHTTPNode& treeRoot) - : impl(Impl::start(pollURL, treeRoot)) +LLEventPoll::LLEventPoll(const std::string& pollURL) + : impl(Impl::start(pollURL)) { } LLEventPoll::~LLEventPoll() diff --git a/linden/indra/newview/lleventpoll.h b/linden/indra/newview/lleventpoll.h index b12770e..4c06a43 100644 --- a/linden/indra/newview/lleventpoll.h +++ b/linden/indra/newview/lleventpoll.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -28,20 +29,12 @@ #ifndef LL_LLEVENTPOLL_H #define LL_LLEVENTPOLL_H -class LLHTTPNode; - - class LLEventPoll ///< implements the viewer side of server-to-viewer pushed events. { public: - LLEventPoll(const std::string& pollURL, const LLHTTPNode& treeRoot); - /**< Start polling the URL. - - The object will automatically responde to events - by calling handlers in the tree. - */ - + LLEventPoll(const std::string& pollURL); + ///< Start polling the URL. virtual ~LLEventPoll(); ///< will stop polling, cancelling any poll in progress. diff --git a/linden/indra/newview/llface.cpp b/linden/indra/newview/llface.cpp index e46fcd3..3b47e21 100644 --- a/linden/indra/newview/llface.cpp +++ b/linden/indra/newview/llface.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -250,8 +251,6 @@ void LLFace::setDrawable(LLDrawable *drawable) void LLFace::setSize(const S32 num_vertices, const S32 num_indices) { - LLMemType mt1(LLMemType::MTYPE_DRAWABLE); - mGeomCount = num_vertices; mIndicesCount = num_indices; } @@ -750,7 +749,18 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f, { size.scaleVec(mDrawablep->getVObj()->getScale()); } - LLQuaternion rotation = LLQuaternion(mat_normal); + + LLMatrix3 mat = mat_normal; + LLVector3 x = mat.getFwdRow(); + LLVector3 y = mat.getLeftRow(); + LLVector3 z = mat.getUpRow(); + x.normVec(); + y.normVec(); + z.normVec(); + + mat.setRows(x,y,z); + + LLQuaternion rotation = LLQuaternion(mat); LLVector3 v[4]; //get 4 corners of bounding box @@ -934,7 +944,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, LLVector2 tmin, tmax; const LLTextureEntry *tep = mVObjp->getTE(f); - U8 bump_code = tep ? bump_code = tep->getBumpmap() : 0; + U8 bump_code = tep ? tep->getBumpmap() : 0; if (rebuild_tcoord) { @@ -969,20 +979,11 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } else { - //if (mode & LLViewerTextureAnim::TRANSLATE) - { - os = ot = 0.f; - } - //if (mode & LLViewerTextureAnim::ROTATE) - { - r = 0.f; - cos_ang = 1.f; - sin_ang = 0.f; - } - //if (mode & LLViewerTextureAnim::SCALE) - { - ms = mt = 1.f; - } + os = ot = 0.f; + r = 0.f; + cos_ang = 1.f; + sin_ang = 0.f; + ms = mt = 1.f; } } diff --git a/linden/indra/newview/llface.h b/linden/indra/newview/llface.h index b265b3a..6870789 100644 --- a/linden/indra/newview/llface.h +++ b/linden/indra/newview/llface.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llface.inl b/linden/indra/newview/llface.inl index cdf858f..b36577e 100644 --- a/linden/indra/newview/llface.inl +++ b/linden/indra/newview/llface.inl @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfasttimerview.cpp b/linden/indra/newview/llfasttimerview.cpp index 5038ed9..c469d8c 100644 --- a/linden/indra/newview/llfasttimerview.cpp +++ b/linden/indra/newview/llfasttimerview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfasttimerview.h b/linden/indra/newview/llfasttimerview.h index 11a8887..f4ecfcd 100644 --- a/linden/indra/newview/llfasttimerview.h +++ b/linden/indra/newview/llfasttimerview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfeaturemanager.cpp b/linden/indra/newview/llfeaturemanager.cpp index c0fd96b..57fbc64 100644 --- a/linden/indra/newview/llfeaturemanager.cpp +++ b/linden/indra/newview/llfeaturemanager.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -192,7 +193,7 @@ BOOL LLFeatureManager::maskFeatures(const char *name) LLFeatureList *maskp = findMask(name); if (!maskp) { - llwarns << "Unknown feature mask " << name << llendl; +// llwarns << "Unknown feature mask " << name << llendl; return FALSE; } llinfos << "Applying Feature Mask: " << name << llendl; @@ -450,14 +451,6 @@ void LLFeatureManager::initGraphicsFeatureMasks() { maskFeatures("ATI"); } - if (gGLManager.mIsRadeon8500) - { - maskFeatures("Radeon8500"); - } - if (gGLManager.mIsRadeon9700) - { - maskFeatures("Radeon9700"); - } if (gGLManager.mIsGFFX) { maskFeatures("GeForceFX"); @@ -470,11 +463,18 @@ void LLFeatureManager::initGraphicsFeatureMasks() { maskFeatures("OpenGLPre15"); } - - if (gGLManager.mIsMobilityRadeon9000) + // Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces + std::string gpustr = mGPUString; + for (std::string::iterator iter = gpustr.begin(); iter != gpustr.end(); ++iter) { - maskFeatures("MobilityRadeon9000"); + if (*iter == ' ') + { + *iter = '_'; + } } +// llinfos << "Masking features from gpu table match: " << gpustr << llendl; + maskFeatures(gpustr.c_str()); + if (isSafe()) { maskFeatures("safe"); diff --git a/linden/indra/newview/llfeaturemanager.h b/linden/indra/newview/llfeaturemanager.h index a3800da..026b78a 100644 --- a/linden/indra/newview/llfeaturemanager.h +++ b/linden/indra/newview/llfeaturemanager.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfft.cpp b/linden/indra/newview/llfft.cpp index 9652786..2b80ad9 100644 --- a/linden/indra/newview/llfft.cpp +++ b/linden/indra/newview/llfft.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfft.h b/linden/indra/newview/llfft.h index 5df02ab..07e868b 100644 --- a/linden/indra/newview/llfft.h +++ b/linden/indra/newview/llfft.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfilepicker.cpp b/linden/indra/newview/llfilepicker.cpp index d3938e0..971743b 100644 --- a/linden/indra/newview/llfilepicker.cpp +++ b/linden/indra/newview/llfilepicker.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -279,6 +280,7 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const char* filename) wcsncpy( mFilesW,L"untitled.wav", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/ } mOFN.lpstrDefExt = L"wav"; + mOFN.lpstrFilter = L"WAV Sounds (*.wav)\0*.wav\0" \ L"\0"; break; diff --git a/linden/indra/newview/llfilepicker.h b/linden/indra/newview/llfilepicker.h index c284a42..008c96e 100644 --- a/linden/indra/newview/llfilepicker.h +++ b/linden/indra/newview/llfilepicker.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfirstuse.cpp b/linden/indra/newview/llfirstuse.cpp index 1127f8b..74381dc 100644 --- a/linden/indra/newview/llfirstuse.cpp +++ b/linden/indra/newview/llfirstuse.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfirstuse.h b/linden/indra/newview/llfirstuse.h index 86992cb..89a58be 100644 --- a/linden/indra/newview/llfirstuse.h +++ b/linden/indra/newview/llfirstuse.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llflexibleobject.cpp b/linden/indra/newview/llflexibleobject.cpp index 4ce1614..d4080c5 100644 --- a/linden/indra/newview/llflexibleobject.cpp +++ b/linden/indra/newview/llflexibleobject.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llflexibleobject.h b/linden/indra/newview/llflexibleobject.h index 9772c57..3d35dd2 100644 --- a/linden/indra/newview/llflexibleobject.h +++ b/linden/indra/newview/llflexibleobject.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterabout.cpp b/linden/indra/newview/llfloaterabout.cpp index cbac9f3..372d7e0 100644 --- a/linden/indra/newview/llfloaterabout.cpp +++ b/linden/indra/newview/llfloaterabout.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -112,7 +113,7 @@ LLFloaterAbout::LLFloaterAbout() // CPU support.append("CPU: "); - support.append( gSysCPU.getCPUStringTerse() ); + support.append( gSysCPU.getCPUString() ); support.append("\n"); U32 memory = gSysMemory.getPhysicalMemory() / 1024 / 1024; diff --git a/linden/indra/newview/llfloaterabout.h b/linden/indra/newview/llfloaterabout.h index 881cb43..1e7ad4c 100644 --- a/linden/indra/newview/llfloaterabout.h +++ b/linden/indra/newview/llfloaterabout.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloateranimpreview.cpp b/linden/indra/newview/llfloateranimpreview.cpp index 3661ea2..6802fb2 100644 --- a/linden/indra/newview/llfloateranimpreview.cpp +++ b/linden/indra/newview/llfloateranimpreview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -281,7 +282,7 @@ BOOL LLFloaterAnimPreview::postBuild() childSetValue("ease_out_time", LLSD(motionp->getEaseOutDuration())); mEnabled = TRUE; char seconds_string[128]; /*Flawfinder: ignore*/ - snprintf(seconds_string, sizeof(seconds_string), " - %.2f seconds", motionp->getDuration()); /*Flawfinder: ignore*/ + snprintf(seconds_string, sizeof(seconds_string), " - %.2f seconds", motionp->getDuration()); /* Flawfinder: ignore */ setTitle(mFilename + LLString(seconds_string)); } @@ -303,7 +304,7 @@ BOOL LLFloaterAnimPreview::postBuild() { char output_str[256]; /*Flawfinder: ignore*/ - snprintf(output_str, sizeof(output_str), "Animation file is %.1f seconds in length.\n\nMaximum animation length is %.1f seconds.\n", /*Flawfinder: ignore*/ + snprintf(output_str, sizeof(output_str), "Animation file is %.1f seconds in length.\n\nMaximum animation length is %.1f seconds.\n", /* Flawfinder: ignore */ loaderp->getDuration(), MAX_ANIM_DURATION); childSetValue("bad_animation_text", LLSD(output_str)); } @@ -409,7 +410,7 @@ BOOL LLFloaterAnimPreview::handleMouseDown(S32 x, S32 y, MASK mask) if (mPreviewRect.pointInRect(x, y)) { bringToFront( x, y ); - gViewerWindow->setMouseCapture(this, onMouseCaptureLost); + gViewerWindow->setMouseCapture(this); gViewerWindow->hideCursor(); mLastMouseX = x; mLastMouseY = y; @@ -424,7 +425,7 @@ BOOL LLFloaterAnimPreview::handleMouseDown(S32 x, S32 y, MASK mask) //----------------------------------------------------------------------------- BOOL LLFloaterAnimPreview::handleMouseUp(S32 x, S32 y, MASK mask) { - gViewerWindow->setMouseCapture(FALSE, NULL); + gViewerWindow->setMouseCapture(FALSE); gViewerWindow->showCursor(); return LLFloater::handleMouseUp(x, y, mask); } @@ -436,7 +437,7 @@ BOOL LLFloaterAnimPreview::handleHover(S32 x, S32 y, MASK mask) { MASK local_mask = mask & ~MASK_ALT; - if (mAnimPreview && gViewerWindow->hasMouseCapture(this)) + if (mAnimPreview && hasMouseCapture()) { if (local_mask == MASK_PAN) { @@ -498,7 +499,7 @@ BOOL LLFloaterAnimPreview::handleScrollWheel(S32 x, S32 y, S32 clicks) //----------------------------------------------------------------------------- // onMouseCaptureLost() //----------------------------------------------------------------------------- -void LLFloaterAnimPreview::onMouseCaptureLost(LLMouseHandler* handler) +void LLFloaterAnimPreview::onMouseCaptureLost() { gViewerWindow->showCursor(); } diff --git a/linden/indra/newview/llfloateranimpreview.h b/linden/indra/newview/llfloateranimpreview.h index fea10d7..f6d9589 100644 --- a/linden/indra/newview/llfloateranimpreview.h +++ b/linden/indra/newview/llfloateranimpreview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -75,10 +76,10 @@ public: BOOL handleMouseUp(S32 x, S32 y, MASK mask); BOOL handleHover(S32 x, S32 y, MASK mask); BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); + void onMouseCaptureLost(); void refresh(); - static void onMouseCaptureLost(LLMouseHandler*); static void onBtnPlay(void*); static void onBtnStop(void*); static void setUploadAmount(S32 amount) { sUploadAmount = amount; } diff --git a/linden/indra/newview/llfloaterauction.cpp b/linden/indra/newview/llfloaterauction.cpp index 8e7124a..49da8ba 100644 --- a/linden/indra/newview/llfloaterauction.cpp +++ b/linden/indra/newview/llfloaterauction.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -76,12 +77,6 @@ LLFloaterAuction::LLFloaterAuction() : childSetCommitCallback("fence_check", LLSavedSettingsGlue::setBOOL, (void*)"AuctionShowFence"); - LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(this, "saletype_combo"); - if (combo) - { - combo->selectFirstItem(); - } - childSetAction("snapshot_btn", onClickSnapshot, this); childSetAction("ok_btn", onClickOK, this); } @@ -215,28 +210,18 @@ void LLFloaterAuction::onClickSnapshot(void* data) void LLFloaterAuction::onClickOK(void* data) { LLFloaterAuction* self = (LLFloaterAuction*)(data); - bool is_auction = false; - LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(self, "saletype_combo"); - if (combo - && combo->getCurrentIndex() == 0) - { - is_auction = true; - } + if(self->mImageID.notNull()) { LLSD parcel_name = self->childGetValue("parcel_text"); - // create the asset - if(is_auction) - { - // only need the tga if it is an auction. - LLString* name = new LLString(parcel_name.asString()); - gAssetStorage->storeAssetData(self->mTransactionID, LLAssetType::AT_IMAGE_TGA, - &auction_tga_upload_done, - (void*)name, - FALSE); - self->getWindow()->incBusyCount(); - } + // create the asset + LLString* name = new LLString(parcel_name.asString()); + gAssetStorage->storeAssetData(self->mTransactionID, LLAssetType::AT_IMAGE_TGA, + &auction_tga_upload_done, + (void*)name, + FALSE); + self->getWindow()->incBusyCount(); LLString* j2c_name = new LLString(parcel_name.asString()); gAssetStorage->storeAssetData(self->mTransactionID, LLAssetType::AT_TEXTURE, @@ -245,24 +230,13 @@ void LLFloaterAuction::onClickOK(void* data) FALSE); self->getWindow()->incBusyCount(); - if(is_auction) - { - LLNotifyBox::showXml("UploadingAuctionSnapshot"); - } - else - { - LLNotifyBox::showXml("UploadingSnapshot"); - } + LLNotifyBox::showXml("UploadingAuctionSnapshot"); + } LLMessageSystem* msg = gMessageSystem; - if(is_auction) - { - msg->newMessage("ViewerStartAuction"); - } - else - { - msg->newMessage("ParcelGodReserveForNewbie"); - } + + msg->newMessage("ViewerStartAuction"); + msg->nextBlock("AgentData"); msg->addUUID("AgentID", gAgent.getID()); msg->addUUID("SessionID", gAgent.getSessionID()); diff --git a/linden/indra/newview/llfloaterauction.h b/linden/indra/newview/llfloaterauction.h index 7ff932f..51936bc 100644 --- a/linden/indra/newview/llfloaterauction.h +++ b/linden/indra/newview/llfloaterauction.h @@ -5,6 +5,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloateravatarinfo.cpp b/linden/indra/newview/llfloateravatarinfo.cpp index ef34542..c0351ee 100644 --- a/linden/indra/newview/llfloateravatarinfo.cpp +++ b/linden/indra/newview/llfloateravatarinfo.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -52,7 +53,6 @@ #include "llcheckboxctrl.h" #include "llfloaterworldmap.h" #include "llfloatermute.h" -#include "llfloaterrate.h" #include "llinventoryview.h" #include "lllineeditor.h" #include "llmutelist.h" @@ -205,10 +205,6 @@ void LLFloaterAvatarInfo::showFromDirectory(const LLUUID &avatar_id) floater->mPanelAvatarp->setAvatarID(avatar_id, "", ONLINE_STATUS_NO); floater->open(); /*Flawfinder: ignore*/ } - if(floater) - { - floater->mPanelAvatarp->disableRate(); - } } diff --git a/linden/indra/newview/llfloateravatarinfo.h b/linden/indra/newview/llfloateravatarinfo.h index 4879309..7ca6882 100644 --- a/linden/indra/newview/llfloateravatarinfo.h +++ b/linden/indra/newview/llfloateravatarinfo.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloateravatarpicker.cpp b/linden/indra/newview/llfloateravatarpicker.cpp index cb9af67..6989084 100644 --- a/linden/indra/newview/llfloateravatarpicker.cpp +++ b/linden/indra/newview/llfloateravatarpicker.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -43,7 +44,7 @@ const S32 MIN_WIDTH = 200; const S32 MIN_HEIGHT = 340; const LLRect FLOATER_RECT(0, 380, 240, 0); -const char FLOATER_TITLE[] = "Choose Person"; +const char FLOATER_TITLE[] = "Choose Resident"; // static LLFloaterAvatarPicker* LLFloaterAvatarPicker::sInstance = NULL; @@ -108,9 +109,7 @@ BOOL LLFloaterAvatarPicker::postBuild() if (mListNames) { - LLScrollListItem* row = new LLScrollListItem( TRUE, NULL, LLUUID::null ); - row->addColumn("No results", LLFontGL::sSansSerif); - mListNames->addItem(row); + mListNames->addSimpleElement("No results"); } mInventoryPanel = (LLInventoryPanel*)this->getCtrlByNameAndType("Inventory Panel", WIDGET_TYPE_INVENTORY_PANEL); @@ -188,11 +187,12 @@ void LLFloaterAvatarPicker::onList(LLUICtrl* ctrl, void* userdata) } std::vector items = self->mListNames->getAllSelected(); - std::vector::iterator itor; - for (itor = items.begin(); itor != items.end(); ++itor) + for (std::vector::iterator iter = items.begin(); + iter != items.end(); ++iter) { - self->mAvatarNames.push_back((*itor)->getColumn(0)->getText()); - self->mAvatarIDs.push_back((*itor)->getUUID()); + LLScrollListItem* item = *iter; + self->mAvatarNames.push_back(item->getColumn(0)->getText()); + self->mAvatarIDs.push_back(item->getUUID()); self->childSetEnabled("Select", TRUE); } } @@ -256,10 +256,7 @@ void LLFloaterAvatarPicker::find() if (mListNames) { mListNames->deleteAllItems(); - - LLScrollListItem* row = new LLScrollListItem( TRUE, NULL, LLUUID::null ); - row->addColumn("Searching...", LLFontGL::sSansSerif); - mListNames->addItem(row); + mListNames->addSimpleElement("Searching..."); } childSetEnabled("Select", FALSE); @@ -324,23 +321,23 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void* msg->getStringFast(_PREHASH_Data,_PREHASH_FirstName, DB_FIRST_NAME_BUF_SIZE, first_name, i); msg->getStringFast(_PREHASH_Data,_PREHASH_LastName, DB_LAST_NAME_BUF_SIZE, last_name, i); - LLScrollListItem* row = new LLScrollListItem( TRUE, NULL, avatar_id ); - + LLString avatar_name; if (avatar_id.isNull()) { self->childSetTextArg("NotFound", "[TEXT]", self->childGetText("Edit")); - LLString msg = self->childGetValue("NotFound").asString(); - row->addColumn(msg, LLFontGL::sSansSerif); + avatar_name = self->childGetValue("NotFound").asString(); self->mListNames->setEnabled(FALSE); } else { - LLString buffer = LLString(first_name) + " " + last_name; - row->addColumn(buffer, LLFontGL::sSansSerif); + avatar_name = LLString(first_name) + " " + last_name; self->mListNames->setEnabled(TRUE); found_one = TRUE; } - self->mListNames->addItem(row); + LLSD element; + element["id"] = avatar_id; // value + element["columns"][0]["value"] = avatar_name; + self->mListNames->addElement(element); } if (found_one) diff --git a/linden/indra/newview/llfloateravatarpicker.h b/linden/indra/newview/llfloateravatarpicker.h index a8ed5ef..9089c9a 100644 --- a/linden/indra/newview/llfloateravatarpicker.h +++ b/linden/indra/newview/llfloateravatarpicker.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloateravatartextures.cpp b/linden/indra/newview/llfloateravatartextures.cpp index d7d7dfc..5d53107 100644 --- a/linden/indra/newview/llfloateravatartextures.cpp +++ b/linden/indra/newview/llfloateravatartextures.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -97,6 +98,7 @@ void LLFloaterAvatarTextures::draw() LLFloater::draw(); } +#if !LL_RELEASE_FOR_DOWNLOAD static void update_texture_ctrl(LLVOAvatar* avatarp, LLTextureCtrl* ctrl, LLVOAvatar::ETextureIndex te) @@ -134,7 +136,6 @@ static LLVOAvatar* find_avatar(const LLUUID& id) void LLFloaterAvatarTextures::refresh() { -#if !LL_RELEASE_FOR_DOWNLOAD LLVOAvatar *avatarp = find_avatar(mID); if (avatarp) { @@ -177,9 +178,16 @@ void LLFloaterAvatarTextures::refresh() { setTitle(mTitle + ": INVALID AVATAR (" + mID.asString() + ")"); } -#endif } +#else + +void LLFloaterAvatarTextures::refresh() +{ +} + +#endif + // static void LLFloaterAvatarTextures::onClickDump(void* data) { diff --git a/linden/indra/newview/llfloateravatartextures.h b/linden/indra/newview/llfloateravatartextures.h index c908935..bd67859 100644 --- a/linden/indra/newview/llfloateravatartextures.h +++ b/linden/indra/newview/llfloateravatartextures.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterbuildoptions.cpp b/linden/indra/newview/llfloaterbuildoptions.cpp index be5cd4e..1bec048 100644 --- a/linden/indra/newview/llfloaterbuildoptions.cpp +++ b/linden/indra/newview/llfloaterbuildoptions.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterbuildoptions.h b/linden/indra/newview/llfloaterbuildoptions.h index b31ddcb..a34aa2c 100644 --- a/linden/indra/newview/llfloaterbuildoptions.h +++ b/linden/indra/newview/llfloaterbuildoptions.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterbump.cpp b/linden/indra/newview/llfloaterbump.cpp index ead50e8..ee26d6a 100644 --- a/linden/indra/newview/llfloaterbump.cpp +++ b/linden/indra/newview/llfloaterbump.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -82,9 +83,10 @@ void LLFloaterBump::show(void *contents) if (gMeanCollisionList.isEmpty()) { LLString none_detected = sInstance->childGetText("none_detected"); - LLScrollListItem *item = new LLScrollListItem(); - item->addColumn(none_detected, LLFontGL::sSansSerifBold); - list->addItem(item); + LLSD row; + row["columns"][0]["value"] = none_detected; + row["columns"][0]["font"] = "SansSerifBold"; + list->addElement(row); } else { @@ -151,7 +153,9 @@ void LLFloaterBump::add(LLScrollListCtrl* list, LLMeanCollisionData* mcd) text.setArg("[FIRST]", mcd->mFirstName); text.setArg("[LAST]", mcd->mLastName); - LLScrollListItem *item = new LLScrollListItem(TRUE, NULL, mcd->mPerp); - item->addColumn(text, LLFontGL::sSansSerifBold); - list->addItem(item); + LLSD row; + row["id"] = mcd->mPerp; + row["columns"][0]["value"] = text; + row["columns"][0]["font"] = "SansSerifBold"; + list->addElement(row); } diff --git a/linden/indra/newview/llfloaterbump.h b/linden/indra/newview/llfloaterbump.h index d944443..476220a 100644 --- a/linden/indra/newview/llfloaterbump.h +++ b/linden/indra/newview/llfloaterbump.h @@ -5,6 +5,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterbuy.cpp b/linden/indra/newview/llfloaterbuy.cpp index 2266845..be52084 100644 --- a/linden/indra/newview/llfloaterbuy.cpp +++ b/linden/indra/newview/llfloaterbuy.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -147,7 +148,8 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info) // Compute icon for this item LLUUID icon_id = get_item_icon_uuid(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, - 0x0); + 0x0, FALSE); + row["columns"][0]["column"] = "icon"; row["columns"][0]["type"] = "icon"; row["columns"][0]["value"] = icon_id; @@ -243,9 +245,16 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj, LLSD row; // Compute icon for this item + BOOL item_is_multi = FALSE; + if ( inv_item->getFlags() & LLInventoryItem::II_FLAGS_LANDMARK_VISITED ) + { + item_is_multi = TRUE; + } + LLUUID icon_id = get_item_icon_uuid(inv_item->getType(), inv_item->getInventoryType(), - inv_item->getFlags()); + inv_item->getFlags(), + item_is_multi); row["columns"][0]["column"] = "icon"; row["columns"][0]["type"] = "icon"; row["columns"][0]["value"] = icon_id; diff --git a/linden/indra/newview/llfloaterbuy.h b/linden/indra/newview/llfloaterbuy.h index 1642aaa..a4428fe 100644 --- a/linden/indra/newview/llfloaterbuy.h +++ b/linden/indra/newview/llfloaterbuy.h @@ -5,6 +5,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterbuycontents.cpp b/linden/indra/newview/llfloaterbuycontents.cpp index 1deb1ab..5e8d921 100644 --- a/linden/indra/newview/llfloaterbuycontents.cpp +++ b/linden/indra/newview/llfloaterbuycontents.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -214,9 +215,17 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj, // Create the line in the list LLSD row; + + BOOL item_is_multi = FALSE; + if ( inv_item->getFlags() & LLInventoryItem::II_FLAGS_LANDMARK_VISITED ) + { + item_is_multi = TRUE; + } + LLUUID icon_id = get_item_icon_uuid(inv_item->getType(), inv_item->getInventoryType(), - inv_item->getFlags()); + inv_item->getFlags(), + item_is_multi); row["columns"][0]["column"] = "icon"; row["columns"][0]["type"] = "icon"; row["columns"][0]["value"] = icon_id; diff --git a/linden/indra/newview/llfloaterbuycontents.h b/linden/indra/newview/llfloaterbuycontents.h index a30de0e..2553e09 100644 --- a/linden/indra/newview/llfloaterbuycontents.h +++ b/linden/indra/newview/llfloaterbuycontents.h @@ -5,6 +5,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterbuycurrency.cpp b/linden/indra/newview/llfloaterbuycurrency.cpp index 388a8aa..2ce46f7 100644 --- a/linden/indra/newview/llfloaterbuycurrency.cpp +++ b/linden/indra/newview/llfloaterbuycurrency.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterbuycurrency.h b/linden/indra/newview/llfloaterbuycurrency.h index 4dfb61f..633a7b7 100644 --- a/linden/indra/newview/llfloaterbuycurrency.h +++ b/linden/indra/newview/llfloaterbuycurrency.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterbuyland.cpp b/linden/indra/newview/llfloaterbuyland.cpp index 1b72d4e..ed7f619 100644 --- a/linden/indra/newview/llfloaterbuyland.cpp +++ b/linden/indra/newview/llfloaterbuyland.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -94,7 +95,6 @@ private: // information about the parcel bool mParcelValid; bool mParcelIsForSale; - bool mParcelIsFirstLand; bool mParcelIsGroupLand; S32 mParcelGroupContribution; S32 mParcelPrice; @@ -371,7 +371,6 @@ void LLFloaterBuyLandUI::updateParcelInfo() LLParcel* parcel = mParcel->getParcel(); mParcelValid = parcel && mRegion; mParcelIsForSale = false; - mParcelIsFirstLand = false; mParcelIsGroupLand = false; mParcelGroupContribution = 0; mParcelPrice = 0; @@ -405,7 +404,6 @@ void LLFloaterBuyLandUI::updateParcelInfo() { mParcelActualArea = parcel->getArea(); mParcelIsForSale = parcel->getForSale(); - mParcelIsFirstLand = parcel->getReservedForNewbie(); mParcelIsGroupLand = parcel->getIsGroupOwned(); mParcelPrice = mParcelIsForSale ? parcel->getSalePrice() : 0; @@ -512,36 +510,6 @@ void LLFloaterBuyLandUI::updateParcelInfo() } } - /* - if ((mRegion->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) - && !gAgent.isGodlike()) - { - mCannotBuyReason = llformat( - "The region %s does not allow transfer of land.", - mRegion->getName().c_str() ); - return; - } - */ - - if (parcel->getReservedForNewbie()) - { - if (mIsForGroup) - { - mCannotBuyReason = childGetText("first_time_group"); - return; - } - - if (gStatusBar->getSquareMetersCommitted() > 0) - { - mCannotBuyReason == childGetText("first_time"); - return; - } - - // *TODO: There should be a check based on the database value - // indra.user.ever_owned_land, only that value never makes it - // to the viewer, see SL-10728 - } - mCanBuy = true; } @@ -1162,17 +1130,6 @@ void LLFloaterBuyLandUI::refreshUI() message += childGetText("insufficient_land_credits"); } - else if (mAgentHasNeverOwnedLand) - { - if (mParcelIsFirstLand) - { - message += childGetText("first_purchase"); - } - else - { - message += childGetText("first_time_but_not_first_land"); - } - } else { @@ -1280,14 +1237,12 @@ void LLFloaterBuyLandUI::refreshUI() } - //remove_contribution not in XML - ?! childSetValue("remove_contribution", LLSD(groupContributionEnough)); childSetEnabled("remove_contribution", groupContributionEnough); bool showRemoveContribution = mParcelIsGroupLand && (mParcelGroupContribution > 0); - childSetText("remove_contribution", - llformat("Remove %d square meters of contribution from group", - minContribution)); + childSetLabelArg("remove_contribution", "[AMOUNT]", + llformat("%d", minContribution)); childSetVisible("remove_contribution", showRemoveContribution); childShow("step_3"); diff --git a/linden/indra/newview/llfloaterbuyland.h b/linden/indra/newview/llfloaterbuyland.h index a91c6d6..328eaec 100644 --- a/linden/indra/newview/llfloaterbuyland.h +++ b/linden/indra/newview/llfloaterbuyland.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp index 2b27d15..d31532f 100644 --- a/linden/indra/newview/llfloaterchat.cpp +++ b/linden/indra/newview/llfloaterchat.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterchat.h b/linden/indra/newview/llfloaterchat.h index 2b150a2..54df738 100644 --- a/linden/indra/newview/llfloaterchat.h +++ b/linden/indra/newview/llfloaterchat.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterclothing.cpp b/linden/indra/newview/llfloaterclothing.cpp index 627b2c6..8df90bc 100644 --- a/linden/indra/newview/llfloaterclothing.cpp +++ b/linden/indra/newview/llfloaterclothing.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -263,9 +264,15 @@ void LLFloaterClothing::buildClothingList() LLSD row; row["id"] = item->getUUID(); + BOOL item_is_multi = FALSE; + if ( item->getFlags() & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) + { + item_is_multi = TRUE; + } + LLUUID image_id = get_item_icon_uuid(item->getType(), item->getInventoryType(), - item->getFlags()); // flags = wearable type + item->getFlags(), item_is_multi); // flags = wearable type row["columns"][0]["column"] = "icon"; row["columns"][0]["type"] = "icon"; row["columns"][0]["value"] = image_id; diff --git a/linden/indra/newview/llfloaterclothing.h b/linden/indra/newview/llfloaterclothing.h index 85fbc18..6c2015a 100644 --- a/linden/indra/newview/llfloaterclothing.h +++ b/linden/indra/newview/llfloaterclothing.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatercolorpicker.cpp b/linden/indra/newview/llfloatercolorpicker.cpp index 84df754..973fe75 100644 --- a/linden/indra/newview/llfloatercolorpicker.cpp +++ b/linden/indra/newview/llfloatercolorpicker.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -294,59 +295,6 @@ destroyUI () } } -////////////////////////////////////////////////////////////////////////////// -// -void -LLFloaterColorPicker:: -rgbToHsl ( F32 rValIn, F32 gValIn, F32 bValIn, F32& hValOut, F32& sValOut, F32& lValOut ) -{ - F32 var_R = ( rValIn ); - F32 var_G = ( gValIn ); - F32 var_B = ( bValIn ); - - F32 var_Min = ( var_R < ( var_G < var_B ? var_G : var_B ) ? var_R : ( var_G < var_B ? var_G : var_B ) ); - F32 var_Max = ( var_R > ( var_G > var_B ? var_G : var_B ) ? var_R : ( var_G > var_B ? var_G : var_B ) ); - - F32 del_Max = var_Max - var_Min; - - F32 L = ( var_Max + var_Min ) / 2.0f; - F32 H = 0.0f; - F32 S = 0.0f; - - if ( del_Max == 0.0f ) - { - H = 0.0f; - S = 0.0f; - } - else - { - if ( L < 0.5 ) - S = del_Max / ( var_Max + var_Min ); - else - S = del_Max / ( 2.0f - var_Max - var_Min ); - - F32 del_R = ( ( ( var_Max - var_R ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; - F32 del_G = ( ( ( var_Max - var_G ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; - F32 del_B = ( ( ( var_Max - var_B ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; - - if ( var_R >= var_Max ) - H = del_B - del_G; - else - if ( var_G >= var_Max ) - H = ( 1.0f / 3.0f ) + del_R - del_B; - else - if ( var_B >= var_Max ) - H = ( 2.0f / 3.0f ) + del_G - del_R; - - if ( H < 0.0f ) H += 1.0f; - if ( H > 1.0f ) H -= 1.0f; - } - - // scale to meet calculation requirements - hValOut = H * 360.0f / 360.0f; - sValOut = S * 100.0f / 100.0f; - lValOut = L * 100.0f / 100.0f; -} ////////////////////////////////////////////////////////////////////////////// // @@ -426,7 +374,7 @@ setCurRgb ( F32 curRIn, F32 curGIn, F32 curBIn ) curB = curBIn; // update corresponding HSL values and - rgbToHsl ( curR, curG, curB, curH, curS, curL ); + LLColor3(curRIn, curGIn, curBIn).calcHSL(&curH, &curS, &curL); // color changed so update text fields (fixes SL-16968) // HACK: turn off the call back wilst we update the text or we recurse ourselves into oblivion @@ -573,11 +521,10 @@ void LLFloaterColorPicker::onColorSelect( const LLTextureEntry& te, void *data ) } } -void LLFloaterColorPicker::onMouseCaptureLost(LLMouseHandler *old_captor) +void LLFloaterColorPicker::onMouseCaptureLost() { - LLFloaterColorPicker* self = (LLFloaterColorPicker*)old_captor; - self->setMouseDownInHueRegion(FALSE); - self->setMouseDownInLumRegion(FALSE); + setMouseDownInHueRegion(FALSE); + setMouseDownInLumRegion(FALSE); } ////////////////////////////////////////////////////////////////////////////// @@ -726,7 +673,10 @@ getComplimentaryColor ( LLColor4& backgroundColor ) { // going to base calculation on luminance F32 hVal, sVal, lVal; - rgbToHsl ( backgroundColor [ 0 ], backgroundColor [ 1 ], backgroundColor [ 2 ], hVal, sVal, lVal ); + backgroundColor.calcHSL(&hVal, &sVal, &lVal); + hVal *= 360.f; + sVal *= 100.f; + lVal *= 100.f; // fairly simple heuristic for now...! if ( lVal < 0.5f ) @@ -961,7 +911,7 @@ handleMouseDown ( S32 x, S32 y, MASK mask ) if ( rgbAreaRect.pointInRect ( x, y ) ) { - gViewerWindow->setMouseCapture(this, onMouseCaptureLost); + gViewerWindow->setMouseCapture(this); // mouse button down setMouseDownInHueRegion ( TRUE ); @@ -980,7 +930,7 @@ handleMouseDown ( S32 x, S32 y, MASK mask ) if ( lumAreaRect.pointInRect ( x, y ) ) { - gViewerWindow->setMouseCapture(this, onMouseCaptureLost); + gViewerWindow->setMouseCapture(this); // mouse button down setMouseDownInLumRegion ( TRUE ); @@ -1193,9 +1143,9 @@ handleMouseUp ( S32 x, S32 y, MASK mask ) // mouse button not down in color swatch anymore mMouseDownInSwatch = false; - if (gViewerWindow->hasMouseCapture(this)) + if (hasMouseCapture()) { - gViewerWindow->setMouseCapture(NULL, NULL); + gViewerWindow->setMouseCapture(NULL); } // dispatch to base class for the rest of things diff --git a/linden/indra/newview/llfloatercolorpicker.h b/linden/indra/newview/llfloatercolorpicker.h index 953b402..6c5fc85 100644 --- a/linden/indra/newview/llfloatercolorpicker.h +++ b/linden/indra/newview/llfloatercolorpicker.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -55,6 +56,7 @@ class LLFloaterColorPicker virtual BOOL handleMouseDown ( S32 x, S32 y, MASK mask ); virtual BOOL handleMouseUp ( S32 x, S32 y, MASK mask ); virtual BOOL handleHover ( S32 x, S32 y, MASK mask ); + virtual void onMouseCaptureLost(); virtual void onClose(bool app_quitting); // implicit methods @@ -109,11 +111,9 @@ class LLFloaterColorPicker // convert RGB to HSL and vice-versa void hslToRgb ( F32 hValIn, F32 sValIn, F32 lValIn, F32& rValOut, F32& gValOut, F32& bValOut ); - void rgbToHsl ( F32 rValIn, F32 gValIn, F32 bValIn, F32& hValOut, F32& sValOut, F32& lValOut ); F32 hueToRgb ( F32 val1In, F32 val2In, F32 valHUeIn ); void setActive(BOOL active); - static void onMouseCaptureLost(LLMouseHandler* old_captor); protected: // callbacks diff --git a/linden/indra/newview/llfloatercustomize.cpp b/linden/indra/newview/llfloatercustomize.cpp index 7ac50ae..ee83bf9 100644 --- a/linden/indra/newview/llfloatercustomize.cpp +++ b/linden/indra/newview/llfloatercustomize.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatercustomize.h b/linden/indra/newview/llfloatercustomize.h index 47419e2..6eccdcc 100644 --- a/linden/indra/newview/llfloatercustomize.h +++ b/linden/indra/newview/llfloatercustomize.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterdirectory.cpp b/linden/indra/newview/llfloaterdirectory.cpp index 846a2fb..aea55f7 100644 --- a/linden/indra/newview/llfloaterdirectory.cpp +++ b/linden/indra/newview/llfloaterdirectory.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterdirectory.h b/linden/indra/newview/llfloaterdirectory.h index 34cf43d..b57dc14 100644 --- a/linden/indra/newview/llfloaterdirectory.h +++ b/linden/indra/newview/llfloaterdirectory.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatereditui.cpp b/linden/indra/newview/llfloatereditui.cpp index 3af5741..81c93ce 100644 --- a/linden/indra/newview/llfloatereditui.cpp +++ b/linden/indra/newview/llfloatereditui.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatereditui.h b/linden/indra/newview/llfloatereditui.h index 0f57e7d..054339f 100644 --- a/linden/indra/newview/llfloatereditui.h +++ b/linden/indra/newview/llfloatereditui.h @@ -5,6 +5,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterfriends.cpp b/linden/indra/newview/llfloaterfriends.cpp index 8a36620..8d39890 100644 --- a/linden/indra/newview/llfloaterfriends.cpp +++ b/linden/indra/newview/llfloaterfriends.cpp @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -520,14 +521,11 @@ void LLFloaterFriends::onClickIM(void* user_data) } else { - LLUUID session_id; - session_id.generate(); gIMView->setFloaterOpen(TRUE); - gIMView->addSession( - "Friends Conference", - IM_SESSION_ADD, - session_id, - ids); + gIMView->addSession("Friends Conference", + IM_SESSION_CONFERENCE_START, + ids[0], + ids); } } } @@ -545,38 +543,51 @@ void LLFloaterFriends::requestFriendship(const LLUUID& target_id, const LLString IM_FRIENDSHIP_OFFERED); } +struct LLAddFriendData +{ + LLUUID mID; + std::string mName; +}; + // static -void LLFloaterFriends::callbackAddFriend(S32 option, void* user_data) +void LLFloaterFriends::callbackAddFriend(S32 option, void* data) { + LLAddFriendData* add = (LLAddFriendData*)data; if (option == 0) { - LLFloaterFriends* self = (LLFloaterFriends*)user_data; - requestFriendship(self->mAddFriendID, self->mAddFriendName); + requestFriendship(add->mID, add->mName); } + delete add; } // static void LLFloaterFriends::onPickAvatar(const std::vector& names, const std::vector& ids, - void* user_data) + void* ) { if (names.empty()) return; if (ids.empty()) return; + requestFriendshipDialog(ids[0], names[0]); +} - LLFloaterFriends* self = (LLFloaterFriends*)user_data; - self->mAddFriendID = ids[0]; - self->mAddFriendName = names[0]; - - if(ids[0] == gAgentID) +// static +void LLFloaterFriends::requestFriendshipDialog(const LLUUID& id, + const std::string& name) +{ + if(id == gAgentID) { LLNotifyBox::showXml("AddSelfFriend"); return; } + LLAddFriendData* data = new LLAddFriendData(); + data->mID = id; + data->mName = name; + // TODO: accept a line of text with this dialog LLString::format_map_t args; - args["[NAME]"] = names[0]; - gViewerWindow->alertXml("AddFriend", args, callbackAddFriend, user_data); + args["[NAME]"] = name; + gViewerWindow->alertXml("AddFriend", args, callbackAddFriend, data); } // static diff --git a/linden/indra/newview/llfloaterfriends.h b/linden/indra/newview/llfloaterfriends.h index 236ac34..327a8cf 100644 --- a/linden/indra/newview/llfloaterfriends.h +++ b/linden/indra/newview/llfloaterfriends.h @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -72,7 +73,14 @@ public: // Toggles visibility of floater static void toggle(void* unused = NULL); - static void requestFriendship(const LLUUID& target_id, const LLString& target_name); + // Show a dialog explaining what friendship entails, then request + // friendship. JC + static void requestFriendshipDialog(const LLUUID& target_id, + const std::string& target_name); + + // Just request friendship, no dialog. + static void requestFriendship(const LLUUID& target_id, + const LLString& target_name); private: diff --git a/linden/indra/newview/llfloatergesture.cpp b/linden/indra/newview/llfloatergesture.cpp index 313dccf..5b191e4 100644 --- a/linden/indra/newview/llfloatergesture.cpp +++ b/linden/indra/newview/llfloatergesture.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatergesture.h b/linden/indra/newview/llfloatergesture.h index 51f7566..d463e09 100644 --- a/linden/indra/newview/llfloatergesture.h +++ b/linden/indra/newview/llfloatergesture.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatergodtools.cpp b/linden/indra/newview/llfloatergodtools.cpp index e1d12d2..7376bba 100644 --- a/linden/indra/newview/llfloatergodtools.cpp +++ b/linden/indra/newview/llfloatergodtools.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -1344,11 +1345,10 @@ void LLPanelRequestTools::refresh() list->operateOnAll(LLCtrlListInterface::OP_DELETE); list->addSimpleElement(SELECTION); list->addSimpleElement(AGENT_REGION); - LLViewerRegion* regionp; - for(regionp = gWorldp->mActiveRegionList.getFirstData(); - regionp != NULL; - regionp = gWorldp->mActiveRegionList.getNextData()) + for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin(); + iter != gWorldp->mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; LLString name = regionp->getName(); if (!name.empty()) { @@ -1406,11 +1406,10 @@ void LLPanelRequestTools::onClickRequest(void* data) else { // find region by name - LLViewerRegion* regionp; - for(regionp = gWorldp->mActiveRegionList.getFirstData(); - regionp != NULL; - regionp = gWorldp->mActiveRegionList.getNextData()) + for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin(); + iter != gWorldp->mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; if(dest == regionp->getName()) { // found it diff --git a/linden/indra/newview/llfloatergodtools.h b/linden/indra/newview/llfloatergodtools.h index 876d5e4..908ef63 100644 --- a/linden/indra/newview/llfloatergodtools.h +++ b/linden/indra/newview/llfloatergodtools.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatergroupinfo.cpp b/linden/indra/newview/llfloatergroupinfo.cpp index a807774..348f31f 100644 --- a/linden/indra/newview/llfloatergroupinfo.cpp +++ b/linden/indra/newview/llfloatergroupinfo.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatergroupinfo.h b/linden/indra/newview/llfloatergroupinfo.h index 00ecca5..b89fdc9 100644 --- a/linden/indra/newview/llfloatergroupinfo.h +++ b/linden/indra/newview/llfloatergroupinfo.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatergroupinvite.cpp b/linden/indra/newview/llfloatergroupinvite.cpp index 0c8b526..a6d81ec 100644 --- a/linden/indra/newview/llfloatergroupinvite.cpp +++ b/linden/indra/newview/llfloatergroupinvite.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatergroupinvite.h b/linden/indra/newview/llfloatergroupinvite.h index 6ee294c..c61adee 100644 --- a/linden/indra/newview/llfloatergroupinvite.h +++ b/linden/indra/newview/llfloatergroupinvite.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatergroups.cpp b/linden/indra/newview/llfloatergroups.cpp index 11b58d5..53d5147 100644 --- a/linden/indra/newview/llfloatergroups.cpp +++ b/linden/indra/newview/llfloatergroups.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatergroups.h b/linden/indra/newview/llfloatergroups.h index ed382f0..9c51d2f 100644 --- a/linden/indra/newview/llfloatergroups.h +++ b/linden/indra/newview/llfloatergroups.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterhtml.cpp b/linden/indra/newview/llfloaterhtml.cpp index 8a10cfe..519a031 100644 --- a/linden/indra/newview/llfloaterhtml.cpp +++ b/linden/indra/newview/llfloaterhtml.cpp @@ -1,9 +1,10 @@ /** * @file llfloaterhtml.cpp - * @brief In-world web browser + * @brief In-world HTML dialog * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -27,68 +28,127 @@ #include "llviewerprecompiledheaders.h" -#include "llfloaterhtml.h" - -#include "lldir.h" - -#include "llbutton.h" -#include "llviewertexteditor.h" -#include "lllineeditor.h" -#include "lltextbox.h" #include "llvieweruictrlfactory.h" +#include "llviewerwindow.h" #include "llviewercontrol.h" -#include "llwebbrowserctrl.h" -#include "llviewerwindow.h" // incBusyCount() -#include "llfloaterworldmap.h" //for sl urls -#include "viewer.h" +#include "llfloaterhtml.h" +#include "llfloaterhtmlhelp.h" -const S32 LINE = 16; -const S32 HPAD = 4; -const S32 HPAD_SMALL = 2; -const S32 HSEPARATOR = 3 * HPAD; -const S32 VPAD = 4; +LLFloaterHtml* LLFloaterHtml::sInstance = 0; -const S32 SCROLLER_HPAD = 3; +//////////////////////////////////////////////////////////////////////////////// +// +LLFloaterHtml* LLFloaterHtml::getInstance() +{ + if ( ! sInstance ) + sInstance = new LLFloaterHtml; -BOOL process_secondlife_url(LLString url) + return sInstance; +} + +//////////////////////////////////////////////////////////////////////////////// +// +LLFloaterHtml::LLFloaterHtml() +: LLFloater( "HTML Floater" ), + mWebBrowser( 0 ) { - S32 strpos, strpos2; + // create floater from its XML definition + gUICtrlFactory->buildFloater( this, "floater_html.xml" ); - LLString slurlID = "slurl.com/secondlife/"; - strpos = url.find(slurlID); - - if (strpos < 0) - { - slurlID="secondlife://"; - strpos = url.find(slurlID); - } - - if (strpos >= 0) + // reposition floater from saved settings + LLRect rect = gSavedSettings.getRect( "HtmlFloaterRect" ); + reshape( rect.getWidth(), rect.getHeight(), FALSE ); + setRect( rect ); + + mWebBrowser = LLViewerUICtrlFactory::getWebBrowserByName(this, "html_floater_browser" ); + if ( mWebBrowser ) { - LLString simname; + // observe browser events + mWebBrowser->addObserver( this ); + + // make links open in external browser + mWebBrowser->setOpenInExternalBrowser( true ); + + // don't automatically open secondlife links since we want to catch + // special ones that do other stuff (like open F1 Help) + mWebBrowser->setOpenSecondLifeLinksInMap( false ); + }; + + childSetAction("close_btn", onClickClose, this); + setDefaultBtn("close_btn"); +} + +//////////////////////////////////////////////////////////////////////////////// +// +LLFloaterHtml::~LLFloaterHtml() +{ + // stop observing browser events + if ( mWebBrowser ) + mWebBrowser->remObserver( this ); + + // save position of floater + gSavedSettings.setRect( "HtmlFloaterRect", mRect ); + + sInstance = 0; +} - strpos+=slurlID.length(); - strpos2=url.find("/",strpos); - if (strpos2 < strpos) strpos2=url.length(); - simname="secondlife://" + url.substr(strpos,url.length() - strpos); +//////////////////////////////////////////////////////////////////////////////// +// +void LLFloaterHtml::show( LLString content_id ) +{ + // calculate the XML labels we'll need (if only XML folders worked) + LLString title_str = content_id + "_title"; + LLString url_str = content_id + "_url"; + + // set the title + setTitle( childGetValue( title_str ).asString() ); + + // navigate to the URL + if ( mWebBrowser ) + mWebBrowser->navigateTo( childGetValue( url_str ).asString() ); + + // make floater appear + setVisibleAndFrontmost(); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFloaterHtml::onClose( bool app_quitting ) +{ + setVisible( false ); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFloaterHtml::onClickClose( void* data ) +{ + LLFloaterHtml* self = ( LLFloaterHtml* )data; - LLURLSimString::setString( simname ); - LLURLSimString::parse(); + self->setVisible( false ); +} - // if there is a world map - if ( gFloaterWorldMap ) +//////////////////////////////////////////////////////////////////////////////// +// +void LLFloaterHtml::onClickLinkSecondLife( const EventType& eventIn ) +{ + const std::string protocol( "secondlife://app." ); + + // special 'app' secondlife link (using a different protocol - one that isn't registered in the browser) causes bad + // things to happen and Mozilla stops responding because it can't display the "invalid protocol dialog) + if ( LLString::compareInsensitive( eventIn.getStringValue().substr( 0, protocol.length() ).c_str(), protocol.c_str() ) == 0 ) + { + // extract the command string + LLString cmd = eventIn.getStringValue().substr( protocol.length() ); + + // command is open the F1 Help floater + if ( LLString::compareInsensitive( cmd.c_str() , "floater.html.help" ) == 0 ) { - // mark where the destination is - gFloaterWorldMap->trackURL( LLURLSimString::sInstance.mSimName.c_str(), - LLURLSimString::sInstance.mX, - LLURLSimString::sInstance.mY, - LLURLSimString::sInstance.mZ ); - - // display map - LLFloaterWorldMap::show( NULL, TRUE ); + gViewerHtmlHelp.show(); }; - - return TRUE; } - return FALSE; -} + else + // regular secondlife link - just open the map as normal + { + mWebBrowser->openMapAtlocation( eventIn.getStringValue() ); + }; +}; \ No newline at end of file diff --git a/linden/indra/newview/llfloaterhtml.h b/linden/indra/newview/llfloaterhtml.h index daef04b..9a09baf 100644 --- a/linden/indra/newview/llfloaterhtml.h +++ b/linden/indra/newview/llfloaterhtml.h @@ -1,10 +1,11 @@ /** * @file llfloaterhtml.h * @author James Cook - * @brief In-world web browser + * @brief In-world HTML dialog * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -29,6 +30,30 @@ #ifndef LL_LLFLOATERHTML_H #define LL_LLFLOATERHTML_H -BOOL process_secondlife_url(LLString url); +#include "llwebbrowserctrl.h" +#include "llfloater.h" -#endif +class LLFloaterHtml : + public LLFloater, + public LLWebBrowserCtrlObserver +{ + public: + static LLFloaterHtml* getInstance(); + virtual ~LLFloaterHtml(); + + virtual void onClose( bool app_quitting ); + + void show( LLString content_id ); + static void onClickClose( void* data ); + + // observable browser events + virtual void onClickLinkSecondLife( const EventType& eventIn ); + + private: + LLFloaterHtml(); + LLWebBrowserCtrl* mWebBrowser; + static LLFloaterHtml* sInstance; + LLButton* mCloseButton; +}; + +#endif \ No newline at end of file diff --git a/linden/indra/newview/llfloaterhtmlfind.cpp b/linden/indra/newview/llfloaterhtmlfind.cpp index b233c1b..4aeea21 100644 --- a/linden/indra/newview/llfloaterhtmlfind.cpp +++ b/linden/indra/newview/llfloaterhtmlfind.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterhtmlfind.h b/linden/indra/newview/llfloaterhtmlfind.h index 39a6737..89f2138 100644 --- a/linden/indra/newview/llfloaterhtmlfind.h +++ b/linden/indra/newview/llfloaterhtmlfind.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterhtmlhelp.cpp b/linden/indra/newview/llfloaterhtmlhelp.cpp index 50dd14c..4612674 100644 --- a/linden/indra/newview/llfloaterhtmlhelp.cpp +++ b/linden/indra/newview/llfloaterhtmlhelp.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -36,18 +37,21 @@ #if LL_LIBXUL_ENABLED +LLViewerHtmlHelp gViewerHtmlHelp; + class LLFloaterHtmlHelp : public LLFloater, public LLWebBrowserCtrlObserver { public: - LLFloaterHtmlHelp(); + LLFloaterHtmlHelp(std::string start_url = ""); virtual ~LLFloaterHtmlHelp(); virtual void onClose( bool app_quitting ); virtual void draw(); - static void show( void* url_string = NULL ); + static void show(); + static void show(std::string url); static void onClickBack( void* data ); static void onClickHome( void* data ); static void onClickForward( void* data ); @@ -77,7 +81,7 @@ BOOL LLFloaterHtmlHelp::sFloaterOpened = FALSE; //////////////////////////////////////////////////////////////////////////////// // -LLFloaterHtmlHelp::LLFloaterHtmlHelp() +LLFloaterHtmlHelp::LLFloaterHtmlHelp(std::string start_url) : LLFloater( "HTML Help" ), mWebBrowser( 0 ), mStatusTextContents( "" ), @@ -100,16 +104,22 @@ LLFloaterHtmlHelp::LLFloaterHtmlHelp() { // observe browser control events mWebBrowser->addObserver( this ); - - // if the last page we were at before the client was closed is valid, go there and - // override what is in the XML file - // (not when the window was closed - it's only ever hidden - not closed) - LLString lastPageUrl = gSavedSettings.getString( "HtmlHelpLastPage" ); - if ( lastPageUrl != "" ) + if (start_url != "") { - mWebBrowser->navigateTo( lastPageUrl ); - }; + mWebBrowser->navigateTo( start_url ); + } + else + { + // if the last page we were at before the client was closed is valid, go there and + // override what is in the XML file + // (not when the window was closed - it's only ever hidden - not closed) + LLString lastPageUrl = gSavedSettings.getString( "HtmlHelpLastPage" ); + if ( lastPageUrl != "" ) + { + mWebBrowser->navigateTo( lastPageUrl ); + }; + } }; } @@ -151,17 +161,21 @@ void LLFloaterHtmlHelp::draw() //////////////////////////////////////////////////////////////////////////////// // -void LLFloaterHtmlHelp::show( void* url_string ) +void LLFloaterHtmlHelp::show(std::string url) { sFloaterOpened = true; if ( sInstance ) { + if (sInstance->mWebBrowser) + { + sInstance->mWebBrowser->navigateTo(url); + } sInstance->setVisibleAndFrontmost(); return; } - LLFloaterHtmlHelp* self = new LLFloaterHtmlHelp; + LLFloaterHtmlHelp* self = new LLFloaterHtmlHelp(url); // reposition floater from saved settings LLRect rect = gSavedSettings.getRect( "HtmlHelpRect" ); @@ -248,14 +262,22 @@ void LLFloaterHtmlHelp::onLocationChange( const EventType& eventIn ) //////////////////////////////////////////////////////////////////////////////// // -// static -void LLHtmlHelp::show(void* url_string) +LLViewerHtmlHelp::LLViewerHtmlHelp() +{ + LLUI::setHtmlHelp(this); +} + +LLViewerHtmlHelp::~LLViewerHtmlHelp() +{ + LLUI::setHtmlHelp(NULL); +} + +void LLViewerHtmlHelp::show(std::string url) { - LLFloaterHtmlHelp::show(url_string); + LLFloaterHtmlHelp::show(url); } -// static -BOOL LLHtmlHelp::getFloaterOpened() +BOOL LLViewerHtmlHelp::getFloaterOpened() { return LLFloaterHtmlHelp::sFloaterOpened; } diff --git a/linden/indra/newview/llfloaterhtmlhelp.h b/linden/indra/newview/llfloaterhtmlhelp.h index 5868db0..9e9c88d 100644 --- a/linden/indra/newview/llfloaterhtmlhelp.h +++ b/linden/indra/newview/llfloaterhtmlhelp.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -30,14 +31,20 @@ #ifndef LL_LLFLOATERHTMLHELP_H #define LL_LLFLOATERHTMLHELP_H -class LLHtmlHelp +#include "llhtmlhelp.h" + +class LLViewerHtmlHelp : public LLHtmlHelp { public: - static void show(void* url_string = NULL); - static BOOL getFloaterOpened(); + LLViewerHtmlHelp(); + virtual ~LLViewerHtmlHelp(); + + /*virtual*/ void show(std::string start_url = ""); + /*virtual*/ BOOL getFloaterOpened(); }; +extern LLViewerHtmlHelp gViewerHtmlHelp; + #endif // LL_LLFLOATERHTMLHELP_H #endif // LL_LIBXUL_ENABLED - diff --git a/linden/indra/newview/llfloaterimagepreview.cpp b/linden/indra/newview/llfloaterimagepreview.cpp index 9c68ca8..9237380 100644 --- a/linden/indra/newview/llfloaterimagepreview.cpp +++ b/linden/indra/newview/llfloaterimagepreview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -375,7 +376,7 @@ BOOL LLFloaterImagePreview::handleMouseDown(S32 x, S32 y, MASK mask) if (mPreviewRect.pointInRect(x, y)) { bringToFront( x, y ); - gViewerWindow->setMouseCapture(this, onMouseCaptureLost); + gViewerWindow->setMouseCapture(this); gViewerWindow->hideCursor(); mLastMouseX = x; mLastMouseY = y; @@ -390,7 +391,7 @@ BOOL LLFloaterImagePreview::handleMouseDown(S32 x, S32 y, MASK mask) //----------------------------------------------------------------------------- BOOL LLFloaterImagePreview::handleMouseUp(S32 x, S32 y, MASK mask) { - gViewerWindow->setMouseCapture(FALSE, NULL); + gViewerWindow->setMouseCapture(FALSE); gViewerWindow->showCursor(); return LLFloater::handleMouseUp(x, y, mask); } @@ -402,7 +403,7 @@ BOOL LLFloaterImagePreview::handleHover(S32 x, S32 y, MASK mask) { MASK local_mask = mask & ~MASK_ALT; - if (mAvatarPreview && gViewerWindow->hasMouseCapture(this)) + if (mAvatarPreview && hasMouseCapture()) { if (local_mask == MASK_PAN) { diff --git a/linden/indra/newview/llfloaterimagepreview.h b/linden/indra/newview/llfloaterimagepreview.h index a53cd88..57874f1 100644 --- a/linden/indra/newview/llfloaterimagepreview.h +++ b/linden/indra/newview/llfloaterimagepreview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterimport.cpp b/linden/indra/newview/llfloaterimport.cpp index 478b5d7..72cf2e0 100644 --- a/linden/indra/newview/llfloaterimport.cpp +++ b/linden/indra/newview/llfloaterimport.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -148,9 +149,6 @@ BOOL LLFloaterImport::postBuild() setDefaultBtn(mOKBtn); mImageLabel = LLViewerUICtrlFactory::getTextBoxByName(this, "preview_label"); - - LLFontGL *default_font = LLFontGL::sSansSerif; - mImportList = LLViewerUICtrlFactory::getScrollListByName(this, "upload_list"); bool object_file_read = false; @@ -180,17 +178,20 @@ BOOL LLFloaterImport::postBuild() task_name_node->getStringValue(1, &task_name); } { - LLScrollListItem *new_item = new LLScrollListItem(TRUE, task); - new_item->addColumn("OBJECT", default_font, 60); LLString output_line; char buffer[20]; /*Flawfinder: ignore*/ - snprintf(buffer, sizeof(buffer), "%d", (S32)tasks_list.size()); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "%d", (S32)tasks_list.size()); /* Flawfinder: ignore */ output_line.append(buffer); output_line.append(" prims"); - new_item->addColumn(output_line, default_font, 80); - new_item->addColumn(task_name, default_font); - new_item->setEnabled(FALSE); - mImportList->addItem(new_item); + + LLSD row; + row["columns"][0]["value"] = "OBJECT"; + row["columns"][0]["width"] = 60; + row["columns"][1]["value"] = output_line; + row["columns"][1]["width"] = 80; + row["columns"][2]["value"] = task_name; + row["enabled"] = false; + mImportList->addElement(row); } mImportList->setCanSelect(TRUE); mImportList->setAllowMultipleSelection(TRUE); @@ -286,12 +287,13 @@ BOOL LLFloaterImport::postBuild() } for (U32 image_num=0; image_numaddColumn("IMAGE", default_font, 60); - new_item->addColumn(image_changed[image_num]?"NEW":"NOT NEW", default_font, 80); - new_item->addColumn(unique_images[image_num].c_str(), default_font); - mImportList->addItem(new_item); + LLSD row; + row["columns"][0]["value"] = "IMAGE"; + row["columns"][0]["width"] = 60; + row["columns"][1]["value"] = image_changed[image_num]?"NEW":"NOT NEW"; + row["columns"][1]["width"] = 80; + row["columns"][2]["value"] = unique_images[image_num]; + mImportList->addElement(row); mImportList->setCanSelect(TRUE); image_count++; } diff --git a/linden/indra/newview/llfloaterimport.h b/linden/indra/newview/llfloaterimport.h index b12eff7..518ddc4 100644 --- a/linden/indra/newview/llfloaterimport.h +++ b/linden/indra/newview/llfloaterimport.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterinspect.cpp b/linden/indra/newview/llfloaterinspect.cpp index 8bb73e3..1548c0e 100644 --- a/linden/indra/newview/llfloaterinspect.cpp +++ b/linden/indra/newview/llfloaterinspect.cpp @@ -218,4 +218,3 @@ void LLFloaterInspect::draw() LLFloater::draw(); } - diff --git a/linden/indra/newview/llfloaterinspect.h b/linden/indra/newview/llfloaterinspect.h index 51549ad..ab453b4 100644 --- a/linden/indra/newview/llfloaterinspect.h +++ b/linden/indra/newview/llfloaterinspect.h @@ -6,6 +6,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterland.cpp b/linden/indra/newview/llfloaterland.cpp index 6bb6aff..9ff44f4 100644 --- a/linden/indra/newview/llfloaterland.cpp +++ b/linden/indra/newview/llfloaterland.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -411,8 +412,8 @@ BOOL LLPanelLandGeneral::postBuild() mBtnDeedToGroup->setClickedCallback(onClickDeed, this); - mCheckContributeWithDeed = LLUICtrlFactory::getCheckBoxByName(this, "check contib"); - childSetCommitCallback("check contib", onCommitAny, this); + mCheckContributeWithDeed = LLUICtrlFactory::getCheckBoxByName(this, "check contrib"); + childSetCommitCallback("check contrib", onCommitAny, this); @@ -589,7 +590,7 @@ void LLPanelLandGeneral::refresh() else if(parcel->getAuctionID()) { char auction_str[MAX_STRING]; /*Flawfinder: ignore*/ - snprintf(auction_str, sizeof(auction_str), "Auction ID: %u", parcel->getAuctionID()); /*Flawfinder: ignore*/ + snprintf(auction_str, sizeof(auction_str), "Auction ID: %u", parcel->getAuctionID()); /* Flawfinder: ignore */ mTextSalePending->setText(auction_str); mTextSalePending->setEnabled(TRUE); } @@ -729,13 +730,13 @@ void LLPanelLandGeneral::refresh() &dwell); // Area - snprintf(price, sizeof(price), "%d sq. m.", area); /*Flawfinder: ignore*/ + snprintf(price, sizeof(price), "%d sq. m.", area); /* Flawfinder: ignore */ label = AREA; mTextPriceLabel->setText(label); mTextPrice->setText(price); - snprintf(price, sizeof(price), "%.0f", dwell); /*Flawfinder: ignore*/ + snprintf(price, sizeof(price), "%.0f", dwell); /* Flawfinder: ignore */ mTextDwell->setText(price); if(region_owner) @@ -780,7 +781,7 @@ void LLPanelLandGeneral::refreshNames() char owner_first[MAX_STRING]; /*Flawfinder: ignore*/ char owner_last[MAX_STRING]; /*Flawfinder: ignore*/ gCacheName->getName(parcel->getOwnerID(), owner_first, owner_last); - snprintf(buffer, sizeof(buffer), "%s %s", owner_first, owner_last); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "%s %s", owner_first, owner_last); /* Flawfinder: ignore */ } if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus()) @@ -812,10 +813,6 @@ void LLPanelLandGeneral::refreshNames() mSaleInfoForSale2->setTextArg("[BUYER]", name); } - else if(parcel->getReservedForNewbie()) - { - mSaleInfoForSale2->setTextArg("[BUYER]", childGetText("new users only")); - } else { mSaleInfoForSale2->setTextArg("[BUYER]", childGetText("anyone")); @@ -941,8 +938,8 @@ void LLPanelLandGeneral::onClickBuyPass(void* data) F32 pass_hours = parcel->getPassHours(); char cost[256], time[256]; /*Flawfinder: ignore*/ - snprintf(cost, sizeof(cost), "%d", pass_price); /*Flawfinder: ignore*/ - snprintf(time, sizeof(time), "%.2f", pass_hours); /*Flawfinder: ignore*/ + snprintf(cost, sizeof(cost), "%d", pass_price); /* Flawfinder: ignore */ + snprintf(time, sizeof(time), "%.2f", pass_hours); /* Flawfinder: ignore */ LLStringBase::format_map_t args; args["[COST]"] = cost; @@ -1054,65 +1051,39 @@ BOOL LLPanelLandObjects::postBuild() mFirstReply = TRUE; mParcelObjectBonus = LLUICtrlFactory::getTextBoxByName(this, "Simulator Primitive Bonus Factor: 1.00"); - - mSWTotalObjectsLabel = LLUICtrlFactory::getTextBoxByName(this, "Simulator primitive usage:"); mSWTotalObjects = LLUICtrlFactory::getTextBoxByName(this, "0 out of 0 available"); - - mObjectContributionLabel = LLUICtrlFactory::getTextBoxByName(this, "Primitives parcel supports:"); mObjectContribution = LLUICtrlFactory::getTextBoxByName(this, "object_contrib_text"); - - - mTotalObjectsLabel = LLUICtrlFactory::getTextBoxByName(this, "Primitives on parcel:"); mTotalObjects = LLUICtrlFactory::getTextBoxByName(this, "total_objects_text"); - - - mOwnerObjectsLabel = LLUICtrlFactory::getTextBoxByName(this, "Owned by parcel owner:"); mOwnerObjects = LLUICtrlFactory::getTextBoxByName(this, "owner_objects_text"); - mBtnShowOwnerObjects = LLUICtrlFactory::getButtonByName(this, "ShowOwner"); mBtnShowOwnerObjects->setClickedCallback(onClickShowOwnerObjects, this); - + mBtnReturnOwnerObjects = LLUICtrlFactory::getButtonByName(this, "ReturnOwner..."); mBtnReturnOwnerObjects->setClickedCallback(onClickReturnOwnerObjects, this); - - mGroupObjectsLabel = LLUICtrlFactory::getTextBoxByName(this, "Set to group:"); mGroupObjects = LLUICtrlFactory::getTextBoxByName(this, "group_objects_text"); - - mBtnShowGroupObjects = LLUICtrlFactory::getButtonByName(this, "ShowGroup"); mBtnShowGroupObjects->setClickedCallback(onClickShowGroupObjects, this); - + mBtnReturnGroupObjects = LLUICtrlFactory::getButtonByName(this, "ReturnGroup..."); mBtnReturnGroupObjects->setClickedCallback(onClickReturnGroupObjects, this); - - mOtherObjectsLabel = LLUICtrlFactory::getTextBoxByName(this, "Owned by others:"); mOtherObjects = LLUICtrlFactory::getTextBoxByName(this, "other_objects_text"); - mBtnShowOtherObjects = LLUICtrlFactory::getButtonByName(this, "ShowOther"); mBtnShowOtherObjects->setClickedCallback(onClickShowOtherObjects, this); - + mBtnReturnOtherObjects = LLUICtrlFactory::getButtonByName(this, "ReturnOther..."); mBtnReturnOtherObjects->setClickedCallback(onClickReturnOtherObjects, this); - - mSelectedObjectsLabel = LLUICtrlFactory::getTextBoxByName(this, "Selected / sat upon:"); - mSelectedObjects = LLUICtrlFactory::getTextBoxByName(this, "selected_objects_text"); - mCleanOtherObjectsLabel = LLUICtrlFactory::getTextBoxByName(this, "Autoreturn other resident's objects (minutes, 0 for off):"); - + mSelectedObjects = LLUICtrlFactory::getTextBoxByName(this, "selected_objects_text"); mCleanOtherObjectsTime = LLUICtrlFactory::getLineEditorByName(this, "clean other time"); mCleanOtherObjectsTime->setFocusLostCallback(onLostFocus); childSetPrevalidate("clean other time", LLLineEditor::prevalidateNonNegativeS32); childSetUserData("clean other time", this); - mOwnerListText = LLUICtrlFactory::getTextBoxByName(this, "Object Owners:"); - - mBtnRefresh = LLUICtrlFactory::getButtonByName(this, "Refresh List"); mBtnRefresh->setClickedCallback(onClickRefresh, this); - mBtnReturnOwnerList = LLUICtrlFactory::getButtonByName(this, "Return objects..."); mBtnReturnOwnerList->setClickedCallback(onClickReturnOwnerList, this); @@ -1266,7 +1237,7 @@ void LLPanelLandObjects::refresh() if (parcel_object_bonus != 1.0f) { - snprintf(count, sizeof(count), "Region Object Bonus Factor: %.2f", /*Flawfinder: ignore*/ + snprintf(count, sizeof(count), "Region Object Bonus Factor: %.2f", /* Flawfinder: ignore */ parcel_object_bonus); mParcelObjectBonus->setText(count); } @@ -1277,35 +1248,35 @@ void LLPanelLandObjects::refresh() if (sw_total > sw_max) { - snprintf(count, sizeof(count), "%d out of %d (%d will be deleted)", /*Flawfinder: ignore*/ + snprintf(count, sizeof(count), "%d out of %d (%d will be deleted)", /* Flawfinder: ignore */ sw_total, sw_max, sw_total - sw_max); } else { - snprintf(count, sizeof(count), "%d out of %d (%d available)", /*Flawfinder: ignore*/ + snprintf(count, sizeof(count), "%d out of %d (%d available)", /* Flawfinder: ignore */ sw_total, sw_max, sw_max - sw_total); } mSWTotalObjects->setText(count); - snprintf(count, sizeof(count), "%d", max); /*Flawfinder: ignore*/ + snprintf(count, sizeof(count), "%d", max); /* Flawfinder: ignore */ mObjectContribution->setText(count); - snprintf(count, sizeof(count), "%d", total); /*Flawfinder: ignore*/ + snprintf(count, sizeof(count), "%d", total); /* Flawfinder: ignore */ mTotalObjects->setText(count); - snprintf(count, sizeof(count), "%d", owned); /*Flawfinder: ignore*/ + snprintf(count, sizeof(count), "%d", owned); /* Flawfinder: ignore */ mOwnerObjects->setText(count); - snprintf(count, sizeof(count), "%d", group); /*Flawfinder: ignore*/ + snprintf(count, sizeof(count), "%d", group); /* Flawfinder: ignore */ mGroupObjects->setText(count); - snprintf(count, sizeof(count), "%d", other); /*Flawfinder: ignore*/ + snprintf(count, sizeof(count), "%d", other); /* Flawfinder: ignore */ mOtherObjects->setText(count); - snprintf(count, sizeof(count), "%d", selected); /*Flawfinder: ignore*/ + snprintf(count, sizeof(count), "%d", selected); /* Flawfinder: ignore */ mSelectedObjects->setText(count); - snprintf(count, sizeof(count), "%d", mOtherTime); /*Flawfinder: ignore*/ + snprintf(count, sizeof(count), "%d", mOtherTime); /* Flawfinder: ignore */ mCleanOtherObjectsTime->setText(count); BOOL can_return_owned = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_RETURN_GROUP_OWNED); @@ -1636,7 +1607,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo // Placeholder for name. row->addColumn("", FONT, self->mColWidth[2]); - snprintf(object_count_str, sizeof(object_count_str), "%d", object_count); /*Flawfinder: ignore*/ + snprintf(object_count_str, sizeof(object_count_str), "%d", object_count); /* Flawfinder: ignore */ row->addColumn(object_count_str, FONT, self->mColWidth[3]); if (is_group_owned) @@ -1884,7 +1855,7 @@ void LLPanelLandObjects::onClickReturnOtherObjects(void* userdata) } // static -void LLPanelLandObjects::onLostFocus(LLLineEditor *caller, void* user_data) +void LLPanelLandObjects::onLostFocus(LLUICtrl *caller, void* user_data) { LLPanelLandObjects *lop = (LLPanelLandObjects *)user_data; LLParcel* parcel = lop->mParcel->getParcel(); @@ -2194,7 +2165,7 @@ void LLPanelLandOptions::refresh() else { char buffer[256]; /*Flawfinder: ignore*/ - snprintf(buffer, sizeof(buffer), "Landing Point: %d, %d, %d", /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "Landing Point: %d, %d, %d", /* Flawfinder: ignore */ llround(pos.mV[VX]), llround(pos.mV[VY]), llround(pos.mV[VZ])); @@ -2534,6 +2505,7 @@ BOOL LLPanelLandAccess::postBuild() childSetCommitCallback("AccessCheck", onCommitAny, this); mListAccess = LLUICtrlFactory::getNameListByName(this, "AccessList"); + mListAccess->sortByColumn(0, TRUE); // ascending mBtnAddAccess = LLUICtrlFactory::getButtonByName(this, "Add..."); @@ -2578,14 +2550,14 @@ void LLPanelLandAccess::refresh() char group_name[MAX_STRING]; /*Flawfinder: ignore*/ gCacheName->getGroupName(parcel->getGroupID(), group_name); - snprintf(label, sizeof(label), "Group: %s", group_name); /*Flawfinder: ignore*/ + snprintf(label, sizeof(label), "Group: %s", group_name); /* Flawfinder: ignore */ mCheckGroup->setLabel( label ); S32 count = parcel->mAccessList.size(); BOOL use_list = parcel->getParcelFlag(PF_USE_ACCESS_LIST); mCheckAccess->set( use_list ); - snprintf(label, sizeof(label), "Avatars: (%d listed, %d max)", /*Flawfinder: ignore*/ + snprintf(label, sizeof(label), "Avatars: (%d listed, %d max)", /* Flawfinder: ignore */ count, PARCEL_MAX_ACCESS_LIST); mCheckAccess->setLabel( label ); @@ -2605,7 +2577,7 @@ void LLPanelLandAccess::refresh() if (seconds >= 120) { char buf[30]; /*Flawfinder: ignore*/ - snprintf(buf, sizeof(buf), "%d minutes", (seconds/60)); /*Flawfinder: ignore*/ + snprintf(buf, sizeof(buf), "%d minutes", (seconds/60)); /* Flawfinder: ignore */ suffix.append(buf); } else if (seconds >= 60) @@ -2615,14 +2587,14 @@ void LLPanelLandAccess::refresh() else { char buf[30]; /*Flawfinder: ignore*/ - snprintf(buf, sizeof(buf), "%d seconds", seconds); /*Flawfinder: ignore*/ + snprintf(buf, sizeof(buf), "%d seconds", seconds); /* Flawfinder: ignore */ suffix.append(buf); } suffix.append(" remaining)"); } - mListAccess->addNameItem(entry.mID, ADD_BOTTOM, TRUE, suffix); + mListAccess->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix); } - + BOOL can_manage_allowed = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_ALLOWED); BOOL enable_add = can_manage_allowed && (count < PARCEL_MAX_ACCESS_LIST); @@ -2680,7 +2652,7 @@ void LLPanelLandAccess::refreshNames() gCacheName->getGroupName(parcel->getGroupID(), group_name); } char label[MAX_STRING]; /*Flawfinder: ignore*/ - snprintf(label, sizeof(label), "Group: %s", group_name); /*Flawfinder: ignore*/ + snprintf(label, sizeof(label), "Group: %s", group_name); /* Flawfinder: ignore */ mCheckGroup->setLabel(label); } @@ -2812,6 +2784,7 @@ BOOL LLPanelLandBan::postBuild() childSetCommitCallback("LandBanCheck", onCommitAny, this); mList = LLUICtrlFactory::getNameListByName(this, "LandBanList"); + mList->sortByColumn(0, TRUE); // ascending mBtnAdd = LLUICtrlFactory::getButtonByName(this, "Add..."); @@ -2855,7 +2828,7 @@ void LLPanelLandBan::refresh() BOOL use_ban = parcel->getParcelFlag(PF_USE_BAN_LIST); mCheck->set( use_ban ); - snprintf(label, sizeof(label), "Ban these avatars: (%d listed, %d max)", /*Flawfinder: ignore*/ + snprintf(label, sizeof(label), "Ban these avatars: (%d listed, %d max)", /* Flawfinder: ignore */ count, PARCEL_MAX_ACCESS_LIST); mCheck->setLabel( label ); @@ -2874,7 +2847,7 @@ void LLPanelLandBan::refresh() if (seconds >= 120) { char buf[30]; /*Flawfinder: ignore*/ - snprintf(buf, sizeof(buf), "%d minutes", (seconds/60)); /*Flawfinder: ignore*/ + snprintf(buf, sizeof(buf), "%d minutes", (seconds/60)); /* Flawfinder: ignore */ suffix.append(buf); } else if (seconds >= 60) @@ -2884,12 +2857,12 @@ void LLPanelLandBan::refresh() else { char buf[30]; /*Flawfinder: ignore*/ - snprintf(buf, sizeof(buf), "%d seconds", seconds); /*Flawfinder: ignore*/ + snprintf(buf, sizeof(buf), "%d seconds", seconds); /* Flawfinder: ignore */ suffix.append(buf); } suffix.append(" remaining)"); } - mList->addNameItem(entry.mID, ADD_BOTTOM, TRUE, suffix); + mList->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix); } BOOL can_manage_banned = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_BANNED); diff --git a/linden/indra/newview/llfloaterland.h b/linden/indra/newview/llfloaterland.h index 4301306..3cc0b27 100644 --- a/linden/indra/newview/llfloaterland.h +++ b/linden/indra/newview/llfloaterland.h @@ -5,6 +5,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -253,7 +254,7 @@ public: static void onDoubleClickOwner(void*); static void onCommitList(LLUICtrl* ctrl, void* data); - static void onLostFocus(LLLineEditor* caller, void* user_data); + static void onLostFocus(LLUICtrl* caller, void* user_data); static void processParcelObjectOwnersReply(LLMessageSystem *msg, void **); @@ -262,39 +263,22 @@ public: protected: void sortBtnCore(S32 column); - LLTextBox *mSWTotalObjectsLabel; - LLTextBox *mSWTotalObjects; - LLTextBox *mParcelObjectBonus; - - LLTextBox *mObjectContributionLabel; + LLTextBox *mSWTotalObjects; LLTextBox *mObjectContribution; - LLTextBox *mTotalObjectsLabel; LLTextBox *mTotalObjects; - - LLTextBox *mOwnerObjectsLabel; LLTextBox *mOwnerObjects; LLButton *mBtnShowOwnerObjects; LLButton *mBtnReturnOwnerObjects; - - LLTextBox *mGroupObjectsLabel; LLTextBox *mGroupObjects; LLButton *mBtnShowGroupObjects; LLButton *mBtnReturnGroupObjects; - - LLTextBox *mOtherObjectsLabel; LLTextBox *mOtherObjects; LLButton *mBtnShowOtherObjects; LLButton *mBtnReturnOtherObjects; - - LLTextBox *mSelectedObjectsLabel; LLTextBox *mSelectedObjects; - - LLTextBox *mCleanOtherObjectsLabel; LLLineEditor *mCleanOtherObjectsTime; S32 mOtherTime; - - LLTextBox *mOwnerListText; LLButton *mBtnRefresh; LLButton *mBtnReturnOwnerList; LLButton *mBtnType; // column 0 diff --git a/linden/indra/newview/llfloaterlandholdings.cpp b/linden/indra/newview/llfloaterlandholdings.cpp index e34e84c..3bdfdd9 100644 --- a/linden/indra/newview/llfloaterlandholdings.cpp +++ b/linden/indra/newview/llfloaterlandholdings.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -207,20 +208,20 @@ void LLFloaterLandHoldings::processPlacesReply(LLMessageSystem* msg, void**) S32 region_y = llround(global_y) % REGION_WIDTH_UNITS; char location[MAX_STRING]; /* Flawfinder: ignore */ - snprintf(location, MAX_STRING, "%s (%d, %d)", sim_name, region_x, region_y); /* Flawfinder: ignore */ + snprintf(location, MAX_STRING, "%s (%d, %d)", sim_name, region_x, region_y); /* Flawfinder: ignore */ char area[MAX_STRING]; /* Flawfinder: ignore */ if(billable_area == actual_area) { - snprintf(area, MAX_STRING, "%d", billable_area); /* Flawfinder: ignore */ + snprintf(area, MAX_STRING, "%d", billable_area); /* Flawfinder: ignore */ } else { - snprintf(area, MAX_STRING, "%d / %d", billable_area, actual_area); /* Flawfinder: ignore */ + snprintf(area, MAX_STRING, "%d / %d", billable_area, actual_area); /* Flawfinder: ignore */ } char hidden[MAX_STRING]; /* Flawfinder: ignore */ - snprintf(hidden, MAX_STRING, "%f %f", global_x, global_y); /* Flawfinder: ignore */ + snprintf(hidden, MAX_STRING, "%f %f", global_x, global_y); /* Flawfinder: ignore */ LLSD element; element["columns"][0]["column"] = "name"; @@ -313,12 +314,12 @@ void LLFloaterLandHoldings::refreshAggregates() char buffer[MAX_STRING]; /* Flawfinder: ignore */ - snprintf(buffer, MAX_STRING, "%d sq. meters", allowed_area); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%d sq. meters", allowed_area); /* Flawfinder: ignore */ childSetValue("allowed_text", LLSD(buffer)); - snprintf(buffer, MAX_STRING, "%d sq. meters", current_area); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%d sq. meters", current_area); /* Flawfinder: ignore */ childSetValue("current_text", LLSD(buffer)); - snprintf(buffer, MAX_STRING, "%d sq. meters", available_area); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%d sq. meters", available_area); /* Flawfinder: ignore */ childSetValue("available_text", LLSD(buffer)); } diff --git a/linden/indra/newview/llfloaterlandholdings.h b/linden/indra/newview/llfloaterlandholdings.h index f2d750f..30c4aea 100644 --- a/linden/indra/newview/llfloaterlandholdings.h +++ b/linden/indra/newview/llfloaterlandholdings.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatermap.cpp b/linden/indra/newview/llfloatermap.cpp index 2d549db..97d0041 100644 --- a/linden/indra/newview/llfloatermap.cpp +++ b/linden/indra/newview/llfloatermap.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -216,3 +217,47 @@ void LLFloaterMap::toggle(void*) } } } + + +BOOL process_secondlife_url(LLString url) +{ + S32 strpos, strpos2; + + LLString slurlID = "slurl.com/secondlife/"; + strpos = url.find(slurlID); + + if (strpos < 0) + { + slurlID="secondlife://"; + strpos = url.find(slurlID); + } + + if (strpos >= 0) + { + LLString simname; + + strpos+=slurlID.length(); + strpos2=url.find("/",strpos); + if (strpos2 < strpos) strpos2=url.length(); + simname="secondlife://" + url.substr(strpos,url.length() - strpos); + + LLURLSimString::setString( simname ); + LLURLSimString::parse(); + + // if there is a world map + if ( gFloaterWorldMap ) + { + // mark where the destination is + gFloaterWorldMap->trackURL( LLURLSimString::sInstance.mSimName.c_str(), + LLURLSimString::sInstance.mX, + LLURLSimString::sInstance.mY, + LLURLSimString::sInstance.mZ ); + + // display map + LLFloaterWorldMap::show( NULL, TRUE ); + }; + + return TRUE; + } + return FALSE; +} diff --git a/linden/indra/newview/llfloatermap.h b/linden/indra/newview/llfloatermap.h index 170c138..0f96cc7 100644 --- a/linden/indra/newview/llfloatermap.h +++ b/linden/indra/newview/llfloatermap.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -65,5 +66,6 @@ protected: extern LLFloaterMap *gFloaterMap; +BOOL process_secondlife_url(LLString url); #endif // LL_LLFLOATERMAP_H diff --git a/linden/indra/newview/llfloatermute.cpp b/linden/indra/newview/llfloatermute.cpp index f71b58f..696f9fe 100644 --- a/linden/indra/newview/llfloatermute.cpp +++ b/linden/indra/newview/llfloatermute.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatermute.h b/linden/indra/newview/llfloatermute.h index 92fec11..4f26412 100644 --- a/linden/indra/newview/llfloatermute.h +++ b/linden/indra/newview/llfloatermute.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaternamedesc.cpp b/linden/indra/newview/llfloaternamedesc.cpp index b39a2eb..f5ef7dc 100644 --- a/linden/indra/newview/llfloaternamedesc.cpp +++ b/linden/indra/newview/llfloaternamedesc.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaternamedesc.h b/linden/indra/newview/llfloaternamedesc.h index b72f0d4..9f2d545 100644 --- a/linden/indra/newview/llfloaternamedesc.h +++ b/linden/indra/newview/llfloaternamedesc.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaternewim.cpp b/linden/indra/newview/llfloaternewim.cpp index 4288209..2fa2b51 100644 --- a/linden/indra/newview/llfloaternewim.cpp +++ b/linden/indra/newview/llfloaternewim.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -96,18 +97,44 @@ void LLFloaterNewIM::clearAllTargets() mSelectionList->deleteAllItems(); } -void LLFloaterNewIM::addTarget(const LLUUID& uuid, const std::string& name, +void LLFloaterNewIM::addSpecial(const LLUUID& uuid, const std::string& name, void* data, BOOL bold, BOOL online) { - LLScrollListItem* item = new LLScrollListItem(TRUE, data, uuid); + LLSD row; + row["id"] = uuid; + row["name"] = name; + row["target"] = "SPECIAL"; + row["columns"][0]["value"] = name; + row["columns"][0]["width"] = COL_1_WIDTH; + row["columns"][0]["font"] = "SANSSERIF"; + row["columns"][0]["font-style"] = bold ? "BOLD" : "NORMAL"; + row["columns"][1]["value"] = online ? sOnlineDescriptor : ""; + row["columns"][1]["font"] = "SANSSERIF"; + row["columns"][1]["font-style"] = "BOLD"; + LLScrollListItem* itemp = mSelectionList->addElement(row); + itemp->setUserdata(data); - item->addColumn(name, bold ? LLFontGL::sSansSerifBold : LLFontGL::sSansSerif, COL_1_WIDTH); - if( online ) + if (mSelectionList->getFirstSelectedIndex() == -1) { - item->addColumn(sOnlineDescriptor, LLFontGL::sSansSerifBold); + mSelectionList->selectFirstItem(); } +} + +void LLFloaterNewIM::addGroup(const LLUUID& uuid, void* data, BOOL bold, BOOL online) +{ + LLSD row; + row["id"] = uuid; + row["target"] = "GROUP"; + row["columns"][0]["value"] = ""; // name will be looked up + row["columns"][0]["width"] = COL_1_WIDTH; + row["columns"][0]["font"] = "SANSSERIF"; + row["columns"][0]["font-style"] = bold ? "BOLD" : "NORMAL"; + row["columns"][1]["value"] = online ? sOnlineDescriptor : ""; + row["columns"][1]["font"] = "SANSSERIF"; + row["columns"][1]["font-style"] = "BOLD"; + LLScrollListItem* itemp = mSelectionList->addElement(row); + itemp->setUserdata(data); - mSelectionList->addItem(item); if (mSelectionList->getFirstSelectedIndex() == -1) { mSelectionList->selectFirstItem(); @@ -116,7 +143,6 @@ void LLFloaterNewIM::addTarget(const LLUUID& uuid, const std::string& name, void LLFloaterNewIM::addAgent(const LLUUID& uuid, void* data, BOOL online) { - LLScrollListItem* item = new LLScrollListItem(TRUE, data, uuid); char first[DB_FIRST_NAME_BUF_SIZE]; /* Flawfinder: ignore */ first[0] = '\0'; char last[DB_LAST_NAME_BUF_SIZE]; /* Flawfinder: ignore */ @@ -125,16 +151,19 @@ void LLFloaterNewIM::addAgent(const LLUUID& uuid, void* data, BOOL online) LLUIString fullname = sNameFormat; fullname.setArg("[FIRST]", first); fullname.setArg("[LAST]", last); - item->addColumn( - fullname, - online ? LLFontGL::sSansSerifBold : LLFontGL::sSansSerif, - COL_1_WIDTH, - FALSE); - if(online) - { - item->addColumn(sOnlineDescriptor, LLFontGL::sSansSerifBold); - } - mSelectionList->addItem(item, ADD_BOTTOM); + + LLSD row; + row["id"] = uuid; + row["columns"][0]["value"] = fullname; + row["columns"][0]["width"] = COL_1_WIDTH; + row["columns"][0]["font"] = "SANSSERIF"; + row["columns"][0]["font-style"] = online ? "BOLD" : "NORMAL"; + row["columns"][1]["value"] = online ? sOnlineDescriptor : ""; + row["columns"][1]["font"] = "SANSSERIF"; + row["columns"][1]["font-style"] = "BOLD"; + LLScrollListItem* itemp = mSelectionList->addElement(row); + itemp->setUserdata(data); + if (mSelectionList->getFirstSelectedIndex() == -1) { mSelectionList->selectFirstItem(); diff --git a/linden/indra/newview/llfloaternewim.h b/linden/indra/newview/llfloaternewim.h index 2e3aa3a..06765b1 100644 --- a/linden/indra/newview/llfloaternewim.h +++ b/linden/indra/newview/llfloaternewim.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -51,12 +52,13 @@ public: // add a scroll list item which has everything specified - useful // for special IM targets like everyone. - void addTarget(const LLUUID& uuid, const std::string& name, - void* data, BOOL bold, BOOL online); + void addSpecial(const LLUUID& uuid, const std::string& name, + void* data, BOOL bold, BOOL online); // add a scroll list item for an agent - the name will be autoupdated // as it appears void addAgent(const LLUUID& uuid, void* data, BOOL online); + void addGroup(const LLUUID& uuid, void* data, BOOL bold, BOOL online); void addDefaultTargets(); BOOL isUUIDAvailable(const LLUUID& uuid); diff --git a/linden/indra/newview/llfloateropenobject.cpp b/linden/indra/newview/llfloateropenobject.cpp index 22b4292..b907c39 100644 --- a/linden/indra/newview/llfloateropenobject.cpp +++ b/linden/indra/newview/llfloateropenobject.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloateropenobject.h b/linden/indra/newview/llfloateropenobject.h index 4772982..46954da 100644 --- a/linden/indra/newview/llfloateropenobject.h +++ b/linden/indra/newview/llfloateropenobject.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterpermissionsmgr.cpp b/linden/indra/newview/llfloaterpermissionsmgr.cpp index 1c13cf2..f98c200 100644 --- a/linden/indra/newview/llfloaterpermissionsmgr.cpp +++ b/linden/indra/newview/llfloaterpermissionsmgr.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterpermissionsmgr.h b/linden/indra/newview/llfloaterpermissionsmgr.h index ecd268e..1c87e04 100644 --- a/linden/indra/newview/llfloaterpermissionsmgr.h +++ b/linden/indra/newview/llfloaterpermissionsmgr.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterpostcard.cpp b/linden/indra/newview/llfloaterpostcard.cpp index 036ce38..2c80300 100644 --- a/linden/indra/newview/llfloaterpostcard.cpp +++ b/linden/indra/newview/llfloaterpostcard.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -237,7 +238,7 @@ public: { } // *TODO define custom uploadFailed here so it's not such a generic message - void LLSendPostcardResponder::uploadComplete(const LLSD& content) + void uploadComplete(const LLSD& content) { // we don't care about what the server returns from this post, just clean up the UI LLUploadDialog::modalUploadFinished(); diff --git a/linden/indra/newview/llfloaterpostcard.h b/linden/indra/newview/llfloaterpostcard.h index b5d691b..bd44e22 100644 --- a/linden/indra/newview/llfloaterpostcard.h +++ b/linden/indra/newview/llfloaterpostcard.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterpreference.cpp b/linden/indra/newview/llfloaterpreference.cpp index ad1990e..dceadf9 100644 --- a/linden/indra/newview/llfloaterpreference.cpp +++ b/linden/indra/newview/llfloaterpreference.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterpreference.h b/linden/indra/newview/llfloaterpreference.h index 70e8fb3..dcef6a0 100644 --- a/linden/indra/newview/llfloaterpreference.h +++ b/linden/indra/newview/llfloaterpreference.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterproperties.cpp b/linden/indra/newview/llfloaterproperties.cpp index 0beea67..546270e 100644 --- a/linden/indra/newview/llfloaterproperties.cpp +++ b/linden/indra/newview/llfloaterproperties.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -434,27 +435,27 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item) char perm_string[11]; /* Flawfinder: ignore */ - snprintf(perm_string, sizeof(perm_string), "B: "); /* Flawfinder: ignore */ + snprintf(perm_string, sizeof(perm_string), "B: "); /* Flawfinder: ignore */ mask_to_string(base_mask, perm_string+3); childSetText("BaseMaskDebug",perm_string); childSetVisible("BaseMaskDebug",TRUE); - snprintf(perm_string, sizeof(perm_string), "O: "); /* Flawfinder: ignore */ + snprintf(perm_string, sizeof(perm_string), "O: "); /* Flawfinder: ignore */ mask_to_string(owner_mask, perm_string+3); childSetText("OwnerMaskDebug",perm_string); childSetVisible("OwnerMaskDebug",TRUE); - snprintf(perm_string, sizeof(perm_string), "G%s: ", overwrite_group ? "*" : ""); /* Flawfinder: ignore */ + snprintf(perm_string, sizeof(perm_string), "G%s: ", overwrite_group ? "*" : ""); /* Flawfinder: ignore */ mask_to_string(group_mask, perm_string + (overwrite_group ? 4 : 3)); childSetText("GroupMaskDebug",perm_string); childSetVisible("GroupMaskDebug",TRUE); - snprintf(perm_string, sizeof(perm_string), "E%s: ", overwrite_everyone ? "*" : ""); /* Flawfinder: ignore */ + snprintf(perm_string, sizeof(perm_string), "E%s: ", overwrite_everyone ? "*" : ""); /* Flawfinder: ignore */ mask_to_string(everyone_mask, perm_string + (overwrite_everyone ? 4 : 3)); childSetText("EveryoneMaskDebug",perm_string); childSetVisible("EveryoneMaskDebug",TRUE); - snprintf(perm_string, sizeof(perm_string), "N%s: ", slam_perm ? "*" : ""); /* Flawfinder: ignore */ + snprintf(perm_string, sizeof(perm_string), "N%s: ", slam_perm ? "*" : ""); /* Flawfinder: ignore */ mask_to_string(next_owner_mask, perm_string + (slam_perm ? 4 : 3)); childSetText("NextMaskDebug",perm_string); childSetVisible("NextMaskDebug",TRUE); @@ -568,7 +569,7 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item) { radioSaleType->setSelectedIndex((S32)sale_info.getSaleType() - 1); char numerical_price[MAX_STRING]; /* Flawfinder: ignore */ - snprintf(numerical_price, MAX_STRING, "%d", sale_info.getSalePrice()); /* Flawfinder: ignore */ + snprintf(numerical_price, MAX_STRING, "%d", sale_info.getSalePrice()); /* Flawfinder: ignore */ childSetText("EditPrice",numerical_price); } else diff --git a/linden/indra/newview/llfloaterproperties.h b/linden/indra/newview/llfloaterproperties.h index ab70354..deaf1d4 100644 --- a/linden/indra/newview/llfloaterproperties.h +++ b/linden/indra/newview/llfloaterproperties.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterrate.cpp b/linden/indra/newview/llfloaterrate.cpp deleted file mode 100644 index a057374..0000000 --- a/linden/indra/newview/llfloaterrate.cpp +++ /dev/null @@ -1,277 +0,0 @@ -/** - * @file llfloaterrate.cpp - * @brief Dialog for rating avatars. She's a ten! - * - * Copyright (c) 2002-2007, Linden Research, Inc. - * - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlife.com/developers/opensource/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at http://secondlife.com/developers/opensource/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include "llviewerprecompiledheaders.h" - -#include "llfloaterrate.h" - -#include "llcachename.h" -#include "llfontgl.h" -#include "lluuid.h" -#include "message.h" - -#include "llagent.h" -#include "lltextbox.h" -#include "llbutton.h" -#include "lllineeditor.h" -#include "llradiogroup.h" -#include "llselectmgr.h" -#include "llvieweruictrlfactory.h" -#include "llviewermessage.h" -#include "llviewernetwork.h" -#include "llviewerregion.h" -#include "llviewerreputation.h" -#include "llviewerwindow.h" - -// Dollar cost to change your rating of someone -const S32 RATING_COST = 25; - -//static -LLFloaterRate::instance_map_t LLFloaterRate::sInstanceMap; - -//----------------------------------------------------------------------------- -// Methods -//----------------------------------------------------------------------------- -LLFloaterRate::LLFloaterRate(const std::string& name, const LLUUID &id) -: LLFloater(name), - mAvatarID( id ), - mLastBehavior( 0.f ), - mLastAppearance( 0.f ), - mLastBuilding( 0.f ), - mReputationRequested( FALSE ) -{ - gUICtrlFactory->buildFloater(this, "floater_rate.xml"); - - childSetAction("OK", onClickOK, this); - childSetAction("Cancel", onClickCancel, this); - - mObjectSelection = gSelectMgr->getEditSelection(); -} - - -LLFloaterRate::~LLFloaterRate() -{ - sInstanceMap.erase(mAvatarID); -} - - -void LLFloaterRate::draw() -{ - LLString name; - - // Construct the name, if possible - char firstname[MAX_STRING]; /* Flawfinder: ignore */ - char lastname[MAX_STRING]; /* Flawfinder: ignore */ - gCacheName->getName(mAvatarID, firstname, lastname); - name.assign(firstname); - name.append(" "); - name.append(lastname); - - // Request the current data, if we haven't already - if (!mReputationRequested) - { - sendReputationIndividualRequest(mAvatarID); - } - - LLString title("Your Rating of "); - title.append( name ); - - setTitle(title); - - F32 behavior = childGetValue("behavior").asString() == "Positive" ? 1.0f : 0.0f; - F32 appearance = childGetValue("appearance").asString() == "Positive" ? 1.0f : 0.0f; - F32 building = childGetValue("building").asString() == "Positive" ? 1.0f : 0.0f; - - S32 change_count = 0; - if (behavior != mLastBehavior) change_count++; - if (appearance != mLastAppearance) change_count++; - if (building != mLastBuilding) change_count++; - - childSetTextArg("cost", "[COST]", llformat("%d",RATING_COST)); - childSetTextArg("cost", "[TOTAL]", llformat("%d",RATING_COST * change_count)); - - BOOL can_afford = can_afford_transaction(RATING_COST * change_count); - BOOL changed = (change_count > 0); - childSetEnabled("OK", changed && can_afford ); - - LLFloater::draw(); -} - - -// static -void LLFloaterRate::show(const LLUUID &avatar_id) -{ - instance_map_t::iterator iter = sInstanceMap.find(avatar_id); - if (iter != sInstanceMap.end()) - { - iter->second->setFocus(TRUE); - iter->second->open(); /* Flawfinder: ignore */ - } - else if (avatar_id != LLUUID::null) - { - LLFloaterRate *f = new LLFloaterRate("rate", avatar_id); - sInstanceMap[avatar_id] = f; - f->center(); - f->setFocus(TRUE); - f->sendReputationIndividualRequest(avatar_id); - f->open(); /* Flawfinder: ignore */ - } -} - - -// static -void LLFloaterRate::show(ERateSelection which) -{ - LLUUID avatarid; - LLString avatarname; - switch(which) - { - case RS_CREATOR: - gSelectMgr->selectGetCreator(avatarid, avatarname); - break; - - case RS_OWNER: - default: - gSelectMgr->selectGetOwner(avatarid, avatarname); - break; - } - - if (avatarid != LLUUID::null) - { - show(avatarid); - } - else - { - gViewerWindow->alertXml("SelectSingleRate"); - } -} - - -// static -void LLFloaterRate::onClickOK(void *data) -{ - LLFloaterRate *self = (LLFloaterRate *)data; - - F32 behavior = self->childGetValue("behavior").asString() == "Positive" ? 1.0f : 0.0f; - F32 appearance = self->childGetValue("appearance").asString() == "Positive" ? 1.0f : 0.0f; - F32 building = self->childGetValue("building").asString() == "Positive" ? 1.0f : 0.0f; - std::string text = self->childGetValue("mesg editor").asString(); - - S32 change_count = 0; - if (behavior != self->mLastBehavior) change_count++; - if (appearance != self->mLastAppearance) change_count++; - if (building != self->mLastBuilding) change_count++; - - if (change_count > 0) - { - send_reputation_agent_assign(gAgent.getID(), self->mAvatarID, - behavior, appearance, building, text.c_str() ); - - give_money(LLUUID::null, gAgent.getRegion(), change_count * RATING_COST); - - self->mLastBehavior = behavior; - self->mLastAppearance = appearance; - self->mLastBuilding = building; - } - - self->close(); -} - - -// static -void LLFloaterRate::onClickCancel(void *data) -{ - LLFloaterRate *self = (LLFloaterRate *)data; - self->close(); -} - - -void LLFloaterRate::sendReputationIndividualRequest(const LLUUID &avatar_id) -{ - mReputationRequested = TRUE; - - LLMessageSystem *msg = gMessageSystem; - msg->newMessageFast(_PREHASH_ReputationIndividualRequest); - msg->nextBlockFast(_PREHASH_ReputationData); - msg->addUUIDFast(_PREHASH_FromID, gAgent.getID() ); - msg->addUUIDFast(_PREHASH_ToID, avatar_id ); - msg->sendReliable( gUserServer ); -} - - -// static -void LLFloaterRate::processReputationIndividualReply(LLMessageSystem *msg, void** data) -{ - LLUUID from_id; - LLUUID to_id; - F32 behavior = 0.f; - F32 appearance = 0.f; - F32 building = 0.f; - - msg->getUUIDFast(_PREHASH_ReputationData, _PREHASH_FromID, from_id ); - msg->getUUIDFast(_PREHASH_ReputationData, _PREHASH_ToID, to_id ); - msg->getF32Fast(_PREHASH_ReputationData, _PREHASH_Behavior, behavior ); - msg->getF32Fast(_PREHASH_ReputationData, _PREHASH_Appearance, appearance ); - msg->getF32Fast(_PREHASH_ReputationData, _PREHASH_Building, building ); - - instance_map_t::iterator iter = sInstanceMap.find(to_id); - if (iter != sInstanceMap.end()) - { - LLFloaterRate* f = iter->second; - - f->mLastBehavior = behavior; - f->mLastAppearance = appearance; - f->mLastBuilding = building; - - if (behavior > 0.f) - { - f->childSetValue("behavior", "Positive"); - } - else - { - f->childSetValue("behavior", "No Rating"); - } - - if (appearance > 0.f) - { - f->childSetValue("appearance", "Positive"); - } - else - { - f->childSetValue("appearance", "No Rating"); - } - - if (building > 0.f) - { - f->childSetValue("building", "Positive"); - } - else - { - f->childSetValue("building", "No Rating"); - } - } -} diff --git a/linden/indra/newview/llfloaterrate.h b/linden/indra/newview/llfloaterrate.h deleted file mode 100644 index 1b24383..0000000 --- a/linden/indra/newview/llfloaterrate.h +++ /dev/null @@ -1,88 +0,0 @@ -/** - * @file llfloaterrate.h - * @brief Dialog for rating avatars. He's a ten! - * - * Copyright (c) 2002-2007, Linden Research, Inc. - * - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlife.com/developers/opensource/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at http://secondlife.com/developers/opensource/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef LL_LLFLOATERRATE_H -#define LL_LLFLOATERRATE_H - -#ifndef LL_LLFLOATER_H -#include "llfloater.h" -#endif - -#include "lluuid.h" -#include - -class LLTextBox; -class LLRadioGroup; -class LLButton; -class LLMessageSystem; -class LLLineEditor; -class LLObjectSelection; - -class LLFloaterRate -: public LLFloater -{ -public: - virtual void draw(); - - // Call this if you have the avatar id - static void show(const LLUUID &avatar_id); - - // Types for show() below - enum ERateSelection { - RS_CREATOR, - RS_OWNER - }; - - // Call this to rate the currently selected object, either - // the creator or the owner. - static void show(ERateSelection which); - - static void processReputationIndividualReply(LLMessageSystem *msg, void**); - -protected: - LLFloaterRate(const std::string& name, const LLUUID &id); - virtual ~LLFloaterRate(); - - void sendReputationIndividualRequest(const LLUUID &avatar_id); - - static void onClickOK(void *data); - static void onClickCancel(void *data); - -protected: - typedef std::map instance_map_t; - static instance_map_t sInstanceMap; - -protected: - LLUUID mAvatarID; - F32 mLastBehavior; - F32 mLastAppearance; - F32 mLastBuilding; - BOOL mReputationRequested; - LLHandle mObjectSelection; -}; - -#endif diff --git a/linden/indra/newview/llfloaterregioninfo.cpp b/linden/indra/newview/llfloaterregioninfo.cpp index b758777..7fa5f6a 100644 --- a/linden/indra/newview/llfloaterregioninfo.cpp +++ b/linden/indra/newview/llfloaterregioninfo.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -697,34 +698,34 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate() strings_t strings; //integers_t integers; char buffer[MAX_STRING]; /* Flawfinder: ignore*/ - snprintf(buffer, MAX_STRING, "%s", (childGetValue("block_terraform_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%s", (childGetValue("block_terraform_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ strings.push_back(strings_t::value_type(buffer)); - snprintf(buffer, MAX_STRING, "%s", (childGetValue("block_fly_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%s", (childGetValue("block_fly_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ strings.push_back(strings_t::value_type(buffer)); - snprintf(buffer, MAX_STRING, "%s", (childGetValue("allow_damage_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%s", (childGetValue("allow_damage_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ strings.push_back(strings_t::value_type(buffer)); - snprintf(buffer, MAX_STRING, "%s", (childGetValue("allow_land_resell_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%s", (childGetValue("allow_land_resell_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ strings.push_back(strings_t::value_type(buffer)); F32 value = (F32)childGetValue("agent_limit_spin").asReal(); - snprintf(buffer, MAX_STRING, "%f", value); /* Flawfinder: ignore*/ + snprintf(buffer, MAX_STRING, "%f", value); /* Flawfinder: ignore */ strings.push_back(strings_t::value_type(buffer)); value = (F32)childGetValue("object_bonus_spin").asReal(); - snprintf(buffer, MAX_STRING, "%f", value); /* Flawfinder: ignore*/ + snprintf(buffer, MAX_STRING, "%f", value); /* Flawfinder: ignore */ strings.push_back(strings_t::value_type(buffer)); U8 access = LLViewerRegion::stringToAccess(childGetValue("access_combo").asString().c_str()); - snprintf(buffer, MAX_STRING, "%d", (S32)access); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%d", (S32)access); /* Flawfinder: ignore */ strings.push_back(strings_t::value_type(buffer)); - snprintf(buffer, MAX_STRING, "%s", (childGetValue("restrict_pushobject").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%s", (childGetValue("restrict_pushobject").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ strings.push_back(strings_t::value_type(buffer)); - snprintf(buffer, MAX_STRING, "%s", (childGetValue("allow_parcel_changes_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%s", (childGetValue("allow_parcel_changes_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ strings.push_back(strings_t::value_type(buffer)); LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); @@ -793,13 +794,13 @@ BOOL LLPanelRegionDebugInfo::sendUpdate() strings_t strings; char buffer[MAX_STRING]; /* Flawfinder: ignore */ - snprintf(buffer, MAX_STRING, "%s", (childGetValue("disable_scripts_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%s", (childGetValue("disable_scripts_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ strings.push_back(buffer); - snprintf(buffer, MAX_STRING, "%s", (childGetValue("disable_collisions_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%s", (childGetValue("disable_collisions_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ strings.push_back(buffer); - snprintf(buffer, MAX_STRING, "%s", (childGetValue("disable_physics_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%s", (childGetValue("disable_physics_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ strings.push_back(buffer); LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); @@ -957,7 +958,7 @@ bool LLPanelRegionTextureInfo::refreshFromRegion(LLViewerRegion* region) char buffer[MAX_STRING]; /* Flawfinder: ignore */ for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i) { - snprintf(buffer, MAX_STRING, "texture_detail_%d", i); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "texture_detail_%d", i); /* Flawfinder: ignore */ texture_ctrl = LLViewerUICtrlFactory::getTexturePickerByName(this, buffer); if(texture_ctrl) { @@ -970,9 +971,9 @@ bool LLPanelRegionTextureInfo::refreshFromRegion(LLViewerRegion* region) for(S32 i = 0; i < CORNER_COUNT; ++i) { - snprintf(buffer, MAX_STRING, "height_start_spin_%d", i); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "height_start_spin_%d", i); /* Flawfinder: ignore */ childSetValue(buffer, LLSD(compp->getStartHeight(i))); - snprintf(buffer, MAX_STRING, "height_range_spin_%d", i); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "height_range_spin_%d", i); /* Flawfinder: ignore */ childSetValue(buffer, LLSD(compp->getHeightRange(i))); } @@ -987,15 +988,15 @@ BOOL LLPanelRegionTextureInfo::postBuild() char buffer[MAX_STRING]; /* Flawfinder: ignore */ for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i) { - snprintf(buffer, MAX_STRING, "texture_detail_%d", i); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "texture_detail_%d", i); /* Flawfinder: ignore */ initCtrl(buffer); } for(S32 i = 0; i < CORNER_COUNT; ++i) { - snprintf(buffer, MAX_STRING, "height_start_spin_%d", i); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "height_start_spin_%d", i); /* Flawfinder: ignore */ initCtrl(buffer); - snprintf(buffer, MAX_STRING, "height_range_spin_%d", i); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "height_range_spin_%d", i); /* Flawfinder: ignore */ initCtrl(buffer); } @@ -1035,13 +1036,13 @@ BOOL LLPanelRegionTextureInfo::sendUpdate() for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i) { - snprintf(buffer, MAX_STRING, "texture_detail_%d", i); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "texture_detail_%d", i); /* Flawfinder: ignore */ texture_ctrl = LLViewerUICtrlFactory::getTexturePickerByName(this, buffer); if(texture_ctrl) { LLUUID tmp_id(texture_ctrl->getImageAssetID()); tmp_id.toString(id_str); - snprintf(buffer, MAX_STRING, "%d %s", i, id_str); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%d %s", i, id_str); /* Flawfinder: ignore */ strings.push_back(strings_t::value_type(buffer)); } } @@ -1049,9 +1050,9 @@ BOOL LLPanelRegionTextureInfo::sendUpdate() strings.clear(); for(S32 i = 0; i < CORNER_COUNT; ++i) { - snprintf(buffer, MAX_STRING, "height_start_spin_%d", i); /* Flawfinder: ignore */ - snprintf(buffer2, MAX_STRING, "height_range_spin_%d", i); /* Flawfinder: ignore */ - snprintf(buffer, MAX_STRING, "%d %f %f", i, (F32)childGetValue(buffer).asReal(), (F32)childGetValue(buffer2).asReal()); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "height_start_spin_%d", i); /* Flawfinder: ignore */ + snprintf(buffer2, MAX_STRING, "height_range_spin_%d", i); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%d %f %f", i, (F32)childGetValue(buffer).asReal(), (F32)childGetValue(buffer2).asReal()); /* Flawfinder: ignore */ strings.push_back(strings_t::value_type(buffer)); } sendEstateOwnerMessage(msg, "textureheights", invoice, strings); @@ -1065,7 +1066,7 @@ BOOL LLPanelRegionTextureInfo::validateTextureSizes() for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i) { char buffer[MAX_STRING]; /* Flawfinder: ignore */ - snprintf(buffer, MAX_STRING, "texture_detail_%d", i); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "texture_detail_%d", i); /* Flawfinder: ignore */ LLTextureCtrl* texture_ctrl = LLViewerUICtrlFactory::getTexturePickerByName(this, buffer); if (!texture_ctrl) continue; @@ -1170,17 +1171,17 @@ BOOL LLPanelRegionTerrainInfo::sendUpdate() strings_t strings; LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); - snprintf(buffer, MAX_STRING, "%f", (F32)childGetValue("water_height_spin").asReal()); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%f", (F32)childGetValue("water_height_spin").asReal()); /* Flawfinder: ignore */ strings.push_back(buffer); - snprintf(buffer, MAX_STRING, "%f", (F32)childGetValue("terrain_raise_spin").asReal()); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%f", (F32)childGetValue("terrain_raise_spin").asReal()); /* Flawfinder: ignore */ strings.push_back(buffer); - snprintf(buffer, MAX_STRING, "%f", (F32)childGetValue("terrain_lower_spin").asReal()); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%f", (F32)childGetValue("terrain_lower_spin").asReal()); /* Flawfinder: ignore */ strings.push_back(buffer); - snprintf(buffer, MAX_STRING, "%s", (childGetValue("use_estate_sun_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore*/ + snprintf(buffer, MAX_STRING, "%s", (childGetValue("use_estate_sun_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ strings.push_back(buffer); - snprintf(buffer, MAX_STRING, "%s", (childGetValue("fixed_sun_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore*/ + snprintf(buffer, MAX_STRING, "%s", (childGetValue("fixed_sun_check").asBoolean() ? "Y" : "N")); /* Flawfinder: ignore */ strings.push_back(buffer); - snprintf(buffer, MAX_STRING, "%f", (F32)childGetValue("sun_hour_slider").asReal() ); /* Flawfinder: ignore*/ + snprintf(buffer, MAX_STRING, "%f", (F32)childGetValue("sun_hour_slider").asReal() ); /* Flawfinder: ignore */ strings.push_back(buffer); // Grab estate information in case the user decided to set the @@ -1206,11 +1207,11 @@ BOOL LLPanelRegionTerrainInfo::sendUpdate() estate_sun_hour = panel->getSunHour(); } - snprintf(buffer, MAX_STRING, "%s", (estate_global_time ? "Y" : "N") ); /* Flawfinder: ignore*/ + snprintf(buffer, MAX_STRING, "%s", (estate_global_time ? "Y" : "N") ); /* Flawfinder: ignore */ strings.push_back(buffer); - snprintf(buffer, MAX_STRING, "%s", (estate_fixed_sun ? "Y" : "N") ); /* Flawfinder: ignore*/ + snprintf(buffer, MAX_STRING, "%s", (estate_fixed_sun ? "Y" : "N") ); /* Flawfinder: ignore */ strings.push_back(buffer); - snprintf(buffer, MAX_STRING, "%f", estate_sun_hour); /* Flawfinder: ignore*/ + snprintf(buffer, MAX_STRING, "%f", estate_sun_hour); /* Flawfinder: ignore */ strings.push_back(buffer); sendEstateOwnerMessage(gMessageSystem, "setregionterrain", invoice, strings); @@ -1827,7 +1828,7 @@ void LLPanelEstateInfo::sendEstateAccessDelta(U32 flags, const LLUUID& agent_or_ msg->nextBlock("ParamList"); msg->addString("Parameter", buf); - snprintf(buf, MAX_STRING, "%u", flags); /* Flawfinder: ignore*/ + snprintf(buf, MAX_STRING, "%u", flags); /* Flawfinder: ignore */ msg->nextBlock("ParamList"); msg->addString("Parameter", buf); @@ -2084,7 +2085,7 @@ void LLPanelEstateInfo::commitEstateInfo() msg->addString("Parameter", getEstateName()); char buf[MAX_STRING]; /* Flawfinder: ignore*/ - snprintf(buf, MAX_STRING, "%u", computeEstateFlags()); /* Flawfinder: ignore*/ + snprintf(buf, MAX_STRING, "%u", computeEstateFlags()); /* Flawfinder: ignore */ msg->nextBlock("ParamList"); msg->addString("Parameter", buf); @@ -2094,7 +2095,7 @@ void LLPanelEstateInfo::commitEstateInfo() sun_hour = 0.f; // 0 = global time } - snprintf(buf, MAX_STRING, "%d", (S32)(sun_hour*1024.0f)); /* Flawfinder: ignore*/ + snprintf(buf, MAX_STRING, "%d", (S32)(sun_hour*1024.0f)); /* Flawfinder: ignore */ msg->nextBlock("ParamList"); msg->addString("Parameter", buf); diff --git a/linden/indra/newview/llfloaterregioninfo.h b/linden/indra/newview/llfloaterregioninfo.h index fda23e8..cd550ff 100644 --- a/linden/indra/newview/llfloaterregioninfo.h +++ b/linden/indra/newview/llfloaterregioninfo.h @@ -5,6 +5,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterreporter.cpp b/linden/indra/newview/llfloaterreporter.cpp index 0337dd0..2e44191 100644 --- a/linden/indra/newview/llfloaterreporter.cpp +++ b/linden/indra/newview/llfloaterreporter.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -59,7 +60,6 @@ #include "llviewerobject.h" #include "llviewerregion.h" #include "llcombobox.h" -#include "llfloaterrate.h" #include "lltooldraganddrop.h" #include "llfloatermap.h" #include "lluiconstants.h" @@ -726,7 +726,7 @@ LLSD LLFloaterReporter::gatherReport() details << childGetValue("details_edit").asString(); char version_string[MAX_STRING]; /* Flawfinder: ignore */ - snprintf(version_string, /* Flawfinder: ignore */ + snprintf(version_string, /* Flawfinder: ignore */ MAX_STRING, "%d.%d.%d %s %s %s %s", LL_VERSION_MAJOR, diff --git a/linden/indra/newview/llfloaterreporter.h b/linden/indra/newview/llfloaterreporter.h index 5e25d59..4cb72b9 100644 --- a/linden/indra/newview/llfloaterreporter.h +++ b/linden/indra/newview/llfloaterreporter.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatersaveavatar.cpp b/linden/indra/newview/llfloatersaveavatar.cpp index 3b8439e..edc740d 100644 --- a/linden/indra/newview/llfloatersaveavatar.cpp +++ b/linden/indra/newview/llfloatersaveavatar.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatersaveavatar.h b/linden/indra/newview/llfloatersaveavatar.h index 5957531..50cdb12 100644 --- a/linden/indra/newview/llfloatersaveavatar.h +++ b/linden/indra/newview/llfloatersaveavatar.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterscriptdebug.cpp b/linden/indra/newview/llfloaterscriptdebug.cpp index 94047cb..5ad2dc9 100644 --- a/linden/indra/newview/llfloaterscriptdebug.cpp +++ b/linden/indra/newview/llfloaterscriptdebug.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterscriptdebug.h b/linden/indra/newview/llfloaterscriptdebug.h index c9d0b51..891ec3b 100644 --- a/linden/indra/newview/llfloaterscriptdebug.h +++ b/linden/indra/newview/llfloaterscriptdebug.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatersellland.cpp b/linden/indra/newview/llfloatersellland.cpp index cc7df3b..49cb14e 100755 --- a/linden/indra/newview/llfloatersellland.cpp +++ b/linden/indra/newview/llfloatersellland.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatersellland.h b/linden/indra/newview/llfloatersellland.h index 4131011..1f0af61 100755 --- a/linden/indra/newview/llfloatersellland.h +++ b/linden/indra/newview/llfloatersellland.h @@ -3,6 +3,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatersnapshot.cpp b/linden/indra/newview/llfloatersnapshot.cpp index cfa94a5..af58cd9 100644 --- a/linden/indra/newview/llfloatersnapshot.cpp +++ b/linden/indra/newview/llfloatersnapshot.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -523,7 +524,7 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview ) previewp->mSnapshotDelayTimer.hasExpired()); // don't take snapshots while ALT-zoom active - if (gFocusMgr.getMouseCapture() == gToolCamera) + if (gToolCamera->hasMouseCapture()) { previewp->mSnapshotActive = FALSE; } diff --git a/linden/indra/newview/llfloatersnapshot.h b/linden/indra/newview/llfloatersnapshot.h index 6b7a847..deefc6d 100644 --- a/linden/indra/newview/llfloatersnapshot.h +++ b/linden/indra/newview/llfloatersnapshot.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatertelehub.cpp b/linden/indra/newview/llfloatertelehub.cpp index 150e369..e48b6ca 100644 --- a/linden/indra/newview/llfloatertelehub.cpp +++ b/linden/indra/newview/llfloatertelehub.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -244,7 +245,7 @@ void LLFloaterTelehub::onClickRemoveSpawnPoint(void* data) msg->addString("Parameter", "spawnpoint remove"); char buffer[MAX_STRING]; /* Flawfinder: ignore */ - snprintf(buffer, MAX_STRING, "%d", spawn_index); /* Flawfinder: ignore */ + snprintf(buffer, MAX_STRING, "%d", spawn_index); /* Flawfinder: ignore */ msg->nextBlock("ParamList"); msg->addString("Parameter", buffer); diff --git a/linden/indra/newview/llfloatertelehub.h b/linden/indra/newview/llfloatertelehub.h index 3458998..33e9516 100644 --- a/linden/indra/newview/llfloatertelehub.h +++ b/linden/indra/newview/llfloatertelehub.h @@ -5,6 +5,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatertest.cpp b/linden/indra/newview/llfloatertest.cpp index 29c897d..510072d 100644 --- a/linden/indra/newview/llfloatertest.cpp +++ b/linden/indra/newview/llfloatertest.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -65,7 +66,7 @@ private: static void onCommitCombo(LLUICtrl*, void*); static void onCommitLine(LLUICtrl*, void*); static void onKeyLine(LLLineEditor*, void*); - static void onFocusLostLine(LLLineEditor*, void*); + static void onFocusLostLine(LLUICtrl*, void*); static void onChangeRadioGroup(LLUICtrl*, void*); LLButton* mBtnSimple; @@ -359,7 +360,7 @@ void LLFloaterTestImpl::onKeyLine(LLLineEditor*, void*) } // static -void LLFloaterTestImpl::onFocusLostLine(LLLineEditor*, void*) +void LLFloaterTestImpl::onFocusLostLine(LLUICtrl*, void*) { llinfos << "focus lost line editor" << llendl; } diff --git a/linden/indra/newview/llfloatertest.h b/linden/indra/newview/llfloatertest.h index 3634161..93869ef 100644 --- a/linden/indra/newview/llfloatertest.h +++ b/linden/indra/newview/llfloatertest.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatertools.cpp b/linden/indra/newview/llfloatertools.cpp index f777581..0480628 100644 --- a/linden/indra/newview/llfloatertools.cpp +++ b/linden/indra/newview/llfloatertools.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -947,7 +948,7 @@ void LLFloaterTools::setObjectType( void* data ) LLPCode pcode = *(LLPCode*) data; LLToolPlacer::setObjectType( pcode ); gSavedSettings.setBOOL("CreateToolCopySelection", FALSE); - gViewerWindow->setMouseCapture(NULL, NULL); + gViewerWindow->setMouseCapture(NULL); } // static diff --git a/linden/indra/newview/llfloatertools.h b/linden/indra/newview/llfloatertools.h index 664aa62..27d7f56 100644 --- a/linden/indra/newview/llfloatertools.h +++ b/linden/indra/newview/llfloatertools.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatertopobjects.cpp b/linden/indra/newview/llfloatertopobjects.cpp index 7c86e83..6212ce9 100644 --- a/linden/indra/newview/llfloatertopobjects.cpp +++ b/linden/indra/newview/llfloatertopobjects.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatertopobjects.h b/linden/indra/newview/llfloatertopobjects.h index a1494a3..3d8a1e6 100644 --- a/linden/indra/newview/llfloatertopobjects.h +++ b/linden/indra/newview/llfloatertopobjects.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloatertos.cpp b/linden/indra/newview/llfloatertos.cpp index 26346d5..6b38ca8 100644 --- a/linden/indra/newview/llfloatertos.cpp +++ b/linden/indra/newview/llfloatertos.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -181,6 +182,7 @@ BOOL LLFloaterTOS::postBuild() childSetValue("tos_text", LLSD(mMessage)); #endif + return TRUE; } diff --git a/linden/indra/newview/llfloatertos.h b/linden/indra/newview/llfloatertos.h index 16f5d95..5dfd939 100644 --- a/linden/indra/newview/llfloatertos.h +++ b/linden/indra/newview/llfloatertos.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterworldmap.cpp b/linden/indra/newview/llfloaterworldmap.cpp index 967e6d0..dc42a40 100644 --- a/linden/indra/newview/llfloaterworldmap.cpp +++ b/linden/indra/newview/llfloaterworldmap.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfloaterworldmap.h b/linden/indra/newview/llfloaterworldmap.h index 4b812b6..f383754 100644 --- a/linden/indra/newview/llfloaterworldmap.h +++ b/linden/indra/newview/llfloaterworldmap.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfolderview.cpp b/linden/indra/newview/llfolderview.cpp index 1007bc4..7bc9cd8 100644 --- a/linden/indra/newview/llfolderview.cpp +++ b/linden/indra/newview/llfolderview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -90,7 +91,7 @@ void copy_selected_item(void* user_data); void open_selected_items(void* user_data); void properties_selected_items(void* user_data); void paste_items(void* user_data); -void top_view_lost( LLView* handler ); +void renamer_focus_lost( LLUICtrl* handler, void* user_data ); ///---------------------------------------------------------------------------- /// Class LLFolderViewItem @@ -607,7 +608,7 @@ BOOL LLFolderViewItem::handleMouseDown( S32 x, S32 y, MASK mask ) { // No handler needed for focus lost since this class has no // state that depends on it. - gViewerWindow->setMouseCapture( this, NULL ); + gViewerWindow->setMouseCapture( this ); if (!mIsSelected) { @@ -642,7 +643,7 @@ BOOL LLFolderViewItem::handleMouseDown( S32 x, S32 y, MASK mask ) BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask ) { - if( gViewerWindow->hasMouseCapture( this ) && isMovable() ) + if( hasMouseCapture() && isMovable() ) { S32 screen_x; S32 screen_y; @@ -742,10 +743,10 @@ BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask ) mSelectPending = FALSE; - if( gViewerWindow->hasMouseCapture( this ) ) + if( hasMouseCapture() ) { getRoot()->setShowSelectionContext(FALSE); - gViewerWindow->setMouseCapture( NULL, NULL ); + gViewerWindow->setMouseCapture( NULL ); } return TRUE; } @@ -2615,9 +2616,9 @@ LLFolderView::~LLFolderView( void ) LLView::deleteViewByHandle(mPopupMenuHandle); - if(gViewerWindow->hasTopView(mRenamer)) + if(gViewerWindow->hasTopCtrl(mRenamer)) { - gViewerWindow->setTopView(NULL, NULL); + gViewerWindow->setTopCtrl(NULL); } mAutoOpenItems.removeAllNodes(); @@ -3194,7 +3195,7 @@ void LLFolderView::finishRenamingItem( void ) mRenamer->setFocus( FALSE ); mRenamer->setVisible( FALSE ); mRenamer->setCommitOnFocusLost( TRUE ); - gViewerWindow->setTopView( NULL, NULL ); + gViewerWindow->setTopCtrl( NULL ); if( mRenameItem ) { @@ -3212,7 +3213,7 @@ void LLFolderView::revertRenamingItem( void ) mRenamer->setFocus( FALSE ); mRenamer->setVisible( FALSE ); mRenamer->setCommitOnFocusLost( TRUE ); - gViewerWindow->setTopView( NULL, NULL ); + gViewerWindow->setTopCtrl( NULL ); if( mRenameItem ) { @@ -3610,7 +3611,8 @@ void LLFolderView::startRenamingSelectedItem( void ) mRenamer->setVisible( TRUE ); // set focus will fail unless item is visible mRenamer->setFocus( TRUE ); - gViewerWindow->setTopView( mRenamer, top_view_lost ); + mRenamer->setFocusLostCallback(renamer_focus_lost); + gViewerWindow->setTopCtrl( mRenamer ); } } @@ -3939,6 +3941,7 @@ void LLFolderView::onFocusLost( ) { gEditMenuHandler = NULL; } + LLUICtrl::onFocusLost(); } BOOL LLFolderView::search(LLFolderViewItem* first_item, const LLString &search_string, BOOL backward) @@ -4096,9 +4099,9 @@ BOOL LLFolderView::handleScrollWheel(S32 x, S32 y, S32 clicks) void LLFolderView::deleteAllChildren() { - if(gViewerWindow->hasTopView(mRenamer)) + if(gViewerWindow->hasTopCtrl(mRenamer)) { - gViewerWindow->setTopView(NULL, NULL); + gViewerWindow->setTopCtrl(NULL); } LLView::deleteViewByHandle(mPopupMenuHandle); mPopupMenuHandle = LLViewHandle::sDeadHandle; @@ -4334,9 +4337,12 @@ bool sort_item_date(LLFolderViewItem* a, LLFolderViewItem* b) } } -void top_view_lost( LLView* view ) +void renamer_focus_lost( LLUICtrl* ctrl, void* userdata) { - if( view ) view->setVisible( FALSE ); + if( ctrl ) + { + ctrl->setVisible( FALSE ); + } } void delete_selected_item(void* user_data) diff --git a/linden/indra/newview/llfolderview.h b/linden/indra/newview/llfolderview.h index eb67373..8acbc8f 100644 --- a/linden/indra/newview/llfolderview.h +++ b/linden/indra/newview/llfolderview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfollowcam.cpp b/linden/indra/newview/llfollowcam.cpp index d9e1d4a..b18b0d2 100644 --- a/linden/indra/newview/llfollowcam.cpp +++ b/linden/indra/newview/llfollowcam.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llfollowcam.h b/linden/indra/newview/llfollowcam.h index c8a5c88..a199dbb 100644 --- a/linden/indra/newview/llfollowcam.h +++ b/linden/indra/newview/llfollowcam.h @@ -5,6 +5,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llframestats.cpp b/linden/indra/newview/llframestats.cpp index 237f59b..9ae7667 100644 --- a/linden/indra/newview/llframestats.cpp +++ b/linden/indra/newview/llframestats.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -178,11 +179,11 @@ void LLFrameStats::dump() static S32 dump_count = 0; char file_with_num[256]; /* Flawfinder: ignore */ - snprintf(file_with_num, sizeof(file_with_num), "fs%d.txt", dump_count); /* Flawfinder: ignore */ + snprintf(file_with_num, sizeof(file_with_num), "fs%d.txt", dump_count); /* Flawfinder: ignore */ dump_count++; char filename[LL_MAX_PATH]; /* Flawfinder: ignore */ - snprintf(filename, LL_MAX_PATH, "%s", gDirUtilp->getExpandedFilename(LL_PATH_LOGS, file_with_num).c_str()); /* Flawfinder: ignore */ + snprintf(filename, LL_MAX_PATH, "%s", gDirUtilp->getExpandedFilename(LL_PATH_LOGS, file_with_num).c_str()); /* Flawfinder: ignore */ FILE *fp = LLFile::fopen(filename, "w"); /* Flawfinder: ignore */ if (!fp) { @@ -224,7 +225,7 @@ void LLFrameStats::dump() fclose(fp); // Now dump cumulative stats - snprintf(filename, LL_MAX_PATH, "%s", gDirUtilp->getExpandedFilename(LL_PATH_LOGS, mSummaryFilename.c_str()).c_str()); /* Flawfinder: ignore */ + snprintf(filename, LL_MAX_PATH, "%s", gDirUtilp->getExpandedFilename(LL_PATH_LOGS, mSummaryFilename.c_str()).c_str()); /* Flawfinder: ignore */ fp = LLFile::fopen(filename, "a"); /* Flawfinder: ignore */ if (!fp) { diff --git a/linden/indra/newview/llframestats.h b/linden/indra/newview/llframestats.h index faaaa91..2f83061 100644 --- a/linden/indra/newview/llframestats.h +++ b/linden/indra/newview/llframestats.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llframestatview.cpp b/linden/indra/newview/llframestatview.cpp index e0c1cc7..af9162d 100644 --- a/linden/indra/newview/llframestatview.cpp +++ b/linden/indra/newview/llframestatview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -215,7 +216,7 @@ void LLFrameStatView::draw() right = left + 1; gl_rect_2d(left, top, right, bottom, LLColor4(1.f, 1.f, 1.f, 0.2f)); - snprintf(tick_label, sizeof(tick_label), "%.2f", tick_value); /* Flawfinder: ignore */ + snprintf(tick_label, sizeof(tick_label), "%.2f", tick_value); /* Flawfinder: ignore */ // draw labels for the tick marks LLFontGL::sMonospace->renderUTF8(tick_label, 0, left, bottom, LLColor4(1.f, 1.f, 1.f, 0.5f), @@ -265,7 +266,7 @@ void LLFrameStatView::draw() right = left + 1; gl_rect_2d(left, top, right, bottom, LLColor4(1.f, 1.f, 1.f, 0.25f)); - snprintf(tick_label, sizeof(tick_label), "%.2f", tick_value); /* Flawfinder: ignore */ + snprintf(tick_label, sizeof(tick_label), "%.2f", tick_value); /* Flawfinder: ignore */ // draw labels for the tick marks LLFontGL::sMonospace->renderUTF8(tick_label, 0, left, bottom, LLColor4(1.f, 1.f, 1.f, 0.5f), @@ -290,7 +291,7 @@ void LLFrameStatView::draw() right = left + 1; gl_rect_2d(left, top, right, bottom, LLColor4(1.f, 1.f, 1.f, 0.25f)); - snprintf(tick_label, sizeof(tick_label), "%.2f", tick_value); /* Flawfinder: ignore */ + snprintf(tick_label, sizeof(tick_label), "%.2f", tick_value); /* Flawfinder: ignore */ // draw labels for the tick marks LLFontGL::sMonospace->renderUTF8(tick_label, 0, left, bottom, LLColor4(1.f, 1.f, 1.f, 0.5f), diff --git a/linden/indra/newview/llframestatview.h b/linden/indra/newview/llframestatview.h index 465b238..7bcc041 100644 --- a/linden/indra/newview/llframestatview.h +++ b/linden/indra/newview/llframestatview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llgenepool.cpp b/linden/indra/newview/llgenepool.cpp index 2a2c864..95b15f3 100644 --- a/linden/indra/newview/llgenepool.cpp +++ b/linden/indra/newview/llgenepool.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llgenepool.h b/linden/indra/newview/llgenepool.h index 268c374..dfe54bb 100644 --- a/linden/indra/newview/llgenepool.h +++ b/linden/indra/newview/llgenepool.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llgesturemgr.cpp b/linden/indra/newview/llgesturemgr.cpp index 76a2ca7..c94e9e2 100644 --- a/linden/indra/newview/llgesturemgr.cpp +++ b/linden/indra/newview/llgesturemgr.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llgesturemgr.h b/linden/indra/newview/llgesturemgr.h index 1351e3a..8544599 100644 --- a/linden/indra/newview/llgesturemgr.h +++ b/linden/indra/newview/llgesturemgr.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llgivemoney.cpp b/linden/indra/newview/llgivemoney.cpp index 0baf1f3..3722682 100644 --- a/linden/indra/newview/llgivemoney.cpp +++ b/linden/indra/newview/llgivemoney.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llgivemoney.h b/linden/indra/newview/llgivemoney.h index cff4fb7..664d1c8 100644 --- a/linden/indra/newview/llgivemoney.h +++ b/linden/indra/newview/llgivemoney.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llglsandbox.cpp b/linden/indra/newview/llglsandbox.cpp index decbdd9..e14cebe 100644 --- a/linden/indra/newview/llglsandbox.cpp +++ b/linden/indra/newview/llglsandbox.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llglslshader.cpp b/linden/indra/newview/llglslshader.cpp new file mode 100644 index 0000000..3f23a66 --- /dev/null +++ b/linden/indra/newview/llglslshader.cpp @@ -0,0 +1,1221 @@ +/** + * @file llglslshader.cpp + * @brief GLSL helper functions and state. + * + * Copyright (c) 2005-2007, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + */ + +#include "llviewerprecompiledheaders.h" + +#include "llviewerwindow.h" +#include "llglslshader.h" +#include "llviewercontrol.h" +#include "pipeline.h" +#include "llworld.h" + +//utility shader objects (not shader programs) +GLhandleARB gLightVertex; +GLhandleARB gLightFragment; +GLhandleARB gScatterVertex; +GLhandleARB gScatterFragment; + +LLVector4 gShinyOrigin; + +//object shaders +LLGLSLShader gObjectSimpleProgram; +LLGLSLShader gObjectAlphaProgram; +LLGLSLShader gObjectBumpProgram; +LLGLSLShader gObjectShinyProgram; + +//environment shaders +LLGLSLShader gTerrainProgram; +LLGLSLShader gGlowProgram; +LLGLSLShader gGroundProgram; +LLGLSLShader gWaterProgram; + +//interface shaders +LLGLSLShader gHighlightProgram; + +//avatar skinning utility shader object +GLhandleARB gAvatarSkinVertex; + +//avatar shader handles +LLGLSLShader gAvatarProgram; +LLGLSLShader gAvatarEyeballProgram; +LLGLSLShader gAvatarPickProgram; + +//current avatar shader parameter pointer +GLint gAvatarMatrixParam; +GLint gMaterialIndex; +GLint gSpecularIndex; + +S32 LLShaderMgr::sVertexShaderLevel[SHADER_COUNT] = { 0 }; +S32 LLShaderMgr::sMaxVertexShaderLevel[SHADER_COUNT] = { 0 }; + +//glsl parameter tables +const char* LLShaderMgr::sReservedAttribs[] = +{ + "materialColor", + "specularColor", + "binormal" +}; + +U32 LLShaderMgr::sReservedAttribCount = LLShaderMgr::END_RESERVED_ATTRIBS; + +const char* LLShaderMgr::sAvatarAttribs[] = +{ + "weight", + "clothing", + "gWindDir", + "gSinWaveParams", + "gGravity" +}; + +U32 LLShaderMgr::sAvatarAttribCount = sizeof(LLShaderMgr::sAvatarAttribs)/sizeof(char*); + +const char* LLShaderMgr::sAvatarUniforms[] = +{ + "matrixPalette" +}; + +U32 LLShaderMgr::sAvatarUniformCount = 1; + +const char* LLShaderMgr::sReservedUniforms[] = +{ + "diffuseMap", + "specularMap", + "bumpMap", + "environmentMap", + "scatterMap" +}; + +U32 LLShaderMgr::sReservedUniformCount = LLShaderMgr::END_RESERVED_UNIFORMS; + +const char* LLShaderMgr::sTerrainUniforms[] = +{ + "detail0", + "detail1", + "alphaRamp" +}; + +U32 LLShaderMgr::sTerrainUniformCount = sizeof(LLShaderMgr::sTerrainUniforms)/sizeof(char*); + +const char* LLShaderMgr::sGlowUniforms[] = +{ + "delta" +}; + +U32 LLShaderMgr::sGlowUniformCount = sizeof(LLShaderMgr::sGlowUniforms)/sizeof(char*); + +const char* LLShaderMgr::sShinyUniforms[] = +{ + "origin" +}; + +U32 LLShaderMgr::sShinyUniformCount = sizeof(LLShaderMgr::sShinyUniforms)/sizeof(char*); + +const char* LLShaderMgr::sWaterUniforms[] = +{ + "screenTex", + "eyeVec", + "time", + "d1", + "d2", + "lightDir", + "specular", + "lightExp", + "fbScale", + "refScale" +}; + +U32 LLShaderMgr::sWaterUniformCount = sizeof(LLShaderMgr::sWaterUniforms)/sizeof(char*); + + +//============================================================================ +// Set Levels + +S32 LLShaderMgr::getVertexShaderLevel(S32 type) +{ + return sVertexShaderLevel[type]; +} + +S32 LLShaderMgr::getMaxVertexShaderLevel(S32 type) +{ + return sMaxVertexShaderLevel[type]; +} + +//============================================================================ +// Load Shader + +static LLString get_object_log(GLhandleARB ret) +{ + LLString res; + + //get log length + GLint length; + glGetObjectParameterivARB(ret, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length); + if (length > 0) + { + //the log could be any size, so allocate appropriately + GLcharARB* log = new GLcharARB[length]; + glGetInfoLogARB(ret, length, &length, log); + res = LLString(log); + delete[] log; + } + return res; +} + +void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns) +{ + LLString log = get_object_log(ret); + if (warns) + { + llwarns << log << llendl; + } + else + { + llinfos << log << llendl; + } +} + +GLhandleARB LLShaderMgr::loadShader(const LLString& filename, S32 cls, GLenum type) +{ + GLenum error; + error = glGetError(); + if (error != GL_NO_ERROR) + { + llwarns << "GL ERROR entering loadShader(): " << error << llendl; + } + + llinfos << "Loading shader file: " << filename << llendl; + + if (filename.empty()) + { + return 0; + } + + + //read in from file + FILE* file = NULL; + + S32 try_gpu_class = sVertexShaderLevel[cls]; + S32 gpu_class; + + //find the most relevant file + for (gpu_class = try_gpu_class; gpu_class > 0; gpu_class--) + { //search from the current gpu class down to class 1 to find the most relevant shader + std::stringstream fname; + fname << gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "shaders/class"); + fname << gpu_class << "/" << filename; + +// llinfos << "Looking in " << fname.str().c_str() << llendl; + file = fopen(fname.str().c_str(), "r"); /* Flawfinder: ignore */ + if (file) + { + break; // done + } + } + + if (file == NULL) + { + llinfos << "GLSL Shader file not found: " << filename << llendl; + return 0; + } + + //we can't have any lines longer than 1024 characters + //or any shaders longer than 1024 lines... deal - DaveP + GLcharARB buff[1024]; + GLcharARB* text[1024]; + GLuint count = 0; + + //copy file into memory + while(fgets(buff, 1024, file) != NULL) + { + text[count++] = strdup(buff); + } + fclose(file); + + //create shader object + GLhandleARB ret = glCreateShaderObjectARB(type); + error = glGetError(); + if (error != GL_NO_ERROR) + { + llwarns << "GL ERROR in glCreateShaderObjectARB: " << error << llendl; + } + else + { + //load source + glShaderSourceARB(ret, count, (const GLcharARB**) text, NULL); + error = glGetError(); + if (error != GL_NO_ERROR) + { + llwarns << "GL ERROR in glShaderSourceARB: " << error << llendl; + } + else + { + //compile source + glCompileShaderARB(ret); + error = glGetError(); + if (error != GL_NO_ERROR) + { + llwarns << "GL ERROR in glCompileShaderARB: " << error << llendl; + } + } + } + //free memory + for (GLuint i = 0; i < count; i++) + { + free(text[i]); + } + if (error == GL_NO_ERROR) + { + //check for errors + GLint success = GL_TRUE; + glGetObjectParameterivARB(ret, GL_OBJECT_COMPILE_STATUS_ARB, &success); + error = glGetError(); + if (error != GL_NO_ERROR || success == GL_FALSE) + { + //an error occured, print log + llwarns << "GLSL Compilation Error: (" << error << ") in " << filename << llendl; + dumpObjectLog(ret); + ret = 0; + } + } + else + { + ret = 0; + } + stop_glerror(); + + //successfully loaded, save results +#if 1 // 1.9.1 + if (ret) + { + sVertexShaderLevel[cls] = try_gpu_class; + } + else + { + if (sVertexShaderLevel[cls] > 1) + { + sVertexShaderLevel[cls] = sVertexShaderLevel[cls] - 1; + ret = loadShader(filename,cls,type); + if (ret && sMaxVertexShaderLevel[cls] > sVertexShaderLevel[cls]) + { + sMaxVertexShaderLevel[cls] = sVertexShaderLevel[cls]; + } + } + } +#else + if (ret) + { + S32 max = -1; + /*if (try_gpu_class == sMaxVertexShaderLevel[cls]) + { + max = gpu_class; + }*/ + saveVertexShaderLevel(cls,try_gpu_class,max); + } + else + { + if (sVertexShaderLevel[cls] > 1) + { + sVertexShaderLevel[cls] = sVertexShaderLevel[cls] - 1; + ret = loadShader(f,cls,type); + if (ret && sMaxVertexShaderLevel[cls] > sVertexShaderLevel[cls]) + { + saveVertexShaderLevel(cls, sVertexShaderLevel[cls], sVertexShaderLevel[cls]); + } + } + } +#endif + return ret; +} + +BOOL LLShaderMgr::linkProgramObject(GLhandleARB obj, BOOL suppress_errors) +{ + //check for errors + glLinkProgramARB(obj); + GLint success = GL_TRUE; + glGetObjectParameterivARB(obj, GL_OBJECT_LINK_STATUS_ARB, &success); + if (!suppress_errors && success == GL_FALSE) + { + //an error occured, print log + llwarns << "GLSL Linker Error:" << llendl; + } + + LLString log = get_object_log(obj); + LLString::toLower(log); + if (log.find("software") != LLString::npos) + { + llwarns << "GLSL Linker: Running in Software:" << llendl; + success = GL_FALSE; + suppress_errors = FALSE; + } + if (!suppress_errors) + { + dumpObjectLog(obj, !success); + } + + return success; +} + +BOOL LLShaderMgr::validateProgramObject(GLhandleARB obj) +{ + //check program validity against current GL + glValidateProgramARB(obj); + GLint success = GL_TRUE; + glGetObjectParameterivARB(obj, GL_OBJECT_VALIDATE_STATUS_ARB, &success); + if (success == GL_FALSE) + { + llwarns << "GLSL program not valid: " << llendl; + dumpObjectLog(obj); + } + else + { + dumpObjectLog(obj, FALSE); + } + + return success; +} + +//============================================================================ +// Shader Management + +void LLShaderMgr::setShaders() +{ + if (!gPipeline.mInitialized) + { + return; + } + + if (gGLManager.mHasFramebufferObject) + { + LLPipeline::sDynamicReflections = gSavedSettings.getBOOL("RenderDynamicReflections"); + LLPipeline::sRenderGlow = gSavedSettings.getBOOL("RenderGlow"); + } + else + { + LLPipeline::sDynamicReflections = LLPipeline::sRenderGlow = FALSE; + } + + //hack to reset buffers that change behavior with shaders + gPipeline.resetVertexBuffers(); + + if (gViewerWindow) + { + gViewerWindow->setCursor(UI_CURSOR_WAIT); + } + + // Lighting + gPipeline.setLightingDetail(-1); + + // Shaders + for (S32 i=0; isetCursor(UI_CURSOR_ARROW); + } +} + +void LLShaderMgr::unloadShaders() +{ + gObjectSimpleProgram.unload(); + gObjectShinyProgram.unload(); + gObjectBumpProgram.unload(); + gObjectAlphaProgram.unload(); + gWaterProgram.unload(); + gTerrainProgram.unload(); + gGlowProgram.unload(); + gGroundProgram.unload(); + gAvatarProgram.unload(); + gAvatarEyeballProgram.unload(); + gAvatarPickProgram.unload(); + gHighlightProgram.unload(); + + sVertexShaderLevel[SHADER_LIGHTING] = 0; + sVertexShaderLevel[SHADER_OBJECT] = 0; + sVertexShaderLevel[SHADER_AVATAR] = 0; + sVertexShaderLevel[SHADER_ENVIRONMENT] = 0; + sVertexShaderLevel[SHADER_INTERFACE] = 0; + + gLightVertex = gLightFragment = gScatterVertex = gScatterFragment = 0; + gPipeline.mVertexShadersLoaded = 0; +} + +BOOL LLShaderMgr::loadShadersLighting() +{ + // Load light dependency shaders first + // All of these have to load for any shaders to function + + std::string lightvertex = "lighting/lightV.glsl"; + //get default light function implementation + gLightVertex = loadShader(lightvertex, SHADER_LIGHTING, GL_VERTEX_SHADER_ARB); + if( !gLightVertex ) + { + llwarns << "Failed to load " << lightvertex << llendl; + return FALSE; + } + + std::string lightfragment = "lighting/lightF.glsl"; + gLightFragment = loadShader(lightfragment, SHADER_LIGHTING, GL_FRAGMENT_SHADER_ARB); + if ( !gLightFragment ) + { + llwarns << "Failed to load " << lightfragment << llendl; + return FALSE; + } + + // NOTE: Scatter shaders use the ENVIRONMENT detail level + + std::string scattervertex = "environment/scatterV.glsl"; + gScatterVertex = loadShader(scattervertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB); + if ( !gScatterVertex ) + { + llwarns << "Failed to load " << scattervertex << llendl; + return FALSE; + } + + std::string scatterfragment = "environment/scatterF.glsl"; + gScatterFragment = loadShader(scatterfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB); + if ( !gScatterFragment ) + { + llwarns << "Failed to load " << scatterfragment << llendl; + return FALSE; + } + + return TRUE; +} + +BOOL LLShaderMgr::loadShadersEnvironment() +{ + GLhandleARB baseObjects[] = + { + gLightFragment, + gLightVertex, + gScatterFragment, + gScatterVertex + }; + S32 baseCount = 4; + + BOOL success = TRUE; + + if (sVertexShaderLevel[SHADER_ENVIRONMENT] == 0) + { + gWaterProgram.unload(); + gGroundProgram.unload(); + gTerrainProgram.unload(); + gGlowProgram.unload(); + return FALSE; + } + + if (success) + { + //load water vertex shader + std::string waterfragment = "environment/waterF.glsl"; + std::string watervertex = "environment/waterV.glsl"; + gWaterProgram.mProgramObject = glCreateProgramObjectARB(); + gWaterProgram.attachObjects(baseObjects, baseCount); + gWaterProgram.attachObject(loadShader(watervertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB)); + gWaterProgram.attachObject(loadShader(waterfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB)); + + success = gWaterProgram.mapAttributes(); + if (success) + { + success = gWaterProgram.mapUniforms(sWaterUniforms, sWaterUniformCount); + } + if (!success) + { + llwarns << "Failed to load " << watervertex << llendl; + } + } + if (success) + { + //load ground vertex shader + std::string groundvertex = "environment/groundV.glsl"; + std::string groundfragment = "environment/groundF.glsl"; + gGroundProgram.mProgramObject = glCreateProgramObjectARB(); + gGroundProgram.attachObjects(baseObjects, baseCount); + gGroundProgram.attachObject(loadShader(groundvertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB)); + gGroundProgram.attachObject(loadShader(groundfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB)); + + success = gGroundProgram.mapAttributes(); + if (success) + { + success = gGroundProgram.mapUniforms(); + } + if (!success) + { + llwarns << "Failed to load " << groundvertex << llendl; + } + } + + if (success) + { + //load terrain vertex shader + std::string terrainvertex = "environment/terrainV.glsl"; + std::string terrainfragment = "environment/terrainF.glsl"; + gTerrainProgram.mProgramObject = glCreateProgramObjectARB(); + gTerrainProgram.attachObjects(baseObjects, baseCount); + gTerrainProgram.attachObject(loadShader(terrainvertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB)); + gTerrainProgram.attachObject(loadShader(terrainfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB)); + success = gTerrainProgram.mapAttributes(); + if (success) + { + success = gTerrainProgram.mapUniforms(sTerrainUniforms, sTerrainUniformCount); + } + if (!success) + { + llwarns << "Failed to load " << terrainvertex << llendl; + } + } + + if (success) + { + //load glow shader + std::string glowvertex = "environment/glowV.glsl"; + std::string glowfragment = "environment/glowF.glsl"; + gGlowProgram.mProgramObject = glCreateProgramObjectARB(); + gGlowProgram.attachObjects(baseObjects, baseCount); + gGlowProgram.attachObject(loadShader(glowvertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB)); + gGlowProgram.attachObject(loadShader(glowfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB)); + success = gGlowProgram.mapAttributes(); + if (success) + { + success = gGlowProgram.mapUniforms(sGlowUniforms, sGlowUniformCount); + } + if (!success) + { + llwarns << "Failed to load " << glowvertex << llendl; + } + } + + if( !success ) + { + sVertexShaderLevel[SHADER_ENVIRONMENT] = 0; + sMaxVertexShaderLevel[SHADER_ENVIRONMENT] = 0; + return FALSE; + } + + if (gWorldPointer) + { + gWorldPointer->updateWaterObjects(); + } + + return TRUE; +} + +BOOL LLShaderMgr::loadShadersObject() +{ + GLhandleARB baseObjects[] = + { + gLightFragment, + gLightVertex, + gScatterFragment, + gScatterVertex + }; + S32 baseCount = 4; + + BOOL success = TRUE; + + if (sVertexShaderLevel[SHADER_OBJECT] == 0) + { + gObjectShinyProgram.unload(); + gObjectSimpleProgram.unload(); + gObjectBumpProgram.unload(); + gObjectAlphaProgram.unload(); + return FALSE; + } + +#if 0 + if (success) + { + //load object (volume/tree) vertex shader + std::string simplevertex = "objects/simpleV.glsl"; + std::string simplefragment = "objects/simpleF.glsl"; + gObjectSimpleProgram.mProgramObject = glCreateProgramObjectARB(); + gObjectSimpleProgram.attachObjects(baseObjects, baseCount); + gObjectSimpleProgram.attachObject(loadShader(simplevertex, SHADER_OBJECT, GL_VERTEX_SHADER_ARB)); + gObjectSimpleProgram.attachObject(loadShader(simplefragment, SHADER_OBJECT, GL_FRAGMENT_SHADER_ARB)); + success = gObjectSimpleProgram.mapAttributes(); + if (success) + { + success = gObjectSimpleProgram.mapUniforms(); + } + if( !success ) + { + llwarns << "Failed to load " << simplevertex << llendl; + } + } + + if (success) + { + //load object bumpy vertex shader + std::string bumpshinyvertex = "objects/bumpshinyV.glsl"; + std::string bumpshinyfragment = "objects/bumpshinyF.glsl"; + gObjectBumpProgram.mProgramObject = glCreateProgramObjectARB(); + gObjectBumpProgram.attachObjects(baseObjects, baseCount); + gObjectBumpProgram.attachObject(loadShader(bumpshinyvertex, SHADER_OBJECT, GL_VERTEX_SHADER_ARB)); + gObjectBumpProgram.attachObject(loadShader(bumpshinyfragment, SHADER_OBJECT, GL_FRAGMENT_SHADER_ARB)); + success = gObjectBumpProgram.mapAttributes(); + if (success) + { + success = gObjectBumpProgram.mapUniforms(); + } + if( !success ) + { + llwarns << "Failed to load " << bumpshinyvertex << llendl; + } + } + + if (success) + { + //load object alpha vertex shader + std::string alphavertex = "objects/alphaV.glsl"; + std::string alphafragment = "objects/alphaF.glsl"; + gObjectAlphaProgram.mProgramObject = glCreateProgramObjectARB(); + gObjectAlphaProgram.attachObjects(baseObjects, baseCount); + gObjectAlphaProgram.attachObject(loadShader(alphavertex, SHADER_OBJECT, GL_VERTEX_SHADER_ARB)); + gObjectAlphaProgram.attachObject(loadShader(alphafragment, SHADER_OBJECT, GL_FRAGMENT_SHADER_ARB)); + + success = gObjectAlphaProgram.mapAttributes(); + if (success) + { + success = gObjectAlphaProgram.mapUniforms(); + } + if( !success ) + { + llwarns << "Failed to load " << alphavertex << llendl; + } + } +#endif + + if (success) + { + //load shiny vertex shader + std::string shinyvertex = "objects/shinyV.glsl"; + std::string shinyfragment = "objects/shinyF.glsl"; + gObjectShinyProgram.mProgramObject = glCreateProgramObjectARB(); + gObjectShinyProgram.attachObjects(baseObjects, baseCount); + gObjectShinyProgram.attachObject(loadShader(shinyvertex, SHADER_OBJECT, GL_VERTEX_SHADER_ARB)); + gObjectShinyProgram.attachObject(loadShader(shinyfragment, SHADER_OBJECT, GL_FRAGMENT_SHADER_ARB)); + + success = gObjectShinyProgram.mapAttributes(); + if (success) + { + success = gObjectShinyProgram.mapUniforms(sShinyUniforms, sShinyUniformCount); + } + if( !success ) + { + llwarns << "Failed to load " << shinyvertex << llendl; + } + } + + if( !success ) + { + sVertexShaderLevel[SHADER_OBJECT] = 0; + sMaxVertexShaderLevel[SHADER_OBJECT] = 0; + return FALSE; + } + + return TRUE; +} + +BOOL LLShaderMgr::loadShadersAvatar() +{ + GLhandleARB baseObjects[] = + { + gLightFragment, + gLightVertex, + gScatterFragment, + gScatterVertex + }; + S32 baseCount = 4; + + BOOL success = TRUE; + + if (sVertexShaderLevel[SHADER_AVATAR] == 0) + { + gAvatarProgram.unload(); + gAvatarEyeballProgram.unload(); + gAvatarPickProgram.unload(); + return FALSE; + } + + if (success) + { + //load specular (eyeball) vertex program + std::string eyeballvertex = "avatar/eyeballV.glsl"; + std::string eyeballfragment = "avatar/eyeballF.glsl"; + gAvatarEyeballProgram.mProgramObject = glCreateProgramObjectARB(); + gAvatarEyeballProgram.attachObjects(baseObjects, baseCount); + gAvatarEyeballProgram.attachObject(loadShader(eyeballvertex, SHADER_AVATAR, GL_VERTEX_SHADER_ARB)); + gAvatarEyeballProgram.attachObject(loadShader(eyeballfragment, SHADER_AVATAR, GL_FRAGMENT_SHADER_ARB)); + success = gAvatarEyeballProgram.mapAttributes(); + if (success) + { + success = gAvatarEyeballProgram.mapUniforms(); + } + if( !success ) + { + llwarns << "Failed to load " << eyeballvertex << llendl; + } + } + + if (success) + { + gAvatarSkinVertex = loadShader("avatar/avatarSkinV.glsl", SHADER_AVATAR, GL_VERTEX_SHADER_ARB); + //load avatar vertex shader + std::string avatarvertex = "avatar/avatarV.glsl"; + std::string avatarfragment = "avatar/avatarF.glsl"; + + gAvatarProgram.mProgramObject = glCreateProgramObjectARB(); + gAvatarProgram.attachObjects(baseObjects, baseCount); + gAvatarProgram.attachObject(gAvatarSkinVertex); + gAvatarProgram.attachObject(loadShader(avatarvertex, SHADER_AVATAR, GL_VERTEX_SHADER_ARB)); + gAvatarProgram.attachObject(loadShader(avatarfragment, SHADER_AVATAR, GL_FRAGMENT_SHADER_ARB)); + + success = gAvatarProgram.mapAttributes(sAvatarAttribs, sAvatarAttribCount); + if (success) + { + success = gAvatarProgram.mapUniforms(sAvatarUniforms, sAvatarUniformCount); + } + if( !success ) + { + llwarns << "Failed to load " << avatarvertex << llendl; + } + } + + if (success) + { + //load avatar picking shader + std::string pickvertex = "avatar/pickAvatarV.glsl"; + std::string pickfragment = "avatar/pickAvatarF.glsl"; + gAvatarPickProgram.mProgramObject = glCreateProgramObjectARB(); + gAvatarPickProgram.attachObject(loadShader(pickvertex, SHADER_AVATAR, GL_VERTEX_SHADER_ARB)); + gAvatarPickProgram.attachObject(loadShader(pickfragment, SHADER_AVATAR, GL_FRAGMENT_SHADER_ARB)); + gAvatarPickProgram.attachObject(gAvatarSkinVertex); + + success = gAvatarPickProgram.mapAttributes(sAvatarAttribs, sAvatarAttribCount); + if (success) + { + success = gAvatarPickProgram.mapUniforms(sAvatarUniforms, sAvatarUniformCount); + } + if( !success ) + { + llwarns << "Failed to load " << pickvertex << llendl; + } + } + + if( !success ) + { + sVertexShaderLevel[SHADER_AVATAR] = 0; + sMaxVertexShaderLevel[SHADER_AVATAR] = 0; + return FALSE; + } + + return TRUE; +} + +BOOL LLShaderMgr::loadShadersInterface() +{ + BOOL success = TRUE; + + if (sVertexShaderLevel[SHADER_INTERFACE] == 0) + { + gHighlightProgram.unload(); + return FALSE; + } + + if (success) + { + //load highlighting shader + std::string highlightvertex = "interface/highlightV.glsl"; + std::string highlightfragment = "interface/highlightF.glsl"; + gHighlightProgram.mProgramObject = glCreateProgramObjectARB(); + gHighlightProgram.attachObject(loadShader(highlightvertex, SHADER_INTERFACE, GL_VERTEX_SHADER_ARB)); + gHighlightProgram.attachObject(loadShader(highlightfragment, SHADER_INTERFACE, GL_FRAGMENT_SHADER_ARB)); + + success = gHighlightProgram.mapAttributes(); + if (success) + { + success = gHighlightProgram.mapUniforms(); + } + if( !success ) + { + llwarns << "Failed to load " << highlightvertex << llendl; + } + } + + if( !success ) + { + sVertexShaderLevel[SHADER_INTERFACE] = 0; + sMaxVertexShaderLevel[SHADER_INTERFACE] = 0; + return FALSE; + } + + return TRUE; +} + + +//=============================== +// LLGLSL Shader implementation +//=============================== +LLGLSLShader::LLGLSLShader() +: mProgramObject(0) +{ } + +void LLGLSLShader::unload() +{ + stop_glerror(); + mAttribute.clear(); + mTexture.clear(); + mUniform.clear(); + + if (mProgramObject) + { + GLhandleARB obj[1024]; + GLsizei count; + + glGetAttachedObjectsARB(mProgramObject, 1024, &count, obj); + for (GLsizei i = 0; i < count; i++) + { + glDeleteObjectARB(obj[i]); + } + + glDeleteObjectARB(mProgramObject); + + mProgramObject = 0; + } + + //hack to make apple not complain + glGetError(); + + stop_glerror(); +} + +void LLGLSLShader::attachObject(GLhandleARB object) +{ + if (object != 0) + { + stop_glerror(); + glAttachObjectARB(mProgramObject, object); + stop_glerror(); + } + else + { + llwarns << "Attempting to attach non existing shader object. " << llendl; + } +} + +void LLGLSLShader::attachObjects(GLhandleARB* objects, S32 count) +{ + for (S32 i = 0; i < count; i++) + { + attachObject(objects[i]); + } +} + +BOOL LLGLSLShader::mapAttributes(const char** attrib_names, S32 count) +{ + //link the program + BOOL res = link(); + + mAttribute.clear(); + mAttribute.resize(LLShaderMgr::sReservedAttribCount + count, -1); + + if (res) + { //read back channel locations + + //read back reserved channels first + for (S32 i = 0; i < (S32) LLShaderMgr::sReservedAttribCount; i++) + { + const char* name = LLShaderMgr::sReservedAttribs[i]; + S32 index = glGetAttribLocationARB(mProgramObject, name); + if (index != -1) + { + mAttribute[i] = index; + llinfos << "Attribute " << name << " assigned to channel " << index << llendl; + } + } + + for (S32 i = 0; i < count; i++) + { + const char* name = attrib_names[i]; + S32 index = glGetAttribLocationARB(mProgramObject, name); + if (index != -1) + { + mAttribute[LLShaderMgr::sReservedAttribCount + i] = index; + llinfos << "Attribute " << name << " assigned to channel " << index << llendl; + } + } + + return TRUE; + } + + return FALSE; +} + +void LLGLSLShader::mapUniform(GLint index, const char** uniform_names, S32 count) +{ + if (index == -1) + { + return; + } + + GLenum type; + GLsizei length; + GLint size; + char name[1024]; /* Flawfinder: ignore */ + name[0] = 0; + + glGetActiveUniformARB(mProgramObject, index, 1024, &length, &size, &type, name); + + //find the index of this uniform + for (S32 i = 0; i < (S32) LLShaderMgr::sReservedUniformCount; i++) + { + if (mUniform[i] == -1 && !strncmp(LLShaderMgr::sReservedUniforms[i],name, strlen(LLShaderMgr::sReservedUniforms[i]))) /* Flawfinder: ignore */ + { + //found it + S32 location = glGetUniformLocationARB(mProgramObject, name); + mUniform[i] = location; + llinfos << "Uniform " << name << " is at location " << location << llendl; + mTexture[i] = mapUniformTextureChannel(location, type); + return; + } + } + + for (S32 i = 0; i < count; i++) + { + if (mUniform[i+LLShaderMgr::sReservedUniformCount] == -1 && + !strncmp(uniform_names[i],name, strlen(uniform_names[i]))) /* Flawfinder: ignore */ + { + //found it + S32 location = glGetUniformLocationARB(mProgramObject, name); + mUniform[i+LLShaderMgr::sReservedUniformCount] = location; + llinfos << "Uniform " << name << " is at location " << location << " stored in index " << + (i+LLShaderMgr::sReservedUniformCount) << llendl; + mTexture[i+LLShaderMgr::sReservedUniformCount] = mapUniformTextureChannel(location, type); + return; + } + } + + //llinfos << "Unknown uniform: " << name << llendl; + } + +GLint LLGLSLShader::mapUniformTextureChannel(GLint location, GLenum type) +{ + if (type >= GL_SAMPLER_1D_ARB && type <= GL_SAMPLER_2D_RECT_SHADOW_ARB) + { //this here is a texture + glUniform1iARB(location, mActiveTextureChannels); + llinfos << "Assigned to texture channel " << mActiveTextureChannels << llendl; + return mActiveTextureChannels++; + } + return -1; +} + +BOOL LLGLSLShader::mapUniforms(const char** uniform_names, S32 count) +{ + BOOL res = TRUE; + + mActiveTextureChannels = 0; + mUniform.clear(); + mTexture.clear(); + + //initialize arrays + mUniform.resize(count + LLShaderMgr::sReservedUniformCount, -1); + mTexture.resize(count + LLShaderMgr::sReservedUniformCount, -1); + + bind(); + + //get the number of active uniforms + GLint activeCount; + glGetObjectParameterivARB(mProgramObject, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &activeCount); + + for (S32 i = 0; i < activeCount; i++) + { + mapUniform(i, uniform_names, count); + } + + unbind(); + + return res; +} + +BOOL LLGLSLShader::link(BOOL suppress_errors) +{ + return LLShaderMgr::linkProgramObject(mProgramObject, suppress_errors); +} + +void LLGLSLShader::bind() +{ + glUseProgramObjectARB(mProgramObject); + if (mAttribute.size() > 0) + { + gMaterialIndex = mAttribute[0]; + } +} + +void LLGLSLShader::unbind() +{ + for (U32 i = 0; i < mAttribute.size(); ++i) + { + vertexAttrib4f(i, 0,0,0,1); + } + glUseProgramObjectARB(0); +} + +S32 LLGLSLShader::enableTexture(S32 uniform, S32 mode) +{ + if (uniform < 0 || uniform >= (S32)mTexture.size()) + { + llerrs << "LLGLSLShader::enableTexture: uniform out of range: " << uniform << llendl; + } + S32 index = mTexture[uniform]; + if (index != -1) + { + glActiveTextureARB(GL_TEXTURE0_ARB+index); + glEnable(mode); + } + return index; +} + +S32 LLGLSLShader::disableTexture(S32 uniform, S32 mode) +{ + S32 index = mTexture[uniform]; + if (index != -1) + { + glActiveTextureARB(GL_TEXTURE0_ARB+index); + glDisable(mode); + } + return index; +} + +void LLGLSLShader::vertexAttrib4f(U32 index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) +{ + if (mAttribute[index] > 0) + { + glVertexAttrib4fARB(mAttribute[index], x, y, z, w); + } +} + +void LLGLSLShader::vertexAttrib4fv(U32 index, GLfloat* v) +{ + if (mAttribute[index] > 0) + { + glVertexAttrib4fvARB(mAttribute[index], v); + } +} + +void LLScatterShader::init(GLhandleARB shader, int map_stage) +{ + glUseProgramObjectARB(shader); + glUniform1iARB(glGetUniformLocationARB(shader, "scatterMap"), map_stage); + glUseProgramObjectARB(0); +} + diff --git a/linden/indra/newview/llglslshader.h b/linden/indra/newview/llglslshader.h new file mode 100644 index 0000000..bbf91a8 --- /dev/null +++ b/linden/indra/newview/llglslshader.h @@ -0,0 +1,232 @@ +/** + * @file llglslshader.h + * @brief GLSL shader wrappers + * + * Copyright (c) 2001-2007, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + */ + +#ifndef LL_LLGLSLSHADER_H +#define LL_LLGLSLSHADER_H + +#include "llgl.h" + +class LLGLSLShader +{ +public: + LLGLSLShader(); + + void unload(); + void attachObject(GLhandleARB object); + void attachObjects(GLhandleARB* objects = NULL, S32 count = 0); + BOOL mapAttributes(const char** attrib_names = NULL, S32 count = 0); + BOOL mapUniforms(const char** uniform_names = NULL, S32 count = 0); + void mapUniform(GLint index, const char** uniform_names = NULL, S32 count = 0); + void vertexAttrib4f(U32 index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + void vertexAttrib4fv(U32 index, GLfloat* v); + + GLint mapUniformTextureChannel(GLint location, GLenum type); + + + //enable/disable texture channel for specified uniform + //if given texture uniform is active in the shader, + //the corresponding channel will be active upon return + //returns channel texture is enabled in from [0-MAX) + S32 enableTexture(S32 uniform, S32 mode = GL_TEXTURE_2D); + S32 disableTexture(S32 uniform, S32 mode = GL_TEXTURE_2D); + + BOOL link(BOOL suppress_errors = FALSE); + void bind(); + void unbind(); + + GLhandleARB mProgramObject; + std::vector mAttribute; + std::vector mUniform; + std::vector mTexture; + S32 mActiveTextureChannels; +}; + +class LLScatterShader +{ +public: + static void init(GLhandleARB shader, int map_stage); +}; + +class LLShaderMgr +{ +public: + static void setShaders(); + static void unloadShaders(); + static void dumpObjectLog(GLhandleARB ret, BOOL warns = TRUE); + static BOOL linkProgramObject(GLhandleARB obj, BOOL suppress_errors = FALSE); + static BOOL validateProgramObject(GLhandleARB obj); + static GLhandleARB loadShader(const LLString& filename, S32 cls, GLenum type); + static S32 getVertexShaderLevel(S32 type); + static S32 getMaxVertexShaderLevel(S32 type); + static BOOL loadShadersLighting(); + static BOOL loadShadersObject(); + static BOOL loadShadersAvatar(); + static BOOL loadShadersEnvironment(); + static BOOL loadShadersInterface(); + static S32 sVertexShaderLevel[]; + static S32 sMaxVertexShaderLevel[]; + //global (reserved slot) shader parameters + static const char* sReservedAttribs[]; + static U32 sReservedAttribCount; + + enum EShaderClass + { + SHADER_LIGHTING, + SHADER_OBJECT, + SHADER_AVATAR, + SHADER_ENVIRONMENT, + SHADER_INTERFACE, + SHADER_COUNT + }; + + typedef enum + { + MATERIAL_COLOR = 0, + SPECULAR_COLOR, + BINORMAL, + END_RESERVED_ATTRIBS + } eGLSLReservedAttribs; + + static const char* sReservedUniforms[]; + static U32 sReservedUniformCount; + + typedef enum + { + DIFFUSE_MAP = 0, + SPECULAR_MAP, + BUMP_MAP, + ENVIRONMENT_MAP, + END_RESERVED_UNIFORMS + } eGLSLReservedUniforms; + + static const char* sShinyUniforms[]; + static U32 sShinyUniformCount; + + typedef enum + { + SHINY_ORIGIN = END_RESERVED_UNIFORMS + } eShinyUniforms; + + //water parameters + static const char* sWaterUniforms[]; + static U32 sWaterUniformCount; + + typedef enum + { + WATER_SCREENTEX = END_RESERVED_UNIFORMS, + WATER_EYEVEC, + WATER_TIME, + WATER_WAVE_DIR1, + WATER_WAVE_DIR2, + WATER_LIGHT_DIR, + WATER_SPECULAR, + WATER_SPECULAR_EXP, + WATER_FBSCALE, + WATER_REFSCALE + } eWaterUniforms; + + //terrain parameters + static const char* sTerrainUniforms[]; + static U32 sTerrainUniformCount; + + typedef enum + { + TERRAIN_DETAIL0 = END_RESERVED_UNIFORMS, + TERRAIN_DETAIL1, + TERRAIN_ALPHARAMP + } eTerrainUniforms; + + //glow parameters + static const char* sGlowUniforms[]; + static U32 sGlowUniformCount; + + typedef enum + { + GLOW_DELTA = END_RESERVED_UNIFORMS + } eGlowUniforms; + + //avatar shader parameter tables + static const char* sAvatarAttribs[]; + static U32 sAvatarAttribCount; + + typedef enum + { + AVATAR_WEIGHT = END_RESERVED_ATTRIBS, + AVATAR_CLOTHING, + AVATAR_WIND, + AVATAR_SINWAVE, + AVATAR_GRAVITY + } eAvatarAttribs; + + static const char* sAvatarUniforms[]; + static U32 sAvatarUniformCount; + + typedef enum + { + AVATAR_MATRIX = END_RESERVED_UNIFORMS + } eAvatarUniforms; + +}; //LLSL + +//utility shader objects (not shader programs) +extern GLhandleARB gLightVertex; +extern GLhandleARB gLightFragment; +extern GLhandleARB gScatterVertex; +extern GLhandleARB gScatterFragment; + +extern LLVector4 gShinyOrigin; + +//object shaders +extern LLGLSLShader gObjectSimpleProgram; +extern LLGLSLShader gObjectAlphaProgram; +extern LLGLSLShader gObjectBumpProgram; +extern LLGLSLShader gObjectShinyProgram; + +//environment shaders +extern LLGLSLShader gTerrainProgram; +extern LLGLSLShader gGlowProgram; +extern LLGLSLShader gGroundProgram; +extern LLGLSLShader gWaterProgram; + +//interface shaders +extern LLGLSLShader gHighlightProgram; + +//avatar skinning utility shader object +extern GLhandleARB gAvatarSkinVertex; + +//avatar shader handles +extern LLGLSLShader gAvatarProgram; +extern LLGLSLShader gAvatarEyeballProgram; +extern LLGLSLShader gAvatarPickProgram; + +//current avatar shader parameter pointer +extern GLint gAvatarMatrixParam; +extern GLint gMaterialIndex; +extern GLint gSpecularIndex; + +#endif diff --git a/linden/indra/newview/llgroupmgr.cpp b/linden/indra/newview/llgroupmgr.cpp index d020236..fbdcf81 100644 --- a/linden/indra/newview/llgroupmgr.cpp +++ b/linden/indra/newview/llgroupmgr.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llgroupmgr.h b/linden/indra/newview/llgroupmgr.h index 506f4e6..bc4fa71 100644 --- a/linden/indra/newview/llgroupmgr.h +++ b/linden/indra/newview/llgroupmgr.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llgroupnotify.cpp b/linden/indra/newview/llgroupnotify.cpp index d6e5785..de9b571 100644 --- a/linden/indra/newview/llgroupnotify.cpp +++ b/linden/indra/newview/llgroupnotify.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -249,7 +250,7 @@ LLGroupNotifyBox::LLGroupNotifyBox(const char* subject, LLViewerImage* item_icon = get_item_icon(mInventoryOffer->mType, LLInventoryType::IT_TEXTURE, - 0); + 0, FALSE); x += LABEL_WIDTH + HPAD; diff --git a/linden/indra/newview/llgroupnotify.h b/linden/indra/newview/llgroupnotify.h index b0fdbe8..d465181 100644 --- a/linden/indra/newview/llgroupnotify.h +++ b/linden/indra/newview/llgroupnotify.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhippo.cpp b/linden/indra/newview/llhippo.cpp index b2dd20f..9d4b52b 100644 --- a/linden/indra/newview/llhippo.cpp +++ b/linden/indra/newview/llhippo.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhippo.h b/linden/indra/newview/llhippo.h index 0757e66..ee37dbe 100644 --- a/linden/indra/newview/llhippo.h +++ b/linden/indra/newview/llhippo.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhoverview.cpp b/linden/indra/newview/llhoverview.cpp index 30ee2b0..6807b42 100644 --- a/linden/indra/newview/llhoverview.cpp +++ b/linden/indra/newview/llhoverview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -424,7 +425,7 @@ void LLHoverView::updateText() { temp_str = new LLString(); temp_str->append("For Sale: "); - snprintf(cstring, sizeof(cstring), "L$%d", nodep->mSaleInfo.getSalePrice()); /*Flawfinder: ignore*/ + snprintf(cstring, sizeof(cstring), "L$%d", nodep->mSaleInfo.getSalePrice()); /* Flawfinder: ignore */ temp_str->append(cstring); mText.addDataAtEnd(temp_str); suppressObjectHoverDisplay = FALSE; // Show tip @@ -615,7 +616,7 @@ void LLHoverView::updateText() if (hover_parcel && hover_parcel->getParcelFlag(PF_FOR_SALE)) { char buffer[MAX_STRING]; /*Flawfinder: ignore*/ - snprintf(buffer, sizeof(buffer), "For Sale: L$%d", hover_parcel->getSalePrice() ); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "For Sale: L$%d", hover_parcel->getSalePrice() ); /* Flawfinder: ignore */ line = new LLString(buffer); mText.addDataAtEnd(line); diff --git a/linden/indra/newview/llhoverview.h b/linden/indra/newview/llhoverview.h index e7fdd6a..ef93eae 100644 --- a/linden/indra/newview/llhoverview.h +++ b/linden/indra/newview/llhoverview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudconnector.cpp b/linden/indra/newview/llhudconnector.cpp index 18c1bfc..8739917 100644 --- a/linden/indra/newview/llhudconnector.cpp +++ b/linden/indra/newview/llhudconnector.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudconnector.h b/linden/indra/newview/llhudconnector.h index 115fe28..4b7bf77 100644 --- a/linden/indra/newview/llhudconnector.h +++ b/linden/indra/newview/llhudconnector.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudeffect.cpp b/linden/indra/newview/llhudeffect.cpp index 090895e..96035c6 100644 --- a/linden/indra/newview/llhudeffect.cpp +++ b/linden/indra/newview/llhudeffect.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudeffect.h b/linden/indra/newview/llhudeffect.h index cc86bfa..98a7553 100644 --- a/linden/indra/newview/llhudeffect.h +++ b/linden/indra/newview/llhudeffect.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudeffectbeam.cpp b/linden/indra/newview/llhudeffectbeam.cpp index db24875..4b74f88 100644 --- a/linden/indra/newview/llhudeffectbeam.cpp +++ b/linden/indra/newview/llhudeffectbeam.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudeffectbeam.h b/linden/indra/newview/llhudeffectbeam.h index 0148b37..de6d18d 100644 --- a/linden/indra/newview/llhudeffectbeam.h +++ b/linden/indra/newview/llhudeffectbeam.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudeffectlookat.cpp b/linden/indra/newview/llhudeffectlookat.cpp index 99ae239..5250b57 100644 --- a/linden/indra/newview/llhudeffectlookat.cpp +++ b/linden/indra/newview/llhudeffectlookat.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudeffectlookat.h b/linden/indra/newview/llhudeffectlookat.h index 3d76df5..8fa1ac2 100644 --- a/linden/indra/newview/llhudeffectlookat.h +++ b/linden/indra/newview/llhudeffectlookat.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudeffectpointat.cpp b/linden/indra/newview/llhudeffectpointat.cpp index 7644ff8..7218642 100644 --- a/linden/indra/newview/llhudeffectpointat.cpp +++ b/linden/indra/newview/llhudeffectpointat.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudeffectpointat.h b/linden/indra/newview/llhudeffectpointat.h index 6fd0e62..aba4dc8 100644 --- a/linden/indra/newview/llhudeffectpointat.h +++ b/linden/indra/newview/llhudeffectpointat.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudeffecttrail.cpp b/linden/indra/newview/llhudeffecttrail.cpp index cf76357..fed3a9e 100644 --- a/linden/indra/newview/llhudeffecttrail.cpp +++ b/linden/indra/newview/llhudeffecttrail.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudeffecttrail.h b/linden/indra/newview/llhudeffecttrail.h index 5602d23..d14d000 100644 --- a/linden/indra/newview/llhudeffecttrail.h +++ b/linden/indra/newview/llhudeffecttrail.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudicon.cpp b/linden/indra/newview/llhudicon.cpp index d0d2ea5..93e730e 100644 --- a/linden/indra/newview/llhudicon.cpp +++ b/linden/indra/newview/llhudicon.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudicon.h b/linden/indra/newview/llhudicon.h index 53837d1..f26abb4 100644 --- a/linden/indra/newview/llhudicon.h +++ b/linden/indra/newview/llhudicon.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudmanager.cpp b/linden/indra/newview/llhudmanager.cpp index bb1c2da..f4eeb5b 100644 --- a/linden/indra/newview/llhudmanager.cpp +++ b/linden/indra/newview/llhudmanager.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudmanager.h b/linden/indra/newview/llhudmanager.h index a9567a1..41cf018 100644 --- a/linden/indra/newview/llhudmanager.h +++ b/linden/indra/newview/llhudmanager.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudobject.cpp b/linden/indra/newview/llhudobject.cpp index 4aef468..6032354 100644 --- a/linden/indra/newview/llhudobject.cpp +++ b/linden/indra/newview/llhudobject.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudobject.h b/linden/indra/newview/llhudobject.h index d5494ac..bacffce 100644 --- a/linden/indra/newview/llhudobject.h +++ b/linden/indra/newview/llhudobject.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudrender.cpp b/linden/indra/newview/llhudrender.cpp index 8060318..f85638e 100644 --- a/linden/indra/newview/llhudrender.cpp +++ b/linden/indra/newview/llhudrender.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudrender.h b/linden/indra/newview/llhudrender.h index bcc202c..1233f46 100644 --- a/linden/indra/newview/llhudrender.h +++ b/linden/indra/newview/llhudrender.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudtext.cpp b/linden/indra/newview/llhudtext.cpp index bacfaa0..740cce0 100644 --- a/linden/indra/newview/llhudtext.cpp +++ b/linden/indra/newview/llhudtext.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudtext.h b/linden/indra/newview/llhudtext.h index 962bd1d..033702b 100644 --- a/linden/indra/newview/llhudtext.h +++ b/linden/indra/newview/llhudtext.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudview.cpp b/linden/indra/newview/llhudview.cpp index 91aa589..2ce9172 100644 --- a/linden/indra/newview/llhudview.cpp +++ b/linden/indra/newview/llhudview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llhudview.h b/linden/indra/newview/llhudview.h index c09f883..d958f9c 100644 --- a/linden/indra/newview/llhudview.h +++ b/linden/indra/newview/llhudview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llimpanel.cpp b/linden/indra/newview/llimpanel.cpp index 088d601..d95abf3 100644 --- a/linden/indra/newview/llimpanel.cpp +++ b/linden/indra/newview/llimpanel.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -74,40 +75,171 @@ const S32 MIN_HEIGHT = 130; // static LLString sTitleString = "Instant Message with [NAME]"; static LLString sTypingStartString = "[NAME]: ..."; +static LLString sSessionStartString = "Starting session with [NAME] please wait."; + +void session_starter_helper(const LLUUID& temp_session_id, + const LLUUID& other_participant_id, + EInstantMessage im_type) +{ + LLMessageSystem *msg = gMessageSystem; + + msg->newMessageFast(_PREHASH_ImprovedInstantMessage); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + + msg->nextBlockFast(_PREHASH_MessageBlock); + msg->addBOOLFast(_PREHASH_FromGroup, FALSE); + msg->addUUIDFast(_PREHASH_ToAgentID, other_participant_id); + msg->addU8Fast(_PREHASH_Offline, IM_ONLINE); + msg->addU8Fast(_PREHASH_Dialog, im_type); + msg->addUUIDFast(_PREHASH_ID, temp_session_id); + msg->addU32Fast(_PREHASH_Timestamp, NO_TIMESTAMP); // no timestamp necessary + + std::string name; + gAgent.buildFullname(name); + + msg->addStringFast(_PREHASH_FromAgentName, name); + msg->addStringFast(_PREHASH_Message, LLString::null); + msg->addU32Fast(_PREHASH_ParentEstateID, 0); + msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null); + msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent()); +} + +// Returns true if any messages were sent, false otherwise. +// Is sort of equivalent to "does the server need to do anything?" +bool send_start_session_messages(const LLUUID& temp_session_id, + const LLUUID& other_participant_id, + const LLDynamicArray& ids, + EInstantMessage dialog) +{ + if ( (dialog == IM_SESSION_911_START) || + (dialog == IM_SESSION_GROUP_START) || + (dialog == IM_SESSION_CONFERENCE_START) ) + { + S32 count = ids.size(); + S32 bucket_size = UUID_BYTES * count; + U8* bucket; + U8* pos; + + session_starter_helper(temp_session_id, + other_participant_id, + dialog); + + switch(dialog) + { + case IM_SESSION_GROUP_START: + case IM_SESSION_911_START: + gMessageSystem->addBinaryDataFast(_PREHASH_BinaryBucket, + EMPTY_BINARY_BUCKET, + EMPTY_BINARY_BUCKET_SIZE); + break; + case IM_SESSION_CONFERENCE_START: + bucket = new U8[bucket_size]; + pos = bucket; + + // *FIX: this could suffer from endian issues + for(S32 i = 0; i < count; ++i) + { + memcpy(pos, &(ids.get(i)), UUID_BYTES); + pos += UUID_BYTES; + } + gMessageSystem->addBinaryDataFast(_PREHASH_BinaryBucket, + bucket, + bucket_size); + delete[] bucket; + + break; + default: + break; + } + gAgent.sendReliableMessage(); + + return true; + } + + return false; +} // Member Functions // -LLFloaterIMPanel::LLFloaterIMPanel(const std::string& name, const LLRect& rect, - const std::string& session_label, - const LLUUID& session_id, - const LLUUID& other_participant_id, - EInstantMessage dialog) : +LLFloaterIMPanel::LLFloaterIMPanel(const std::string& name, + const LLRect& rect, + const std::string& session_label, + const LLUUID& session_id, + const LLUUID& other_participant_id, + EInstantMessage dialog) : + LLFloater(name, rect, session_label), + mInputEditor(NULL), + mHistoryEditor(NULL), + mSessionUUID(session_id), + mOtherParticipantUUID(other_participant_id), + mDialog(dialog), + mTyping(FALSE), + mOtherTyping(FALSE), + mTypingLineStartIndex(0), + mSentTypingState(TRUE), + mFirstKeystrokeTimer(), + mLastKeystrokeTimer(), + mSessionInitialized(FALSE), + mSessionInitRequested(FALSE) +{ + init(session_label); +} + +LLFloaterIMPanel::LLFloaterIMPanel(const std::string& name, + const LLRect& rect, + const std::string& session_label, + const LLUUID& session_id, + const LLUUID& other_participant_id, + const LLDynamicArray& ids, + EInstantMessage dialog) : LLFloater(name, rect, session_label), mInputEditor(NULL), mHistoryEditor(NULL), - mSessionLabel(session_label), mSessionUUID(session_id), mOtherParticipantUUID(other_participant_id), - mLureID(), mDialog(dialog), mTyping(FALSE), mOtherTyping(FALSE), mTypingLineStartIndex(0), mSentTypingState(TRUE), mFirstKeystrokeTimer(), - mLastKeystrokeTimer() + mLastKeystrokeTimer(), + mSessionInitialized(FALSE), + mSessionInitRequested(FALSE) +{ + init(session_label); + + mSessionInitialTargetIDs = ids; +} + + +void LLFloaterIMPanel::init(const LLString& session_label) { - init(); + gUICtrlFactory->buildFloater(this, + "floater_instant_message.xml", + NULL, + FALSE); + setLabel(session_label); setTitle(session_label); mInputEditor->setMaxTextLength(1023); -} + if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") ) + { + LLLogChat::loadHistory(session_label, + &chatFromLogFile, + (void *)this); + } -void LLFloaterIMPanel::init() -{ - gUICtrlFactory->buildFloater(this, "floater_instant_message.xml", NULL, FALSE); + if(IM_SESSION_911_START == mDialog) + { + LLTextBox* live_help_text = + LLUICtrlFactory::getTextBoxByName(this, "live_help_dialog"); + addHistoryLine(live_help_text->getText()); + } } @@ -120,6 +252,8 @@ BOOL LLFloaterIMPanel::postBuild() requires("live_help_dialog", WIDGET_TYPE_TEXT_BOX); requires("title_string", WIDGET_TYPE_TEXT_BOX); requires("typing_start_string", WIDGET_TYPE_TEXT_BOX); + requires("session_start_string", WIDGET_TYPE_TEXT_BOX); + requires("teleport_btn", WIDGET_TYPE_BUTTON); if (checkRequirements()) { @@ -137,24 +271,19 @@ BOOL LLFloaterIMPanel::postBuild() LLButton* close_btn = LLUICtrlFactory::getButtonByName(this, "close_btn"); close_btn->setClickedCallback(&LLFloaterIMPanel::onClickClose, this); + LLButton* tp_btn = LLUICtrlFactory::getButtonByName(this, "teleport_btn"); + tp_btn->setClickedCallback(&LLFloaterIMPanel::onTeleport, this); + tp_btn->setVisible(FALSE); + tp_btn->setEnabled(FALSE); + mHistoryEditor = LLViewerUICtrlFactory::getViewerTextEditorByName(this, "im_history"); mHistoryEditor->setParseHTML(TRUE); - if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") ) - { - LLLogChat::loadHistory(mSessionLabel, &chatFromLogFile, (void *)this); - } if (IM_SESSION_GROUP_START == mDialog || IM_SESSION_911_START == mDialog) { profile_btn->setEnabled(FALSE); - if(IM_SESSION_911_START == mDialog) - { - LLTextBox* live_help_text = LLUICtrlFactory::getTextBoxByName(this, "live_help_dialog"); - addHistoryLine(live_help_text->getText()); - } } - LLTextBox* title = LLUICtrlFactory::getTextBoxByName(this, "title_string"); sTitleString = title->getText(); @@ -162,6 +291,11 @@ BOOL LLFloaterIMPanel::postBuild() sTypingStartString = typing_start->getText(); + LLTextBox* session_start = LLUICtrlFactory::getTextBoxByName( + this, + "session_start_string"); + sSessionStartString = session_start->getText(); + return TRUE; } @@ -195,12 +329,14 @@ void LLFloaterIMPanel::draw() BOOL LLFloaterIMPanel::addParticipants(const LLDynamicArray& ids) { - if(isAddAllowed()) + S32 count = ids.count(); + + if( isAddAllowed() && (count > 0) ) { llinfos << "LLFloaterIMPanel::addParticipants() - adding participants" << llendl; const S32 MAX_AGENTS = 50; - S32 count = ids.count(); if(count > MAX_AGENTS) return FALSE; + LLMessageSystem *msg = gMessageSystem; msg->newMessageFast(_PREHASH_ImprovedInstantMessage); msg->nextBlockFast(_PREHASH_AgentData); @@ -210,7 +346,7 @@ BOOL LLFloaterIMPanel::addParticipants(const LLDynamicArray& ids) msg->addBOOLFast(_PREHASH_FromGroup, FALSE); msg->addUUIDFast(_PREHASH_ToAgentID, mOtherParticipantUUID); msg->addU8Fast(_PREHASH_Offline, IM_ONLINE); - msg->addU8Fast(_PREHASH_Dialog, mDialog); + msg->addU8Fast(_PREHASH_Dialog, IM_SESSION_ADD); msg->addUUIDFast(_PREHASH_ID, mSessionUUID); msg->addU32Fast(_PREHASH_Timestamp, NO_TIMESTAMP); // no timestamp necessary std::string name; @@ -220,57 +356,21 @@ BOOL LLFloaterIMPanel::addParticipants(const LLDynamicArray& ids) msg->addU32Fast(_PREHASH_ParentEstateID, 0); msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null); msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent()); - if (IM_SESSION_GROUP_START == mDialog) - { - // *HACK: binary bucket contains session label - the server - // will actually add agents. - llinfos << "Group IM session name '" << mSessionLabel - << "'" << llendl; - msg->addStringFast(_PREHASH_BinaryBucket, mSessionLabel); - gAgent.sendReliableMessage(); - } - else if (IM_SESSION_911_START == mDialog) - { - // HACK -- we modify the name of the session going out to - // the helpers to help them easily identify "Help" - // sessions in their collection of IM panels. - LLString name; - gAgent.getName(name); - LLString buffer = LLString("HELP ") + name; - llinfos << "LiveHelp IM session '" << buffer << "'." << llendl; - msg->addStringFast(_PREHASH_BinaryBucket, buffer.c_str()); - - // automaticaly open a wormhole when this reliable message gets through - msg->sendReliable( - gAgent.getRegionHost(), - 3, // retries - TRUE, // ping-based - 5.0f, // timeout - send_lure_911, - (void**)&mSessionUUID); - } - else + + // *FIX: this could suffer from endian issues + S32 bucket_size = UUID_BYTES * count; + U8* bucket = new U8[bucket_size]; + U8* pos = bucket; + for(S32 i = 0; i < count; ++i) { - if (mDialog != IM_SESSION_ADD - && mDialog != IM_SESSION_OFFLINE_ADD) - { - llwarns << "LLFloaterIMPanel::addParticipants() - dialog type " << mDialog - << " is not an ADD" << llendl; - } - // *FIX: this could suffer from endian issues - S32 bucket_size = UUID_BYTES * count; - U8* bucket = new U8[bucket_size]; - U8* pos = bucket; - for(S32 i = 0; i < count; ++i) - { - memcpy(pos, &(ids.get(i)), UUID_BYTES); /* Flawfinder: ignore */ - pos += UUID_BYTES; - } - msg->addBinaryDataFast(_PREHASH_BinaryBucket, bucket, bucket_size); - delete[] bucket; - gAgent.sendReliableMessage(); + memcpy(pos, &(ids.get(i)), UUID_BYTES); + pos += UUID_BYTES; } - + msg->addBinaryDataFast(_PREHASH_BinaryBucket, + bucket, + bucket_size); + delete[] bucket; + gAgent.sendReliableMessage(); } else { @@ -279,6 +379,7 @@ BOOL LLFloaterIMPanel::addParticipants(const LLDynamicArray& ids) // successful add, because everyone that needed to get added // was added. } + return TRUE; } @@ -312,7 +413,7 @@ void LLFloaterIMPanel::addHistoryLine(const std::string &utf8msg, const LLColor4 { LLString histstr = timestring + utf8msg; - LLLogChat::saveHistory(mSessionLabel,histstr); + LLLogChat::saveHistory(getTitle(),histstr); } } @@ -474,11 +575,8 @@ BOOL LLFloaterIMPanel::dropCategory(LLInventoryCategory* category, BOOL drop) BOOL LLFloaterIMPanel::isAddAllowed() const { - return ((IM_SESSION_ADD == mDialog) - || (IM_SESSION_OFFLINE_ADD == mDialog) - || (IM_SESSION_GROUP_START == mDialog) - || (IM_SESSION_911_START == mDialog) - || (IM_SESSION_CARDLESS_START == mDialog)); + return ((IM_SESSION_CONFERENCE_START == mDialog) + || (IM_SESSION_ADD) ); } @@ -512,72 +610,36 @@ void LLFloaterIMPanel::onClickClose( void* userdata ) } } -void LLFloaterIMPanel::addTeleportButton(const LLUUID& lure_id) +void LLFloaterIMPanel::addTeleportButton() { - LLButton* btn = LLViewerUICtrlFactory::getButtonByName(this, "Teleport Btn"); - if (!btn) - { - S32 BTN_VPAD = 2; - S32 BTN_HPAD = 2; + LLButton* btn = + LLViewerUICtrlFactory::getButtonByName(this, "teleport_btn"); - const char* teleport_label = "Teleport"; - - const LLFontGL* font = gResMgr->getRes( LLFONT_SANSSERIF ); - S32 p_btn_width = 75; - S32 c_btn_width = 60; - S32 t_btn_width = 75; - - // adjust the size of the editor to make room for the new button + if ( !btn->getEnabled() ) + { + //it's required, don't need to check for null here + // adjust the size of the editor to make room for the button LLRect rect = mInputEditor->getRect(); - S32 editor_right = rect.mRight - t_btn_width; + S32 editor_right = rect.mRight - btn->getRect().getWidth(); rect.mRight = editor_right; mInputEditor->reshape(rect.getWidth(), rect.getHeight(), FALSE); mInputEditor->setRect(rect); - - const S32 IMPANEL_PAD = 1 + LLPANEL_BORDER_WIDTH; - const S32 IMPANEL_INPUT_HEIGHT = 20; - - rect.setLeftTopAndSize( - mRect.getWidth() - IMPANEL_PAD - p_btn_width - c_btn_width - t_btn_width - BTN_HPAD - RESIZE_HANDLE_WIDTH, - IMPANEL_INPUT_HEIGHT + IMPANEL_PAD - BTN_VPAD, - t_btn_width, - BTN_HEIGHT); - - btn = new LLButton( - "Teleport Btn", rect, - "","", "", - &LLFloaterIMPanel::onTeleport, this, - font, teleport_label, teleport_label ); - - btn->setFollowsBottom(); - btn->setFollowsRight(); - addChild( btn ); - } - btn->setEnabled(TRUE); - mLureID = lure_id; -} -void LLFloaterIMPanel::removeTeleportButton() -{ - // TODO -- purge the button - LLButton* btn = LLViewerUICtrlFactory::getButtonByName(this, "Teleport Btn"); - if (btn) - { - btn->setEnabled(FALSE); + btn->setVisible(TRUE); + btn->setEnabled(TRUE); } } -// static +// static void LLFloaterIMPanel::onTeleport(void* userdata) { LLFloaterIMPanel* self = (LLFloaterIMPanel*) userdata; if(self) { - send_simple_im(self->mLureID, - "", - IM_LURE_911, - LLUUID::null); - self->removeTeleportButton(); + send_simple_im(self->mSessionUUID, //to + "", + IM_TELEPORT_911, + self->mSessionUUID);//session } } @@ -589,7 +651,7 @@ void LLFloaterIMPanel::onInputEditorFocusReceived( LLUICtrl* caller, void* userd } // static -void LLFloaterIMPanel::onInputEditorFocusLost(LLLineEditor* caller, void* userdata) +void LLFloaterIMPanel::onInputEditorFocusLost(LLUICtrl* caller, void* userdata) { LLFloaterIMPanel* self = (LLFloaterIMPanel*) userdata; self->setTyping(FALSE); @@ -637,6 +699,44 @@ void LLFloaterIMPanel::onClose(bool app_quitting) destroy(); } +void deliver_message(const std::string& utf8_text, + const LLUUID& im_session_id, + const LLUUID& other_participant_id, + EInstantMessage dialog) +{ + std::string name; + gAgent.buildFullname(name); + + const LLRelationship* info = NULL; + info = LLAvatarTracker::instance().getBuddyInfo(other_participant_id); + U8 offline = (!info || info->isOnline()) ? IM_ONLINE : IM_OFFLINE; + + // default to IM_SESSION_SEND unless it's nothing special - in + // which case it's probably an IM to everyone. + U8 new_dialog = dialog; + + if ( dialog == IM_SESSION_911_START ) + { + new_dialog = IM_SESSION_911_SEND; + } + else if ( dialog != IM_NOTHING_SPECIAL ) + { + new_dialog = IM_SESSION_SEND; + } + + pack_instant_message( + gMessageSystem, + gAgent.getID(), + FALSE, + gAgent.getSessionID(), + other_participant_id, + name.c_str(), + utf8_text.c_str(), + offline, + (EInstantMessage)new_dialog, + im_session_id); + gAgent.sendReliableMessage(); +} void LLFloaterIMPanel::sendMsg() { @@ -654,50 +754,82 @@ void LLFloaterIMPanel::sendMsg() // Truncate and convert to UTF8 for transport std::string utf8_text = wstring_to_utf8str(text); utf8_text = utf8str_truncate(utf8_text, MAX_MSG_BUF_SIZE - 1); - std::string name; - gAgent.buildFullname(name); - - const LLRelationship* info = NULL; - info = LLAvatarTracker::instance().getBuddyInfo(mOtherParticipantUUID); - U8 offline = (!info || info->isOnline()) ? IM_ONLINE : IM_OFFLINE; - - // default to IM_SESSION_SEND unless it's nothing special - in - // which case it's probably an IM to everyone. - U8 dialog = (mDialog == IM_NOTHING_SPECIAL) - ? (U8)IM_NOTHING_SPECIAL : (U8)IM_SESSION_SEND; - pack_instant_message( - gMessageSystem, - gAgent.getID(), - FALSE, - gAgent.getSessionID(), - mOtherParticipantUUID, - name.c_str(), - utf8_text.c_str(), - offline, - (EInstantMessage)dialog, - mSessionUUID); - gAgent.sendReliableMessage(); - // local echo - if((mDialog == IM_NOTHING_SPECIAL) && (mOtherParticipantUUID.notNull())) + if ( !mSessionInitialized ) { - std::string history_echo; - gAgent.buildFullname(history_echo); - - // Look for IRC-style emotes here. - char tmpstr[5]; /* Flawfinder: ignore */ - strncpy(tmpstr,utf8_text.substr(0,4).c_str(), sizeof(tmpstr) -1); /* Flawfinder: ignore */ - tmpstr[sizeof(tmpstr) -1] = '\0'; - if (!strncmp(tmpstr, "/me ", 4) || !strncmp(tmpstr, "/me'", 4)) + //we send requests (if we need to) to initialize our session + if ( !mSessionInitRequested ) { - utf8_text.replace(0,3,""); + mSessionInitRequested = TRUE; + if ( !send_start_session_messages(mSessionUUID, + mOtherParticipantUUID, + mSessionInitialTargetIDs, + mDialog) ) + { + //we don't need to need to wait for any responses + //so we don't need to disable + mSessionInitialized = TRUE; + } + else + { + //queue up the message to send once the session is + //initialized + mQueuedMsgsForInit.append(utf8_text); + + //locally echo a little "starting session" message + LLUIString session_start = sSessionStartString; + + session_start.setArg("[NAME]", getTitle()); + mSessionStartMsgPos = + mHistoryEditor->getText().length(); + + bool log_to_file = false; + addHistoryLine(session_start, + LLColor4::grey, + log_to_file); + + } } else { - history_echo += ": "; + //queue up the message to send once the session is + //initialized + mQueuedMsgsForInit.append(utf8_text); + } + } + + if ( mSessionInitialized ) + { + deliver_message(utf8_text, + mSessionUUID, + mOtherParticipantUUID, + mDialog); + + // local echo + if((mDialog == IM_NOTHING_SPECIAL) && + (mOtherParticipantUUID.notNull())) + { + std::string history_echo; + gAgent.buildFullname(history_echo); + + // Look for IRC-style emotes here. + char tmpstr[5]; /* Flawfinder: ignore */ + strncpy(tmpstr, + utf8_text.substr(0,4).c_str(), + sizeof(tmpstr) -1); /* Flawfinder: ignore */ + tmpstr[sizeof(tmpstr) -1] = '\0'; + if (!strncmp(tmpstr, "/me ", 4) || + !strncmp(tmpstr, "/me'", 4)) + { + utf8_text.replace(0,3,""); + } + else + { + history_echo += ": "; + } + history_echo += utf8_text; + addHistoryLine(history_echo); } - history_echo += utf8_text; - addHistoryLine(history_echo); } gViewerStats->incStat(LLViewerStats::ST_IM_COUNT); @@ -710,6 +842,31 @@ void LLFloaterIMPanel::sendMsg() mSentTypingState = TRUE; } +void LLFloaterIMPanel::sessionInitReplyReceived(const LLUUID& session_id) +{ + mSessionUUID = session_id; + mSessionInitialized = TRUE; + + //we assume the history editor hasn't moved at all since + //we added the starting session message + //so, we count how many characters to remove + S32 chars_to_remove = mHistoryEditor->getText().length() - + mSessionStartMsgPos; + mHistoryEditor->removeTextFromEnd(chars_to_remove); + + //and now, send the queued msg + LLSD::array_iterator iter; + for ( iter = mQueuedMsgsForInit.beginArray(); + iter != mQueuedMsgsForInit.endArray(); + ++iter) + { + deliver_message(iter->asString(), + mSessionUUID, + mOtherParticipantUUID, + mDialog); + } +} + void LLFloaterIMPanel::setTyping(BOOL typing) { diff --git a/linden/indra/newview/llimpanel.h b/linden/indra/newview/llimpanel.h index 877fd88..e760513 100644 --- a/linden/indra/newview/llimpanel.h +++ b/linden/indra/newview/llimpanel.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -46,10 +47,20 @@ public: // the default. For example, if you open a session though a // calling card, a new session id will be generated, but the // target_id will be the agent referenced by the calling card. - LLFloaterIMPanel(const std::string& name, const LLRect& rect, - const std::string& session_label, - const LLUUID& session_id, const LLUUID& target_id, - EInstantMessage dialog); + LLFloaterIMPanel(const std::string& name, + const LLRect& rect, + const std::string& session_label, + const LLUUID& session_id, + const LLUUID& target_id, + EInstantMessage dialog); + LLFloaterIMPanel(const std::string& name, + const LLRect& rect, + const std::string& session_label, + const LLUUID& session_id, + const LLUUID& target_id, + const LLDynamicArray& ids, + EInstantMessage dialog); + /*virtual*/ BOOL postBuild(); @@ -78,21 +89,21 @@ public: LLString& tooltip_msg); static void onInputEditorFocusReceived( LLUICtrl* caller, void* userdata ); - static void onInputEditorFocusLost(LLLineEditor* caller, void* userdata); + static void onInputEditorFocusLost(LLUICtrl* caller, void* userdata); static void onInputEditorKeystroke(LLLineEditor* caller, void* userdata); static void onTabClick( void* userdata ); static void onClickProfile( void* userdata ); // Profile button pressed static void onClickClose( void* userdata ); - //const LLUUID& getItemUUID() const { return mItemUUID; } const LLUUID& getSessionID() const { return mSessionUUID; } const LLUUID& getOtherParticipantID() const { return mOtherParticipantUUID; } // HACK -- for enabling a teleport button for helpers static void onTeleport(void* userdata); - void addTeleportButton(const LLUUID& lure_id); - void removeTeleportButton(); + void addTeleportButton(); + + void sessionInitReplyReceived(const LLUUID& im_session_id); // Handle other participant in the session typing. void processIMTyping(const LLIMInfo* im_info, BOOL typing); @@ -100,7 +111,7 @@ public: private: // called by constructors - void init(); + void init(const LLString& session_label); // Called by UI methods. void sendMsg(); @@ -129,7 +140,6 @@ private: private: LLLineEditor* mInputEditor; LLViewerTextEditor* mHistoryEditor; - std::string mSessionLabel; // The value of the mSessionUUID depends on how the IM session was started: // one-on-one ==> random id @@ -138,15 +148,17 @@ private: // 911 ==> Gaurdian_Angel_Group_ID ^ gAgent.getID() LLUUID mSessionUUID; + BOOL mSessionInitRequested; + BOOL mSessionInitialized; + LLSD mQueuedMsgsForInit; + // The value mOtherParticipantUUID depends on how the IM session was started: // one-on-one = recipient's id // group ==> group_id // inventory folder ==> first target id in list // 911 ==> sender LLUUID mOtherParticipantUUID; - - // the lure ID for help IM sessions - LLUUID mLureID; + LLDynamicArray mSessionInitialTargetIDs; EInstantMessage mDialog; @@ -158,6 +170,8 @@ private: // Where does the "User is typing..." line start? S32 mTypingLineStartIndex; + //Where does the "Starting session..." line start? + S32 mSessionStartMsgPos; BOOL mSentTypingState; @@ -168,6 +182,8 @@ private: // Timer to detect when user has stopped typing. LLFrameTimer mLastKeystrokeTimer; + + void disableWhileSessionStarting(); }; diff --git a/linden/indra/newview/llimview.cpp b/linden/indra/newview/llimview.cpp index a4fd729..38471ad 100644 --- a/linden/indra/newview/llimview.cpp +++ b/linden/indra/newview/llimview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -42,6 +43,7 @@ #include "llviewerwindow.h" #include "llresmgr.h" #include "llfloaternewim.h" +#include "llhttpnode.h" #include "llimpanel.h" #include "llresizebar.h" #include "lltabcontainer.h" @@ -54,7 +56,6 @@ #include "llcallingcard.h" #include "lltoolbar.h" -const EInstantMessage EVERYONE_DIALOG = IM_NOTHING_SPECIAL; const EInstantMessage GROUP_DIALOG = IM_SESSION_GROUP_START; const EInstantMessage DEFAULT_DIALOG = IM_NOTHING_SPECIAL; @@ -69,6 +70,9 @@ LLIMView* gIMView = NULL; static LLString sOnlyUserMessage; static LLString sOfflineMessage; +static std::map sEventStringsMap; +static std::map sErrorStringsMap; +static std::map sForceCloseSessionMap; // // Helper Functions // @@ -82,7 +86,8 @@ static BOOL group_dictionary_sort( LLGroupData* a, LLGroupData* b ) // the other_participant_id is either an agent_id, a group_id, or an inventory // folder item_id (collection of calling cards) -static LLUUID compute_session_id(EInstantMessage dialog, const LLUUID& other_participant_id) +static LLUUID compute_session_id(EInstantMessage dialog, + const LLUUID& other_participant_id) { LLUUID session_id; if (IM_SESSION_GROUP_START == dialog) @@ -90,6 +95,10 @@ static LLUUID compute_session_id(EInstantMessage dialog, const LLUUID& other_par // slam group session_id to the group_id (other_participant_id) session_id = other_participant_id; } + else if (IM_SESSION_CONFERENCE_START == dialog) + { + session_id.generate(); + } else { LLUUID agent_id = gAgent.getID(); @@ -121,11 +130,34 @@ BOOL LLFloaterIM::postBuild() { requires("only_user_message", WIDGET_TYPE_TEXT_BOX); requires("offline_message", WIDGET_TYPE_TEXT_BOX); + requires("generic_request_error", WIDGET_TYPE_TEXT_BOX); + requires("insufficient_perms_error", WIDGET_TYPE_TEXT_BOX); + requires("generic_request_error", WIDGET_TYPE_TEXT_BOX); + requires("add_session_event", WIDGET_TYPE_TEXT_BOX); + requires("message_session_event", WIDGET_TYPE_TEXT_BOX); + requires("removed_from_group", WIDGET_TYPE_TEXT_BOX); if (checkRequirements()) { sOnlyUserMessage = childGetText("only_user_message"); sOfflineMessage = childGetText("offline_message"); + + sErrorStringsMap["generic"] = + childGetText("generic_request_error"); + sErrorStringsMap["unverified"] = + childGetText("insufficient_perms_error"); + sErrorStringsMap["no_user_911"] = + childGetText("user_no_help"); + + sEventStringsMap["add"] = childGetText("add_session_event");; + sEventStringsMap["message"] = + childGetText("message_session_event");; + sEventStringsMap["teleport"] = + childGetText("teleport_session_event");; + + sForceCloseSessionMap["removed"] = + childGetText("removed_from_group"); + return TRUE; } return FALSE; @@ -209,16 +241,12 @@ protected: // static EInstantMessage LLIMView::defaultIMTypeForAgent(const LLUUID& agent_id) { - EInstantMessage type = IM_SESSION_CARDLESS_START; + EInstantMessage type = IM_NOTHING_SPECIAL; if(is_agent_friend(agent_id)) { if(LLAvatarTracker::instance().isBuddyOnline(agent_id)) { - type = IM_SESSION_ADD; - } - else - { - type = IM_SESSION_OFFLINE_ADD; + type = IM_SESSION_CONFERENCE_START; } } return type; @@ -426,18 +454,25 @@ BOOL LLIMView::isIMSessionOpen(const LLUUID& uuid) // exists, it is brought forward. Specifying id = NULL results in an // im session to everyone. Returns the uuid of the session. LLUUID LLIMView::addSession(const std::string& name, - EInstantMessage dialog, - const LLUUID& other_participant_id) + EInstantMessage dialog, + const LLUUID& other_participant_id) { LLUUID session_id = compute_session_id(dialog, other_participant_id); + LLFloaterIMPanel* floater = findFloaterBySession(session_id); if(!floater) { - floater = createFloater(session_id, other_participant_id, name, dialog, TRUE); LLDynamicArray ids; ids.put(other_participant_id); + + floater = createFloater(session_id, + other_participant_id, + name, + ids, + dialog, + TRUE); + noteOfflineUsers(floater, ids); - floater->addParticipants(ids); mTalkFloater->showFloater(floater); } else @@ -452,30 +487,30 @@ LLUUID LLIMView::addSession(const std::string& name, // Adds a session using the given session_id. If the session already exists // the dialog type is assumed correct. Returns the uuid of the session. LLUUID LLIMView::addSession(const std::string& name, - EInstantMessage dialog, - const LLUUID& session_id, - const LLDynamicArray& ids) + EInstantMessage dialog, + const LLUUID& other_participant_id, + const LLDynamicArray& ids) { if (0 == ids.getLength()) { return LLUUID::null; } - LLUUID other_participant_id = ids[0]; - LLUUID new_session_id = session_id; - if (new_session_id.isNull()) - { - new_session_id = compute_session_id(dialog, other_participant_id); - } + LLUUID session_id = compute_session_id(dialog, + other_participant_id); - LLFloaterIMPanel* floater = findFloaterBySession(new_session_id); + LLFloaterIMPanel* floater = findFloaterBySession(session_id); if(!floater) { // On creation, use the first element of ids as the "other_participant_id" - floater = createFloater(new_session_id, other_participant_id, name, dialog, TRUE); + floater = createFloater(session_id, + other_participant_id, + name, + ids, + dialog, + TRUE); noteOfflineUsers(floater, ids); } - floater->addParticipants(ids); mTalkFloater->showFloater(floater); //mTabContainer->selectTabPanel(panel); floater->setInputFocus(TRUE); @@ -518,8 +553,7 @@ void LLIMView::refresh() group; group = group_list.getNextData()) { - mNewIMFloater->addTarget(group->mID, group->mName, - (void*)(&GROUP_DIALOG), TRUE, FALSE); + mNewIMFloater->addGroup(group->mID, (void*)(&GROUP_DIALOG), TRUE, FALSE); } // build a set of buddies in the current buddy list. @@ -539,13 +573,6 @@ void LLIMView::refresh() { mNewIMFloater->addAgent((*it).second, (void*)(&DEFAULT_DIALOG), FALSE); } - - if(gAgent.isGodlike()) - { - // XUI:translate - mNewIMFloater->addTarget(LLUUID::null, "All Residents, All Grids", - (void*)(&EVERYONE_DIALOG), TRUE, FALSE); - } mNewIMFloater->setScrollPos( old_scroll_pos ); } @@ -619,12 +646,17 @@ void LLIMView::disconnectAllSessions() std::set::iterator handle_it; for(handle_it = mFloaters.begin(); handle_it != mFloaters.end(); - ++handle_it) + ) { floater = (LLFloaterIMPanel*)LLFloater::getFloaterByHandle(*handle_it); + + // MUST do this BEFORE calling floater->onClose() because that may remove the item from the set, causing the subsequent increment to crash. + ++handle_it; + if (floater) { floater->setEnabled(FALSE); + floater->onClose(TRUE); } } } @@ -662,11 +694,12 @@ BOOL LLIMView::hasSession(const LLUUID& session_id) // consistency. Returns the pointer, caller (the class instance since // it is a private method) is not responsible for deleting the // pointer. Add the floater to this but do not select it. -LLFloaterIMPanel* LLIMView::createFloater(const LLUUID& session_id, - const LLUUID& other_participant_id, - const std::string& session_label, - EInstantMessage dialog, - BOOL user_initiated) +LLFloaterIMPanel* LLIMView::createFloater( + const LLUUID& session_id, + const LLUUID& other_participant_id, + const std::string& session_label, + EInstantMessage dialog, + BOOL user_initiated) { if (session_id.isNull()) { @@ -686,6 +719,33 @@ LLFloaterIMPanel* LLIMView::createFloater(const LLUUID& session_id, return floater; } +LLFloaterIMPanel* LLIMView::createFloater( + const LLUUID& session_id, + const LLUUID& other_participant_id, + const std::string& session_label, + const LLDynamicArray& ids, + EInstantMessage dialog, + BOOL user_initiated) +{ + if (session_id.isNull()) + { + llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl; + } + llinfos << "LLIMView::createFloater: from " << other_participant_id + << " in session " << session_id << llendl; + LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label, + LLRect(), + session_label, + session_id, + other_participant_id, + ids, + dialog); + LLTabContainerCommon::eInsertionPoint i_pt = user_initiated ? LLTabContainerCommon::RIGHT_OF_CURRENT : LLTabContainerCommon::END; + mTalkFloater->addFloater(floater, FALSE, i_pt); + mFloaters.insert(floater->getHandle()); + return floater; +} + void LLIMView::noteOfflineUsers(LLFloaterIMPanel* floater, const LLDynamicArray& ids) { @@ -734,3 +794,159 @@ void LLIMView::processIMTypingCore(const LLIMInfo* im_info, BOOL typing) floater->processIMTyping(im_info, typing); } } + +void LLIMView::updateFloaterSessionID(const LLUUID& old_session_id, + const LLUUID& new_session_id) +{ + LLFloaterIMPanel* floater = findFloaterBySession(old_session_id); + if (floater) + { + floater->sessionInitReplyReceived(new_session_id); + } +} + +void onConfirmForceCloseError(S32 option, void* data) +{ + //only 1 option really + LLFloaterIMPanel* floater = ((LLFloaterIMPanel*) data); + + if ( floater ) floater->onClose(FALSE); +} + +class LLViewerIMSessionStartReply : public LLHTTPNode +{ +public: + virtual void describe(Description& desc) const + { + desc.shortInfo("Used for receiving a reply to a request to initialize an IM session"); + desc.postAPI(); + desc.input( + "{\"client_session_id\": UUID, \"session_id\": UUID, \"success\" boolean, \"reason\": string"); + desc.source(__FILE__, __LINE__); + } + + virtual void post(ResponsePtr response, + const LLSD& context, + const LLSD& input) const + { + LLSD body; + LLUUID temp_session_id; + LLUUID session_id; + bool success; + + body = input["body"]; + success = body["success"].asBoolean(); + temp_session_id = body["temp_session_id"].asUUID(); + + if ( success ) + { + session_id = body["session_id"].asUUID(); + gIMView->updateFloaterSessionID(temp_session_id, + session_id); + } + else + { + //throw an error dialog and close the temp session's + //floater + LLFloaterIMPanel* floater = + gIMView->findFloaterBySession(temp_session_id); + if (floater) + { + LLString::format_map_t args; + args["[REASON]"] = + sErrorStringsMap[body["error"].asString()]; + args["[RECIPIENT]"] = floater->getTitle(); + + gViewerWindow->alertXml("IMSessionStartError", + args, + onConfirmForceCloseError, + floater); + + } + } + } +}; + +class LLViewerIMSessionEventReply : public LLHTTPNode +{ + public: + virtual void describe(Description& desc) const + { + desc.shortInfo("Used for receiving a reply to a IM session event"); + desc.postAPI(); + desc.input( + "{\"event\": string, \"reason\": string, \"success\": boolean, \"session_id\": UUID"); + desc.source(__FILE__, __LINE__); + } + + virtual void post(ResponsePtr response, + const LLSD& context, + const LLSD& input) const + { + LLUUID session_id; + bool success; + + LLSD body = input["body"]; + success = body["success"].asBoolean(); + session_id = body["session_id"].asUUID(); + + if ( !success ) + { + //throw an error dialog + LLFloaterIMPanel* floater = + gIMView->findFloaterBySession(session_id); + if (floater) + { + LLString::format_map_t args; + args["[REASON]"] = + sErrorStringsMap[body["error"].asString()]; + args["[EVENT]"] = + sEventStringsMap[body["event"].asString()]; + args["[RECIPIENT]"] = floater->getTitle(); + + gViewerWindow->alertXml("IMSessionEventError", + args); + } + } + } +}; + +class LLViewerForceCloseIMSession: public LLHTTPNode +{ + + virtual void post(ResponsePtr response, + const LLSD& context, + const LLSD& input) const + { + LLUUID session_id; + LLString reason; + + session_id = input["body"]["session_id"].asUUID(); + reason = input["body"]["reason"].asString(); + + LLFloaterIMPanel* floater = + gIMView ->findFloaterBySession(session_id); + + if ( floater ) + { + LLString::format_map_t args; + + args["[NAME]"] = floater->getTitle(); + args["[REASON]"] = sForceCloseSessionMap[reason]; + + gViewerWindow->alertXml("ForceCloseIMSession", + args, + onConfirmForceCloseError, + floater); + } + } +}; + +LLHTTPRegistration + gHTTPRegistrationMessageImsessionstartreply("/message/IMSessionStartReply"); + +LLHTTPRegistration + gHTTPRegistrationMessageImsessioneventreply("/message/IMSessionEventReply"); + +LLHTTPRegistration + gHTTPRegistrationMessageForceCloseImSession("/message/ForceCloseIMSession"); diff --git a/linden/indra/newview/llimview.h b/linden/indra/newview/llimview.h index 9a0c462..74ea880 100644 --- a/linden/indra/newview/llimview.h +++ b/linden/indra/newview/llimview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -74,11 +75,11 @@ public: EInstantMessage dialog, const LLUUID& other_participant_id); - // Adds a session using the given session_id. If the session already exists + // Adds a session using a specific group of starting agents // the dialog type is assumed correct. Returns the uuid of the session. LLUUID addSession(const std::string& name, EInstantMessage dialog, - const LLUUID& session_id, + const LLUUID& other_participant_id, const LLDynamicArray& ids); // This removes the panel referenced by the uuid, and then @@ -86,6 +87,12 @@ public: // deleted. void removeSession(const LLUUID& session_id); + //Updates a given session's session IDs. Does not open, + //create or do anything new. If the old session doesn't + //exist, then nothing happens. + void updateFloaterSessionID(const LLUUID& old_session_id, + const LLUUID& new_session_id); + void processIMTypingStart(const LLIMInfo* im_info); void processIMTypingStop(const LLIMInfo* im_info); @@ -129,8 +136,18 @@ private: // consistency. Returns the pointer, caller (the class instance // since it is a private method) is not responsible for deleting // the pointer. - LLFloaterIMPanel* createFloater(const LLUUID& session_id, const LLUUID& target_id, - const std::string& name, EInstantMessage dialog, BOOL user_initiated = FALSE); + LLFloaterIMPanel* createFloater(const LLUUID& session_id, + const LLUUID& target_id, + const std::string& name, + EInstantMessage dialog, + BOOL user_initiated = FALSE); + + LLFloaterIMPanel* createFloater(const LLUUID& session_id, + const LLUUID& target_id, + const std::string& name, + const LLDynamicArray& ids, + EInstantMessage dialog, + BOOL user_initiated = FALSE); // This simple method just iterates through all of the ids, and // prints a simple message if they are not online. Used to help diff --git a/linden/indra/newview/llinventoryactions.cpp b/linden/indra/newview/llinventoryactions.cpp index 756ba63..6452c87 100644 --- a/linden/indra/newview/llinventoryactions.cpp +++ b/linden/indra/newview/llinventoryactions.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -499,72 +500,104 @@ class LLBeginIMSession : public inventory_panel_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - LLString who = userdata.asString(); - bool only_online = false; - if ("everyone" == who) - { - only_online = false; - } - else // "online" - { - only_online = true; - } LLInventoryPanel *panel = mPtr; LLInventoryModel* model = panel->getModel(); if(!model) return true; std::set selected_items; panel->getRootFolder()->getSelectionList(selected_items); - LLUUID item = *selected_items.begin(); - LLFolderViewItem* folder_item = panel->getRootFolder()->getItemByID(item); - if(!folder_item) return true; - LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getListener(); - if(!bridge) return true; - LLViewerInventoryCategory* cat = bridge->getCategory(); - if(!cat) return true; - LLUniqueBuddyCollector is_buddy; - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - model->collectDescendentsIf(bridge->getUUID(), - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_buddy); - S32 count = item_array.count(); - if(count > 0) + + LLString name; + static int session_num = 1; + + LLDynamicArray members; + EInstantMessage type = IM_SESSION_CONFERENCE_START; + + std::set::const_iterator iter; + for (iter = selected_items.begin(); iter != selected_items.end(); iter++) { - // create the session - gIMView->setFloaterOpen(TRUE); - LLDynamicArray members; - //members.put(gAgent.getID()); - S32 i; - EInstantMessage type = IM_SESSION_ADD; - if(only_online) + + LLUUID item = *iter; + LLFolderViewItem* folder_item = panel->getRootFolder()->getItemByID(item); + + if(folder_item) { - LLAvatarTracker& at = LLAvatarTracker::instance(); - LLUUID id; - for(i = 0; i < count; ++i) + LLFolderViewEventListener* fve_listener = folder_item->getListener(); + if (fve_listener && (fve_listener->getInventoryType() == LLInventoryType::IT_CATEGORY)) { - id = item_array.get(i)->getCreatorUUID(); - if(at.isBuddyOnline(id)) + + LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getListener(); + if(!bridge) return true; + LLViewerInventoryCategory* cat = bridge->getCategory(); + if(!cat) return true; + name = cat->getName(); + LLUniqueBuddyCollector is_buddy; + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + model->collectDescendentsIf(bridge->getUUID(), + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_buddy); + S32 count = item_array.count(); + if(count > 0) { - members.put(id); + // create the session + gIMView->setFloaterOpen(TRUE); + S32 i; + + LLAvatarTracker& at = LLAvatarTracker::instance(); + LLUUID id; + for(i = 0; i < count; ++i) + { + id = item_array.get(i)->getCreatorUUID(); + if(at.isBuddyOnline(id)) + { + members.put(id); + } + } } } - } - else - { - type = IM_SESSION_OFFLINE_ADD; - for(i = 0; i < count; ++i) + else { - members.put(item_array.get(i)->getCreatorUUID()); - } + LLFolderViewItem* folder_item = panel->getRootFolder()->getItemByID(item); + if(!folder_item) return true; + LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener(); + + if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD) + { + LLInventoryItem* inv_item = gInventory.getItem(listenerp->getUUID()); + + if (inv_item) + { + LLAvatarTracker& at = LLAvatarTracker::instance(); + LLUUID id = inv_item->getCreatorUUID(); + + if(at.isBuddyOnline(id)) + { + members.put(id); + } + } + } //if IT_CALLINGCARD + } //if !IT_CATEGORY } - // the session_id is always the item_id of the inventory folder - gIMView->addSession(cat->getName(), - type, - bridge->getUUID(), - members); + } //for selected_items + + // the session_id is randomly generated UUID which will be replaced later + // with a server side generated number + + if (name.empty()) + { + char buffer [50]; + sprintf(buffer, "Session %d", session_num++); + name = buffer; } + + + gIMView->addSession(name, + type, + members[0], + members); + return true; } }; diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp index baf6638..05334d7 100644 --- a/linden/indra/newview/llinventorybridge.cpp +++ b/linden/indra/newview/llinventorybridge.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -122,6 +123,7 @@ const char* ICON_NAME[ICON_NAME_COUNT] = "inv_item_script.tga", "inv_item_clothing.tga", "inv_item_object.tga", + "inv_item_object_multi.tga", "inv_item_notecard.tga", "inv_item_bodypart.tga", "inv_item_snapshot.tga", @@ -837,7 +839,7 @@ LLString LLItemBridge::getLabelSuffix() const if(xfer) sxfer = EMPTY; else sxfer = NO_XFER; char buffer[MAX_STRING]; /*Flawfinder: ignore*/ - snprintf( /*Flawfinder: ignore*/ + snprintf( /* Flawfinder: ignore */ buffer, MAX_STRING, "%s%s%s", @@ -1742,7 +1744,7 @@ void LLFolderBridge::folderOptionsMenu() if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard)) { mItems.push_back("Calling Card Separator"); - mItems.push_back("IM Contacts In Folder"); + mItems.push_back("Conference Chat Folder"); mItems.push_back("IM All Contacts In Folder"); } @@ -2061,58 +2063,6 @@ void LLFolderBridge::createWearable(LLUUID parent_id, EWearableType type) LLPointer(NULL)); } -void LLFolderBridge::beginIMSession(BOOL only_online) -{ - LLInventoryModel* model = mInventoryPanel->getModel(); - if(!model) return; - LLViewerInventoryCategory* cat = getCategory(); - if(!cat) return; - LLUniqueBuddyCollector is_buddy; - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - model->collectDescendentsIf(mUUID, - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_buddy); - S32 count = item_array.count(); - if(count > 0) - { - // create the session - gIMView->setFloaterOpen(TRUE); - LLDynamicArray members; - //members.put(gAgent.getID()); - S32 i; - EInstantMessage type = IM_SESSION_ADD; - if(only_online) - { - LLAvatarTracker& at = LLAvatarTracker::instance(); - LLUUID id; - for(i = 0; i < count; ++i) - { - id = item_array.get(i)->getCreatorUUID(); - if(at.isBuddyOnline(id)) - { - members.put(id); - } - } - } - else - { - type = IM_SESSION_OFFLINE_ADD; - for(i = 0; i < count; ++i) - { - members.put(item_array.get(i)->getCreatorUUID()); - } - } - // the session_id is always the item_id of the inventory folder - gIMView->addSession(cat->getName(), - type, - mUUID, - members); - } -} - void LLFolderBridge::modifyOutfit(BOOL append) { LLInventoryModel* model = mInventoryPanel->getModel(); @@ -2332,7 +2282,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, LLViewerImage* LLScriptBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0); + return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); } // +=================================================+ @@ -2344,7 +2294,7 @@ LLString LLTextureBridge::sPrefix("Texture: "); LLViewerImage* LLTextureBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_TEXTURE, mInvType, 0); + return get_item_icon(LLAssetType::AT_TEXTURE, mInvType, 0, FALSE); } void open_texture(const LLUUID& item_id, @@ -2394,7 +2344,7 @@ LLString LLSoundBridge::sPrefix("Sound: "); LLViewerImage* LLSoundBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0); + return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE); } void LLSoundBridge::openItem() @@ -2489,7 +2439,7 @@ LLString LLLandmarkBridge::sPrefix("Landmark: "); LLViewerImage* LLLandmarkBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, mVisited); + return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, mVisited, FALSE); } void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags) @@ -2650,7 +2600,7 @@ LLViewerImage* LLCallingCardBridge::getIcon() const { online = LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()); } - return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, online); + return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, online, FALSE); } LLString LLCallingCardBridge::getLabelSuffix() const @@ -2707,11 +2657,13 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags) items.push_back("Send Instant Message"); items.push_back("Offer Teleport..."); + items.push_back("Conference Chat"); if (!good_card) { disabled_items.push_back("Send Instant Message"); disabled_items.push_back("Offer Teleport..."); + disabled_items.push_back("Conference Chat"); } } hideContextEntries(menu, items, disabled_items); @@ -2798,7 +2750,7 @@ LLString LLNotecardBridge::sPrefix("Note: "); LLViewerImage* LLNotecardBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0); + return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE); } void open_notecard(const LLUUID& item_id, @@ -2870,7 +2822,7 @@ LLString LLGestureBridge::sPrefix("Gesture: "); LLViewerImage* LLGestureBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0); + return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE); } LLFontGL::StyleFlags LLGestureBridge::getLabelStyle() const @@ -3003,7 +2955,7 @@ LLString LLAnimationBridge::sPrefix("Animation: "); LLViewerImage* LLAnimationBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0); + return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE); } void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags) @@ -3121,7 +3073,7 @@ BOOL LLObjectBridge::isItemRemovable() LLViewerImage* LLObjectBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_OBJECT, mInvType, mAttachPt); + return get_item_icon(LLAssetType::AT_OBJECT, mInvType, mAttachPt, mIsMultiObject ); } void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment); @@ -3376,7 +3328,7 @@ LLString LLLSLTextBridge::sPrefix("Script: "); LLViewerImage* LLLSLTextBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0); + return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); } void LLLSLTextBridge::openItem() @@ -4139,7 +4091,7 @@ LLString LLWearableBridge::getLabelSuffix() const LLViewerImage* LLWearableBridge::getIcon() const { - return get_item_icon(mAssetType, mInvType, mWearableType); + return get_item_icon(mAssetType, mInvType, mWearableType, FALSE); } // virtual diff --git a/linden/indra/newview/llinventorybridge.h b/linden/indra/newview/llinventorybridge.h index 2d2288f..1269fa2 100755 --- a/linden/indra/newview/llinventorybridge.h +++ b/linden/indra/newview/llinventorybridge.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -41,6 +42,7 @@ enum EInventoryIcon SCRIPT_ICON_NAME, CLOTHING_ICON_NAME, OBJECT_ICON_NAME, + OBJECT_MULTI_ICON_NAME, NOTECARD_ICON_NAME, BODYPART_ICON_NAME, SNAPSHOT_ICON_NAME, @@ -314,7 +316,6 @@ protected: BOOL checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& typeToCheck); - void beginIMSession(BOOL only_online); void modifyOutfit(BOOL append); public: static LLFolderBridge* sSelf; @@ -528,6 +529,8 @@ protected: LLItemBridge(inventory, uuid), mInvType(type) { mAttachPt = (flags & 0xff); // low bye of inventory flags + + mIsMultiObject = ( flags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ? TRUE: FALSE; } protected: @@ -535,7 +538,7 @@ protected: static LLUUID sContextMenuItemID; // Only valid while the context menu is open. LLInventoryType::EType mInvType; U32 mAttachPt; - + BOOL mIsMultiObject; }; diff --git a/linden/indra/newview/llinventoryclipboard.cpp b/linden/indra/newview/llinventoryclipboard.cpp index fb16912..da067ad 100644 --- a/linden/indra/newview/llinventoryclipboard.cpp +++ b/linden/indra/newview/llinventoryclipboard.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llinventoryclipboard.h b/linden/indra/newview/llinventoryclipboard.h index 3b762f2..e706269 100644 --- a/linden/indra/newview/llinventoryclipboard.h +++ b/linden/indra/newview/llinventoryclipboard.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llinventorymodel.cpp b/linden/indra/newview/llinventorymodel.cpp index e35f71b..ddd229b 100644 --- a/linden/indra/newview/llinventorymodel.cpp +++ b/linden/indra/newview/llinventorymodel.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -1155,7 +1156,7 @@ void LLInventoryModel::cache( char inventory_filename[LL_MAX_PATH]; /*Flawfinder: ignore*/ agent_id.toString(agent_id_str); std::string path(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, agent_id_str)); - snprintf( /*Flawfinder: ignore*/ + snprintf( /* Flawfinder: ignore */ inventory_filename, LL_MAX_PATH, CACHE_FORMAT_STRING, @@ -1444,7 +1445,7 @@ bool LLInventoryModel::loadSkeleton( owner_id.toString(owner_id_str); std::string path(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, owner_id_str)); char inventory_filename[LL_MAX_PATH]; /*Flawfinder: ignore*/ - snprintf( /*Flawfinder: ignore*/ + snprintf( /* Flawfinder: ignore */ inventory_filename, LL_MAX_PATH, CACHE_FORMAT_STRING, @@ -1842,7 +1843,7 @@ void LLInventoryModel::buildParentChildMap() msg->addUUIDFast(_PREHASH_ItemID, (*it)); msg->addUUIDFast(_PREHASH_FolderID, lnf); msg->addString("NewName", NULL); - if(msg->mCurrentSendTotal >= MTUBYTES) + if(msg->isSendFull(NULL)) { start_new_message = TRUE; gAgent.sendReliableMessage(); @@ -3201,7 +3202,7 @@ void LLInventoryFetchObserver::fetchItems( msg->nextBlockFast(_PREHASH_InventoryData); msg->addUUIDFast(_PREHASH_OwnerID, owner_id); msg->addUUIDFast(_PREHASH_ItemID, (*it)); - if(msg->getCurrentSendTotal() >= MTUBYTES) + if(msg->isSendFull(NULL)) { start_new_message = TRUE; gAgent.sendReliableMessage(); diff --git a/linden/indra/newview/llinventorymodel.h b/linden/indra/newview/llinventorymodel.h index d0eb2de..9867842 100644 --- a/linden/indra/newview/llinventorymodel.h +++ b/linden/indra/newview/llinventorymodel.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llinventoryview.cpp b/linden/indra/newview/llinventoryview.cpp index 162cf9f..900b145 100644 --- a/linden/indra/newview/llinventoryview.cpp +++ b/linden/indra/newview/llinventoryview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -942,9 +943,15 @@ void LLInventoryView::onFilterSelected(void* userdata, bool from_click) LLUUID get_item_icon_uuid(LLAssetType::EType asset_type, LLInventoryType::EType inventory_type, - U32 flags) + U32 attachment_point, + BOOL item_is_multi ) { EInventoryIcon idx = OBJECT_ICON_NAME; + if ( item_is_multi ) + { + idx = OBJECT_MULTI_ICON_NAME; + } + switch(asset_type) { case LLAssetType::AT_TEXTURE: @@ -957,11 +964,12 @@ LLUUID get_item_icon_uuid(LLAssetType::EType asset_type, idx = TEXTURE_ICON_NAME; } break; + case LLAssetType::AT_SOUND: idx = SOUND_ICON_NAME; break; case LLAssetType::AT_CALLINGCARD: - if(flags != 0) + if(attachment_point!= 0) { idx = CALLINGCARD_ONLINE_ICON_NAME; } @@ -971,7 +979,7 @@ LLUUID get_item_icon_uuid(LLAssetType::EType asset_type, } break; case LLAssetType::AT_LANDMARK: - if(flags != 0) + if(attachment_point!= 0) { idx = LANDMARK_VISITED_ICON_NAME; } @@ -992,7 +1000,7 @@ LLUUID get_item_icon_uuid(LLAssetType::EType asset_type, { idx = BODYPART_ICON_NAME; } - switch(flags) + switch(attachment_point) { case WT_SHAPE: idx = BODYPART_SHAPE_ICON_NAME; @@ -1056,9 +1064,10 @@ LLUUID get_item_icon_uuid(LLAssetType::EType asset_type, LLViewerImage* get_item_icon(LLAssetType::EType asset_type, LLInventoryType::EType inventory_type, - U32 flags) + U32 attachment_point, + BOOL item_is_multi) { - LLUUID icon_uuid = get_item_icon_uuid(asset_type, inventory_type, flags); + LLUUID icon_uuid = get_item_icon_uuid(asset_type, inventory_type, attachment_point, item_is_multi ); LLViewerImage* imagep = gImageList.getImage(icon_uuid, MIPMAP_FALSE, TRUE); imagep->setClamp(TRUE, TRUE); return imagep; diff --git a/linden/indra/newview/llinventoryview.h b/linden/indra/newview/llinventoryview.h index 78fa362..7b29864 100644 --- a/linden/indra/newview/llinventoryview.h +++ b/linden/indra/newview/llinventoryview.h @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -334,11 +335,13 @@ void open_texture(const LLUUID& item_id, const LLString& title, BOOL show_keep_d LLUUID get_item_icon_uuid(LLAssetType::EType asset_type, LLInventoryType::EType inventory_type, - U32 flags); + U32 attachment_point, + BOOL item_is_multi ); LLViewerImage* get_item_icon(LLAssetType::EType asset_type, LLInventoryType::EType inventory_type, - U32 flags); + U32 attachment_point, + BOOL item_is_multi ); // Move items from an in-world object's "Contents" folder to a specified // folder in agent inventory. diff --git a/linden/indra/newview/lljoystickbutton.cpp b/linden/indra/newview/lljoystickbutton.cpp index a280ca8..6e62627 100644 --- a/linden/indra/newview/lljoystickbutton.cpp +++ b/linden/indra/newview/lljoystickbutton.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -134,7 +135,7 @@ BOOL LLJoystick::handleMouseUp(S32 x, S32 y, MASK mask) { // llinfos << "joystick mouse up " << x << ", " << y << llendl; - if( gViewerWindow->hasMouseCapture( this ) ) + if( hasMouseCapture() ) { mLastMouse.set(x, y); mHeldDown = FALSE; @@ -147,7 +148,7 @@ BOOL LLJoystick::handleMouseUp(S32 x, S32 y, MASK mask) BOOL LLJoystick::handleHover(S32 x, S32 y, MASK mask) { - if( gViewerWindow->hasMouseCapture( this ) ) + if( hasMouseCapture() ) { mLastMouse.set(x, y); } @@ -172,7 +173,9 @@ void LLJoystick::onHeldDown(void *userdata) { LLJoystick *self = (LLJoystick *)userdata; - llassert( gViewerWindow->hasMouseCapture( self ) ); + // somebody removed this function without checking the + // build. Removed 2007-03-26. + //llassert( gViewerWindow->hasMouseCapture( self ) ); self->mHeldDown = TRUE; self->onHeldDown(); diff --git a/linden/indra/newview/lljoystickbutton.h b/linden/indra/newview/lljoystickbutton.h index 69baa32..e947559 100644 --- a/linden/indra/newview/lljoystickbutton.h +++ b/linden/indra/newview/lljoystickbutton.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lllandmarklist.cpp b/linden/indra/newview/lllandmarklist.cpp index f17a73b..a0ad1ce 100644 --- a/linden/indra/newview/lllandmarklist.cpp +++ b/linden/indra/newview/lllandmarklist.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lllandmarklist.h b/linden/indra/newview/lllandmarklist.h index 892dec1..50ccfb6 100644 --- a/linden/indra/newview/lllandmarklist.h +++ b/linden/indra/newview/lllandmarklist.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lllightconstants.h b/linden/indra/newview/lllightconstants.h index fe4ba9d..5926229 100644 --- a/linden/indra/newview/lllightconstants.h +++ b/linden/indra/newview/lllightconstants.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lllocalanimationobject.cpp b/linden/indra/newview/lllocalanimationobject.cpp index b7cccae..c77b1ed 100644 --- a/linden/indra/newview/lllocalanimationobject.cpp +++ b/linden/indra/newview/lllocalanimationobject.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lllocalanimationobject.h b/linden/indra/newview/lllocalanimationobject.h index 51d870f..b834400 100644 --- a/linden/indra/newview/lllocalanimationobject.h +++ b/linden/indra/newview/lllocalanimationobject.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lllogchat.cpp b/linden/indra/newview/lllogchat.cpp index 6be5ee1..aaa19ea 100644 --- a/linden/indra/newview/lllogchat.cpp +++ b/linden/indra/newview/lllogchat.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lllogchat.h b/linden/indra/newview/lllogchat.h index 6164279..56ea04b 100644 --- a/linden/indra/newview/lllogchat.h +++ b/linden/indra/newview/lllogchat.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmanip.cpp b/linden/indra/newview/llmanip.cpp index a1ff7c3..1db0a6c 100644 --- a/linden/indra/newview/llmanip.cpp +++ b/linden/indra/newview/llmanip.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -454,25 +455,25 @@ void LLManip::renderXYZ(const LLVector3 &vec) LLGLDepthTest gls_depth(GL_FALSE); LLGLEnable tex(GL_TEXTURE_2D); // render drop shadowed text - snprintf(feedback_string, sizeof(feedback_string), "X: %.3f", vec.mV[VX]); /*Flawfinder: ignore*/ + snprintf(feedback_string, sizeof(feedback_string), "X: %.3f", vec.mV[VX]); /* Flawfinder: ignore */ hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *gResMgr->getRes( LLFONT_SANSSERIF ), LLFontGL::NORMAL, -102.f + 1.f, (F32)vertical_offset - 1.f, LLColor4::black, FALSE); - snprintf(feedback_string, sizeof(feedback_string), "Y: %.3f", vec.mV[VY]); /*Flawfinder: ignore*/ + snprintf(feedback_string, sizeof(feedback_string), "Y: %.3f", vec.mV[VY]); /* Flawfinder: ignore */ hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *gResMgr->getRes( LLFONT_SANSSERIF ), LLFontGL::NORMAL, -27.f + 1.f, (F32)vertical_offset - 1.f, LLColor4::black, FALSE); - snprintf(feedback_string, sizeof(feedback_string), "Z: %.3f", vec.mV[VZ]); /*Flawfinder: ignore*/ + snprintf(feedback_string, sizeof(feedback_string), "Z: %.3f", vec.mV[VZ]); /* Flawfinder: ignore */ hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *gResMgr->getRes( LLFONT_SANSSERIF ), LLFontGL::NORMAL, 48.f + 1.f, (F32)vertical_offset - 1.f, LLColor4::black, FALSE); // render text on top - snprintf(feedback_string, sizeof(feedback_string), "X: %.3f", vec.mV[VX]); /*Flawfinder: ignore*/ + snprintf(feedback_string, sizeof(feedback_string), "X: %.3f", vec.mV[VX]); /* Flawfinder: ignore */ hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *gResMgr->getRes( LLFONT_SANSSERIF ), LLFontGL::NORMAL, -102.f, (F32)vertical_offset, LLColor4(1.f, 0.5f, 0.5f, 1.f), FALSE); glColor3f(0.5f, 1.f, 0.5f); - snprintf(feedback_string, sizeof(feedback_string), "Y: %.3f", vec.mV[VY]); /*Flawfinder: ignore*/ + snprintf(feedback_string, sizeof(feedback_string), "Y: %.3f", vec.mV[VY]); /* Flawfinder: ignore */ hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *gResMgr->getRes( LLFONT_SANSSERIF ), LLFontGL::NORMAL, -27.f, (F32)vertical_offset, LLColor4(0.5f, 1.f, 0.5f, 1.f), FALSE); glColor3f(0.5f, 0.5f, 1.f); - snprintf(feedback_string, sizeof(feedback_string), "Z: %.3f", vec.mV[VZ]); /*Flawfinder: ignore*/ + snprintf(feedback_string, sizeof(feedback_string), "Z: %.3f", vec.mV[VZ]); /* Flawfinder: ignore */ hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *gResMgr->getRes( LLFONT_SANSSERIF ), LLFontGL::NORMAL, 48.f, (F32)vertical_offset, LLColor4(0.5f, 0.5f, 1.f, 1.f), FALSE); } } @@ -521,22 +522,22 @@ void LLManip::renderTickValue(const LLVector3& pos, F32 value, const char* suffi { if (fractional_portion == 0) { - snprintf(val_string, sizeof(val_string), "-%d%s", lltrunc(llabs(val_to_print)), suffix); /*Flawfinder: ignore*/ + snprintf(val_string, sizeof(val_string), "-%d%s", lltrunc(llabs(val_to_print)), suffix); /* Flawfinder: ignore */ } else { - snprintf(val_string, sizeof(val_string), "-%d", lltrunc(llabs(val_to_print))); /*Flawfinder: ignore*/ + snprintf(val_string, sizeof(val_string), "-%d", lltrunc(llabs(val_to_print))); /* Flawfinder: ignore */ } } else { if (fractional_portion == 0) { - snprintf(val_string, sizeof(val_string), "%d%s", lltrunc(llabs(val_to_print)), suffix); /*Flawfinder: ignore*/ + snprintf(val_string, sizeof(val_string), "%d%s", lltrunc(llabs(val_to_print)), suffix); /* Flawfinder: ignore */ } else { - snprintf(val_string, sizeof(val_string), "%d", lltrunc(val_to_print)); /*Flawfinder: ignore*/ + snprintf(val_string, sizeof(val_string), "%d", lltrunc(val_to_print)); /* Flawfinder: ignore */ } } @@ -559,7 +560,7 @@ void LLManip::renderTickValue(const LLVector3& pos, F32 value, const char* suffi LLGLEnable tex(GL_TEXTURE_2D); if (fractional_portion != 0) { - snprintf(fraction_string, sizeof(fraction_string), "%c%d%s", gResMgr->getDecimalPoint(), fractional_portion, suffix); /*Flawfinder: ignore*/ + snprintf(fraction_string, sizeof(fraction_string), "%c%d%s", gResMgr->getDecimalPoint(), fractional_portion, suffix); /* Flawfinder: ignore */ gViewerWindow->setupViewport(1, -1); hud_render_utf8text(val_string, render_pos, *big_fontp, LLFontGL::NORMAL, -1.f * big_fontp->getWidthF32(val_string), 3.f, shadow_color, hud_selection); diff --git a/linden/indra/newview/llmanip.h b/linden/indra/newview/llmanip.h index 7f83ae2..2b1e836 100644 --- a/linden/indra/newview/llmanip.h +++ b/linden/indra/newview/llmanip.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmaniprotate.cpp b/linden/indra/newview/llmaniprotate.cpp index 452e4d4..aaab416 100644 --- a/linden/indra/newview/llmaniprotate.cpp +++ b/linden/indra/newview/llmaniprotate.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmaniprotate.h b/linden/indra/newview/llmaniprotate.h index fb51643..80ff488 100644 --- a/linden/indra/newview/llmaniprotate.h +++ b/linden/indra/newview/llmaniprotate.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmanipscale.cpp b/linden/indra/newview/llmanipscale.cpp index d520fbe..c153339 100644 --- a/linden/indra/newview/llmanipscale.cpp +++ b/linden/indra/newview/llmanipscale.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmanipscale.h b/linden/indra/newview/llmanipscale.h index 2452e6b..40c8a53 100644 --- a/linden/indra/newview/llmanipscale.h +++ b/linden/indra/newview/llmanipscale.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmaniptranslate.cpp b/linden/indra/newview/llmaniptranslate.cpp index bb58a9c..0bdfbb3 100644 --- a/linden/indra/newview/llmaniptranslate.cpp +++ b/linden/indra/newview/llmaniptranslate.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -1697,7 +1698,7 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal, LLPipeline::toggleRenderType(LLPipeline::RENDER_TYPE_CLOUDS); } - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); } glPushMatrix(); diff --git a/linden/indra/newview/llmaniptranslate.h b/linden/indra/newview/llmaniptranslate.h index 4937d71..04c3d5a 100644 --- a/linden/indra/newview/llmaniptranslate.h +++ b/linden/indra/newview/llmaniptranslate.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmapresponders.cpp b/linden/indra/newview/llmapresponders.cpp index 2863c0b..ddf5701 100644 --- a/linden/indra/newview/llmapresponders.cpp +++ b/linden/indra/newview/llmapresponders.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmapresponders.h b/linden/indra/newview/llmapresponders.h index cbe21e8..57f54b7 100644 --- a/linden/indra/newview/llmapresponders.h +++ b/linden/indra/newview/llmapresponders.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmediaremotectrl.cpp b/linden/indra/newview/llmediaremotectrl.cpp index c1fec1c..4549c3b 100644 --- a/linden/indra/newview/llmediaremotectrl.cpp +++ b/linden/indra/newview/llmediaremotectrl.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmediaremotectrl.h b/linden/indra/newview/llmediaremotectrl.h index b1694c0..605be04 100644 --- a/linden/indra/newview/llmediaremotectrl.h +++ b/linden/indra/newview/llmediaremotectrl.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmemoryview.cpp b/linden/indra/newview/llmemoryview.cpp index c377560..1d92bff 100644 --- a/linden/indra/newview/llmemoryview.cpp +++ b/linden/indra/newview/llmemoryview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmemoryview.h b/linden/indra/newview/llmemoryview.h index bbb4f49..6d5b96b 100644 --- a/linden/indra/newview/llmemoryview.h +++ b/linden/indra/newview/llmemoryview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmenucommands.cpp b/linden/indra/newview/llmenucommands.cpp index 425786e..43f783e 100644 --- a/linden/indra/newview/llmenucommands.cpp +++ b/linden/indra/newview/llmenucommands.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmenucommands.h b/linden/indra/newview/llmenucommands.h index 8e8ae9d..08cee43 100644 --- a/linden/indra/newview/llmenucommands.h +++ b/linden/indra/newview/llmenucommands.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmorphview.cpp b/linden/indra/newview/llmorphview.cpp index f2ac87c..1a28fd7 100644 --- a/linden/indra/newview/llmorphview.cpp +++ b/linden/indra/newview/llmorphview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmorphview.h b/linden/indra/newview/llmorphview.h index 7bd7847..6abc630 100644 --- a/linden/indra/newview/llmorphview.h +++ b/linden/indra/newview/llmorphview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmoveview.cpp b/linden/indra/newview/llmoveview.cpp index 755aec9..2f4c8d1 100644 --- a/linden/indra/newview/llmoveview.cpp +++ b/linden/indra/newview/llmoveview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmoveview.h b/linden/indra/newview/llmoveview.h index bcbfbeb..d0179b2 100644 --- a/linden/indra/newview/llmoveview.h +++ b/linden/indra/newview/llmoveview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llmutelist.cpp b/linden/indra/newview/llmutelist.cpp index e02d6fc..e62bf19 100644 --- a/linden/indra/newview/llmutelist.cpp +++ b/linden/indra/newview/llmutelist.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -55,7 +56,7 @@ #include "llagent.h" #include "llfloatermute.h" -#include "llviewermessage.h" // for gGenericDispatcher +#include "llviewergenericmessage.h" // for gGenericDispatcher #include "llviewerwindow.h" #include "viewer.h" #include "llworld.h" //for particle system banning @@ -462,7 +463,7 @@ void LLMuteList::requestFromServer(const LLUUID& agent_id) char agent_id_string[UUID_STR_LENGTH]; /*Flawfinder: ignore*/ char filename[LL_MAX_PATH]; /*Flawfinder: ignore*/ agent_id.toString(agent_id_string); - snprintf(filename, sizeof(filename), "%s.cached_mute", gDirUtilp->getExpandedFilename(LL_PATH_CACHE,agent_id_string).c_str()); /*Flawfinder: ignore*/ + snprintf(filename, sizeof(filename), "%s.cached_mute", gDirUtilp->getExpandedFilename(LL_PATH_CACHE,agent_id_string).c_str()); /* Flawfinder: ignore */ LLCRC crc; crc.update(filename); @@ -488,7 +489,7 @@ void LLMuteList::cache(const LLUUID& agent_id) char agent_id_string[UUID_STR_LENGTH]; /*Flawfinder: ignore*/ char filename[LL_MAX_PATH]; /*Flawfinder: ignore*/ agent_id.toString(agent_id_string); - snprintf(filename, sizeof(filename), "%s.cached_mute", gDirUtilp->getExpandedFilename(LL_PATH_CACHE,agent_id_string).c_str()); /*Flawfinder: ignore*/ + snprintf(filename, sizeof(filename), "%s.cached_mute", gDirUtilp->getExpandedFilename(LL_PATH_CACHE,agent_id_string).c_str()); /* Flawfinder: ignore */ saveToFile(filename); } } @@ -531,7 +532,7 @@ void LLMuteList::processUseCachedMuteList(LLMessageSystem* msg, void**) char agent_id_string[UUID_STR_LENGTH]; /*Flawfinder: ignore*/ gAgent.getID().toString(agent_id_string); char filename[LL_MAX_PATH]; /*Flawfinder: ignore*/ - snprintf(filename, sizeof(filename), "%s.cached_mute", gDirUtilp->getExpandedFilename(LL_PATH_CACHE,agent_id_string).c_str()); /*Flawfinder: ignore*/ + snprintf(filename, sizeof(filename), "%s.cached_mute", gDirUtilp->getExpandedFilename(LL_PATH_CACHE,agent_id_string).c_str()); /* Flawfinder: ignore */ gMuteListp->loadFromFile(filename); } diff --git a/linden/indra/newview/llmutelist.h b/linden/indra/newview/llmutelist.h index afd57ad..d8f1bf6 100644 --- a/linden/indra/newview/llmutelist.h +++ b/linden/indra/newview/llmutelist.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llnamebox.cpp b/linden/indra/newview/llnamebox.cpp index 8dacf34..a5eee6a 100644 --- a/linden/indra/newview/llnamebox.cpp +++ b/linden/indra/newview/llnamebox.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llnamebox.h b/linden/indra/newview/llnamebox.h index 31a09ae..74fd0a2 100644 --- a/linden/indra/newview/llnamebox.h +++ b/linden/indra/newview/llnamebox.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llnameeditor.cpp b/linden/indra/newview/llnameeditor.cpp index 5cc5ddd..5362ba7 100644 --- a/linden/indra/newview/llnameeditor.cpp +++ b/linden/indra/newview/llnameeditor.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -49,7 +50,7 @@ LLNameEditor::LLNameEditor(const std::string& name, const LLRect& rect, S32 max_text_length, void (*commit_callback)(LLUICtrl* caller, void* user_data), void (*keystroke_callback)(LLLineEditor* caller, void* user_data), - void (*focus_lost_callback)(LLLineEditor* caller, void* user_data), + void (*focus_lost_callback)(LLUICtrl* caller, void* user_data), void* userdata, LLLinePrevalidateFunc prevalidate_func, LLViewBorder::EBevel border_bevel, diff --git a/linden/indra/newview/llnameeditor.h b/linden/indra/newview/llnameeditor.h index 1ad1e8c..60e0432 100644 --- a/linden/indra/newview/llnameeditor.h +++ b/linden/indra/newview/llnameeditor.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -49,7 +50,7 @@ public: S32 max_text_length = 254, void (*commit_callback)(LLUICtrl* caller, void* user_data) = NULL, void (*keystroke_callback)(LLLineEditor* caller, void* user_data) = NULL, - void (*focus_lost_callback)(LLLineEditor* caller, void* user_data) = NULL, + void (*focus_lost_callback)(LLUICtrl* caller, void* user_data) = NULL, void* userdata = NULL, LLLinePrevalidateFunc prevalidate_func = NULL, LLViewBorder::EBevel border_bevel = LLViewBorder::BEVEL_IN, diff --git a/linden/indra/newview/llnamelistctrl.cpp b/linden/indra/newview/llnamelistctrl.cpp index 90bfb86..98745b4 100644 --- a/linden/indra/newview/llnamelistctrl.cpp +++ b/linden/indra/newview/llnamelistctrl.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -177,6 +178,13 @@ BOOL LLNameListCtrl::addNameItem(LLScrollListItem* item, EAddPosition pos) addItem(item, pos); + // this column is resizable + LLScrollListColumn* columnp = getColumn(mNameColumnIndex); + if (columnp && columnp->mHeader) + { + columnp->mHeader->setHasResizableElement(TRUE); + } + return result; } @@ -187,16 +195,41 @@ LLScrollListItem* LLNameListCtrl::addElement(const LLSD& value, EAddPosition pos char first[DB_FIRST_NAME_BUF_SIZE]; /*Flawfinder: ignore*/ char last[DB_LAST_NAME_BUF_SIZE]; /*Flawfinder: ignore*/ - gCacheName->getName(item->getUUID(), first, last); - - LLString fullname; - fullname.assign(first); - fullname.append(1, ' '); - fullname.append(last); - + // use supplied name by default + LLString fullname = value["name"].asString(); + if (value["target"].asString() == "GROUP") + { + char group_name[DB_GROUP_NAME_BUF_SIZE]; /*Flawfinder: ignore*/ + gCacheName->getGroupName(item->getUUID(), group_name); + // fullname will be "nobody" if group not found + fullname = group_name; + } + else if (value["target"].asString() == "SPECIAL") + { + // just use supplied name + } + else // normal resident + { + if (gCacheName->getName(item->getUUID(), first, last)) + { + fullname.assign(first); + fullname.append(1, ' '); + fullname.append(last); + } + } + LLScrollListCell* cell = (LLScrollListCell*)item->getColumn(mNameColumnIndex); ((LLScrollListText*)cell)->setText( fullname ); + updateMaxContentWidth(item); + + // this column is resizable + LLScrollListColumn* columnp = getColumn(mNameColumnIndex); + if (columnp && columnp->mHeader) + { + columnp->mHeader->setHasResizableElement(TRUE); + } + return item; } @@ -241,6 +274,7 @@ void LLNameListCtrl::refresh(const LLUUID& id, const char* first, cell = (LLScrollListCell*)item->getColumn(mNameColumnIndex); ((LLScrollListText*)cell)->setText( fullname ); + updateMaxContentWidth(item); } } } @@ -318,13 +352,6 @@ LLView* LLNameListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto node->getAttributeS32("heading_height", heading_height); name_list->setHeadingHeight(heading_height); } - if (node->hasAttribute("heading_font")) - { - LLString heading_font(""); - node->getAttributeString("heading_font", heading_font); - LLFontGL* gl_font = LLFontGL::fontFromName(heading_font.c_str()); - name_list->setHeadingFont(gl_font); - } name_list->setCollapseEmptyColumns(collapse_empty_columns); BOOL allow_calling_card_drop = FALSE; @@ -363,8 +390,12 @@ LLView* LLNameListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto columns[index]["width"] = columnwidth; } + LLFontGL::HAlign h_align = LLFontGL::LEFT; + h_align = LLView::selectFontHAlign(child); + columns[index]["name"] = columnname; columns[index]["label"] = labelname; + columns[index]["halign"] = (S32)h_align; index++; } } @@ -426,3 +457,4 @@ LLView* LLNameListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto return name_list; } + diff --git a/linden/indra/newview/llnamelistctrl.h b/linden/indra/newview/llnamelistctrl.h index c0e8034..cded3cf 100644 --- a/linden/indra/newview/llnamelistctrl.h +++ b/linden/indra/newview/llnamelistctrl.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llnetmap.cpp b/linden/indra/newview/llnetmap.cpp index dcbf960..35774cb 100644 --- a/linden/indra/newview/llnetmap.cpp +++ b/linden/indra/newview/llnetmap.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -238,8 +239,6 @@ void LLNetMap::draw() mCurPanY = lerp(mCurPanY, mTargetPanY, LLCriticalDamp::getInterpolant(0.1f)); // Prepare a scissor region - // GLint params[4]; - // glGetIntegerv( GL_SCISSOR_BOX, params ); F32 rotation = 0; { @@ -274,12 +273,10 @@ void LLNetMap::draw() // figure out where agent is S32 region_width = llround(gWorldPointer->getRegionWidthInMeters()); - LLViewerRegion *regionp; - - for (regionp = gWorldPointer->mActiveRegionList.getFirstData(); - regionp; - regionp = gWorldPointer->mActiveRegionList.getNextData()) + for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin(); + iter != gWorldp->mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; // Find x and y position relative to camera's center. LLVector3 origin_agent = regionp->getOriginAgent(); LLVector3 rel_region_pos = origin_agent - gAgent.getCameraPositionAgent(); @@ -393,10 +390,10 @@ void LLNetMap::draw() LLVector3 pos_map; // Draw avatars - for (regionp = gWorldPointer->mActiveRegionList.getFirstData(); - regionp; - regionp = gWorldPointer->mActiveRegionList.getNextData()) + for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin(); + iter != gWorldp->mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; const LLVector3d& origin_global = regionp->getOriginGlobal(); S32 count = regionp->mMapAvatars.count(); diff --git a/linden/indra/newview/llnetmap.h b/linden/indra/newview/llnetmap.h index ffc0717..ac5e602 100644 --- a/linden/indra/newview/llnetmap.h +++ b/linden/indra/newview/llnetmap.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llnotify.cpp b/linden/indra/newview/llnotify.cpp index 3512e57..a84341d 100644 --- a/linden/indra/newview/llnotify.cpp +++ b/linden/indra/newview/llnotify.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llnotify.h b/linden/indra/newview/llnotify.h index cddcc42..013b2d9 100644 --- a/linden/indra/newview/llnotify.h +++ b/linden/indra/newview/llnotify.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lloverlaybar.cpp b/linden/indra/newview/lloverlaybar.cpp index a978914..f34dc87 100644 --- a/linden/indra/newview/lloverlaybar.cpp +++ b/linden/indra/newview/lloverlaybar.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lloverlaybar.h b/linden/indra/newview/lloverlaybar.h index df69399..1f15023 100644 --- a/linden/indra/newview/lloverlaybar.h +++ b/linden/indra/newview/lloverlaybar.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelaudioprefs.cpp b/linden/indra/newview/llpanelaudioprefs.cpp index 4b36069..4a58cea 100644 --- a/linden/indra/newview/llpanelaudioprefs.cpp +++ b/linden/indra/newview/llpanelaudioprefs.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelaudioprefs.h b/linden/indra/newview/llpanelaudioprefs.h index ff08d36..63ac77b 100644 --- a/linden/indra/newview/llpanelaudioprefs.h +++ b/linden/indra/newview/llpanelaudioprefs.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelavatar.cpp b/linden/indra/newview/llpanelavatar.cpp index 70b18be..fd25775 100644 --- a/linden/indra/newview/llpanelavatar.cpp +++ b/linden/indra/newview/llpanelavatar.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -29,6 +30,7 @@ #include "llpanelavatar.h" +#include "llclassifiedflags.h" #include "llfontgl.h" #include "llcachename.h" @@ -43,10 +45,11 @@ #include "llcallingcard.h" #include "llcheckboxctrl.h" #include "llfloater.h" + +#include "llfloaterfriends.h" #include "llfloatergroupinfo.h" #include "llfloaterworldmap.h" #include "llfloatermute.h" -#include "llfloaterrate.h" #include "llfloateravatarinfo.h" #include "lliconctrl.h" #include "llinventoryview.h" @@ -64,7 +67,7 @@ #include "lluiconstants.h" #include "llvoavatar.h" #include "llviewermenu.h" // *FIX: for is_agent_friend() -#include "llviewermessage.h" // send_generic_message +#include "llviewergenericmessage.h" // send_generic_message #include "llviewerobjectlist.h" #include "llviewerregion.h" #include "llviewborder.h" @@ -78,7 +81,7 @@ #include "llvieweruictrlfactory.h" // Statics -LLLinkedList LLPanelAvatar::sAllPanels; +std::list LLPanelAvatar::sAllPanels; BOOL LLPanelAvatar::sAllowFirstLife = FALSE; //----------------------------------------------------------------------------- @@ -274,14 +277,13 @@ void LLPanelAvatarTab::draw() } } -void LLPanelAvatarTab::sendAvatarProfileRequestIfNeeded(const char* type) +void LLPanelAvatarTab::sendAvatarProfileRequestIfNeeded(const char* method) { if (!mDataRequested) { std::vector strings; strings.push_back( mPanelAvatar->getAvatarID().asString() ); - strings.push_back( type ); - send_generic_message("avatarprofilerequest", strings); + send_generic_message(method, strings); mDataRequested = true; } } @@ -465,7 +467,8 @@ BOOL LLPanelAvatarSecondLife::postBuild(void) childSetAction("Show on Map", LLPanelAvatar::onClickTrack, getPanelAvatar()); childSetAction("Instant Message...", LLPanelAvatar::onClickIM, getPanelAvatar()); - childSetAction("Rate...", LLPanelAvatar::onClickRate, getPanelAvatar()); + + childSetAction("Add Friend...", LLPanelAvatar::onClickAddFriend, getPanelAvatar()); childSetAction("Pay...", LLPanelAvatar::onClickPay, getPanelAvatar()); childSetAction("Mute", LLPanelAvatar::onClickMute, getPanelAvatar() ); @@ -822,7 +825,7 @@ LLPanelAvatarNotes::LLPanelAvatarNotes(const std::string& name, const LLRect& re void LLPanelAvatarNotes::refresh() { - sendAvatarProfileRequestIfNeeded("notes"); + sendAvatarProfileRequestIfNeeded("avatarnotesrequest"); } void LLPanelAvatarNotes::clearControls() @@ -858,15 +861,15 @@ void LLPanelAvatarClassified::refresh() S32 tab_count = tabs ? tabs->getTabCount() : 0; - BOOL allow_new = TRUE; //tab_count < MAX_CLASSIFIEDS; - BOOL allow_delete = (tab_count > 0); - BOOL show_help = (tab_count == 0); + bool allow_new = tab_count < MAX_CLASSIFIEDS; + bool allow_delete = (tab_count > 0); + bool show_help = (tab_count == 0); childSetEnabled("New...",self && allow_new); childSetEnabled("Delete...",self && allow_delete); childSetVisible("classified tab",!show_help); - sendAvatarProfileRequestIfNeeded("classifieds"); + sendAvatarProfileRequestIfNeeded("avatarclassifiedsrequest"); } @@ -923,9 +926,8 @@ void LLPanelAvatarClassified::processAvatarClassifiedReply(LLMessageSystem* msg, LLTabContainerCommon* tabs = LLViewerUICtrlFactory::getTabContainerByName(this,"classified tab"); - // Clear out all the old panels. - // We'll replace them with the correct number of new panels. - deleteClassifiedPanels(); + // Don't remove old panels. We need to be able to process multiple + // packets for people who have lots of classifieds. JC block_count = msg->getNumberOfBlocksFast(_PREHASH_Data); for (block = 0; block < block_count; block++) @@ -1068,7 +1070,7 @@ void LLPanelAvatarPicks::refresh() childSetEnabled("New...",self && allow_new); childSetEnabled("Delete...",self && allow_delete); - sendAvatarProfileRequestIfNeeded("picks"); + sendAvatarProfileRequestIfNeeded("avatarpicksrequest"); } @@ -1099,6 +1101,9 @@ void LLPanelAvatarPicks::processAvatarPicksReply(LLMessageSystem* msg, void**) // number of new panels. deletePickPanels(); + // The database needs to know for which user to look up picks. + LLUUID avatar_id = getPanelAvatar()->getAvatarID(); + block_count = msg->getNumberOfBlocks("Data"); for (block = 0; block < block_count; block++) { @@ -1107,7 +1112,7 @@ void LLPanelAvatarPicks::processAvatarPicksReply(LLMessageSystem* msg, void**) panel_pick = new LLPanelPick(FALSE); - panel_pick->setPickID(pick_id); + panel_pick->setPickID(pick_id, avatar_id); // This will request data from the server when the pick is first // drawn. @@ -1186,23 +1191,24 @@ void LLPanelAvatarPicks::callbackDelete(S32 option, void* data) if(gAgent.isGodlike()) { msg->newMessage("PickGodDelete"); + msg->nextBlock("AgentData"); + msg->addUUID("AgentID", gAgent.getID()); + msg->addUUID("SessionID", gAgent.getSessionID()); + msg->nextBlock("Data"); + msg->addUUID("PickID", panel_pick->getPickID()); + // *HACK: We need to send the pick's creator id to accomplish + // the delete, and we don't use the query id for anything. JC + msg->addUUID( "QueryID", panel_pick->getPickCreatorID() ); } else { msg->newMessage("PickDelete"); + msg->nextBlock("AgentData"); + msg->addUUID("AgentID", gAgent.getID()); + msg->addUUID("SessionID", gAgent.getSessionID()); + msg->nextBlock("Data"); + msg->addUUID("PickID", panel_pick->getPickID()); } - msg->nextBlock("AgentData"); - msg->addUUID("AgentID", gAgent.getID()); - msg->addUUID("SessionID", gAgent.getSessionID()); - msg->nextBlock("Data"); - msg->addUUID("PickID", panel_pick->getPickID()); - - //God delete receiving end expects a query ID but we dont need it, so send a null. - //This is to resolve SL-24170 God Picks Delete results in crash. - if(gAgent.isGodlike()) - msg->addUUID( "QueryID", LLUUID::null ); - - gAgent.sendReliableMessage(); if(tabs) @@ -1235,11 +1241,10 @@ LLPanelAvatar::LLPanelAvatar( mAvatarID( LLUUID::null ), // mAvatarID is set with 'setAvatar' or 'setAvatarID' mHaveProperties(FALSE), mHaveStatistics(FALSE), - mAllowEdit(allow_edit), - mDisableRate(FALSE) + mAllowEdit(allow_edit) { - sAllPanels.addData(this); + sAllPanels.push_back(this); LLCallbackMap::map_t factory_map; @@ -1291,7 +1296,7 @@ BOOL LLPanelAvatar::postBuild(void) LLPanelAvatar::~LLPanelAvatar() { - sAllPanels.removeData(this); + sAllPanels.remove(this); } @@ -1451,8 +1456,8 @@ void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id, const LLString &name, childSetEnabled("drop target",FALSE); childSetVisible("Show on Map",FALSE); childSetEnabled("Show on Map",FALSE); - childSetVisible("Rate...",FALSE); - childSetEnabled("Rate...",FALSE); + childSetVisible("Add Friend...",FALSE); + childSetEnabled("Add Friend...",FALSE); childSetVisible("Pay...",FALSE); childSetEnabled("Pay...",FALSE); } @@ -1489,8 +1494,8 @@ void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id, const LLString &name, { childSetToolTip("Show on Map",childGetValue("ShowOnMapFriendOnline").asString()); } - childSetVisible("Rate...",TRUE); - childSetEnabled("Rate...",FALSE); + childSetVisible("Add Friend...", true); + childSetEnabled("Add Friend...", true); childSetVisible("Pay...",TRUE); childSetEnabled("Pay...",FALSE); } @@ -1522,7 +1527,6 @@ void LLPanelAvatar::resetGroupList() if (mPanelSecondLife && group_list) { group_list->deleteAllItems(); - LLScrollListItem* item; S32 count = gAgent.mGroups.count(); LLUUID id; @@ -1544,9 +1548,12 @@ void LLPanelAvatar::resetGroupList() */ group_string += group_data.mName; - item = new LLScrollListItem(TRUE, NULL, id); - item->addColumn(group_string, LLFontGL::sSansSerifSmall, 0, LLFontGL::NORMAL); - group_list->addItem(item); + + LLSD row; + row["columns"][0]["value"] = group_string; + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + row["columns"][0]["width"] = 0; + group_list->addElement(row); } group_list->sortByColumn(0, TRUE); } @@ -1586,15 +1593,17 @@ void LLPanelAvatar::onClickTrack(void* userdata) } } + // static -//----------------------------------------------------------------------------- -// onClickRate() -//----------------------------------------------------------------------------- -void LLPanelAvatar::onClickRate(void *userdata) +void LLPanelAvatar::onClickAddFriend(void* userdata) { LLPanelAvatar* self = (LLPanelAvatar*) userdata; - - LLFloaterRate::show(self->mAvatarID); + LLNameEditor* name_edit = LLViewerUICtrlFactory::getNameEditorByName(self->mPanelSecondLife, "name"); + if (name_edit) + { + LLFloaterFriends::requestFriendshipDialog(self->getAvatarID(), + name_edit->getText()); + } } //----------------------------------------------------------------------------- @@ -1625,15 +1634,6 @@ void LLPanelAvatar::onClickMute(void *userdata) } -void LLPanelAvatar::disableRate() -{ - // Force off the rate button, but enable IM. - // Note that these buttons may not exist if it is your own profile. - childSetEnabled("Rate...",FALSE); - mDisableRate = TRUE; -} - - // static void LLPanelAvatar::onClickOfferTeleport(void *userdata) { @@ -1747,8 +1747,6 @@ void LLPanelAvatar::sendAvatarNotesUpdate() // static void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**) { - LLPanelAvatar* self = NULL; - LLUUID agent_id; // your id LLUUID avatar_id; // target of this panel LLUUID image_id; @@ -1772,8 +1770,9 @@ void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**) msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AvatarID, avatar_id ); - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) { + LLPanelAvatar* self = *iter; if (self->mAvatarID != avatar_id) { continue; @@ -1782,10 +1781,6 @@ void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**) self->childSetEnabled("Pay...",TRUE); self->childSetEnabled("Mute",TRUE); - if (!self->mDisableRate) - { - self->childSetEnabled("Rate...",TRUE); - } self->childSetEnabled("drop target",TRUE); self->mHaveProperties = TRUE; @@ -1895,8 +1890,6 @@ void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**) // static void LLPanelAvatar::processAvatarInterestsReply(LLMessageSystem *msg, void**) { - LLPanelAvatar* self = NULL; - LLUUID agent_id; // your id LLUUID avatar_id; // target of this panel @@ -1911,8 +1904,9 @@ void LLPanelAvatar::processAvatarInterestsReply(LLMessageSystem *msg, void**) msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AvatarID, avatar_id ); - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) { + LLPanelAvatar* self = *iter; if (self->mAvatarID != avatar_id) { continue; @@ -1940,15 +1934,15 @@ void LLPanelAvatar::processAvatarGroupsReply(LLMessageSystem *msg, void**) LLUUID group_id; char group_name[DB_GROUP_NAME_BUF_SIZE]; /*Flawfinder: ignore*/ LLUUID group_insignia_id; - const LLFontGL* FONT = LLFontGL::sSansSerifSmall; llinfos << "groups packet size " << msg->getReceiveSize() << llendl; msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AvatarID, avatar_id ); - for (LLPanelAvatar* self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) { + LLPanelAvatar* self = *iter; if (self->mAvatarID != avatar_id) { continue; @@ -1996,9 +1990,15 @@ void LLPanelAvatar::processAvatarGroupsReply(LLMessageSystem *msg, void**) group_list->deleteSingleItem(index); } } - LLScrollListItem *group_item = new LLScrollListItem(TRUE, NULL, group_id); - group_item->addColumn(group_string, FONT); - if(group_list) group_list->addItem(group_item); + + LLSD row; + row["id"] = group_id; + row["columns"][0]["value"] = group_string; + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + if (group_list) + { + group_list->addElement(row); + } } } if(group_list) group_list->sortByColumn(0, TRUE); @@ -2009,7 +2009,7 @@ void LLPanelAvatar::processAvatarGroupsReply(LLMessageSystem *msg, void**) // Otherwise you will write blanks back into the database. void LLPanelAvatar::enableOKIfReady() { - if(mHaveProperties && mHaveStatistics && childIsVisible("OK")) + if(mHaveProperties && childIsVisible("OK")) { childSetEnabled("OK", TRUE); } @@ -2115,68 +2115,6 @@ void LLPanelAvatar::selectTabByName(std::string tab_name) } -// static -void LLPanelAvatar::processAvatarStatisticsReply(LLMessageSystem *msg, void**) -{ - // extract the agent id - LLUUID agent_id; - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); - - LLUUID avatar_id; - msg->getUUIDFast(_PREHASH_AvatarData, _PREHASH_AvatarID, avatar_id); - - // look up all panels which have this avatar - LLPanelAvatar *self = NULL; - - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) - { - if (self->mAvatarID != avatar_id) - { - continue; - } - - self->mHaveStatistics = TRUE; - self->enableOKIfReady(); - - // clear out list - LLScrollListCtrl* ratings_list = LLUICtrlFactory::getScrollListByName(self->mPanelSecondLife,"ratings"); - if (ratings_list) - { - ratings_list->deleteAllItems(); - } - // build the item list - LLFontGL *font = LLFontGL::sSansSerifSmall; - - S32 items = msg->getNumberOfBlocksFast(_PREHASH_StatisticsData); - for (S32 i = 0; i < items; i++) - { - char name[MAX_STRING]; /*Flawfinder: ignore*/ - S32 positive; - S32 negative; - char value_string[MAX_STRING]; /*Flawfinder: ignore*/ - - msg->getStringFast( _PREHASH_StatisticsData, - _PREHASH_Name, MAX_STRING, name, i); - msg->getS32( "StatisticsData", "Positive", positive, i); - msg->getS32( "StatisticsData", "Negative", negative, i); - - LLScrollListItem *item = NULL; - - const S32 TEXT_WIDTH = 75; - - item = new LLScrollListItem(); - item->addColumn( name, font, TEXT_WIDTH ); - - snprintf( value_string, sizeof(value_string), "+%d", positive); /*Flawfinder: ignore*/ - item->addColumn( value_string, font, 50 ); - - item->addColumn("", font); // extra column to force striped appearance - if(ratings_list) ratings_list->addItem( item ); - } - } -} - - void LLPanelAvatar::processAvatarNotesReply(LLMessageSystem *msg, void**) { // extract the agent id @@ -2187,10 +2125,9 @@ void LLPanelAvatar::processAvatarNotesReply(LLMessageSystem *msg, void**) msg->getUUID("Data", "TargetID", target_id); // look up all panels which have this avatar - LLPanelAvatar *self = NULL; - - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) { + LLPanelAvatar* self = *iter; if (self->mAvatarID != target_id) { continue; @@ -2206,7 +2143,6 @@ void LLPanelAvatar::processAvatarNotesReply(LLMessageSystem *msg, void**) void LLPanelAvatar::processAvatarClassifiedReply(LLMessageSystem *msg, void** userdata) { - LLPanelAvatar *self = NULL; LLUUID agent_id; LLUUID target_id; @@ -2214,8 +2150,9 @@ void LLPanelAvatar::processAvatarClassifiedReply(LLMessageSystem *msg, void** us msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TargetID, target_id); // look up all panels which have this avatar target - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) { + LLPanelAvatar* self = *iter; if (self->mAvatarID != target_id) { continue; @@ -2227,7 +2164,6 @@ void LLPanelAvatar::processAvatarClassifiedReply(LLMessageSystem *msg, void** us void LLPanelAvatar::processAvatarPicksReply(LLMessageSystem *msg, void** userdata) { - LLPanelAvatar *self = NULL; LLUUID agent_id; LLUUID target_id; @@ -2235,8 +2171,9 @@ void LLPanelAvatar::processAvatarPicksReply(LLMessageSystem *msg, void** userdat msg->getUUID("AgentData", "TargetID", target_id); // look up all panels which have this avatar target - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) { + LLPanelAvatar* self = *iter; if (self->mAvatarID != target_id) { continue; diff --git a/linden/indra/newview/llpanelavatar.h b/linden/indra/newview/llpanelavatar.h index 3e8bffd..8df5df1 100644 --- a/linden/indra/newview/llpanelavatar.h +++ b/linden/indra/newview/llpanelavatar.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -79,8 +80,9 @@ public: // If the data for this tab has not yet been requested, // send the request. Used by tabs that are filled in only // when they are first displayed. - // type is one of "notes", "classifieds", "picks" - void sendAvatarProfileRequestIfNeeded(const char* type); + // type is one of "avatarnotesrequest", "avatarpicksrequest", + // or "avatarclassifiedsrequest" + void sendAvatarProfileRequestIfNeeded(const char* method); private: LLPanelAvatar* mPanelAvatar; @@ -275,8 +277,6 @@ public: void setOnlineStatus(EOnlineStatus online_status); const LLUUID& getAvatarID() const { return mAvatarID; } - - void disableRate(); void resetGroupList(); @@ -298,7 +298,6 @@ public: static void processAvatarPropertiesReply(LLMessageSystem *msg, void **); static void processAvatarInterestsReply(LLMessageSystem *msg, void **); static void processAvatarGroupsReply(LLMessageSystem* msg, void**); - static void processAvatarStatisticsReply(LLMessageSystem *msg, void **); static void processAvatarNotesReply(LLMessageSystem *msg, void **); static void processAvatarPicksReply(LLMessageSystem *msg, void **); static void processAvatarClassifiedReply(LLMessageSystem *msg, void **); @@ -307,7 +306,7 @@ public: static void onClickIM( void *userdata); static void onClickOfferTeleport( void *userdata); static void onClickPay( void *userdata); - static void onClickRate( void *userdata); + static void onClickAddFriend(void* userdata); static void onClickOK( void *userdata); static void onClickCancel( void *userdata); static void onClickKick( void *userdata); @@ -315,7 +314,6 @@ public: static void onClickUnfreeze(void *userdata); static void onClickCSR( void *userdata); static void onClickMute( void *userdata); - static void onClickAddFriend(void* data); static void finishKick(S32 option, const LLString& text, void* userdata); static void finishFreeze(S32 option, const LLString& text, void* userdata); @@ -356,9 +354,9 @@ protected: BOOL mHaveStatistics; LLTabContainerCommon* mTab; BOOL mAllowEdit; - BOOL mDisableRate; - static LLLinkedList sAllPanels; + typedef std::list panel_list_t; + static panel_list_t sAllPanels; }; // helper funcs diff --git a/linden/indra/newview/llpanelclassified.cpp b/linden/indra/newview/llpanelclassified.cpp index 11120e0..7a2542d 100644 --- a/linden/indra/newview/llpanelclassified.cpp +++ b/linden/indra/newview/llpanelclassified.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -57,7 +58,7 @@ #include "llviewerwindow.h" #include "llworldmap.h" #include "llfloaterworldmap.h" -#include "llviewermessage.h" // send_generic_message +#include "llviewergenericmessage.h" // send_generic_message #include "llviewerwindow.h" // for window width, height const S32 MINIMUM_PRICE_FOR_LISTING = 50; // L$ @@ -91,7 +92,7 @@ public: static LLDispatchClassifiedClickThrough sClassifiedClickThrough; //static -LLLinkedList LLPanelClassified::sAllPanels; +std::list LLPanelClassified::sAllPanels; LLPanelClassified::LLPanelClassified(BOOL in_finder) : LLPanel("Classified Panel"), @@ -118,7 +119,7 @@ LLPanelClassified::LLPanelClassified(BOOL in_finder) mSetBtn(NULL), mClickThroughText(NULL) { - sAllPanels.addData(this); + sAllPanels.push_back(this); std::string classified_def_file; if (mInFinder) @@ -138,7 +139,7 @@ LLPanelClassified::LLPanelClassified(BOOL in_finder) LLPanelClassified::~LLPanelClassified() { - sAllPanels.removeData(this); + sAllPanels.remove(this); } @@ -319,9 +320,9 @@ void LLPanelClassified::setClickThrough(const LLUUID& classified_id, S32 map, S32 profile) { - LLPanelClassified *self = NULL; - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) - { + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) + { + LLPanelClassified* self = *iter; // For top picks, must match pick id if (self->mClassifiedID != classified_id) { @@ -477,7 +478,7 @@ void LLPanelClassified::processClassifiedInfoReply(LLMessageSystem *msg, void ** S32 region_y = llround((F32)pos_global.mdV[VY]) % REGION_WIDTH_UNITS; S32 region_z = llround((F32)pos_global.mdV[VZ]); - snprintf(buffer, sizeof(buffer), "%s (%d, %d, %d)", sim_name, region_x, region_y, region_z); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "%s (%d, %d, %d)", sim_name, region_x, region_y, region_z); /* Flawfinder: ignore */ location_text.append(buffer); U8 flags; @@ -502,9 +503,9 @@ void LLPanelClassified::processClassifiedInfoReply(LLMessageSystem *msg, void ** msg->getS32("Data", "PriceForListing", price_for_listing); // Look up the panel to fill in - LLPanelClassified *self = NULL; - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) - { + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) + { + LLPanelClassified* self = *iter; // For top picks, must match pick id if (self->mClassifiedID != classified_id) { diff --git a/linden/indra/newview/llpanelclassified.h b/linden/indra/newview/llpanelclassified.h index ee70cae..498f8a5 100644 --- a/linden/indra/newview/llpanelclassified.h +++ b/linden/indra/newview/llpanelclassified.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -142,7 +143,8 @@ protected: LLTextBox* mClickThroughText; LLRect mSnapshotSize; - static LLLinkedList sAllPanels; + typedef std::list panel_list_t; + static panel_list_t sAllPanels; }; diff --git a/linden/indra/newview/llpanelcontents.cpp b/linden/indra/newview/llpanelcontents.cpp index 47f2d35..2265ed5 100644 --- a/linden/indra/newview/llpanelcontents.cpp +++ b/linden/indra/newview/llpanelcontents.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelcontents.h b/linden/indra/newview/llpanelcontents.h index a8d3dfc..da2f5f5 100644 --- a/linden/indra/newview/llpanelcontents.h +++ b/linden/indra/newview/llpanelcontents.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpaneldebug.cpp b/linden/indra/newview/llpaneldebug.cpp index 1d2d670..3166a1d 100644 --- a/linden/indra/newview/llpaneldebug.cpp +++ b/linden/indra/newview/llpaneldebug.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpaneldebug.h b/linden/indra/newview/llpaneldebug.h index 7ffed82..cfd4db8 100644 --- a/linden/indra/newview/llpaneldebug.h +++ b/linden/indra/newview/llpaneldebug.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpaneldirbrowser.cpp b/linden/indra/newview/llpaneldirbrowser.cpp index 7f15a85..b65480b 100644 --- a/linden/indra/newview/llpaneldirbrowser.cpp +++ b/linden/indra/newview/llpaneldirbrowser.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -323,7 +324,6 @@ void LLPanelDirBrowser::onCommitList(LLUICtrl* ctrl, void* data) { self->mFloaterDirectory->mPanelAvatarp->setVisible(TRUE); self->mFloaterDirectory->mPanelAvatarp->setAvatarID(id, name, ONLINE_STATUS_NO); - self->mFloaterDirectory->mPanelAvatarp->disableRate(); } break; case EVENT_CODE: @@ -491,7 +491,6 @@ void LLPanelDirBrowser::processDirPlacesReply(LLMessageSystem* msg, void**) char name[MAX_STRING]; /*Flawfinder: ignore*/ BOOL is_for_sale; BOOL is_auction; - BOOL is_newbie; F32 dwell; msg->getUUID("AgentData", "AgentID", agent_id); @@ -528,7 +527,6 @@ void LLPanelDirBrowser::processDirPlacesReply(LLMessageSystem* msg, void**) msg->getString("QueryReplies", "Name", MAX_STRING, name, i); msg->getBOOL("QueryReplies", "ForSale", is_for_sale, i); msg->getBOOL("QueryReplies", "Auction", is_auction, i); - msg->getBOOL("QueryReplies", "ReservedNewbie", is_newbie, i); msg->getF32("QueryReplies", "Dwell", dwell, i); if (parcel_id.isNull()) @@ -539,7 +537,7 @@ void LLPanelDirBrowser::processDirPlacesReply(LLMessageSystem* msg, void**) LLSD content; S32 type; - LLSD row = self->createLandSale(parcel_id, is_auction, is_for_sale, is_newbie, name, &type); + LLSD row = self->createLandSale(parcel_id, is_auction, is_for_sale, name, &type); content["type"] = type; content["name"] = name; @@ -767,8 +765,7 @@ void LLPanelDirBrowser::processDirGroupsReply(LLMessageSystem* msg, void**) LLUUID group_id; char group_name[DB_GROUP_NAME_BUF_SIZE]; /*Flawfinder: ignore*/ S32 members; - BOOL open_enrollment; - S32 membership_fee; + F32 search_order; msg->getUUIDFast(_PREHASH_QueryData,_PREHASH_QueryID, query_id ); @@ -800,8 +797,7 @@ void LLPanelDirBrowser::processDirGroupsReply(LLMessageSystem* msg, void**) msg->getUUIDFast(_PREHASH_QueryReplies, _PREHASH_GroupID, group_id, i ); msg->getStringFast(_PREHASH_QueryReplies, _PREHASH_GroupName, DB_GROUP_NAME_BUF_SIZE, group_name, i); msg->getS32Fast(_PREHASH_QueryReplies, _PREHASH_Members, members, i ); - msg->getBOOLFast(_PREHASH_QueryReplies, _PREHASH_OpenEnrollment, open_enrollment, i ); - msg->getS32Fast(_PREHASH_QueryReplies, _PREHASH_MembershipFee, membership_fee, i ); + msg->getF32Fast(_PREHASH_QueryReplies, _PREHASH_SearchOrder, search_order, i ); if (group_id.isNull()) { @@ -829,6 +825,9 @@ void LLPanelDirBrowser::processDirGroupsReply(LLMessageSystem* msg, void**) row["columns"][2]["value"] = members; row["columns"][2]["font"] = "SANSSERIFSMALL"; + row["columns"][3]["column"] = "score"; + row["columns"][3]["value"] = search_order; + list->addElement(row); self->mResultsContents[group_id.asString()] = content; } @@ -921,7 +920,6 @@ void LLPanelDirBrowser::processDirLandReply(LLMessageSystem *msg, void**) BOOL for_sale; S32 sale_price; S32 actual_area; - BOOL is_newbie; msg->getUUID("AgentData", "AgentID", agent_id); msg->getUUID("QueryData", "QueryID", query_id ); @@ -965,7 +963,6 @@ void LLPanelDirBrowser::processDirLandReply(LLMessageSystem *msg, void**) msg->getString( "QueryReplies", "Name", MAX_STRING, name, i); msg->getBOOL( "QueryReplies", "Auction", auction, i); msg->getBOOL( "QueryReplies", "ForSale", for_sale, i); - msg->getBOOL( "QueryReplies", "ReservedNewbie", is_newbie, i); msg->getS32( "QueryReplies", "SalePrice", sale_price, i); msg->getS32( "QueryReplies", "ActualArea", actual_area, i); @@ -978,7 +975,7 @@ void LLPanelDirBrowser::processDirLandReply(LLMessageSystem *msg, void**) LLSD content; S32 type; - LLSD row = self->createLandSale(parcel_id, auction, for_sale, is_newbie, name, &type); + LLSD row = self->createLandSale(parcel_id, auction, for_sale, name, &type); content["type"] = type; content["name"] = name; @@ -1065,7 +1062,7 @@ void LLPanelDirBrowser::addClassified(LLCtrlListInterface *list, const LLUUID& p list->addElement(row); } -LLSD LLPanelDirBrowser::createLandSale(const LLUUID& parcel_id, BOOL is_auction, BOOL is_for_sale, BOOL is_newbie, const LLString& name, S32 *type) +LLSD LLPanelDirBrowser::createLandSale(const LLUUID& parcel_id, BOOL is_auction, BOOL is_for_sale, const LLString& name, S32 *type) { LLSD row; row["id"] = parcel_id; @@ -1083,24 +1080,12 @@ LLSD LLPanelDirBrowser::createLandSale(const LLUUID& parcel_id, BOOL is_auction, } else if (is_for_sale) { - if(is_newbie) - { - image_id.set( gViewerArt.getString("icon_land_for_landless.tga") ); - row["columns"][0]["column"] = "icon"; - row["columns"][0]["type"] = "icon"; - row["columns"][0]["value"] = image_id; - - *type = FOR_SALE_CODE; - } - else - { - image_id.set( gViewerArt.getString("icon_for_sale.tga") ); - row["columns"][0]["column"] = "icon"; - row["columns"][0]["type"] = "icon"; - row["columns"][0]["value"] = image_id; + image_id.set( gViewerArt.getString("icon_for_sale.tga") ); + row["columns"][0]["column"] = "icon"; + row["columns"][0]["type"] = "icon"; + row["columns"][0]["value"] = image_id; - *type = FOR_SALE_CODE; - } + *type = FOR_SALE_CODE; } else { diff --git a/linden/indra/newview/llpaneldirbrowser.h b/linden/indra/newview/llpaneldirbrowser.h index 1d9ff06..bd0f309 100644 --- a/linden/indra/newview/llpaneldirbrowser.h +++ b/linden/indra/newview/llpaneldirbrowser.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -119,7 +120,7 @@ protected: void updateResultCount(); void addClassified(LLCtrlListInterface *list, const LLUUID& classified_id, const char* name, const U32 creation_date, const S32 price_for_listing); - LLSD createLandSale(const LLUUID& parcel_id, BOOL is_auction, BOOL is_for_sale, BOOL is_newbie, const LLString& name, S32 *type); + LLSD createLandSale(const LLUUID& parcel_id, BOOL is_auction, BOOL is_for_sale, const LLString& name, S32 *type); static void onKeystrokeName(LLLineEditor* line, void* data); diff --git a/linden/indra/newview/llpaneldirclassified.cpp b/linden/indra/newview/llpaneldirclassified.cpp index f2b8d2d..8b4a49d 100644 --- a/linden/indra/newview/llpaneldirclassified.cpp +++ b/linden/indra/newview/llpaneldirclassified.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpaneldirclassified.h b/linden/indra/newview/llpaneldirclassified.h index b273903..f8f3c76 100644 --- a/linden/indra/newview/llpaneldirclassified.h +++ b/linden/indra/newview/llpaneldirclassified.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpaneldirevents.cpp b/linden/indra/newview/llpaneldirevents.cpp index f3cd2ce..f60c113 100644 --- a/linden/indra/newview/llpaneldirevents.cpp +++ b/linden/indra/newview/llpaneldirevents.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -61,10 +62,6 @@ BOOL LLPanelDirEvents::postBuild() { LLPanelDirBrowser::postBuild(); - // *HACK: Deal with PST vs. PDT - LLString buffer = llformat("Time (%s)", (gPacificDaylightTime ? "PDT" : "PST")); - childSetValue("desc_btn", buffer); - childSetCommitCallback("date_mode", onDateModeCallback, this); childSetAction("<<", onBackBtn, this); diff --git a/linden/indra/newview/llpaneldirevents.h b/linden/indra/newview/llpaneldirevents.h index 6a9c24d..d962c5f 100644 --- a/linden/indra/newview/llpaneldirevents.h +++ b/linden/indra/newview/llpaneldirevents.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpaneldirfind.cpp b/linden/indra/newview/llpaneldirfind.cpp index 433cb76..38669f8 100644 --- a/linden/indra/newview/llpaneldirfind.cpp +++ b/linden/indra/newview/llpaneldirfind.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpaneldirfind.h b/linden/indra/newview/llpaneldirfind.h index 4b7434b..d0a1247 100644 --- a/linden/indra/newview/llpaneldirfind.h +++ b/linden/indra/newview/llpaneldirfind.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpaneldirgroups.cpp b/linden/indra/newview/llpaneldirgroups.cpp index 794d7c8..d42cf96 100644 --- a/linden/indra/newview/llpaneldirgroups.cpp +++ b/linden/indra/newview/llpaneldirgroups.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -30,8 +31,11 @@ #include "llpaneldirgroups.h" // linden library includes +#include "llagent.h" //#include "llfontgl.h" #include "message.h" +#include "llqueryflags.h" +#include "llviewercontrol.h" // viewer project includes @@ -60,6 +64,16 @@ LLPanelDirGroups::~LLPanelDirGroups() // Children all cleaned up by default view destructor. } +// virtual +void LLPanelDirGroups::draw() +{ + // You only have a choice if you are mature + childSetVisible("incmature", gAgent.mAccess >= SIM_ACCESS_MATURE); + childSetValue("incmature", gSavedSettings.getBOOL("ShowMatureGroups")); + + LLPanelDirBrowser::draw(); +} + // virtual void LLPanelDirGroups::performQuery() @@ -72,7 +86,17 @@ void LLPanelDirGroups::performQuery() setupNewSearch(); // groups - U32 scope = 0x10; + U32 scope = DFQ_GROUPS; + + // Check group mature filter. + if ( !gSavedSettings.getBOOL("ShowMatureGroups") + || gAgent.mAccess <= SIM_ACCESS_PG ) + { + scope |= DFQ_FILTER_MATURE; + } + + mCurrentSortColumn = "score"; + mCurrentSortAscending = FALSE; // send the message sendDirFindQuery( diff --git a/linden/indra/newview/llpaneldirgroups.h b/linden/indra/newview/llpaneldirgroups.h index 75e6eda..e4fe6a5 100644 --- a/linden/indra/newview/llpaneldirgroups.h +++ b/linden/indra/newview/llpaneldirgroups.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -36,6 +37,8 @@ public: LLPanelDirGroups(const std::string& name, LLFloaterDirectory* floater); virtual ~LLPanelDirGroups(); + /*virtual*/ void draw(); + /*virtual*/ BOOL postBuild(); /*virtual*/ void performQuery(); diff --git a/linden/indra/newview/llpaneldirland.cpp b/linden/indra/newview/llpaneldirland.cpp index 9e123d9..d5883dc 100644 --- a/linden/indra/newview/llpaneldirland.cpp +++ b/linden/indra/newview/llpaneldirland.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -55,7 +56,6 @@ static const char FIND_ALL[] = "All Types"; static const char FIND_AUCTION[] = "Auction"; static const char FIND_MAINLANDSALES[] = "Mainland Sales"; static const char FIND_ESTATESALES[] = "Estate Sales"; -static const char FIND_NEWBIE[] = "First Land"; const char PG_ONLY[] = "PG only"; const char MATURE_ONLY[] = "Mature only"; @@ -150,7 +150,6 @@ void LLPanelDirLand::performQuery() if (FIND_AUCTION == type) search_type = ST_AUCTION; else if(FIND_MAINLANDSALES == type) search_type = ST_MAINLAND; else if(FIND_ESTATESALES == type) search_type = ST_ESTATE; - else if(FIND_NEWBIE == type) search_type = ST_NEWBIE; } U32 query_flags = 0x0; diff --git a/linden/indra/newview/llpaneldirland.h b/linden/indra/newview/llpaneldirland.h index c091700..93dbee1 100644 --- a/linden/indra/newview/llpaneldirland.h +++ b/linden/indra/newview/llpaneldirland.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpaneldirpeople.cpp b/linden/indra/newview/llpaneldirpeople.cpp index 1fe1570..ba94ea9 100644 --- a/linden/indra/newview/llpaneldirpeople.cpp +++ b/linden/indra/newview/llpaneldirpeople.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpaneldirpeople.h b/linden/indra/newview/llpaneldirpeople.h index a9e42fe..ee8ea19 100644 --- a/linden/indra/newview/llpaneldirpeople.h +++ b/linden/indra/newview/llpaneldirpeople.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpaneldirplaces.cpp b/linden/indra/newview/llpaneldirplaces.cpp index 0082eea..1a9a61f 100644 --- a/linden/indra/newview/llpaneldirplaces.cpp +++ b/linden/indra/newview/llpaneldirplaces.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -137,7 +138,7 @@ void LLPanelDirPlaces::queryCore(const LLString& name, if (pg_only) { - flags |= DFQ_PG_SIMS_ONLY; + flags |= DFQ_PG_PARCELS_ONLY; } // JC: Sorting by dwell severely impacts the performance of the query. diff --git a/linden/indra/newview/llpaneldirplaces.h b/linden/indra/newview/llpaneldirplaces.h index ac9b31f..d8a0e4e 100644 --- a/linden/indra/newview/llpaneldirplaces.h +++ b/linden/indra/newview/llpaneldirplaces.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpaneldirpopular.cpp b/linden/indra/newview/llpaneldirpopular.cpp index 24f87e4..5577ca0 100644 --- a/linden/indra/newview/llpaneldirpopular.cpp +++ b/linden/indra/newview/llpaneldirpopular.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpaneldirpopular.h b/linden/indra/newview/llpaneldirpopular.h index 17eb7e4..1d70f8a 100644 --- a/linden/indra/newview/llpaneldirpopular.h +++ b/linden/indra/newview/llpaneldirpopular.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpaneldisplay.cpp b/linden/indra/newview/llpaneldisplay.cpp index a8611b1..d22d1c2 100644 --- a/linden/indra/newview/llpaneldisplay.cpp +++ b/linden/indra/newview/llpaneldisplay.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -66,6 +67,7 @@ #include "pipeline.h" #include "llvieweruictrlfactory.h" #include "llfeaturemanager.h" +#include "llglslshader.h" //RN temporary includes for resolution switching #include "llglheaders.h" @@ -394,11 +396,11 @@ void LLPanelDisplay::onCommitAutoDetectAspect(LLUICtrl *ctrl, void *data) if (numerator != 0) { - snprintf(aspect, sizeof(aspect), "%d:%d", numerator, denominator); /*Flawfinder: ignore*/ + snprintf(aspect, sizeof(aspect), "%d:%d", numerator, denominator); /* Flawfinder: ignore */ } else { - snprintf(aspect, sizeof(aspect), "%.3f", gViewerWindow->mWindow->getNativeAspectRatio()); /*Flawfinder: ignore*/ + snprintf(aspect, sizeof(aspect), "%.3f", gViewerWindow->mWindow->getNativeAspectRatio()); /* Flawfinder: ignore */ } panel->mCtrlAspectRatio->setLabel(aspect); @@ -454,6 +456,7 @@ BOOL LLPanelDisplay2::postBuild() requires("fog", WIDGET_TYPE_SPINNER); requires("particles", WIDGET_TYPE_SPINNER); requires("comp limit", WIDGET_TYPE_SPINNER); + requires("debug beacon line width", WIDGET_TYPE_SPINNER); if (!checkRequirements()) { @@ -486,6 +489,7 @@ void LLPanelDisplay2::refresh() mFogRatio = gSavedSettings.getF32("RenderFogRatio"); mParticleCount = gSavedSettings.getS32("RenderMaxPartCount"); mCompositeLimit = gSavedSettings.getS32("AvatarCompositeLimit"); + mDebugBeaconLineWidth = gSavedSettings.getS32("DebugBeaconLineWidth"); refreshEnabledState(); } @@ -532,6 +536,7 @@ void LLPanelDisplay2::cancel() gSavedSettings.setF32("RenderFogRatio", mFogRatio); gSavedSettings.setS32("RenderMaxPartCount", mParticleCount); gSavedSettings.setS32("AvatarCompositeLimit", mCompositeLimit); + gSavedSettings.setS32("DebugBeaconLineWidth", mDebugBeaconLineWidth); } //============================================================================ @@ -546,6 +551,7 @@ BOOL LLPanelDisplay3::postBuild() requires("bumpshiny", WIDGET_TYPE_CHECKBOX); requires("ripple", WIDGET_TYPE_CHECKBOX); requires("avatarvp", WIDGET_TYPE_CHECKBOX); + requires("shaders", WIDGET_TYPE_CHECKBOX); requires("Avatar Appearance", WIDGET_TYPE_RADIO_GROUP); requires("lighting detail radio", WIDGET_TYPE_RADIO_GROUP); @@ -587,6 +593,13 @@ BOOL LLPanelDisplay3::postBuild() // radio set for terrain detail mode mRadioTerrainDetail = LLUICtrlFactory::getRadioGroupByName(this, "terrain detail radio"); + //---------------------------------------------------------------------------- + // Global Shader Enable + mCtrlShaderEnable = LLUICtrlFactory::getCheckBoxByName(this, "shaders"); + mCtrlShaderEnable->setCommitCallback(&LLPanelDisplay3::onVertexShaderEnable); + mCtrlShaderEnable->setCallbackUserData(this); + + //============================================================================ // Object detail slider @@ -618,6 +631,7 @@ void LLPanelDisplay3::refresh() mBumpShiny = gSavedSettings.getBOOL("RenderObjectBump"); mRippleWater = gSavedSettings.getBOOL("RenderRippleWater"); mAvatarVP = gSavedSettings.getBOOL("RenderAvatarVP"); + mShaderEnable = gSavedSettings.getBOOL("VertexShaderEnable"); mAvatarMode = gSavedSettings.getS32("RenderAvatarMode"); mLightingDetail = gSavedSettings.getS32("RenderLightingDetail"); mTerrainDetail = gSavedSettings.getS32("RenderTerrainDetail"); @@ -632,32 +646,28 @@ void LLPanelDisplay3::refresh() void LLPanelDisplay3::refreshEnabledState() { // Ripple Water - if (gPipeline.getMaxVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT) < 2) - { - mCtrlRippleWater->setEnabled(FALSE); - } + bool ripple = (LLShaderMgr::getMaxVertexShaderLevel(LLShaderMgr::SHADER_ENVIRONMENT) >= 2); + mCtrlRippleWater->setEnabled(ripple ? TRUE : FALSE); + // Avatar Mode - S32 max_avatar_shader = gPipeline.getMaxVertexShaderLevel(LLPipeline::SHADER_AVATAR); - if (max_avatar_shader == 0) - { - mCtrlAvatarVP->setEnabled(FALSE); - } - else - { - mCtrlAvatarVP->setEnabled(TRUE); - } + S32 max_avatar_shader = LLShaderMgr::getMaxVertexShaderLevel(LLShaderMgr::SHADER_AVATAR); + mCtrlAvatarVP->setEnabled((max_avatar_shader > 0) ? TRUE : FALSE); if (gSavedSettings.getBOOL("RenderAvatarVP") == FALSE) { max_avatar_shader = 1; } - max_avatar_shader = llmax(max_avatar_shader, 1); - for (S32 i = 0; i < mCtrlAvatarMode->getItemCount(); i++) { mCtrlAvatarMode->setIndexEnabled(i, i < max_avatar_shader); } + if (mCtrlAvatarMode->getSelectedIndex() >= max_avatar_shader) + { + mCtrlAvatarMode->setSelectedIndex(llmax(max_avatar_shader-1,0)); + } + // Vertex Shaders + mCtrlShaderEnable->setEnabled(gPipeline.canUseVertexShaders()); } void LLPanelDisplay3::apply() diff --git a/linden/indra/newview/llpaneldisplay.h b/linden/indra/newview/llpaneldisplay.h index 305b290..b4db723 100644 --- a/linden/indra/newview/llpaneldisplay.h +++ b/linden/indra/newview/llpaneldisplay.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -100,6 +101,7 @@ protected: F32 mFogRatio; S32 mParticleCount; S32 mCompositeLimit; + S32 mDebugBeaconLineWidth; }; @@ -123,6 +125,7 @@ protected: LLCheckBoxCtrl *mCtrlBumpShiny; LLCheckBoxCtrl *mCtrlRippleWater; LLCheckBoxCtrl *mCtrlAvatarVP; + LLCheckBoxCtrl *mCtrlShaderEnable; LLRadioGroup *mCtrlAvatarMode; LLRadioGroup *mRadioLightingDetail2; @@ -136,6 +139,7 @@ protected: BOOL mBumpShiny; BOOL mRippleWater; BOOL mAvatarVP; + BOOL mShaderEnable; S32 mAvatarMode; S32 mLightingDetail; S32 mTerrainDetail; diff --git a/linden/indra/newview/llpanelevent.cpp b/linden/indra/newview/llpanelevent.cpp index 9478ea2..1f2fb37 100644 --- a/linden/indra/newview/llpanelevent.cpp +++ b/linden/indra/newview/llpanelevent.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -50,17 +51,17 @@ #include "llvieweruictrlfactory.h" //static -LLLinkedList LLPanelEvent::sAllPanels; +std::list LLPanelEvent::sAllPanels; LLPanelEvent::LLPanelEvent() : LLPanel("Event Panel") { - sAllPanels.addData(this); + sAllPanels.push_back(this); } LLPanelEvent::~LLPanelEvent() { - sAllPanels.removeData(this); + sAllPanels.remove(this); } @@ -156,11 +157,9 @@ void LLPanelEvent::processEventInfoReply(LLMessageSystem *msg, void **) msg->getU32("EventData", "EventID", event_id); // look up all panels which have this avatar - LLPanelEvent *self = NULL; - - - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) { + LLPanelEvent* self = *iter; // Skip updating panels which aren't for this event if (self->mEventID != event_id) { @@ -174,7 +173,7 @@ void LLPanelEvent::processEventInfoReply(LLMessageSystem *msg, void **) self->mTBDate->setText(self->mEventInfo.mTimeStr); self->mTBDesc->setText(self->mEventInfo.mDesc); - snprintf(buffer, sizeof(buffer), "%d:%.2d", self->mEventInfo.mDuration / 60, self->mEventInfo.mDuration % 60); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "%d:%.2d", self->mEventInfo.mDuration / 60, self->mEventInfo.mDuration % 60); /* Flawfinder: ignore */ self->mTBDuration->setText(buffer); @@ -184,7 +183,7 @@ void LLPanelEvent::processEventInfoReply(LLMessageSystem *msg, void **) } else { - snprintf(buffer, sizeof(buffer), "%d", self->mEventInfo.mCover); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "%d", self->mEventInfo.mCover); /* Flawfinder: ignore */ self->mTBCover->setText(buffer); } @@ -195,7 +194,7 @@ void LLPanelEvent::processEventInfoReply(LLMessageSystem *msg, void **) S32 region_y = llround(global_y) % REGION_WIDTH_UNITS; S32 region_z = llround((F32)self->mEventInfo.mPosGlobal.mdV[VZ]); - snprintf(buffer, sizeof(buffer), "%s (%d, %d, %d)", self->mEventInfo.mSimName.c_str(), region_x, region_y, region_z); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "%s (%d, %d, %d)", self->mEventInfo.mSimName.c_str(), region_x, region_y, region_z); /* Flawfinder: ignore */ self->mTBLocation->setText(buffer); if (self->mEventInfo.mEventFlags & EVENT_FLAG_MATURE) diff --git a/linden/indra/newview/llpanelevent.h b/linden/indra/newview/llpanelevent.h index dce6a2f..5f92483 100644 --- a/linden/indra/newview/llpanelevent.h +++ b/linden/indra/newview/llpanelevent.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -87,7 +88,8 @@ protected: LLButton* mCreateEventBtn; LLButton* mNotifyBtn; - static LLLinkedList sAllPanels; + typedef std::list panel_list_t; + static panel_list_t sAllPanels; }; #endif // LL_LLPANELEVENT_H diff --git a/linden/indra/newview/llpanelface.cpp b/linden/indra/newview/llpanelface.cpp index c69d765..8f24c55 100644 --- a/linden/indra/newview/llpanelface.cpp +++ b/linden/indra/newview/llpanelface.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelface.h b/linden/indra/newview/llpanelface.h index c68e996..b41d0e5 100644 --- a/linden/indra/newview/llpanelface.h +++ b/linden/indra/newview/llpanelface.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelgeneral.cpp b/linden/indra/newview/llpanelgeneral.cpp index 5db0ee3..900598a 100644 --- a/linden/indra/newview/llpanelgeneral.cpp +++ b/linden/indra/newview/llpanelgeneral.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelgeneral.h b/linden/indra/newview/llpanelgeneral.h index f9ee53f..9f70560 100644 --- a/linden/indra/newview/llpanelgeneral.h +++ b/linden/indra/newview/llpanelgeneral.h @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelgroup.cpp b/linden/indra/newview/llpanelgroup.cpp index ce7c67a..6710c43 100644 --- a/linden/indra/newview/llpanelgroup.cpp +++ b/linden/indra/newview/llpanelgroup.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelgroup.h b/linden/indra/newview/llpanelgroup.h index d17c200..782f28a 100644 --- a/linden/indra/newview/llpanelgroup.h +++ b/linden/indra/newview/llpanelgroup.h @@ -3,6 +3,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelgroupgeneral.cpp b/linden/indra/newview/llpanelgroupgeneral.cpp index e99f341..67a0c31 100644 --- a/linden/indra/newview/llpanelgroupgeneral.cpp +++ b/linden/indra/newview/llpanelgroupgeneral.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -165,6 +166,7 @@ BOOL LLPanelGroupGeneral::postBuild() { mCtrlMature->setCommitCallback(onCommitAny); mCtrlMature->setCallbackUserData(this); + mCtrlMature->setVisible( gAgent.mAccess > SIM_ACCESS_PG ); } mCtrlOpenEnrollment = (LLCheckBoxCtrl*) getChildByName("open_enrollement", recurse); @@ -466,7 +468,17 @@ bool LLPanelGroupGeneral::apply(LLString& mesg) if (mCtrlPublishOnWeb) gdatap->mAllowPublish = mCtrlPublishOnWeb->get(); if (mEditCharter) gdatap->mCharter = mEditCharter->getText(); if (mInsignia) gdatap->mInsigniaID = mInsignia->getImageAssetID(); - if (mCtrlMature) gdatap->mMaturePublish = mCtrlMature->get(); + if (mCtrlMature) + { + if (gAgent.mAccess > SIM_ACCESS_PG) + { + gdatap->mMaturePublish = mCtrlMature->get(); + } + else + { + gdatap->mMaturePublish = FALSE; + } + } if (mCtrlShowInGroupList) gdatap->mShowInList = mCtrlShowInGroupList->get(); } @@ -617,6 +629,7 @@ void LLPanelGroupGeneral::update(LLGroupChange gc) { mCtrlMature->set(gdatap->mMaturePublish); mCtrlMature->setEnabled(mAllowEdit && can_change_ident); + mCtrlMature->setVisible( gAgent.mAccess > SIM_ACCESS_PG ); } if (mCtrlOpenEnrollment) { @@ -646,7 +659,7 @@ void LLPanelGroupGeneral::update(LLGroupChange gc) if ( visible ) { - snprintf(fee_buff, sizeof(fee_buff), "Join (L$%d)", gdatap->mMembershipFee); /*Flawfinder: ignore*/ + snprintf(fee_buff, sizeof(fee_buff), "Join (L$%d)", gdatap->mMembershipFee); /* Flawfinder: ignore */ mBtnJoinGroup->setLabelSelected(std::string(fee_buff)); mBtnJoinGroup->setLabelUnselected(std::string(fee_buff)); } @@ -702,12 +715,14 @@ void LLPanelGroupGeneral::update(LLGroupChange gc) } else { - LLScrollListItem* row = new LLScrollListItem( TRUE, NULL, LLUUID::null ); std::stringstream pending; pending << "Retrieving member list (" << gdatap->mMembers.size() << "\\" << gdatap->mMemberCount << ")"; - row->addColumn(pending.str(), LLFontGL::sSansSerif); + + LLSD row; + row["columns"][0]["value"] = pending.str(); + mListVisibleMembers->setEnabled(FALSE); - mListVisibleMembers->addItem(row); + mListVisibleMembers->addElement(row); } } } diff --git a/linden/indra/newview/llpanelgroupgeneral.h b/linden/indra/newview/llpanelgroupgeneral.h index 2bd1100..22990a9 100644 --- a/linden/indra/newview/llpanelgroupgeneral.h +++ b/linden/indra/newview/llpanelgroupgeneral.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelgroupinvite.cpp b/linden/indra/newview/llpanelgroupinvite.cpp index bc0d8d1..7e5429f 100644 --- a/linden/indra/newview/llpanelgroupinvite.cpp +++ b/linden/indra/newview/llpanelgroupinvite.cpp @@ -3,6 +3,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -118,11 +119,11 @@ void LLPanelGroupInvite::impl::addUsers(const std::vector& names, } //add the name to the names list - const BOOL enabled = TRUE; - LLScrollListItem* row = new LLScrollListItem( - enabled, NULL, id); - row->addColumn(name.c_str(), LLFontGL::sSansSerif); - mInvitees->addItem(row); + LLSD row; + row["id"] = id; + row["columns"][0]["value"] = name; + + mInvitees->addElement(row); } } diff --git a/linden/indra/newview/llpanelgroupinvite.h b/linden/indra/newview/llpanelgroupinvite.h index ff4ce62..260b091 100644 --- a/linden/indra/newview/llpanelgroupinvite.h +++ b/linden/indra/newview/llpanelgroupinvite.h @@ -3,6 +3,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelgrouplandmoney.cpp b/linden/indra/newview/llpanelgrouplandmoney.cpp index 21f4d4b..02aaec4 100644 --- a/linden/indra/newview/llpanelgrouplandmoney.cpp +++ b/linden/indra/newview/llpanelgrouplandmoney.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -242,7 +243,7 @@ void LLPanelGroupLandMoney::impl::setYourMaxContributionTextBox(int max) char buffer[MAX_STRING]; /*Flawfinder: ignore*/ buffer[0] = '\0'; - snprintf(buffer, sizeof(buffer), "(%d max)", max); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "(%d max)", max); /* Flawfinder: ignore */ if ( mYourContributionMaxTextp ) { mYourContributionMaxTextp->setText(buffer); @@ -308,14 +309,14 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg) S32 total_contribution; msg->getS32("QueryData", "ActualArea", total_contribution, 0); char buffer[MAX_STRING]; /*Flawfinder: ignore*/ - snprintf(buffer, sizeof(buffer), "%d sq. meters", total_contribution); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "%d sq. meters", total_contribution); /* Flawfinder: ignore */ mTotalContributedLandp->setText(buffer); S32 committed; msg->getS32("QueryData", "BillableArea", committed, 0); - snprintf(buffer, sizeof(buffer), "%d sq. meters", committed); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "%d sq. meters", committed); /* Flawfinder: ignore */ mTotalLandInUsep->setText(buffer); S32 available = total_contribution - committed; - snprintf(buffer, sizeof(buffer), "%d sq. meters", available); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "%d sq. meters", available); /* Flawfinder: ignore */ mLandAvailablep->setText(buffer); buffer[0] = '\0'; if ( mGroupOverLimitTextp && mGroupOverLimitIconp ) @@ -359,18 +360,18 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg) S32 region_x = llround(global_x) % REGION_WIDTH_UNITS; S32 region_y = llround(global_y) % REGION_WIDTH_UNITS; char location[MAX_STRING]; /*Flawfinder: ignore*/ - snprintf(location, MAX_STRING, "%s (%d, %d)", sim_name, region_x, region_y); /*Flawfinder: ignore*/ + snprintf(location, MAX_STRING, "%s (%d, %d)", sim_name, region_x, region_y); /* Flawfinder: ignore */ char area[MAX_STRING]; /*Flawfinder: ignore*/ if(billable_area == actual_area) { - snprintf(area, MAX_STRING, "%d", billable_area); /*Flawfinder: ignore*/ + snprintf(area, MAX_STRING, "%d", billable_area); /* Flawfinder: ignore */ } else { - snprintf(area, MAX_STRING, "%d / %d", billable_area, actual_area); /*Flawfinder: ignore*/ + snprintf(area, MAX_STRING, "%d / %d", billable_area, actual_area); /* Flawfinder: ignore */ } char hidden[MAX_STRING]; /*Flawfinder: ignore*/ - snprintf(hidden, MAX_STRING, "%f %f", global_x, global_y); /*Flawfinder: ignore*/ + snprintf(hidden, MAX_STRING, "%f %f", global_x, global_y); /* Flawfinder: ignore */ LLSD row; @@ -996,7 +997,7 @@ void LLGroupMoneyDetailsTabEventHandler::processReply(LLMessageSystem* msg, return; } - snprintf(line, MAX_STRING, "%s\n\n", start_date); /*Flawfinder: ignore*/ + snprintf(line, MAX_STRING, "%s\n\n", start_date); /* Flawfinder: ignore */ text.append(line); S32 total_amount = 0; @@ -1011,7 +1012,7 @@ void LLGroupMoneyDetailsTabEventHandler::processReply(LLMessageSystem* msg, if (amount != 0) { - snprintf(line, MAX_STRING, "%-24s %6d\n", desc, amount ); /*Flawfinder: ignore*/ + snprintf(line, MAX_STRING, "%-24s %6d\n", desc, amount ); /* Flawfinder: ignore */ text.append(line); } else @@ -1024,7 +1025,7 @@ void LLGroupMoneyDetailsTabEventHandler::processReply(LLMessageSystem* msg, text.append(1, '\n'); - snprintf(line, MAX_STRING, "%-24s %6d\n", "Total", total_amount ); /*Flawfinder: ignore*/ + snprintf(line, MAX_STRING, "%-24s %6d\n", "Total", total_amount ); /* Flawfinder: ignore */ text.append(line); if ( mImplementationp->mTextEditorp ) @@ -1141,7 +1142,7 @@ void LLGroupMoneySalesTabEventHandler::processReply(LLMessageSystem* msg, { text.clear(); - snprintf(line, MAX_STRING, "%s\n\n", start_date); /*Flawfinder: ignore*/ + snprintf(line, MAX_STRING, "%s\n\n", start_date); /* Flawfinder: ignore */ text.append(line); } @@ -1196,7 +1197,7 @@ void LLGroupMoneySalesTabEventHandler::processReply(LLMessageSystem* msg, break; } - snprintf(line, sizeof(line), "%s %6d - %s %s %s\n", time, amount, user, verb, item); /*Flawfinder: ignore*/ + snprintf(line, sizeof(line), "%s %6d - %s %s %s\n", time, amount, user, verb, item); /* Flawfinder: ignore */ text.append(line); } } @@ -1349,26 +1350,26 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg, return; } - snprintf(line, MAX_STRING, "Summary for this week, beginning on %s\n", start_date); /*Flawfinder: ignore*/ + snprintf(line, MAX_STRING, "Summary for this week, beginning on %s\n", start_date); /* Flawfinder: ignore */ text.append(line); if (current_interval == 0) { - snprintf(line, MAX_STRING, "The next stipend day is %s\n\n", next_stipend_date); /*Flawfinder: ignore*/ + snprintf(line, MAX_STRING, "The next stipend day is %s\n\n", next_stipend_date); /* Flawfinder: ignore */ text.append(line); - snprintf(line, MAX_STRING, "%-24sL$%6d\n", "Balance", balance ); /*Flawfinder: ignore*/ + snprintf(line, MAX_STRING, "%-24sL$%6d\n", "Balance", balance ); /* Flawfinder: ignore */ text.append(line); text.append(1, '\n'); } - snprintf(line, MAX_STRING, " Group Individual Share\n"); /*Flawfinder: ignore*/ + snprintf(line, MAX_STRING, " Group Individual Share\n"); /* Flawfinder: ignore */ text.append(line); - snprintf(line, MAX_STRING, "%-24s %6d %6d \n", "Credits", total_credits, (S32)floor((F32)total_credits/(F32)non_exempt_members)); /*Flawfinder: ignore*/ + snprintf(line, MAX_STRING, "%-24s %6d %6d \n", "Credits", total_credits, (S32)floor((F32)total_credits/(F32)non_exempt_members)); /* Flawfinder: ignore */ text.append(line); - snprintf(line, MAX_STRING, "%-24s %6d %6d \n", "Debits", total_debits, (S32)floor((F32)total_debits/(F32)non_exempt_members)); /*Flawfinder: ignore*/ + snprintf(line, MAX_STRING, "%-24s %6d %6d \n", "Debits", total_debits, (S32)floor((F32)total_debits/(F32)non_exempt_members)); /* Flawfinder: ignore */ text.append(line); - snprintf(line, MAX_STRING, "%-24s %6d %6d \n", "Total", total_credits + total_debits, (S32)floor((F32)(total_credits + total_debits)/(F32)non_exempt_members)); /*Flawfinder: ignore*/ + snprintf(line, MAX_STRING, "%-24s %6d %6d \n", "Total", total_credits + total_debits, (S32)floor((F32)(total_credits + total_debits)/(F32)non_exempt_members)); /* Flawfinder: ignore */ text.append(line); if ( mImplementationp->mTextEditorp ) diff --git a/linden/indra/newview/llpanelgrouplandmoney.h b/linden/indra/newview/llpanelgrouplandmoney.h index c2d860e..6cd4753 100644 --- a/linden/indra/newview/llpanelgrouplandmoney.h +++ b/linden/indra/newview/llpanelgrouplandmoney.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelgroupnotices.cpp b/linden/indra/newview/llpanelgroupnotices.cpp index 2a7cdf5..373f3f2 100644 --- a/linden/indra/newview/llpanelgroupnotices.cpp +++ b/linden/indra/newview/llpanelgroupnotices.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -323,9 +324,16 @@ void LLPanelGroupNotices::setItem(LLPointer inv_item) { mInventoryItem = inv_item; + BOOL item_is_multi = FALSE; + if ( inv_item->getFlags() & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) + { + item_is_multi = TRUE; + }; + LLViewerImage* item_icon = get_item_icon(inv_item->getType(), inv_item->getInventoryType(), - inv_item->getFlags()); + inv_item->getFlags(), + item_is_multi ); mCreateInventoryIcon->setImage(item_icon->getID()); mCreateInventoryIcon->setVisible(TRUE); @@ -482,7 +490,7 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg) { LLUUID icon_id = get_item_icon_uuid( (LLAssetType::EType)asset_type, - LLInventoryType::IT_NONE,FALSE); + LLInventoryType::IT_NONE,FALSE, FALSE); row["columns"][0]["type"] = "icon"; row["columns"][0]["value"] = icon_id; } @@ -498,7 +506,7 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg) row["columns"][3]["column"] = "date"; row["columns"][3]["value"] = buffer; - snprintf(buffer, 30, "%u", timestamp); /*Flawfinder: ignore*/ + snprintf(buffer, 30, "%u", timestamp); /* Flawfinder: ignore */ row["columns"][4]["column"] = "sort"; row["columns"][4]["value"] = buffer; @@ -550,7 +558,7 @@ void LLPanelGroupNotices::showNotice(const char* subject, LLViewerImage* item_icon = get_item_icon(mInventoryOffer->mType, LLInventoryType::IT_TEXTURE, - 0); + 0, FALSE); mViewInventoryIcon->setImage(item_icon->getID()); mViewInventoryIcon->setVisible(TRUE); diff --git a/linden/indra/newview/llpanelgroupnotices.h b/linden/indra/newview/llpanelgroupnotices.h index 194b2b7..ba520e0 100644 --- a/linden/indra/newview/llpanelgroupnotices.h +++ b/linden/indra/newview/llpanelgroupnotices.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelgrouproles.cpp b/linden/indra/newview/llpanelgrouproles.cpp index 59ac556..266ff12 100644 --- a/linden/indra/newview/llpanelgrouproles.cpp +++ b/linden/indra/newview/llpanelgrouproles.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelgrouproles.h b/linden/indra/newview/llpanelgrouproles.h index fda3d40..c3934c6 100644 --- a/linden/indra/newview/llpanelgrouproles.h +++ b/linden/indra/newview/llpanelgrouproles.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelgroupvoting.cpp b/linden/indra/newview/llpanelgroupvoting.cpp index ebe99b1..eca188e 100644 --- a/linden/indra/newview/llpanelgroupvoting.cpp +++ b/linden/indra/newview/llpanelgroupvoting.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -76,16 +77,14 @@ public: void setEnableHistoryList(); void updateQuorumText(); - void addPendingActiveScrollListItem(LLFontGL* font, - unsigned int current, + void addPendingActiveScrollListItem(unsigned int current, unsigned int expected, EAddPosition pos); - void addPendingHistoryScrollListItem(LLFontGL* font, - unsigned int current, + void addPendingHistoryScrollListItem(unsigned int current, unsigned int expected, EAddPosition pos); - void addNoActiveScrollListItem(LLFontGL* font, EAddPosition pos); - void addNoHistoryScrollListItem(LLFontGL* font, EAddPosition pos); + void addNoActiveScrollListItem(EAddPosition pos); + void addNoHistoryScrollListItem(EAddPosition pos); static void processGroupActiveProposalItemReply(LLMessageSystem* msg, @@ -139,8 +138,8 @@ public: int mNumGroupMembers; - std::vector mActiveReceived; - std::vector mHistoryReceived; + std::vector mActiveReceived; + std::vector mHistoryReceived; int mProposalColumnWidths[10]; int mHistoryColumnWidths[10]; @@ -331,7 +330,7 @@ void LLPanelGroupVoting::impl::setEnableVoteProposal() if (already_voted == "Yes") { char message[MAX_STRING]; /*Flawfinder: ignore*/ - snprintf(message, MAX_STRING, "You have voted: %s ", vote_cast.c_str()); /*Flawfinder: ignore*/ + snprintf(message, MAX_STRING, "You have voted: %s ", vote_cast.c_str()); /* Flawfinder: ignore */ mInstructions->setText(message); mBtnYes->setEnabled(FALSE); @@ -523,8 +522,7 @@ void LLPanelGroupVoting::impl::sendGroupProposalsRequest(const LLUUID& group_id) //fill in some text so the user will at least know that //we're pining the server in high latency situations - LLFontGL* font = LLFontGL::sSansSerifSmall; - addPendingActiveScrollListItem(font, 0, 0, ADD_BOTTOM); + addPendingActiveScrollListItem(0, 0, ADD_BOTTOM); mProposals->setCanSelect(FALSE); LLMessageSystem *msg = gMessageSystem; @@ -620,8 +618,7 @@ void LLPanelGroupVoting::impl::sendGroupVoteHistoryRequest(const LLUUID& group_i mHistoryReceived.clear(); //add some text so the user knows we're doing something - LLFontGL* font = LLFontGL::sSansSerifSmall; - addPendingHistoryScrollListItem(font, 0, 0, ADD_BOTTOM); + addPendingHistoryScrollListItem(0, 0, ADD_BOTTOM); mVotesHistory->setCanSelect(FALSE); LLMessageSystem *msg = gMessageSystem; @@ -642,65 +639,58 @@ void LLPanelGroupVoting::impl::updateQuorumText() { //update the quorum count char quorum_text[MAX_STRING]; /*Flawfinder: ignore*/ - snprintf(quorum_text, MAX_STRING, /*Flawfinder: ignore*/ + snprintf(quorum_text, MAX_STRING, /* Flawfinder: ignore */ " out of %d members must vote", mNumGroupMembers); mQuorumText->setText(quorum_text); } } -void LLPanelGroupVoting::impl::addPendingActiveScrollListItem(LLFontGL* font, - unsigned int current, +void LLPanelGroupVoting::impl::addPendingActiveScrollListItem(unsigned int current, unsigned int expected, EAddPosition pos) { - LLScrollListItem* row = new LLScrollListItem( TRUE, NULL, LLUUID::null); - if (!row) return; - std::stringstream pending; pending << "Retrieving active proposals (" << current << "\\" << expected << ")"; - row->addColumn(pending.str(), font); - mProposals->addItem(row, pos); + LLSD row; + row["columns"][0]["value"] = pending.str(); + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + mProposals->addElement(row, pos); } -void LLPanelGroupVoting::impl::addNoActiveScrollListItem(LLFontGL* font, - EAddPosition pos) +void LLPanelGroupVoting::impl::addNoActiveScrollListItem(EAddPosition pos) { - LLScrollListItem* row = new LLScrollListItem( TRUE, NULL, LLUUID::null); - if (!row) return; - - row->addColumn("There are currently no active proposals", font); - mProposals->addItem(row, pos); + LLSD row; + row["columns"][0]["value"] = "There are currently no active proposals"; + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + mProposals->addElement(row, pos); } -void LLPanelGroupVoting::impl::addNoHistoryScrollListItem(LLFontGL* font, - EAddPosition pos) +void LLPanelGroupVoting::impl::addNoHistoryScrollListItem(EAddPosition pos) { - LLScrollListItem* row = new LLScrollListItem( TRUE, NULL, LLUUID::null); - if (!row) return; - - row->addColumn("There are currently no archived proposals", font); - mVotesHistory->addItem(row, pos); + LLSD row; + row["columns"][0]["value"] = "There are currently no archived proposals"; + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + mVotesHistory->addElement(row, pos); } -void LLPanelGroupVoting::impl::addPendingHistoryScrollListItem(LLFontGL* font, - unsigned int current, +void LLPanelGroupVoting::impl::addPendingHistoryScrollListItem(unsigned int current, unsigned int expected, EAddPosition pos) { - LLScrollListItem* row = new LLScrollListItem( TRUE, NULL, LLUUID::null); - if (!row) return; - std::stringstream pending; pending << "Retrieving archived proposals (" << current << "\\" << expected << ")"; - row->addColumn(pending.str(), font); - mVotesHistory->addItem(row, pos); + LLSD row; + row["columns"][0]["value"] = pending.str(); + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + + mVotesHistory->addElement(row, pos); } @@ -753,7 +743,6 @@ void LLPanelGroupVoting::impl::processGroupActiveProposalItemReply(LLMessageSyst F32 majority; S32 quorum; BOOL already_voted; - LLFontGL* font = LLFontGL::sSansSerifSmall; S32 num_proposals = msg->getNumberOfBlocksFast(_PREHASH_ProposalData); msg->getU32Fast(_PREHASH_TransactionData, @@ -762,7 +751,9 @@ void LLPanelGroupVoting::impl::processGroupActiveProposalItemReply(LLMessageSyst //the first item should be indicative that we //are currently receiving information or have it all - self->mProposals->deleteSingleItem(0); + self->mProposals->deleteAllItems(); + // make sure column indices are correct when populating with real data + self->mProposals->clearColumns(); for (int i = 0; i < num_proposals; i++) { @@ -778,23 +769,62 @@ void LLPanelGroupVoting::impl::processGroupActiveProposalItemReply(LLMessageSyst msg->getS32Fast(_PREHASH_ProposalData, _PREHASH_Quorum, quorum, i ); vote_initiator.toString(vote_initiator_string); - snprintf(majority_text, MAX_STRING_NUM_LEN, "%f", majority); /*Flawfinder: ignore*/ - snprintf(quorum_text, MAX_STRING_NUM_LEN, "%i", quorum); /*Flawfinder: ignore*/ + snprintf(majority_text, MAX_STRING_NUM_LEN, "%f", majority); /* Flawfinder: ignore */ + snprintf(quorum_text, MAX_STRING_NUM_LEN, "%i", quorum); /* Flawfinder: ignore */ - LLScrollListItem *row = new LLScrollListItem( TRUE, NULL, vote_id ); - if (!row) return; + LLSD row; S32 index = 0; - - row->addColumn(item_num_string, font, self->mProposalColumnWidths[index++]); // Use less readable datatime for sorting... - row->addColumn(proposal_text, font, self->mProposalColumnWidths[index++]); - row->addColumn(end_datetime, font, self->mProposalColumnWidths[index++]); - row->addColumn(vote_type, font, self->mProposalColumnWidths[index++]); - row->addColumn(already_voted ? "Yes" : "No", font, self->mProposalColumnWidths[index++]); - row->addColumn(start_datetime, font, self->mProposalColumnWidths[index++]); - row->addColumn(vote_cast, font, self->mProposalColumnWidths[index++]); - row->addColumn(vote_initiator_string, font, self->mProposalColumnWidths[index++]); - row->addColumn(quorum_text, font, self->mProposalColumnWidths[index++]); - row->addColumn(majority_text, font, self->mProposalColumnWidths[index++]); + row["id"] = vote_id; + row["columns"][0]["column"] = "item_num"; + row["columns"][0]["value"] = item_num_string; + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + row["columns"][0]["width"] = self->mProposalColumnWidths[index++]; + + row["columns"][1]["column"] = "proposal_text"; + row["columns"][1]["value"] = proposal_text; + row["columns"][1]["font"] = "SANSSERIF_SMALL"; + row["columns"][1]["width"] = self->mProposalColumnWidths[index++]; + + row["columns"][2]["column"] = "end_datetime"; + row["columns"][2]["value"] = end_datetime; + row["columns"][2]["font"] = "SANSSERIF_SMALL"; + row["columns"][2]["width"] = self->mProposalColumnWidths[index++]; + + row["columns"][3]["column"] = "vote_type"; + row["columns"][3]["value"] = vote_type; + row["columns"][3]["font"] = "SANSSERIF_SMALL"; + row["columns"][3]["width"] = self->mProposalColumnWidths[index++]; + + row["columns"][4]["column"] = "already_voted"; + row["columns"][4]["value"] = already_voted ? "Yes" : "No"; + row["columns"][4]["font"] = "SANSSERIF_SMALL"; + row["columns"][4]["width"] = self->mProposalColumnWidths[index++]; + + row["columns"][5]["column"] = "start_datetime"; + row["columns"][5]["value"] = start_datetime; + row["columns"][5]["font"] = "SANSSERIF_SMALL"; + row["columns"][5]["width"] = self->mProposalColumnWidths[index++]; + + row["columns"][6]["column"] = "vote_cast"; + row["columns"][6]["value"] = vote_cast; + row["columns"][6]["font"] = "SANSSERIF_SMALL"; + row["columns"][6]["width"] = self->mProposalColumnWidths[index++]; + + row["columns"][7]["column"] = "vote_initator_string"; + row["columns"][7]["value"] = vote_initiator_string; + row["columns"][7]["font"] = "SANSSERIF_SMALL"; + row["columns"][7]["width"] = self->mProposalColumnWidths[index++]; + + row["columns"][8]["column"] = "quorum_text"; + row["columns"][8]["value"] = quorum_text; + row["columns"][8]["font"] = "SANSSERIF_SMALL"; + row["columns"][8]["width"] = self->mProposalColumnWidths[index++]; + + row["columns"][9]["column"] = "majority_text"; + row["columns"][9]["value"] = majority_text; + row["columns"][9]["font"] = "SANSSERIF_SMALL"; + row["columns"][9]["width"] = self->mProposalColumnWidths[index++]; + self->mActiveReceived.push_back(row); } @@ -803,13 +833,12 @@ void LLPanelGroupVoting::impl::processGroupActiveProposalItemReply(LLMessageSyst { //we are expecting 0 items, put up a message indicating tehre are //no active proposals and make the scroll list unselectable - self->addNoActiveScrollListItem(font, ADD_BOTTOM); + self->addNoActiveScrollListItem(ADD_BOTTOM); self->mProposals->setCanSelect(FALSE); } else if ( (U32)received != num_expected ) { - self->addPendingActiveScrollListItem(font, - received, + self->addPendingActiveScrollListItem(received, num_expected, ADD_BOTTOM); self->mProposals->setCanSelect(FALSE); @@ -817,12 +846,12 @@ void LLPanelGroupVoting::impl::processGroupActiveProposalItemReply(LLMessageSyst else { //all done display all of the items - std::vector::iterator it = self->mActiveReceived.begin(); - std::vector::iterator end = self->mActiveReceived.end(); + std::vector::iterator it = self->mActiveReceived.begin(); + std::vector::iterator end = self->mActiveReceived.end(); for (; it != end; it++) { - self->mProposals->addItem((*it), ADD_SORTED); + self->mProposals->addElement((*it), ADD_SORTED); } self->mProposals->setCanSelect(TRUE); @@ -832,7 +861,6 @@ void LLPanelGroupVoting::impl::processGroupActiveProposalItemReply(LLMessageSyst //static void LLPanelGroupVoting::impl::processGroupVoteHistoryItemReply(LLMessageSystem *msg, void**) { - LLFontGL *font = LLFontGL::sSansSerifSmall; LLUUID agent_id; msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); if (gAgent.getID() != agent_id) @@ -866,13 +894,15 @@ void LLPanelGroupVoting::impl::processGroupVoteHistoryItemReply(LLMessageSystem //explaining that we are attempting to receive information //or are currently receiving information, so we should clear out //the first line - self->mVotesHistory->deleteSingleItem(0); + self->mVotesHistory->deleteAllItems(); + // make sure column indices are correct when populating with real data + self->mVotesHistory->clearColumns(); if ( num_expected == 0 ) { //we are expecting 0 items, put up a message indicating tehre are //no active proposals and make the scroll list unselectable - self->addNoHistoryScrollListItem(font, ADD_BOTTOM); + self->addNoHistoryScrollListItem(ADD_BOTTOM); self->mVotesHistory->setCanSelect(FALSE); return; @@ -911,10 +941,15 @@ void LLPanelGroupVoting::impl::processGroupVoteHistoryItemReply(LLMessageSystem { if (!strcmp(vote_type, "Proposal")) { - LLScrollListItem *row = new LLScrollListItem( TRUE, NULL, vote_id ); - if (!row) return; - row->addColumn(item_num_string, font, self->mHistoryColumnWidths[0]); - + LLSD row; + row["id"] = vote_id; + + S32 index = 0; + row["columns"][0]["column"] = "item_num"; + row["columns"][0]["value"] = item_num_string; + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + row["columns"][0]["width"] = self->mHistoryColumnWidths[index++]; + vote_text.assign(proposal_text); vote_text.append("\n\n--\n"); if (!strcmp(vote_result, "Success")) @@ -935,7 +970,7 @@ void LLPanelGroupVoting::impl::processGroupVoteHistoryItemReply(LLMessageSystem { msg->getStringFast(_PREHASH_VoteItem, _PREHASH_VoteCast, DB_VOTE_RESULT_BUF_SIZE, vote_result, i); msg->getS32Fast(_PREHASH_VoteItem, _PREHASH_NumVotes, num_votes, i); - snprintf(result_msg, MAX_STRING, /*Flawfinder: ignore*/ + snprintf(result_msg, MAX_STRING, /* Flawfinder: ignore */ " %s: %d\n", vote_result, num_votes); @@ -947,11 +982,36 @@ void LLPanelGroupVoting::impl::processGroupVoteHistoryItemReply(LLMessageSystem LLString vote_text_stripped = vote_text; LLString::stripNonprintable(vote_text_stripped); - row->addColumn(vote_text_stripped, font, self->mHistoryColumnWidths[1]); - row->addColumn(end_datetime, font, self->mHistoryColumnWidths[2]); - row->addColumn(vote_type, font, self->mHistoryColumnWidths[3]); - row->addColumn(vote_result, font, self->mHistoryColumnWidths[4]); - row->addColumn(vote_text, font, self->mHistoryColumnWidths[5]); + row["columns"][1]["column"] = "vote_text_stripped"; + row["columns"][1]["value"] = vote_text_stripped; + row["columns"][1]["font"] = "SANSSERIF_SMALL"; + row["columns"][1]["width"] = self->mHistoryColumnWidths[index++]; + + row["columns"][2]["column"] = "end_datetime"; + row["columns"][2]["value"] = end_datetime; + row["columns"][2]["font"] = "SANSSERIF_SMALL"; + row["columns"][2]["width"] = self->mHistoryColumnWidths[index++]; + + row["columns"][3]["column"] = "vote_type"; + row["columns"][3]["value"] = vote_type; + row["columns"][3]["font"] = "SANSSERIF_SMALL"; + row["columns"][3]["width"] = self->mHistoryColumnWidths[index++]; + + row["columns"][4]["column"] = "vote_result"; + row["columns"][4]["value"] = vote_result; + row["columns"][4]["font"] = "SANSSERIF_SMALL"; + row["columns"][4]["width"] = self->mHistoryColumnWidths[index++]; + + row["columns"][5]["column"] = "vote_text"; + row["columns"][5]["value"] = vote_text; + row["columns"][5]["font"] = "SANSSERIF_SMALL"; + row["columns"][5]["width"] = self->mHistoryColumnWidths[index++]; + + //row->addColumn(vote_text_stripped, font, self->mHistoryColumnWidths[1]); + //row->addColumn(end_datetime, font, self->mHistoryColumnWidths[2]); + //row->addColumn(vote_type, font, self->mHistoryColumnWidths[3]); + //row->addColumn(vote_result, font, self->mHistoryColumnWidths[4]); + //row->addColumn(vote_text, font, self->mHistoryColumnWidths[5]); self->mHistoryReceived.push_back(row); } //end if proposal @@ -960,8 +1020,7 @@ void LLPanelGroupVoting::impl::processGroupVoteHistoryItemReply(LLMessageSystem int received = self->mHistoryReceived.size(); if ( (U32)received != num_expected ) { - self->addPendingHistoryScrollListItem(font, - received, + self->addPendingHistoryScrollListItem(received, num_expected, ADD_BOTTOM); self->mVotesHistory->setCanSelect(FALSE); @@ -969,12 +1028,12 @@ void LLPanelGroupVoting::impl::processGroupVoteHistoryItemReply(LLMessageSystem else { //all done display all of the items - std::vector::iterator it = self->mHistoryReceived.begin(); - std::vector::iterator end = self->mHistoryReceived.end(); + std::vector::iterator it = self->mHistoryReceived.begin(); + std::vector::iterator end = self->mHistoryReceived.end(); for (; it != end; it++) { - self->mVotesHistory->addItem((*it), ADD_SORTED); + self->mVotesHistory->addElement((*it), ADD_SORTED); } self->mVotesHistory->setCanSelect(TRUE); diff --git a/linden/indra/newview/llpanelgroupvoting.h b/linden/indra/newview/llpanelgroupvoting.h index d8802ee..38f8e0a 100644 --- a/linden/indra/newview/llpanelgroupvoting.h +++ b/linden/indra/newview/llpanelgroupvoting.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelinput.cpp b/linden/indra/newview/llpanelinput.cpp index 09214d2..ac2b453 100644 --- a/linden/indra/newview/llpanelinput.cpp +++ b/linden/indra/newview/llpanelinput.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelinput.h b/linden/indra/newview/llpanelinput.h index a155460..e22f731 100644 --- a/linden/indra/newview/llpanelinput.h +++ b/linden/indra/newview/llpanelinput.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelinventory.cpp b/linden/indra/newview/llpanelinventory.cpp index d9638fd..2089a6c 100644 --- a/linden/indra/newview/llpanelinventory.cpp +++ b/linden/indra/newview/llpanelinventory.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -93,6 +94,7 @@ protected: LLString mName; mutable LLString mDisplayName; LLPanelInventory* mPanel; + U32 mFlags; LLInventoryItem* findItem() const; @@ -100,7 +102,8 @@ public: LLTaskInvFVBridge( LLPanelInventory* panel, const LLUUID& uuid, - const LLString& name); + const LLString& name, + U32 flags=0); virtual ~LLTaskInvFVBridge( void ) {} virtual LLFontGL::StyleFlags getLabelStyle() const { return LLFontGL::NORMAL; } @@ -152,11 +155,14 @@ public: LLTaskInvFVBridge::LLTaskInvFVBridge( LLPanelInventory* panel, const LLUUID& uuid, - const LLString& name): + const LLString& name, + U32 flags): mUUID(uuid), mName(name), - mPanel(panel) + mPanel(panel), + mFlags(flags) { + } LLInventoryItem* LLTaskInvFVBridge::findItem() const @@ -322,7 +328,13 @@ U32 LLTaskInvFVBridge::getCreationDate() const LLViewerImage* LLTaskInvFVBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0); + BOOL item_is_multi = FALSE; + if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) + { + item_is_multi = TRUE; + } + + return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0, item_is_multi ); } void LLTaskInvFVBridge::openItem() @@ -867,7 +879,7 @@ LLTaskTextureBridge::LLTaskTextureBridge( LLViewerImage* LLTaskTextureBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_TEXTURE, mInventoryType, 0); + return get_item_icon(LLAssetType::AT_TEXTURE, mInventoryType, 0, FALSE); } void LLTaskTextureBridge::openItem() @@ -919,7 +931,7 @@ LLTaskSoundBridge::LLTaskSoundBridge( LLViewerImage* LLTaskSoundBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0); + return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE); } void LLTaskSoundBridge::openItem() @@ -1051,7 +1063,7 @@ LLTaskLandmarkBridge::LLTaskLandmarkBridge( LLViewerImage* LLTaskLandmarkBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, 0); + return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, 0, FALSE); } @@ -1082,7 +1094,7 @@ LLTaskCallingCardBridge::LLTaskCallingCardBridge( LLViewerImage* LLTaskCallingCardBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, 0); + return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, 0, FALSE); } BOOL LLTaskCallingCardBridge::isItemRenameable() const @@ -1122,7 +1134,7 @@ LLTaskScriptBridge::LLTaskScriptBridge( LLViewerImage* LLTaskScriptBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0); + return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); } @@ -1221,9 +1233,14 @@ LLTaskObjectBridge::LLTaskObjectBridge( LLViewerImage* LLTaskObjectBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0); -} + BOOL item_is_multi = FALSE; + if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) + { + item_is_multi = TRUE; + } + return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0, item_is_multi); +} ///---------------------------------------------------------------------------- /// Class LLTaskNotecardBridge @@ -1252,7 +1269,7 @@ LLTaskNotecardBridge::LLTaskNotecardBridge( LLViewerImage* LLTaskNotecardBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0); + return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE); } void LLTaskNotecardBridge::openItem() @@ -1318,7 +1335,7 @@ LLTaskGestureBridge::LLTaskGestureBridge( LLViewerImage* LLTaskGestureBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0); + return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE); } void LLTaskGestureBridge::openItem() @@ -1378,7 +1395,7 @@ LLTaskAnimationBridge::LLTaskAnimationBridge( LLViewerImage* LLTaskAnimationBridge::getIcon() const { - return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0); + return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE); } void LLTaskAnimationBridge::openItem() @@ -1447,7 +1464,6 @@ public: protected: LLAssetType::EType mAssetType; - U32 mWearableType; }; LLTaskWearableBridge::LLTaskWearableBridge( @@ -1456,15 +1472,14 @@ LLTaskWearableBridge::LLTaskWearableBridge( const LLString& name, LLAssetType::EType asset_type, U32 flags) : - LLTaskInvFVBridge(panel, uuid, name), - mAssetType( asset_type ), - mWearableType(flags) + LLTaskInvFVBridge(panel, uuid, name, flags), + mAssetType( asset_type ) { } LLViewerImage* LLTaskWearableBridge::getIcon() const { - return get_item_icon(mAssetType, LLInventoryType::IT_WEARABLE, mWearableType); + return get_item_icon(mAssetType, LLInventoryType::IT_WEARABLE, mFlags, FALSE ); } diff --git a/linden/indra/newview/llpanelinventory.h b/linden/indra/newview/llpanelinventory.h index e6c000e..e56572b 100644 --- a/linden/indra/newview/llpanelinventory.h +++ b/linden/indra/newview/llpanelinventory.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelland.cpp b/linden/indra/newview/llpanelland.cpp index 1b3e146..d49972c 100644 --- a/linden/indra/newview/llpanelland.cpp +++ b/linden/indra/newview/llpanelland.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelland.h b/linden/indra/newview/llpanelland.h index 1bf176b..397bf8d 100644 --- a/linden/indra/newview/llpanelland.h +++ b/linden/indra/newview/llpanelland.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanellandobjects.cpp b/linden/indra/newview/llpanellandobjects.cpp index 6f7a079..c9992a6 100644 --- a/linden/indra/newview/llpanellandobjects.cpp +++ b/linden/indra/newview/llpanellandobjects.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanellandobjects.h b/linden/indra/newview/llpanellandobjects.h index 3e611fd..daf3e35 100644 --- a/linden/indra/newview/llpanellandobjects.h +++ b/linden/indra/newview/llpanellandobjects.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanellandoptions.cpp b/linden/indra/newview/llpanellandoptions.cpp index 76e65e5..508954b 100644 --- a/linden/indra/newview/llpanellandoptions.cpp +++ b/linden/indra/newview/llpanellandoptions.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanellandoptions.h b/linden/indra/newview/llpanellandoptions.h index 9280b31..40d453e 100644 --- a/linden/indra/newview/llpanellandoptions.h +++ b/linden/indra/newview/llpanellandoptions.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanellogin.cpp b/linden/indra/newview/llpanellogin.cpp index 6a0bdb4..5f31216 100644 --- a/linden/indra/newview/llpanellogin.cpp +++ b/linden/indra/newview/llpanellogin.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -401,7 +402,7 @@ BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent) if ( KEY_F1 == key ) { llinfos << "Spawning HTML help window" << llendl; - LLHtmlHelp::show( ); + gViewerHtmlHelp.show(); return TRUE; }; #if ! LL_RELEASE_FOR_DOWNLOAD diff --git a/linden/indra/newview/llpanellogin.h b/linden/indra/newview/llpanellogin.h index 6bd825a..2133044 100644 --- a/linden/indra/newview/llpanellogin.h +++ b/linden/indra/newview/llpanellogin.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelmorph.cpp b/linden/indra/newview/llpanelmorph.cpp index 94d5779..543e0e6 100644 --- a/linden/indra/newview/llpanelmorph.cpp +++ b/linden/indra/newview/llpanelmorph.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelmorph.h b/linden/indra/newview/llpanelmorph.h index f0859db..079f7d7 100644 --- a/linden/indra/newview/llpanelmorph.h +++ b/linden/indra/newview/llpanelmorph.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelmsgs.cpp b/linden/indra/newview/llpanelmsgs.cpp index 08ba343..f25d477 100644 --- a/linden/indra/newview/llpanelmsgs.cpp +++ b/linden/indra/newview/llpanelmsgs.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -69,22 +70,32 @@ void LLPanelMsgs::buildLists() { LLAlertDialogTemplate* alert_temp = iter->second; S32 ignore = alert_temp->getIgnore(); - LLScrollListItem* item = new LLScrollListItem(); - item->setUserdata((void*)&iter->first); - item->addColumn(alert_temp->mIgnoreListText, LLFontGL::sSansSerifSmall, 300); + + LLSD row; + row["columns"][0]["value"] = alert_temp->mIgnoreListText; + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + row["columns"][0]["width"] = 300; + + LLScrollListItem* item = NULL; + + if (ignore) { if (ignore == LLAlertDialog::IGNORE_USE_SAVED) { S32 arg = LLUI::sConfigGroup->getS32("Default" + alert_temp->mIgnoreLabel); - item->addColumn(alert_temp->mOptionDefaultText[arg], LLFontGL::sSansSerifSmall, 160); + row["columns"][1]["value"] = alert_temp->mOptionDefaultText[arg]; + row["columns"][1]["font"] = "SANSSERIF_SMALL"; + row["columns"][1]["width"] = 160; } - mDisabledPopups->addItem(item, ADD_SORTED); + item = mDisabledPopups->addElement(row, ADD_SORTED); } else { - mEnabledPopups->addItem(item, ADD_SORTED); + item = mEnabledPopups->addElement(row, ADD_SORTED); } + + item->setUserdata((void*)&iter->first); } } diff --git a/linden/indra/newview/llpanelmsgs.h b/linden/indra/newview/llpanelmsgs.h index f1231ce..51e0498 100644 --- a/linden/indra/newview/llpanelmsgs.h +++ b/linden/indra/newview/llpanelmsgs.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelnetwork.cpp b/linden/indra/newview/llpanelnetwork.cpp index ef538ba..eaf2075 100644 --- a/linden/indra/newview/llpanelnetwork.cpp +++ b/linden/indra/newview/llpanelnetwork.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelnetwork.h b/linden/indra/newview/llpanelnetwork.h index 051293a..4d54f88 100644 --- a/linden/indra/newview/llpanelnetwork.h +++ b/linden/indra/newview/llpanelnetwork.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelobject.cpp b/linden/indra/newview/llpanelobject.cpp index 590eb63..fb740a4 100644 --- a/linden/indra/newview/llpanelobject.cpp +++ b/linden/indra/newview/llpanelobject.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -447,17 +448,17 @@ void LLPanelObject::getState( ) // Physics checkbox mIsPhysical = root_objectp->usePhysics(); mCheckPhysics->set( mIsPhysical ); - mCheckPhysics->setEnabled( roots_selected==1 + mCheckPhysics->setEnabled( roots_selected>0 && (editable || gAgent.isGodlike()) && !is_flexible); mIsTemporary = root_objectp->flagTemporaryOnRez(); mCheckTemporary->set( mIsTemporary ); - mCheckTemporary->setEnabled( roots_selected==1 && editable ); + mCheckTemporary->setEnabled( roots_selected>0 && editable ); mIsPhantom = root_objectp->flagPhantom(); mCheckPhantom->set( mIsPhantom ); - mCheckPhantom->setEnabled( roots_selected==1 && editable && !is_flexible ); + mCheckPhantom->setEnabled( roots_selected>0 && editable && !is_flexible ); #if 0 // 1.9.2 mCastShadows = root_objectp->flagCastShadows(); diff --git a/linden/indra/newview/llpanelobject.h b/linden/indra/newview/llpanelobject.h index c4f10c5..76b0dab 100644 --- a/linden/indra/newview/llpanelobject.h +++ b/linden/indra/newview/llpanelobject.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelpermissions.cpp b/linden/indra/newview/llpanelpermissions.cpp index 8512342..18ec28e 100644 --- a/linden/indra/newview/llpanelpermissions.cpp +++ b/linden/indra/newview/llpanelpermissions.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -384,7 +385,7 @@ void LLPanelPermissions::refresh() else { char buffer[MAX_STRING]; /*Flawfinder: ignore*/ - snprintf(buffer, MAX_STRING, "%d Objects, ", obj_count); /*Flawfinder: ignore*/ + snprintf(buffer, MAX_STRING, "%d Objects, ", obj_count); /* Flawfinder: ignore */ object_info_string.assign(buffer); } if (1 == prim_count) @@ -394,7 +395,7 @@ void LLPanelPermissions::refresh() else { char buffer[MAX_STRING]; /*Flawfinder: ignore*/ - snprintf(buffer, MAX_STRING, "%d Primitives", prim_count); /*Flawfinder: ignore*/ + snprintf(buffer, MAX_STRING, "%d Primitives", prim_count); /* Flawfinder: ignore */ object_info_string.append(buffer); } childSetText("prim info",object_info_string); diff --git a/linden/indra/newview/llpanelpermissions.h b/linden/indra/newview/llpanelpermissions.h index 5ffba06..9cf7a82 100644 --- a/linden/indra/newview/llpanelpermissions.h +++ b/linden/indra/newview/llpanelpermissions.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelpick.cpp b/linden/indra/newview/llpanelpick.cpp index ddd7934..9dc0aea 100644 --- a/linden/indra/newview/llpanelpick.cpp +++ b/linden/indra/newview/llpanelpick.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -47,6 +48,7 @@ #include "llviewertexteditor.h" #include "lltexturectrl.h" #include "lluiconstants.h" +#include "llviewergenericmessage.h" #include "llvieweruictrlfactory.h" #include "llviewerparcelmgr.h" #include "llworldmap.h" @@ -55,7 +57,7 @@ #include "llviewerwindow.h" //static -LLLinkedList LLPanelPick::sAllPanels; +std::list LLPanelPick::sAllPanels; LLPanelPick::LLPanelPick(BOOL top_pick) : LLPanel("Top Picks Panel"), @@ -78,7 +80,7 @@ LLPanelPick::LLPanelPick(BOOL top_pick) mEnabledCheck(NULL), mSetBtn(NULL) { - sAllPanels.addData(this); + sAllPanels.push_back(this); std::string pick_def_file; if (top_pick) @@ -94,7 +96,7 @@ LLPanelPick::LLPanelPick(BOOL top_pick) LLPanelPick::~LLPanelPick() { - sAllPanels.removeData(this); + sAllPanels.remove(this); } @@ -184,9 +186,10 @@ void LLPanelPick::initNewPick() } -void LLPanelPick::setPickID(const LLUUID& id) +void LLPanelPick::setPickID(const LLUUID& pick_id, const LLUUID& creator_id) { - mPickID = id; + mPickID = pick_id; + mCreatorID = creator_id; } @@ -207,15 +210,12 @@ std::string LLPanelPick::getPickName() void LLPanelPick::sendPickInfoRequest() { - LLMessageSystem *msg = gMessageSystem; - - msg->newMessage("PickInfoRequest"); - msg->nextBlock("AgentData"); - msg->addUUID("AgentID", gAgent.getID() ); - msg->addUUID("SessionID", gAgent.getSessionID()); - msg->nextBlock("Data"); - msg->addUUID("PickID", mPickID); - gAgent.sendReliableMessage(); + // Must ask for a pick based on the creator id because + // the pick database is distributed to the inventory cluster. JC + std::vector strings; + strings.push_back( mCreatorID.asString() ); + strings.push_back( mPickID.asString() ); + send_generic_message("pickinforequest", strings); mDataRequested = TRUE; } @@ -324,7 +324,7 @@ void LLPanelPick::processPickInfoReply(LLMessageSystem *msg, void **) S32 region_y = llround((F32)pos_global.mdV[VY]) % REGION_WIDTH_UNITS; S32 region_z = llround((F32)pos_global.mdV[VZ]); - snprintf(buffer, sizeof(buffer), "%s (%d, %d, %d)", sim_name, region_x, region_y, region_z); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "%s (%d, %d, %d)", sim_name, region_x, region_y, region_z); /* Flawfinder: ignore */ location_text.append(buffer); S32 sort_order; @@ -334,9 +334,9 @@ void LLPanelPick::processPickInfoReply(LLMessageSystem *msg, void **) msg->getBOOL("Data", "Enabled", enabled); // Look up the panel to fill in - LLPanelPick *self = NULL; - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) - { + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) + { + LLPanelPick* self = *iter; // For top picks, must match pick id if (self->mPickID != pick_id) { @@ -359,7 +359,7 @@ void LLPanelPick::processPickInfoReply(LLMessageSystem *msg, void **) self->mLocationEditor->setText(location_text); self->mEnabledCheck->set(enabled); - snprintf(buffer, sizeof(buffer), "%d", sort_order); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "%d", sort_order); /* Flawfinder: ignore */ self->mSortOrderEditor->setText(buffer); } } diff --git a/linden/indra/newview/llpanelpick.h b/linden/indra/newview/llpanelpick.h index 01bf788..21072e4 100644 --- a/linden/indra/newview/llpanelpick.h +++ b/linden/indra/newview/llpanelpick.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -58,13 +59,15 @@ public: /*virtual*/ void draw(); - void refresh(); + /*virtual*/ void refresh(); // Setup a new pick, including creating an id, giving a sane // initial position, etc. void initNewPick(); - void setPickID(const LLUUID& id); + // We need to know the creator id so the database knows which partition + // to query for the pick data. + void setPickID(const LLUUID& pick_id, const LLUUID& creator_id); // Schedules the panel to request data // from the server next time it is drawn. @@ -72,6 +75,7 @@ public: std::string getPickName(); const LLUUID& getPickID() const { return mPickID; } + const LLUUID& getPickCreatorID() const { return mCreatorID; } void sendPickInfoRequest(); void sendPickInfoUpdate(); @@ -112,7 +116,8 @@ protected: LLCheckBoxCtrl* mEnabledCheck; LLButton* mSetBtn; - static LLLinkedList sAllPanels; + typedef std::list panel_list_t; + static panel_list_t sAllPanels; }; #endif // LL_LLPANELPICK_H diff --git a/linden/indra/newview/llpanelplace.cpp b/linden/indra/newview/llpanelplace.cpp index f373e99..a9f11cc 100644 --- a/linden/indra/newview/llpanelplace.cpp +++ b/linden/indra/newview/llpanelplace.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -51,7 +52,7 @@ #include "llweb.h" //static -LLLinkedList LLPanelPlace::sAllPanels; +std::list LLPanelPlace::sAllPanels; LLPanelPlace::LLPanelPlace() : LLPanel("Places Panel"), @@ -59,13 +60,13 @@ LLPanelPlace::LLPanelPlace() mPosGlobal(), mAuctionID(0) { - sAllPanels.addData(this); + sAllPanels.push_back(this); } LLPanelPlace::~LLPanelPlace() { - sAllPanels.removeData(this); + sAllPanels.remove(this); } @@ -158,10 +159,9 @@ void LLPanelPlace::processParcelInfoReply(LLMessageSystem *msg, void **) msg->getUUID("Data", "ParcelID", parcel_id); // look up all panels which have this avatar - LLPanelPlace *self = NULL; - - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) { + LLPanelPlace* self = *iter; if (self->mParcelID != parcel_id) { continue; @@ -193,16 +193,16 @@ void LLPanelPlace::processParcelInfoReply(LLMessageSystem *msg, void **) self->mDescEditor->setText(desc); LLString info; - snprintf(buffer, sizeof(buffer), "Traffic: %.0f, Area: %d sq. m.", dwell, actual_area); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "Traffic: %.0f, Area: %d sq. m.", dwell, actual_area); /* Flawfinder: ignore */ info.append(buffer); if (flags & DFQ_FOR_SALE) { - snprintf(buffer, sizeof(buffer), ", For Sale for L$%d", sale_price); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), ", For Sale for L$%d", sale_price); /* Flawfinder: ignore */ info.append(buffer); } if (auction_id != 0) { - snprintf(buffer, sizeof(buffer), ", Auction ID %010d", auction_id); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), ", Auction ID %010d", auction_id); /* Flawfinder: ignore */ info.append(buffer); } self->mInfoEditor->setText(info); @@ -218,7 +218,7 @@ void LLPanelPlace::processParcelInfoReply(LLMessageSystem *msg, void **) rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE); } - snprintf(buffer, sizeof(buffer), "%s %d, %d, %d (%s)", /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "%s %d, %d, %d (%s)", /* Flawfinder: ignore */ sim_name, region_x, region_y, region_z, rating); self->mLocationEditor->setText(buffer); @@ -281,7 +281,7 @@ void LLPanelPlace::callbackAuctionWebPage(S32 option, void* data) if (0 == option) { char url[256]; /*Flawfinder: ignore*/ - snprintf(url, sizeof(url), "%s%010d", AUCTION_URL, self->mAuctionID); /*Flawfinder: ignore*/ + snprintf(url, sizeof(url), "%s%010d", AUCTION_URL, self->mAuctionID); /* Flawfinder: ignore */ llinfos << "Loading auction page " << url << llendl; diff --git a/linden/indra/newview/llpanelplace.h b/linden/indra/newview/llpanelplace.h index bd01b8c..65dd591 100644 --- a/linden/indra/newview/llpanelplace.h +++ b/linden/indra/newview/llpanelplace.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -83,7 +84,8 @@ protected: //LLButton* mLandmarkBtn; LLButton* mAuctionBtn; - static LLLinkedList sAllPanels; + typedef std::list panel_list_t; + static panel_list_t sAllPanels; }; #endif // LL_LLPANELPLACE_H diff --git a/linden/indra/newview/llpanelvolume.cpp b/linden/indra/newview/llpanelvolume.cpp index 3a8650d..a91eeb7 100644 --- a/linden/indra/newview/llpanelvolume.cpp +++ b/linden/indra/newview/llpanelvolume.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelvolume.h b/linden/indra/newview/llpanelvolume.h index 74f9b60..3f254aa 100644 --- a/linden/indra/newview/llpanelvolume.h +++ b/linden/indra/newview/llpanelvolume.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelweb.cpp b/linden/indra/newview/llpanelweb.cpp index d5805cd..e1e4247 100644 --- a/linden/indra/newview/llpanelweb.cpp +++ b/linden/indra/newview/llpanelweb.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpanelweb.h b/linden/indra/newview/llpanelweb.h index 63922d6..0703f90 100644 --- a/linden/indra/newview/llpanelweb.h +++ b/linden/indra/newview/llpanelweb.h @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpatchvertexarray.cpp b/linden/indra/newview/llpatchvertexarray.cpp index 992423e..bfd4ff4 100644 --- a/linden/indra/newview/llpatchvertexarray.cpp +++ b/linden/indra/newview/llpatchvertexarray.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpatchvertexarray.h b/linden/indra/newview/llpatchvertexarray.h index d85760a..f123c87 100644 --- a/linden/indra/newview/llpatchvertexarray.h +++ b/linden/indra/newview/llpatchvertexarray.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpolymesh.cpp b/linden/indra/newview/llpolymesh.cpp index 2f3dfce..cf94142 100644 --- a/linden/indra/newview/llpolymesh.cpp +++ b/linden/indra/newview/llpolymesh.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -745,7 +746,7 @@ LLPolyMesh *LLPolyMesh::getMesh(const LLString &name, LLPolyMesh* reference_mesh // if not found, create a new one, add it to the list //------------------------------------------------------------------------- char full_path[LL_MAX_PATH]; /*Flawfinder: ignore*/ - snprintf(full_path, LL_MAX_PATH, "%s", (gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,name.c_str())).c_str()); /*Flawfinder: ignore*/ + snprintf(full_path, LL_MAX_PATH, "%s", (gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,name.c_str())).c_str()); /* Flawfinder: ignore */ LLPolyMeshSharedData *mesh_data = new LLPolyMeshSharedData(); if (reference_mesh) @@ -823,7 +824,7 @@ void LLPolyMesh::dumpDiagInfo() S32 num_faces = mesh.mNumFaces; U32 num_kb = mesh.getNumKB(); - snprintf(buf, sizeof(buf), "%8d %8d %8d %s", num_verts, num_faces, num_kb, mesh_name_p->c_str()); /*Flawfinder: ignore*/ + snprintf(buf, sizeof(buf), "%8d %8d %8d %s", num_verts, num_faces, num_kb, mesh_name_p->c_str()); /* Flawfinder: ignore */ llinfos << buf << llendl; total_verts += num_verts; @@ -832,7 +833,7 @@ void LLPolyMesh::dumpDiagInfo() } llinfos << "-----------------------------------------------------" << llendl; - snprintf(buf, sizeof(buf), "%8d %8d %8d TOTAL", total_verts, total_faces, total_kb ); /*Flawfinder: ignore*/ + snprintf(buf, sizeof(buf), "%8d %8d %8d TOTAL", total_verts, total_faces, total_kb ); /* Flawfinder: ignore */ llinfos << buf << llendl; llinfos << "-----------------------------------------------------" << llendl; } diff --git a/linden/indra/newview/llpolymesh.h b/linden/indra/newview/llpolymesh.h index 0d448ac..f3022f5 100644 --- a/linden/indra/newview/llpolymesh.h +++ b/linden/indra/newview/llpolymesh.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpolymorph.cpp b/linden/indra/newview/llpolymorph.cpp index 3937da2..2d1375d 100644 --- a/linden/indra/newview/llpolymorph.cpp +++ b/linden/indra/newview/llpolymorph.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpolymorph.h b/linden/indra/newview/llpolymorph.h index b372398..f867d27 100644 --- a/linden/indra/newview/llpolymorph.h +++ b/linden/indra/newview/llpolymorph.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llprefschat.cpp b/linden/indra/newview/llprefschat.cpp index 2d98ad5..28434ec 100644 --- a/linden/indra/newview/llprefschat.cpp +++ b/linden/indra/newview/llprefschat.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llprefschat.h b/linden/indra/newview/llprefschat.h index 9e19353..71868f7 100644 --- a/linden/indra/newview/llprefschat.h +++ b/linden/indra/newview/llprefschat.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llprefsim.cpp b/linden/indra/newview/llprefsim.cpp index 383fe76..8575113 100644 --- a/linden/indra/newview/llprefsim.cpp +++ b/linden/indra/newview/llprefsim.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llprefsim.h b/linden/indra/newview/llprefsim.h index 6dd0bd1..411253b 100644 --- a/linden/indra/newview/llprefsim.h +++ b/linden/indra/newview/llprefsim.h @@ -5,6 +5,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpreview.cpp b/linden/indra/newview/llpreview.cpp index 534513f..347c6d5 100644 --- a/linden/indra/newview/llpreview.cpp +++ b/linden/indra/newview/llpreview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -328,7 +329,7 @@ BOOL LLPreview::handleMouseDown(S32 x, S32 y, MASK mask) // No handler needed for focus lost since this class has no // state that depends on it. bringToFront(x, y); - gFocusMgr.setMouseCapture(this, NULL); + gFocusMgr.setMouseCapture(this); S32 screen_x; S32 screen_y; localPointToScreen(x, y, &screen_x, &screen_y ); @@ -340,9 +341,9 @@ BOOL LLPreview::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLPreview::handleMouseUp(S32 x, S32 y, MASK mask) { - if(gFocusMgr.getMouseCapture() == this) + if(hasMouseCapture()) { - gFocusMgr.setMouseCapture(NULL, NULL); + gFocusMgr.setMouseCapture(NULL); return TRUE; } return LLFloater::handleMouseUp(x, y, mask); @@ -350,7 +351,7 @@ BOOL LLPreview::handleMouseUp(S32 x, S32 y, MASK mask) BOOL LLPreview::handleHover(S32 x, S32 y, MASK mask) { - if(gFocusMgr.getMouseCapture() == this) + if(hasMouseCapture()) { S32 screen_x; S32 screen_y; diff --git a/linden/indra/newview/llpreview.h b/linden/indra/newview/llpreview.h index 7882b4c..266bdd1 100644 --- a/linden/indra/newview/llpreview.h +++ b/linden/indra/newview/llpreview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpreviewanim.cpp b/linden/indra/newview/llpreviewanim.cpp index bd619b4..ae98fb0 100644 --- a/linden/indra/newview/llpreviewanim.cpp +++ b/linden/indra/newview/llpreviewanim.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -92,11 +93,14 @@ LLPreviewAnim::LLPreviewAnim(const std::string& name, const LLRect& rect, const // static void LLPreviewAnim::endAnimCallback( void *userdata ) { - LLPreviewAnim* self = (LLPreviewAnim*) userdata; - - self->childSetValue("Anim play btn", FALSE); - self->childSetValue("Anim audition btn", FALSE); - + LLViewHandle* handlep = ((LLViewHandle*)userdata); + LLFloater* self = getFloaterByHandle(*handlep); + delete handlep; // done with the handle + if (self) + { + self->childSetValue("Anim play btn", FALSE); + self->childSetValue("Anim audition btn", FALSE); + } } // static @@ -124,7 +128,9 @@ void LLPreviewAnim::playAnim( void *userdata ) LLMotion* motion = avatar->findMotion(itemID); if (motion) - motion->setDeactivateCallback(&endAnimCallback, (void *)self); + { + motion->setDeactivateCallback(&endAnimCallback, (void *)(new LLViewHandle(self->getHandle()))); + } } else { @@ -159,7 +165,9 @@ void LLPreviewAnim::auditionAnim( void *userdata ) LLMotion* motion = avatar->findMotion(itemID); if (motion) - motion->setDeactivateCallback(&endAnimCallback, (void *)self); + { + motion->setDeactivateCallback(&endAnimCallback, (void *)(new LLViewHandle(self->getHandle()))); + } } else { @@ -209,8 +217,9 @@ void LLPreviewAnim::onClose(bool app_quitting) LLMotion* motion = avatar->findMotion(item->getAssetUUID()); if (motion) + { motion->setDeactivateCallback(NULL, (void *)NULL); - + } } destroy(); } diff --git a/linden/indra/newview/llpreviewanim.h b/linden/indra/newview/llpreviewanim.h index 307b617..318d36e 100644 --- a/linden/indra/newview/llpreviewanim.h +++ b/linden/indra/newview/llpreviewanim.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpreviewgesture.cpp b/linden/indra/newview/llpreviewgesture.cpp index fdbeb6c..5f657d3 100644 --- a/linden/indra/newview/llpreviewgesture.cpp +++ b/linden/indra/newview/llpreviewgesture.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -793,7 +794,7 @@ void LLPreviewGesture::refresh() mWaitTimeCheck->set(wait_step->mFlags & WAIT_FLAG_TIME); mWaitTimeEditor->setVisible(TRUE); char buffer[16]; /*Flawfinder: ignore*/ - snprintf(buffer, sizeof(buffer), "%.1f", (double)wait_step->mWaitSeconds); /*Flawfinder: ignore*/ + snprintf(buffer, sizeof(buffer), "%.1f", (double)wait_step->mWaitSeconds); /* Flawfinder: ignore */ mWaitTimeEditor->setText(buffer); break; } @@ -1042,11 +1043,11 @@ void LLPreviewGesture::loadUIFromGesture(LLMultiGesture* gesture) if (!new_step) continue; // Create an enabled item with this step - LLScrollListItem* item = new LLScrollListItem(TRUE, new_step); - item->addColumn(new_step->getLabel(), LLFontGL::sSansSerifSmall); - - // Add item to bottom of list - mStepList->addItem(item, ADD_BOTTOM); + LLSD row; + row["columns"][0]["value"] = new_step->getLabel(); + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + LLScrollListItem* item = mStepList->addElement(row); + item->setUserdata(new_step); } } @@ -1591,12 +1592,11 @@ LLScrollListItem* LLPreviewGesture::addStep(const std::string& library_text) } // Create an enabled item with this step - LLScrollListItem* step_item = new LLScrollListItem(TRUE, step); - std::string label = step->getLabel(); - step_item->addColumn(label, LLFontGL::sSansSerifSmall); - - // Add item to bottom of list - mStepList->addItem(step_item, ADD_BOTTOM); + LLSD row; + row["columns"][0]["value"] = step->getLabel(); + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + LLScrollListItem* step_item = mStepList->addElement(row); + step_item->setUserdata(step); // And move selection to the list on the right mLibraryList->deselectAllItems(); diff --git a/linden/indra/newview/llpreviewgesture.h b/linden/indra/newview/llpreviewgesture.h index c03fd3e..e0ccffd 100644 --- a/linden/indra/newview/llpreviewgesture.h +++ b/linden/indra/newview/llpreviewgesture.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpreviewlandmark.cpp b/linden/indra/newview/llpreviewlandmark.cpp index b56e7a5..f4637dd 100644 --- a/linden/indra/newview/llpreviewlandmark.cpp +++ b/linden/indra/newview/llpreviewlandmark.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpreviewlandmark.h b/linden/indra/newview/llpreviewlandmark.h index 98b2c73..76ab452 100644 --- a/linden/indra/newview/llpreviewlandmark.h +++ b/linden/indra/newview/llpreviewlandmark.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpreviewnotecard.cpp b/linden/indra/newview/llpreviewnotecard.cpp index fe5ade2..1c59bb4 100644 --- a/linden/indra/newview/llpreviewnotecard.cpp +++ b/linden/indra/newview/llpreviewnotecard.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -605,7 +606,7 @@ void LLPreviewNotecard::onSaveComplete(const LLUUID& asset_uuid, void* user_data char uuid_string[UUID_STR_LENGTH]; /*Flawfinder: ignore*/ asset_uuid.toString(uuid_string); char filename[LL_MAX_PATH]; /*Flawfinder: ignore*/ - snprintf(filename, LL_MAX_PATH, "%s.tmp", gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_string).c_str()); /*Flawfinder: ignore*/ + snprintf(filename, LL_MAX_PATH, "%s.tmp", gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_string).c_str()); /* Flawfinder: ignore */ LLFile::remove(filename); delete info; } diff --git a/linden/indra/newview/llpreviewnotecard.h b/linden/indra/newview/llpreviewnotecard.h index 9b72ec8..89352e8 100644 --- a/linden/indra/newview/llpreviewnotecard.h +++ b/linden/indra/newview/llpreviewnotecard.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpreviewscript.cpp b/linden/indra/newview/llpreviewscript.cpp index 75371b2..39938d4 100644 --- a/linden/indra/newview/llpreviewscript.cpp +++ b/linden/indra/newview/llpreviewscript.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -76,6 +77,7 @@ #include "llviewertexteditor.h" #include "llviewerwindow.h" #include "llvieweruictrlfactory.h" +#include "llwebbrowserctrl.h" #include "lluictrlfactory.h" #include "viewer.h" @@ -134,6 +136,9 @@ const S32 SCRIPT_SEARCH_HEIGHT = 120; const S32 SCRIPT_SEARCH_LABEL_WIDTH = 50; const S32 SCRIPT_SEARCH_BUTTON_WIDTH = 80; const S32 TEXT_EDIT_COLUMN_HEIGHT = 16; +const S32 MAX_HISTORY_COUNT = 10; +const F32 LIVE_HELP_REFRESH_TIME = 1.f; + /// --------------------------------------------------------------------------- /// LLFloaterScriptSearch /// --------------------------------------------------------------------------- @@ -273,6 +278,7 @@ void LLFloaterScriptSearch::open() /*Flawfinder: ignore*/ LLFloater::open(); /*Flawfinder: ignore*/ childSetFocus("search_text", TRUE); } + /// --------------------------------------------------------------------------- /// LLScriptEdCore /// --------------------------------------------------------------------------- @@ -295,7 +301,9 @@ LLScriptEdCore::LLScriptEdCore( mLoadCallback( load_callback ), mSaveCallback( save_callback ), mUserdata( userdata ), - mForceClose( FALSE ) + mForceClose( FALSE ), + mLastHelpToken(NULL), + mLiveHelpHistorySize(0) { setFollowsAll(); setBorderVisible(FALSE); @@ -355,14 +363,13 @@ LLScriptEdCore::LLScriptEdCore( initMenu(); - // Do the work that addTabPanel() normally does. //LLRect tab_panel_rect( 0, mRect.getHeight(), mRect.getWidth(), 0 ); //tab_panel_rect.stretch( -LLPANEL_BORDER_WIDTH ); //mCodePanel->setFollowsAll(); //mCodePanel->translate( tab_panel_rect.mLeft - mCodePanel->getRect().mLeft, tab_panel_rect.mBottom - mCodePanel->getRect().mBottom); //mCodePanel->reshape( tab_panel_rect.getWidth(), tab_panel_rect.getHeight(), TRUE ); - + } LLScriptEdCore::~LLScriptEdCore() @@ -421,6 +428,9 @@ void LLScriptEdCore::initMenu() menuItem->setMenuCallback(onBtnHelp, this); menuItem->setEnabledCallback(NULL); + menuItem = LLUICtrlFactory::getMenuItemCallByName(this, "LSL Wiki Help..."); + menuItem->setMenuCallback(onBtnDynamicHelp, this); + menuItem->setEnabledCallback(NULL); } BOOL LLScriptEdCore::hasChanged(void* userdata) @@ -442,7 +452,7 @@ void LLScriptEdCore::draw() S32 column = 0; mEditor->getCurrentLineAndColumn( &line, &column, FALSE ); // don't include wordwrap char cursor_pos[STD_STRING_BUF_SIZE]; /*Flawfinder: ignore*/ - snprintf( cursor_pos, STD_STRING_BUF_SIZE, "Line %d, Column %d", line, column ); /*Flawfinder: ignore*/ + snprintf( cursor_pos, STD_STRING_BUF_SIZE, "Line %d, Column %d", line, column ); /* Flawfinder: ignore */ childSetText("line_col", cursor_pos); } else @@ -450,9 +460,135 @@ void LLScriptEdCore::draw() childSetText("line_col", ""); } + updateDynamicHelp(); + LLPanel::draw(); } +void LLScriptEdCore::updateDynamicHelp(BOOL immediate) +{ + LLFloater* help_floater = LLFloater::getFloaterByHandle(mLiveHelpHandle); + if (!help_floater) return; + + // update back and forward buttons + LLButton* fwd_button = LLUICtrlFactory::getButtonByName(help_floater, "fwd_btn"); + LLButton* back_button = LLUICtrlFactory::getButtonByName(help_floater, "back_btn"); + LLWebBrowserCtrl* browser = LLUICtrlFactory::getWebBrowserCtrlByName(help_floater, "lsl_guide_html"); + back_button->setEnabled(browser->canNavigateBack()); + fwd_button->setEnabled(browser->canNavigateForward()); + + if (!immediate && !gSavedSettings.getBOOL("ScriptHelpFollowsCursor")) + { + return; + } + + LLTextSegment* segment = NULL; + std::vector selected_segments; + mEditor->getSelectedSegments(selected_segments); + + // try segments in selection range first + std::vector::iterator segment_iter; + for (segment_iter = selected_segments.begin(); segment_iter != selected_segments.end(); ++segment_iter) + { + if((*segment_iter)->getToken() && (*segment_iter)->getToken()->getType() == LLKeywordToken::WORD) + { + segment = *segment_iter; + break; + } + } + + // then try previous segment in case we just typed it + if (!segment) + { + LLTextSegment* test_segment = mEditor->getPreviousSegment(); + if(test_segment->getToken() && test_segment->getToken()->getType() == LLKeywordToken::WORD) + { + segment = test_segment; + } + } + + if (segment) + { + if (segment->getToken() != mLastHelpToken) + { + mLastHelpToken = segment->getToken(); + mLiveHelpTimer.start(); + } + if (immediate || (mLiveHelpTimer.getStarted() && mLiveHelpTimer.getElapsedTimeF32() > LIVE_HELP_REFRESH_TIME)) + { + LLString help_string = mEditor->getText().substr(segment->getStart(), segment->getEnd() - segment->getStart()); + setHelpPage(help_string); + mLiveHelpTimer.stop(); + } + } + else + { + setHelpPage(""); + } +} + +void LLScriptEdCore::setHelpPage(const LLString& help_string) +{ + LLFloater* help_floater = LLFloater::getFloaterByHandle(mLiveHelpHandle); + if (!help_floater) return; + + LLWebBrowserCtrl* web_browser = gUICtrlFactory->getWebBrowserCtrlByName(help_floater, "lsl_guide_html"); + if (!web_browser) return; + + LLComboBox* history_combo = gUICtrlFactory->getComboBoxByName(help_floater, "history_combo"); + if (!history_combo) return; + + LLUIString url_string = gSavedSettings.getString("LSLHelpURL"); + url_string.setArg("[APP_DIRECTORY]", gDirUtilp->getWorkingDir()); + url_string.setArg("[LSL_STRING]", help_string); + + addHelpItemToHistory(help_string); + web_browser->navigateTo(url_string); +} + +void LLScriptEdCore::addHelpItemToHistory(const LLString& help_string) +{ + if (help_string.empty()) return; + + LLFloater* help_floater = LLFloater::getFloaterByHandle(mLiveHelpHandle); + if (!help_floater) return; + + LLComboBox* history_combo = gUICtrlFactory->getComboBoxByName(help_floater, "history_combo"); + if (!history_combo) return; + + // separate history items from full item list + if (mLiveHelpHistorySize == 0) + { + LLSD row; + row["columns"][0]["type"] = "separator"; + history_combo->addElement(row, ADD_TOP); + } + // delete all history items over history limit + while(mLiveHelpHistorySize > MAX_HISTORY_COUNT - 1) + { + history_combo->remove(mLiveHelpHistorySize - 1); + mLiveHelpHistorySize--; + } + + history_combo->setSimple(help_string); + S32 index = history_combo->getCurrentIndex(); + + // if help string exists in the combo box + if (index >= 0) + { + S32 cur_index = history_combo->getCurrentIndex(); + if (cur_index < mLiveHelpHistorySize) + { + // item found in history, bubble up to top + history_combo->remove(history_combo->getCurrentIndex()); + mLiveHelpHistorySize--; + } + } + history_combo->add(help_string, LLSD(help_string), ADD_TOP); + history_combo->selectFirstItem(); + mLiveHelpHistorySize++; +} + BOOL LLScriptEdCore::canClose() { if(mForceClose || mEditor->isPristine()) @@ -517,6 +653,92 @@ void LLScriptEdCore::onBtnHelp(void* userdata) } // static +void LLScriptEdCore::onBtnDynamicHelp(void* userdata) +{ + LLScriptEdCore* corep = (LLScriptEdCore*)userdata; + + LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle); + if (live_help_floater) + { + live_help_floater->setFocus(TRUE); + corep->updateDynamicHelp(TRUE); + + return; + } + + live_help_floater = new LLFloater("lsl_help"); + gUICtrlFactory->buildFloater(live_help_floater, "floater_lsl_guide.xml"); + ((LLFloater*)corep->getParent())->addDependentFloater(live_help_floater, TRUE); + live_help_floater->childSetCommitCallback("lock_check", onCheckLock, userdata); + live_help_floater->childSetValue("lock_check", gSavedSettings.getBOOL("ScriptHelpFollowsCursor")); + live_help_floater->childSetCommitCallback("history_combo", onHelpComboCommit, userdata); + live_help_floater->childSetAction("back_btn", onClickBack, userdata); + live_help_floater->childSetAction("fwd_btn", onClickForward, userdata); + + LLWebBrowserCtrl* browser = LLUICtrlFactory::getWebBrowserCtrlByName(live_help_floater, "lsl_guide_html"); + browser->setAlwaysRefresh(TRUE); + + LLComboBox* help_combo = LLUICtrlFactory::getComboBoxByName(live_help_floater, "history_combo"); + LLKeywordToken *token; + LLKeywords::word_token_map_t::iterator token_it; + for (token_it = corep->mEditor->mKeywords.mWordTokenMap.begin(); + token_it != corep->mEditor->mKeywords.mWordTokenMap.end(); + ++token_it) + { + token = token_it->second; + help_combo->add(wstring_to_utf8str(token->mToken)); + } + help_combo->sortByName(); + + // re-initialize help variables + corep->mLastHelpToken = NULL; + corep->mLiveHelpHandle = live_help_floater->getHandle(); + corep->mLiveHelpHistorySize = 0; + corep->updateDynamicHelp(TRUE); +} + +//static +void LLScriptEdCore::onClickBack(void* userdata) +{ + LLScriptEdCore* corep = (LLScriptEdCore*)userdata; + LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle); + if (live_help_floater) + { + LLWebBrowserCtrl* browserp = LLUICtrlFactory::getWebBrowserCtrlByName(live_help_floater, "lsl_guide_html"); + if (browserp) + { + browserp->navigateBack(); + } + } +} + +//static +void LLScriptEdCore::onClickForward(void* userdata) +{ + LLScriptEdCore* corep = (LLScriptEdCore*)userdata; + LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle); + if (live_help_floater) + { + LLWebBrowserCtrl* browserp = LLUICtrlFactory::getWebBrowserCtrlByName(live_help_floater, "lsl_guide_html"); + if (browserp) + { + browserp->navigateForward(); + } + } +} + +// static +void LLScriptEdCore::onCheckLock(LLUICtrl* ctrl, void* userdata) +{ + LLScriptEdCore* corep = (LLScriptEdCore*)userdata; + + // clear out token any time we lock the frame, so we will refresh web page immediately when unlocked + gSavedSettings.setBOOL("ScriptHelpFollowsCursor", ctrl->getValue().asBoolean()); + + corep->mLastHelpToken = NULL; +} + +// static void LLScriptEdCore::onBtnInsertSample(void* userdata) { LLScriptEdCore* self = (LLScriptEdCore*) userdata; @@ -528,6 +750,27 @@ void LLScriptEdCore::onBtnInsertSample(void* userdata) } // static +void LLScriptEdCore::onHelpComboCommit(LLUICtrl* ctrl, void* userdata) +{ + LLScriptEdCore* corep = (LLScriptEdCore*)userdata; + + LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle); + if (live_help_floater) + { + LLWebBrowserCtrl* web_browser = gUICtrlFactory->getWebBrowserCtrlByName(live_help_floater, "lsl_guide_html"); + + LLString help_string = ctrl->getValue().asString(); + + corep->addHelpItemToHistory(help_string); + + LLUIString url_string = gSavedSettings.getString("LSLHelpURL"); + url_string.setArg("[APP_DIRECTORY]", gDirUtilp->getWorkingDir()); + url_string.setArg("[LSL_STRING]", help_string); + web_browser->navigateTo(url_string); + } +} + +// static void LLScriptEdCore::onBtnInsertFunction(LLUICtrl *ui, void* userdata) { LLScriptEdCore* self = (LLScriptEdCore*) userdata; @@ -538,6 +781,7 @@ void LLScriptEdCore::onBtnInsertFunction(LLUICtrl *ui, void* userdata) self->mEditor->insertText(self->mFunctions->getSimple()); } self->mEditor->setFocus(TRUE); + self->setHelpPage(self->mFunctions->getSimple()); } // static @@ -878,15 +1122,14 @@ void LLPreviewLSL::callbackLSLCompileFailed(const LLSD& compile_errors) { llinfos << "Compile failed!" << llendl; - const LLFontGL* err_font = gResMgr->getRes(LLFONT_OCRA); - LLScrollListItem* item = NULL; for(LLSD::array_const_iterator line = compile_errors.beginArray(); line < compile_errors.endArray(); line++) { - item = new LLScrollListItem(); - item->addColumn(line->asString(), err_font); - mScriptEd->mErrorList->addItem(item); + LLSD row; + row["columns"][0]["value"] = line->asString(); + row["columns"][0]["font"] = "OCRA"; + mScriptEd->mErrorList->addElement(row); } mScriptEd->selectFirstError(); closeIfNeeded(); @@ -1011,9 +1254,11 @@ void LLPreviewLSL::saveIfNeeded() if(!fp) { llwarns << "Unable to write to " << filename << llendl; - LLScrollListItem* item = new LLScrollListItem(); - item->addColumn("Error writing to local file. Is your hard drive full?", LLFontGL::sSansSerifSmall); - mScriptEd->mErrorList->addItem(item); + + LLSD row; + row["columns"][0]["value"] = "Error writing to local file. Is your hard drive full?"; + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + mScriptEd->mErrorList->addElement(row); return; } @@ -1068,8 +1313,6 @@ void LLPreviewLSL::uploadAssetLegacy(const std::string& filename, std::string dst_filename = llformat("%s.lso", filepath.c_str()); std::string err_filename = llformat("%s.out", filepath.c_str()); - LLScrollListItem* item = NULL; - const LLFontGL* err_font = gResMgr->getRes(LLFONT_OCRA); if(!lscript_compile(filename.c_str(), dst_filename.c_str(), err_filename.c_str(), @@ -1101,9 +1344,11 @@ void LLPreviewLSL::uploadAssetLegacy(const std::string& filename, { line.assign(buffer); LLString::stripNonprintable(line); - item = new LLScrollListItem(); - item->addColumn(line, err_font); - mScriptEd->mErrorList->addItem(item); + + LLSD row; + row["columns"][0]["value"] = line; + row["columns"][0]["font"] = "OCRA"; + mScriptEd->mErrorList->addElement(row); } } fclose(fp); @@ -1195,9 +1440,10 @@ void LLPreviewLSL::onSaveBytecodeComplete(const LLUUID& asset_uuid, void* user_d { if (self) { - LLScrollListItem* item = new LLScrollListItem(); - item->addColumn("Compile successful!", LLFontGL::sSansSerifSmall); - self->mScriptEd->mErrorList->addItem(item); + LLSD row; + row["columns"][0]["value"] = "Compile successful!"; + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + self->mScriptEd->mErrorList->addElement(row); // Find our window and close it if requested. self->getWindow()->decBusyCount(); @@ -1418,15 +1664,14 @@ void LLLiveLSLEditor::callbackLSLCompileSucceeded(const LLUUID& task_id, void LLLiveLSLEditor::callbackLSLCompileFailed(const LLSD& compile_errors) { lldebugs << "Compile failed!" << llendl; - const LLFontGL* err_font = gResMgr->getRes(LLFONT_OCRA); - LLScrollListItem* item = NULL; for(LLSD::array_const_iterator line = compile_errors.beginArray(); line < compile_errors.endArray(); line++) { - item = new LLScrollListItem(); - item->addColumn(line->asString(), err_font); - mScriptEd->mErrorList->addItem(item); + LLSD row; + row["columns"][0]["value"] = line->asString(); + row["columns"][0]["font"] = "OCRA"; + mScriptEd->mErrorList->addElement(row); } mScriptEd->selectFirstError(); closeIfNeeded(); @@ -1788,9 +2033,11 @@ void LLLiveLSLEditor::saveIfNeeded() if(!fp) { llwarns << "Unable to write to " << filename << llendl; - LLScrollListItem* item = new LLScrollListItem(); - item->addColumn("Error writing to local file. Is your hard drive full?", LLFontGL::sSansSerifSmall); - mScriptEd->mErrorList->addItem(item); + + LLSD row; + row["columns"][0]["value"] = "Error writing to local file. Is your hard drive full?"; + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + mScriptEd->mErrorList->addElement(row); return; } LLString utf8text = mScriptEd->mEditor->getText(); @@ -1848,8 +2095,6 @@ void LLLiveLSLEditor::uploadAssetLegacy(const std::string& filename, std::string dst_filename = llformat("%s.lso", filepath.c_str()); std::string err_filename = llformat("%s.out", filepath.c_str()); - LLScrollListItem* item = NULL; - const LLFontGL* err_font = gResMgr->getRes(LLFONT_OCRA); FILE *fp; if(!lscript_compile(filename.c_str(), dst_filename.c_str(), @@ -1878,9 +2123,11 @@ void LLLiveLSLEditor::uploadAssetLegacy(const std::string& filename, { line.assign(buffer); LLString::stripNonprintable(line); - item = new LLScrollListItem(); - item->addColumn(line, err_font); - mScriptEd->mErrorList->addItem(item); + + LLSD row; + row["columns"][0]["value"] = line; + row["columns"][0]["font"] = "OCRA"; + mScriptEd->mErrorList->addElement(row); } } fclose(fp); diff --git a/linden/indra/newview/llpreviewscript.h b/linden/indra/newview/llpreviewscript.h index cdc4df8..4aadc8b 100644 --- a/linden/indra/newview/llpreviewscript.h +++ b/linden/indra/newview/llpreviewscript.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -34,6 +35,7 @@ #include "llinventory.h" #include "llcombobox.h" #include "lliconctrl.h" +#include "llframetimer.h" class LLMessageSystem; @@ -45,6 +47,7 @@ class LLViewerObject; struct LLEntryAndEdCore; class LLMenuBarGL; class LLFloaterScriptSearch; +class LLKeywordToken; // Inner, implementation class. LLPreviewScript and LLLiveScriptEditor each own one of these. class LLScriptEdCore : public LLPanel @@ -79,6 +82,11 @@ public: static void onHelpWebDialog(S32 option, void* userdata); static void onBtnHelp(void* userdata); + static void onBtnDynamicHelp(void* userdata); + static void onCheckLock(LLUICtrl*, void*); + static void onHelpComboCommit(LLUICtrl* ctrl, void* userdata); + static void onClickBack(void* userdata); + static void onClickForward(void* userdata); static void onBtnInsertSample(void*); static void onBtnInsertFunction(LLUICtrl*, void*); static void doSave( void* userdata, BOOL close_after_save ); @@ -110,6 +118,9 @@ public: protected: void deleteBridges(); + void setHelpPage(const LLString& help_string); + void updateDynamicHelp(BOOL immediate = FALSE); + void addHelpItemToHistory(const LLString& help_string); static void onErrorList(LLUICtrl*, void* user_data); @@ -126,6 +137,10 @@ private: LLPanel* mCodePanel; LLScrollListCtrl* mErrorList; LLDynamicArray mBridges; + LLViewHandle mLiveHelpHandle; + LLKeywordToken* mLastHelpToken; + LLFrameTimer mLiveHelpTimer; + S32 mLiveHelpHistorySize; }; diff --git a/linden/indra/newview/llpreviewsound.cpp b/linden/indra/newview/llpreviewsound.cpp index 10130db..63a8226 100644 --- a/linden/indra/newview/llpreviewsound.cpp +++ b/linden/indra/newview/llpreviewsound.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpreviewsound.h b/linden/indra/newview/llpreviewsound.h index ef8c44f..38b34d0 100644 --- a/linden/indra/newview/llpreviewsound.h +++ b/linden/indra/newview/llpreviewsound.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llpreviewtexture.cpp b/linden/indra/newview/llpreviewtexture.cpp index 99d0959..27a9b52 100644 --- a/linden/indra/newview/llpreviewtexture.cpp +++ b/linden/indra/newview/llpreviewtexture.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -476,7 +477,7 @@ void LLPreviewTexture::updateAspectRatio() void LLPreviewTexture::loadAsset() { - mImage = gImageList.getImage(mImageID, MIPMAP_FALSE, FALSE); + mImage = gImageList.getImage(mImageID, MIPMAP_TRUE, FALSE); mImage->setBoostLevel(LLViewerImage::BOOST_PREVIEW); mAssetStatus = PREVIEW_ASSET_LOADING; } diff --git a/linden/indra/newview/llpreviewtexture.h b/linden/indra/newview/llpreviewtexture.h index 1ee69f4..4749dc2 100644 --- a/linden/indra/newview/llpreviewtexture.h +++ b/linden/indra/newview/llpreviewtexture.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llprogressview.cpp b/linden/indra/newview/llprogressview.cpp index dd75c3f..71a1d66 100644 --- a/linden/indra/newview/llprogressview.cpp +++ b/linden/indra/newview/llprogressview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -61,7 +62,7 @@ const S32 ANIMATION_FRAMES = 1; //13; // XUI:translate LLProgressView::LLProgressView(const std::string& name, const LLRect &rect) -: LLView(name, rect, TRUE) +: LLPanel(name, rect, FALSE) { mPercentDone = 0.f; mDrawBackground = TRUE; @@ -138,7 +139,7 @@ void LLProgressView::setVisible(BOOL visible) } else if (!getVisible() && visible) { - gFocusMgr.setTopView(this, NULL); + gFocusMgr.setTopCtrl(this); mFadeTimer.stop(); mProgressTimer.start(); LLView::setVisible(visible); @@ -202,7 +203,7 @@ void LLProgressView::draw() LLView::draw(); if (mFadeTimer.getElapsedTimeF32() > FADE_IN_TIME) { - gFocusMgr.removeTopViewWithoutCallback(this); + gFocusMgr.removeTopCtrlWithoutCallback(this); LLView::setVisible(FALSE); gStartImageGL = NULL; } diff --git a/linden/indra/newview/llprogressview.h b/linden/indra/newview/llprogressview.h index 6c10b0b..ae0ae72 100644 --- a/linden/indra/newview/llprogressview.h +++ b/linden/indra/newview/llprogressview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -28,13 +29,13 @@ #ifndef LL_LLPROGRESSVIEW_H #define LL_LLPROGRESSVIEW_H -#include "llview.h" +#include "llpanel.h" #include "llframetimer.h" class LLImageRaw; class LLButton; -class LLProgressView : public LLView +class LLProgressView : public LLPanel { public: LLProgressView(const std::string& name, const LLRect& rect); diff --git a/linden/indra/newview/llregionposition.cpp b/linden/indra/newview/llregionposition.cpp index 8404ad0..dff6d72 100644 --- a/linden/indra/newview/llregionposition.cpp +++ b/linden/indra/newview/llregionposition.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llregionposition.h b/linden/indra/newview/llregionposition.h index 41d83ff..bbe8472 100644 --- a/linden/indra/newview/llregionposition.h +++ b/linden/indra/newview/llregionposition.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llroam.cpp b/linden/indra/newview/llroam.cpp index b1a993c..8f45c79 100644 --- a/linden/indra/newview/llroam.cpp +++ b/linden/indra/newview/llroam.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llroam.h b/linden/indra/newview/llroam.h index 0202332..758df0e 100644 --- a/linden/indra/newview/llroam.h +++ b/linden/indra/newview/llroam.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llsavedsettingsglue.cpp b/linden/indra/newview/llsavedsettingsglue.cpp index 5b0ae56..6b42c73 100644 --- a/linden/indra/newview/llsavedsettingsglue.cpp +++ b/linden/indra/newview/llsavedsettingsglue.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llsavedsettingsglue.h b/linden/indra/newview/llsavedsettingsglue.h index 2f850e4..398cac0 100644 --- a/linden/indra/newview/llsavedsettingsglue.h +++ b/linden/indra/newview/llsavedsettingsglue.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llselectmgr.cpp b/linden/indra/newview/llselectmgr.cpp index 4e0cb17..598ded9 100644 --- a/linden/indra/newview/llselectmgr.cpp +++ b/linden/indra/newview/llselectmgr.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -51,7 +52,6 @@ #include "lldrawable.h" #include "llfloaterinspect.h" #include "llfloaterproperties.h" -#include "llfloaterrate.h" #include "llfloaterreporter.h" #include "llfloatertools.h" #include "llframetimer.h" @@ -152,8 +152,8 @@ struct LLDeRezInfo LLObjectSelection* get_null_object_selection() { - static LLObjectSelectionHandle null_ptr(new LLObjectSelection()); - return (LLObjectSelection*)null_ptr; + static LLObjectSelection null_selection; + return &null_selection;; } @@ -561,7 +561,7 @@ void LLSelectMgr::deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_s msg->addU32Fast(_PREHASH_ObjectLocalID, (objects[i])->getLocalID()); select_count++; - if(msg->mCurrentSendTotal >= MTUBYTES || select_count >= MAX_OBJECTS_PER_PACKET) + if(msg->isSendFull(NULL) || select_count >= MAX_OBJECTS_PER_PACKET) { msg->sendReliable(regionp->getHost() ); select_count = 0; @@ -2078,7 +2078,7 @@ void LLSelectMgr::packGodlikeHead(void* user_data) void LLSelectMgr::packObjectIDAsParam(LLSelectNode* node, void *) { char buf [MAX_STRING]; /* Flawfinder: ignore */ - snprintf(buf, MAX_STRING, "%u", node->getObject()->getLocalID()); /* Flawfinder: ignore */ + snprintf(buf, MAX_STRING, "%u", node->getObject()->getLocalID()); /* Flawfinder: ignore */ gMessageSystem->nextBlock("ParamList"); gMessageSystem->addString("Parameter", buf); } @@ -4198,7 +4198,7 @@ void LLSelectMgr::sendListToRegions(const LLString& message_name, // if to same simulator and message not too big if ((current_region == last_region) - && (gMessageSystem->mCurrentSendTotal < MTUBYTES) + && (! gMessageSystem->isSendFull(NULL)) && (objects_in_this_packet < MAX_OBJECTS_PER_PACKET)) { // add another instance of the body of the data @@ -4233,7 +4233,7 @@ void LLSelectMgr::sendListToRegions(const LLString& message_name, } // flush messages - if (gMessageSystem->mCurrentSendTotal > 0) + if (gMessageSystem->getCurrentSendTotal() > 0) { gMessageSystem->sendReliable( current_region->getHost()); packets_sent++; @@ -5164,7 +5164,8 @@ void LLSelectNode::saveTextureScaleRatios() F32 s,t; const LLTextureEntry* tep = mObject->getTE(i); tep->getScale(&s,&t); - U32 s_axis, t_axis; + U32 s_axis = 0; + U32 t_axis = 0; gSelectMgr->getTESTAxes(mObject, i, &s_axis, &t_axis); @@ -6238,7 +6239,6 @@ BOOL LLObjectSelection::getOwnershipCost(S32 &cost) } - //----------------------------------------------------------------------------- // getObjectCount() //----------------------------------------------------------------------------- @@ -6574,3 +6574,4 @@ LLViewerObject* LLObjectSelection::getFirstMoveableObject(BOOL get_root) return object; } + diff --git a/linden/indra/newview/llselectmgr.h b/linden/indra/newview/llselectmgr.h index 4b9a550..98c0a7b 100644 --- a/linden/indra/newview/llselectmgr.h +++ b/linden/indra/newview/llselectmgr.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llsky.cpp b/linden/indra/newview/llsky.cpp index 2888d95..40cc532 100644 --- a/linden/indra/newview/llsky.cpp +++ b/linden/indra/newview/llsky.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llsky.h b/linden/indra/newview/llsky.h index 7e39311..f6acb1d 100644 --- a/linden/indra/newview/llsky.h +++ b/linden/indra/newview/llsky.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llspatialpartition.cpp b/linden/indra/newview/llspatialpartition.cpp index 24ac1ca..46b9df9 100644 --- a/linden/indra/newview/llspatialpartition.cpp +++ b/linden/indra/newview/llspatialpartition.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -145,7 +146,7 @@ LLSpatialGroup::~LLSpatialGroup() { sZombieGroups--; } - + LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION); clearDrawMap(); } @@ -216,10 +217,34 @@ void LLSpatialGroup::validate() #if LL_OCTREE_PARANOIA_CHECK sg_assert(!isState(DIRTY)); + sg_assert(!isDead()); LLVector3 myMin = mBounds[0] - mBounds[1]; LLVector3 myMax = mBounds[0] + mBounds[1]; + validateDrawMap(); + + for (element_iter i = getData().begin(); i != getData().end(); ++i) + { + LLDrawable* drawable = *i; + sg_assert(drawable->getSpatialGroup() == this); + if (drawable->getSpatialBridge()) + { + sg_assert(drawable->getSpatialBridge() == mSpatialPartition->asBridge()); + } + + if (drawable->isSpatialBridge()) + { + LLSpatialPartition* part = drawable->asPartition(); + if (!part) + { + llerrs << "Drawable reports it is a spatial bridge but not a partition." << llendl; + } + LLSpatialGroup* group = (LLSpatialGroup*) part->mOctree->getListener(0); + group->validate(); + } + } + for (U32 i = 0; i < mOctreeNode->getChildCount(); ++i) { LLSpatialGroup* group = (LLSpatialGroup*) mOctreeNode->getChild(i)->getListener(0); @@ -245,8 +270,8 @@ void LLSpatialGroup::validate() void validate_draw_info(LLDrawInfo& params) { -#if LL_DEBUG -/* if (params.mVertexBuffer.isNull()) +#if LL_OCTREE_PARANOIA_CHECK + if (params.mVertexBuffer.isNull()) { llerrs << "Draw batch has no vertex buffer." << llendl; } @@ -257,12 +282,12 @@ void validate_draw_info(LLDrawInfo& params) llerrs << "Draw batch has invalid range." << llendl; } - if (params.mEnd >= params.mVertexBuffer->getNumVerts()) + if (params.mEnd >= (U32) params.mVertexBuffer->getNumVerts()) { llerrs << "Draw batch has buffer overrun error." << llendl; } - if (params.mOffset + params.mCount > params.mVertexBuffer->getNumIndices()) + if (params.mOffset + params.mCount > (U32) params.mVertexBuffer->getNumIndices()) { llerrs << "Draw batch has index buffer ovverrun error." << llendl; } @@ -283,13 +308,14 @@ void validate_draw_info(LLDrawInfo& params) llerrs << "Draw batch has vertex buffer index out of range error (index too high)." << llendl; } } - }*/ + } #endif } void LLSpatialGroup::validateDrawMap() { -/* for (draw_map_t::iterator i = mDrawMap.begin(); i != mDrawMap.end(); ++i) +#if LL_OCTREE_PARANOIA_CHECK + for (draw_map_t::iterator i = mDrawMap.begin(); i != mDrawMap.end(); ++i) { std::vector& draw_vec = i->second; for (std::vector::iterator j = draw_vec.begin(); j != draw_vec.end(); ++j) @@ -298,7 +324,8 @@ void LLSpatialGroup::validateDrawMap() validate_draw_info(params); } - }*/ + } +#endif } void LLSpatialGroup::makeStatic() @@ -361,7 +388,7 @@ BOOL LLSpatialGroup::addObject(LLDrawable *drawablep, BOOL add_all, BOOL from_oc } else { - drawablep->setSpatialGroup(this, 0); + drawablep->setSpatialGroup(this); validate_drawable(drawablep); setState(OBJECT_DIRTY | GEOM_DIRTY); mLastAddTime = gFrameTimeSeconds; @@ -369,7 +396,10 @@ BOOL LLSpatialGroup::addObject(LLDrawable *drawablep, BOOL add_all, BOOL from_oc { mBridgeList.push_back((LLSpatialBridge*) drawablep); } - setState(IMAGE_DIRTY); + if (drawablep->getRadius() > 1.f) + { + setState(IMAGE_DIRTY); + } } return TRUE; @@ -570,7 +600,7 @@ BOOL LLSpatialGroup::removeObject(LLDrawable *drawablep, BOOL from_octree) } else { - drawablep->setSpatialGroup(NULL, -1); + drawablep->setSpatialGroup(NULL); setState(GEOM_DIRTY); if (drawablep->isSpatialBridge()) { @@ -883,6 +913,16 @@ void LLSpatialGroup::handleDestruction(const TreeNode* node) { LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION); setState(DEAD); + + for (element_iter i = getData().begin(); i != getData().end(); ++i) + { + LLDrawable* drawable = *i; + if (drawable->getSpatialGroup() == this) + { + drawable->setSpatialGroup(NULL); + } + } + clearDrawMap(); mOcclusionVerts = NULL; mVertexBuffer = NULL; @@ -1124,7 +1164,7 @@ BOOL LLSpatialPartition::remove(LLDrawable *drawablep, LLSpatialGroup *curp) { LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION); - drawablep->setSpatialGroup(NULL, -1); + drawablep->setSpatialGroup(NULL); if (!curp->removeObject(drawablep)) { @@ -1676,8 +1716,9 @@ void LLSpatialPartition::processImagery(LLCamera* camera) gPipeline.mCubeBuffer->initGL(); } + S32 res = gSavedSettings.getS32("RenderReflectionRes"); gPipeline.generateReflectionMap(gPipeline.mCubeBuffer, cube_cam, 128); - gPipeline.blurReflectionMap(gPipeline.mCubeBuffer, cube_map, 64); + gPipeline.blurReflectionMap(gPipeline.mCubeBuffer, cube_map, res); group->mReflectionMap = cube_map; group->setState(LLSpatialGroup::GEOM_DIRTY); } @@ -2152,7 +2193,7 @@ void LLSpatialPartition::doOcclusion(LLCamera* camera) glFlush(); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); } class LLOctreeGet : public LLSpatialGroup::OctreeTraveler diff --git a/linden/indra/newview/llspatialpartition.h b/linden/indra/newview/llspatialpartition.h index 5804a57..5f6d257 100644 --- a/linden/indra/newview/llspatialpartition.h +++ b/linden/indra/newview/llspatialpartition.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llsphere.cpp b/linden/indra/newview/llsphere.cpp index 5c49e6e..3457e0e 100644 --- a/linden/indra/newview/llsphere.cpp +++ b/linden/indra/newview/llsphere.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llsphere.h b/linden/indra/newview/llsphere.h index 5f888ed..29b42ab 100644 --- a/linden/indra/newview/llsphere.h +++ b/linden/indra/newview/llsphere.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llsprite.cpp b/linden/indra/newview/llsprite.cpp index fb56f4d..28ace97 100644 --- a/linden/indra/newview/llsprite.cpp +++ b/linden/indra/newview/llsprite.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llsprite.h b/linden/indra/newview/llsprite.h index a9de306..7ccef73 100644 --- a/linden/indra/newview/llsprite.h +++ b/linden/indra/newview/llsprite.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp index 2fe1190..585f769 100644 --- a/linden/indra/newview/llstartup.cpp +++ b/linden/indra/newview/llstartup.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -54,6 +55,7 @@ #include "llloginflags.h" #include "llmd5.h" #include "llmemorystream.h" +#include "llmessageconfig.h" #include "llregionhandle.h" #include "llsd.h" #include "llsdserialize.h" @@ -86,7 +88,6 @@ #include "llfloatergesture.h" #include "llfloaterland.h" #include "llfloatertopobjects.h" -#include "llfloaterrate.h" #include "llfloatertos.h" #include "llfloaterworldmap.h" #include "llframestats.h" @@ -127,6 +128,7 @@ #include "llviewerassetstorage.h" #include "llviewercamera.h" #include "llviewerdisplay.h" +#include "llviewergenericmessage.h" #include "llviewergesture.h" #include "llviewerimagelist.h" #include "llviewermenu.h" @@ -147,8 +149,8 @@ #include "viewer.h" #include "llmediaengine.h" #include "llfasttimerview.h" +#include "llfloatermap.h" #include "llweb.h" -#include "llfloaterhtml.h" #if LL_LIBXUL_ENABLED #include "llmozlib.h" @@ -233,7 +235,7 @@ void callback_choose_gender(S32 option, void* userdata); void init_start_screen(S32 location_id); void release_start_screen(); void process_connect_to_userserver(LLMessageSystem* msg, void**); - +void reset_login(); // // exported functionality @@ -347,13 +349,16 @@ BOOL idle_startup() { gViewerWindow->alertXml("DisplaySetToSafe"); } - else if (gSavedSettings.getS32("LastFeatureVersion") < gFeatureManagerp->getVersion()) + else if ((gSavedSettings.getS32("LastFeatureVersion") < gFeatureManagerp->getVersion()) && + (gSavedSettings.getS32("LastFeatureVersion") != 0)) { - if (gSavedSettings.getS32("LastFeatureVersion") != 0) - { - gViewerWindow->alertXml("DisplaySetToRecommended"); - } + gViewerWindow->alertXml("DisplaySetToRecommended"); + } + else if (!gViewerWindow->getInitAlert().empty()) + { + gViewerWindow->alertXml(gViewerWindow->getInitAlert()); } + gSavedSettings.setS32("LastFeatureVersion", gFeatureManagerp->getVersion()); LLString xml_file = LLUI::locateSkin("xui_version.xml"); @@ -414,6 +419,7 @@ BOOL idle_startup() port = gSavedSettings.getU32("ConnectionPort"); } + LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); if(!start_messaging_system( message_template_path, port, @@ -522,12 +528,11 @@ BOOL idle_startup() // the locale to protect it, as exotic/non-C locales // causes our code lots of general critical weirdness // and crashness. (SL-35450) - char *saved_locale = setlocale(LC_ALL, NULL); + std::string saved_locale = setlocale(LC_ALL, NULL); #endif // LL_LINUX LLMozLib::getInstance()->init( profileBaseDir, gDirUtilp->getExpandedFilename( LL_PATH_MOZILLA_PROFILE, "" ) ); #if LL_LINUX - if (saved_locale) - setlocale(LC_ALL, saved_locale); + setlocale(LC_ALL, saved_locale.c_str() ); #endif // LL_LINUX std::ostringstream codec; @@ -768,7 +773,7 @@ BOOL idle_startup() if (gUserServerChoice == USERSERVER_OTHER) { gUserServer.setHostByName( server_label.c_str() ); - snprintf(gUserServerName, MAX_STRING, "%s", server_label.c_str()); /* Flawfinder: ignore */ + snprintf(gUserServerName, MAX_STRING, "%s", server_label.c_str()); /* Flawfinder: ignore */ } } @@ -875,7 +880,7 @@ BOOL idle_startup() args["[HOST_NAME]"] = host_name; gViewerWindow->alertXml("UnableToConnect", args, login_alert_done ); - gStartupState = STATE_LOGIN_SHOW; + reset_login(); return FALSE; } break; @@ -912,7 +917,7 @@ BOOL idle_startup() login_alert_status, NULL); // Back up to login screen - gStartupState = STATE_LOGIN_SHOW; + reset_login(); gViewerStats->incStat(LLViewerStats::ST_LOGIN_TIMEOUT_COUNT); } ms_sleep(1); @@ -928,7 +933,7 @@ BOOL idle_startup() gViewerWindow->alertXml("PleaseSelectServer", args, login_alert_done ); - gStartupState = STATE_LOGIN_SHOW; + reset_login(); return FALSE; } @@ -958,16 +963,7 @@ BOOL idle_startup() } llinfos << "Verifying message template..." << llendl; - - // register with the message system so it knows we're - // expecting this message - LLMessageSystem* msg = gMessageSystem; - msg->setHandlerFuncFast(_PREHASH_TemplateChecksumReply, null_message_callback, NULL); - msg->newMessageFast(_PREHASH_SecuredTemplateChecksumRequest); - msg->nextBlockFast(_PREHASH_TokenBlock); - lldebugs << "random token: " << gTemplateToken << llendl; - msg->addUUIDFast(_PREHASH_Token, gTemplateToken); - msg->sendReliable(mt_host); + LLMessageSystem::sendSecureMessageTemplateChecksum(mt_host); timeout.reset(); gStartupState++; @@ -976,40 +972,16 @@ BOOL idle_startup() if (STATE_MESSAGE_TEMPLATE_WAIT == gStartupState) { - U32 remote_template_checksum = 0; - - U8 major_version = 0; - U8 minor_version = 0; - U8 patch_version = 0; - U8 server_version = 0; - U32 flags = 0x0; - LLMessageSystem* msg = gMessageSystem; - while (msg->checkMessages(gFrameCount)) + while (msg->checkAllMessages(gFrameCount, gServicePump)) { - if (msg->isMessageFast(_PREHASH_TemplateChecksumReply)) + if (msg->isTemplateConfirmed()) { - LLUUID token; - msg->getUUID("TokenBlock", "Token", token); - if(token != gTemplateToken) - { - llwarns << "Incorrect token in template checksum reply: " - << token << llendl; - return do_normal_idle; - } - msg->getU32("DataBlock", "Checksum", remote_template_checksum); - msg->getU8 ("DataBlock", "MajorVersion", major_version); - msg->getU8 ("DataBlock", "MinorVersion", minor_version); - msg->getU8 ("DataBlock", "PatchVersion", patch_version); - msg->getU8 ("DataBlock", "ServerVersion", server_version); - msg->getU32("DataBlock", "Flags", flags); - BOOL update_available = FALSE; BOOL mandatory = FALSE; - if (remote_template_checksum != msg->mMessageFileChecksum) + if (!LLMessageSystem::doesTemplateMatch()) { - llinfos << "Message template out of sync" << llendl; // Mandatory update -- message template checksum doesn't match update_available = TRUE; mandatory = TRUE; @@ -1029,6 +1001,7 @@ BOOL idle_startup() quit = TRUE; } } + // Bail out and clean up circuit if (quit) { @@ -1039,7 +1012,6 @@ BOOL idle_startup() } // If we get here, we've got a compatible message template - if (!mandatory) { llinfos << "Message template is current!" << llendl; @@ -1076,7 +1048,7 @@ BOOL idle_startup() NULL); // Back up to login screen - gStartupState = STATE_LOGIN_SHOW; + reset_login(); gViewerStats->incStat(LLViewerStats::ST_LOGIN_TIMEOUT_COUNT); } else @@ -1206,7 +1178,7 @@ BOOL idle_startup() } // Process messages to keep from dropping circuit. LLMessageSystem* msg = gMessageSystem; - while (msg->checkMessages(gFrameCount)) + while (msg->checkAllMessages(gFrameCount, gServicePump)) { } msg->processAcks(); @@ -1231,7 +1203,7 @@ BOOL idle_startup() } // Process messages to keep from dropping circuit. LLMessageSystem* msg = gMessageSystem; - while (msg->checkMessages(gFrameCount)) + while (msg->checkAllMessages(gFrameCount, gServicePump)) { } msg->processAcks(); @@ -1622,7 +1594,7 @@ BOOL idle_startup() LLStringBase::format_map_t args; args["[ERROR_MESSAGE]"] = emsg.str(); gViewerWindow->alertXml("ErrorMessage", args, login_alert_done); - gStartupState = STATE_LOGIN_SHOW; + reset_login(); gAutoLogin = FALSE; show_connect_box = TRUE; } @@ -1639,7 +1611,7 @@ BOOL idle_startup() LLStringBase::format_map_t args; args["[ERROR_MESSAGE]"] = emsg.str(); gViewerWindow->alertXml("ErrorMessage", args, login_alert_done); - gStartupState = STATE_LOGIN_SHOW; + reset_login(); gAutoLogin = FALSE; show_connect_box = TRUE; } @@ -1937,7 +1909,7 @@ BOOL idle_startup() ++gStartupState; } LLMessageSystem* msg = gMessageSystem; - while (msg->checkMessages(gFrameCount)) + while (msg->checkAllMessages(gFrameCount, gServicePump)) { } msg->processAcks(); @@ -1956,8 +1928,7 @@ BOOL idle_startup() LLMessageSystem* msg = gMessageSystem; msg->setHandlerFuncFast( _PREHASH_AgentMovementComplete, - process_agent_movement_complete, - NULL); + process_agent_movement_complete); LLViewerRegion* regionp = gAgent.getRegion(); if(!gRunLocal && regionp) { @@ -1994,9 +1965,9 @@ BOOL idle_startup() if (STATE_AGENT_WAIT == gStartupState) { LLMessageSystem* msg = gMessageSystem; - while (msg->checkMessages(gFrameCount)) + while (msg->checkAllMessages(gFrameCount, gServicePump)) { - if (msg->isMessageFast(_PREHASH_AgentMovementComplete)) + if (gAgentMovementCompleted) { gStartupState++; // Sometimes we have more than one message in the @@ -2794,7 +2765,7 @@ void on_userserver_name_resolved( BOOL success, const LLString& host_name, U32 i LLStringBase::format_map_t args; args["[HOST_NAME]"] = host_name; gViewerWindow->alertXml("SetByHostFail", args, login_alert_done ); - gStartupState = STATE_LOGIN_SHOW; + reset_login(); } } @@ -2896,7 +2867,7 @@ void update_dialog_callback(S32 option, void *userdata) { app_force_quit(); // Bump them back to the login screen. - //gStartupState = STATE_LOGIN_SHOW; + //reset_login(); } else { @@ -2904,7 +2875,21 @@ void update_dialog_callback(S32 option, void *userdata) } return; } - + + LLSD query_map = LLSD::emptyMap(); + // *TODO place os string in a global constant +#if LL_WINDOWS + query_map["os"] = "win"; +#elif LL_DARWIN + query_map["os"] = "mac"; +#elif LL_LINUX + query_map["os"] = "lnx"; +#endif + query_map["userserver"] = gUserServerName; + query_map["channel"] = gChannelName; + // *TODO constantize this guy + LLURI update_url = LLURI::buildHTTP("secondlife.com", 80, "update.php", query_map); + #if LL_WINDOWS char ip[MAX_STRING]; /* Flawfinder: ignore */ @@ -2936,9 +2921,6 @@ void update_dialog_callback(S32 option, void *userdata) } u32_to_ip_string(gUserServer.getAddress(), ip); - std::ostringstream params; - params << "-userserver " << gUserServerName; - // if a sim name was passed in via command line parameter (typically through a SLURL) if ( LLURLSimString::sInstance.mSimString.length() ) { @@ -2946,6 +2928,8 @@ void update_dialog_callback(S32 option, void *userdata) gSavedSettings.setString( "NextLoginLocation", LLURLSimString::sInstance.mSimString ); }; + std::ostringstream params; + params << "-url \"" << update_url.asString() << "\""; if (gHideLinks) { // Figure out the program name. @@ -2966,7 +2950,8 @@ void update_dialog_callback(S32 option, void *userdata) program_name = "SecondLife"; } - params << " -silent -name \"" << gSecondLife << "\" -program \"" << program_name << "\""; + params << " -silent -name \"" << gSecondLife << "\""; + params << " -program \"" << program_name << "\""; } llinfos << "Calling updater: " << update_exe_path << " " << params.str() << llendl; @@ -2984,12 +2969,12 @@ void update_dialog_callback(S32 option, void *userdata) // record the location to start at next time gSavedSettings.setString( "NextLoginLocation", LLURLSimString::sInstance.mSimString ); }; - + update_exe_path = "'"; update_exe_path += gDirUtilp->getAppRODataDir(); - update_exe_path += "/AutoUpdater.app/Contents/MacOS/AutoUpdater' -userserver "; - update_exe_path += gUserServerName; - update_exe_path += " -name \""; + update_exe_path += "/AutoUpdater.app/Contents/MacOS/AutoUpdater' -url \""; + update_exe_path += update_url.asString(); + update_exe_path += "\" -name \""; update_exe_path += gSecondLife; update_exe_path += "\" &"; @@ -3024,7 +3009,7 @@ void use_circuit_callback(void**, S32 result) llinfos << "Backing up to login screen!" << llendl; gViewerWindow->alertXml("LoginPacketNeverReceived", login_alert_status, NULL); - gStartupState = STATE_LOGIN_SHOW; + reset_login(); } else { @@ -3117,8 +3102,9 @@ void register_viewer_callbacks(LLMessageSystem* msg) LLPanelAvatar::processAvatarInterestsReply); msg->setHandlerFunc("AvatarGroupsReply", LLPanelAvatar::processAvatarGroupsReply); - msg->setHandlerFuncFast(_PREHASH_AvatarStatisticsReply, - LLPanelAvatar::processAvatarStatisticsReply); + // ratings deprecated + //msg->setHandlerFuncFast(_PREHASH_AvatarStatisticsReply, + // LLPanelAvatar::processAvatarStatisticsReply); msg->setHandlerFunc("AvatarNotesReply", LLPanelAvatar::processAvatarNotesReply); msg->setHandlerFunc("AvatarPicksReply", @@ -3137,8 +3123,9 @@ void register_viewer_callbacks(LLMessageSystem* msg) msg->setHandlerFuncFast(_PREHASH_GroupProfileReply, LLGroupMgr::processGroupPropertiesReply); - msg->setHandlerFuncFast(_PREHASH_ReputationIndividualReply, - LLFloaterRate::processReputationIndividualReply); + // ratings deprecated + // msg->setHandlerFuncFast(_PREHASH_ReputationIndividualReply, + // LLFloaterRate::processReputationIndividualReply); msg->setHandlerFuncFast(_PREHASH_AgentWearablesUpdate, LLAgent::processAgentInitialWearablesUpdate ); @@ -3146,9 +3133,6 @@ void register_viewer_callbacks(LLMessageSystem* msg) msg->setHandlerFunc("ScriptControlChange", LLAgent::processScriptControlChange ); - msg->setHandlerFuncFast(_PREHASH_GestureUpdate, - LLViewerGestureList::processGestureUpdate); - msg->setHandlerFuncFast(_PREHASH_ViewerEffect, LLHUDManager::processViewerEffect); msg->setHandlerFuncFast(_PREHASH_GrantGodlikePowers, process_grant_godlike_powers); @@ -3945,4 +3929,9 @@ bool LLStartUp::canGoFullscreen() return gStartupState >= STATE_WORLD_INIT; } +void reset_login() +{ + gStartupState = STATE_LOGIN_SHOW; + // do cleanup here of in-world UI? +} diff --git a/linden/indra/newview/llstartup.h b/linden/indra/newview/llstartup.h index 26f5bc6..59a433e 100644 --- a/linden/indra/newview/llstartup.h +++ b/linden/indra/newview/llstartup.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -80,6 +81,7 @@ enum EStartupState{ // exorted symbol extern S32 gStartupState; +extern BOOL gAgentMovementCompleted; extern bool gQuickTimeInitialized; extern LLPointer gStartImageGL; diff --git a/linden/indra/newview/llstatbar.cpp b/linden/indra/newview/llstatbar.cpp index 4b7067c..1a8734d 100644 --- a/linden/indra/newview/llstatbar.cpp +++ b/linden/indra/newview/llstatbar.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llstatbar.h b/linden/indra/newview/llstatbar.h index 161e454..c550b28 100644 --- a/linden/indra/newview/llstatbar.h +++ b/linden/indra/newview/llstatbar.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llstatgraph.cpp b/linden/indra/newview/llstatgraph.cpp index e85dc8d..ff43965 100644 --- a/linden/indra/newview/llstatgraph.cpp +++ b/linden/indra/newview/llstatgraph.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -94,7 +95,7 @@ void LLStatGraph::draw() char format_str[256]; /* Flawfinder: ignore */ char tmp_str[256]; /* Flawfinder: ignore */ snprintf(format_str, sizeof(format_str), "%%s%%.%df%%s", mPrecision); /* Flawfinder: ignore */ - sprintf(tmp_str, format_str, mLabel.c_str(), mValue, mUnits.c_str()); /* Flawfinder: ignore */ + snprintf(tmp_str, sizeof(tmp_str), format_str, mLabel.c_str(), mValue, mUnits.c_str()); /* Flawfinder: ignore */ setToolTip(tmp_str); mUpdateTimer.reset(); diff --git a/linden/indra/newview/llstatgraph.h b/linden/indra/newview/llstatgraph.h index 158b33b..a74a79a 100644 --- a/linden/indra/newview/llstatgraph.h +++ b/linden/indra/newview/llstatgraph.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llstatusbar.cpp b/linden/indra/newview/llstatusbar.cpp index 22c0a2a..58ac8c2 100644 --- a/linden/indra/newview/llstatusbar.cpp +++ b/linden/indra/newview/llstatusbar.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llstatusbar.h b/linden/indra/newview/llstatusbar.h index d1f7d19..52cc236 100644 --- a/linden/indra/newview/llstatusbar.h +++ b/linden/indra/newview/llstatusbar.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llstatview.cpp b/linden/indra/newview/llstatview.cpp index 64ad5aa..7a39d96 100644 --- a/linden/indra/newview/llstatview.cpp +++ b/linden/indra/newview/llstatview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llstatview.h b/linden/indra/newview/llstatview.h index 6d4d25b..3a885fa 100644 --- a/linden/indra/newview/llstatview.h +++ b/linden/indra/newview/llstatview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llsurface.cpp b/linden/indra/newview/llsurface.cpp index 191c079..9674802 100644 --- a/linden/indra/newview/llsurface.cpp +++ b/linden/indra/newview/llsurface.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llsurface.h b/linden/indra/newview/llsurface.h index 73fe6e6..0306130 100644 --- a/linden/indra/newview/llsurface.h +++ b/linden/indra/newview/llsurface.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llsurfacepatch.cpp b/linden/indra/newview/llsurfacepatch.cpp index 66d100f..4452eb1 100644 --- a/linden/indra/newview/llsurfacepatch.cpp +++ b/linden/indra/newview/llsurfacepatch.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -202,6 +203,11 @@ LLVector2 LLSurfacePatch::getTexCoords(const U32 x, const U32 y) const void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3 *vertex, LLVector3 *normal, LLVector2 *tex0, LLVector2 *tex1) { + if (!mSurfacep || !mSurfacep->getRegion()) + { + return; // failsafe + } + U32 surface_stride = mSurfacep->getGridsPerEdge(); U32 point_offset = x + y*surface_stride; diff --git a/linden/indra/newview/llsurfacepatch.h b/linden/indra/newview/llsurfacepatch.h index 8db92a1..3e82233 100644 --- a/linden/indra/newview/llsurfacepatch.h +++ b/linden/indra/newview/llsurfacepatch.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltable.h b/linden/indra/newview/lltable.h index db5f388..d307ad4 100644 --- a/linden/indra/newview/lltable.h +++ b/linden/indra/newview/lltable.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltexlayer.cpp b/linden/indra/newview/lltexlayer.cpp index d8a97cf..237d563 100644 --- a/linden/indra/newview/lltexlayer.cpp +++ b/linden/indra/newview/lltexlayer.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltexlayer.h b/linden/indra/newview/lltexlayer.h index 5d12da5..c5a34a6 100644 --- a/linden/indra/newview/lltexlayer.h +++ b/linden/indra/newview/lltexlayer.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltexturecache.cpp b/linden/indra/newview/lltexturecache.cpp index 084211a..2008fda 100644 --- a/linden/indra/newview/lltexturecache.cpp +++ b/linden/indra/newview/lltexturecache.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltexturecache.h b/linden/indra/newview/lltexturecache.h index ec20066..d33c9a6 100644 --- a/linden/indra/newview/lltexturecache.h +++ b/linden/indra/newview/lltexturecache.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltexturectrl.cpp b/linden/indra/newview/lltexturectrl.cpp index 8ae6862..1436b62 100644 --- a/linden/indra/newview/lltexturectrl.cpp +++ b/linden/indra/newview/lltexturectrl.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -1031,7 +1032,7 @@ void LLTextureCtrl::setEnabled( BOOL enabled ) mCaption->setEnabled( enabled ); - LLUICtrl::setEnabled( enabled ); + LLView::setEnabled( enabled ); } void LLTextureCtrl::setValid(BOOL valid ) diff --git a/linden/indra/newview/lltexturectrl.h b/linden/indra/newview/lltexturectrl.h index 8569cbc..d8ad4d9 100644 --- a/linden/indra/newview/lltexturectrl.h +++ b/linden/indra/newview/lltexturectrl.h @@ -5,6 +5,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltexturefetch.cpp b/linden/indra/newview/lltexturefetch.cpp index 54b3f28..f281207 100644 --- a/linden/indra/newview/lltexturefetch.cpp +++ b/linden/indra/newview/lltexturefetch.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltexturefetch.h b/linden/indra/newview/lltexturefetch.h index a53deae..6bbd830 100644 --- a/linden/indra/newview/lltexturefetch.h +++ b/linden/indra/newview/lltexturefetch.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltexturetable.cpp b/linden/indra/newview/lltexturetable.cpp index 6d88eea..52e4a46 100644 --- a/linden/indra/newview/lltexturetable.cpp +++ b/linden/indra/newview/lltexturetable.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltexturetable.h b/linden/indra/newview/lltexturetable.h index f054f79..85510b5 100644 --- a/linden/indra/newview/lltexturetable.h +++ b/linden/indra/newview/lltexturetable.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltextureview.cpp b/linden/indra/newview/lltextureview.cpp index d28ee74..bd9b273 100644 --- a/linden/indra/newview/lltextureview.cpp +++ b/linden/indra/newview/lltextureview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltextureview.h b/linden/indra/newview/lltextureview.h index 70ca39a..a838e6c 100644 --- a/linden/indra/newview/lltextureview.h +++ b/linden/indra/newview/lltextureview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltool.cpp b/linden/indra/newview/lltool.cpp index 9489a2b..82d8fb9 100644 --- a/linden/indra/newview/lltool.cpp +++ b/linden/indra/newview/lltool.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -53,7 +54,7 @@ LLTool::LLTool( const LLString& name, LLToolComposite* composite ) : LLTool::~LLTool() { - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { llwarns << "Tool deleted holding mouse capture. Mouse capture removed." << llendl; gFocusMgr.removeMouseCaptureWithoutCallback( this ); @@ -132,12 +133,12 @@ void LLTool::setMouseCapture( BOOL b ) { if( b ) { - gViewerWindow->setMouseCapture(mComposite ? mComposite : this, &LLTool::onMouseCaptureLost ); + gViewerWindow->setMouseCapture(mComposite ? mComposite : this ); } else if( hasMouseCapture() ) { - gViewerWindow->setMouseCapture( NULL, NULL ); + gViewerWindow->setMouseCapture( NULL ); } } @@ -147,7 +148,7 @@ void LLTool::draw() BOOL LLTool::hasMouseCapture() { - return gViewerWindow->hasMouseCapture(mComposite ? mComposite : this); + return gFocusMgr.getMouseCapture() == (mComposite ? mComposite : this); } BOOL LLTool::handleKey(KEY key, MASK mask) @@ -163,17 +164,3 @@ LLTool* LLTool::getOverrideTool(MASK mask) } return NULL; } - -// static -void LLTool::onMouseCaptureLost( LLMouseHandler* old_captor ) -{ - LLTool* self = (LLTool*) old_captor; - if( self->mComposite ) - { - self->mComposite->onMouseCaptureLost(); - } - else - { - self->onMouseCaptureLost(); - } -} diff --git a/linden/indra/newview/lltool.h b/linden/indra/newview/lltool.h index 866755a..cbed9f7 100644 --- a/linden/indra/newview/lltool.h +++ b/linden/indra/newview/lltool.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -91,7 +92,6 @@ public: // Note: NOT virtual. Subclasses should call this version. void setMouseCapture(BOOL b); BOOL hasMouseCapture(); - static void onMouseCaptureLost(LLMouseHandler* old_captor); virtual void onMouseCaptureLost() {} // override this one as needed. protected: diff --git a/linden/indra/newview/lltoolbar.cpp b/linden/indra/newview/lltoolbar.cpp index c7bc49e..3d065e1 100644 --- a/linden/indra/newview/lltoolbar.cpp +++ b/linden/indra/newview/lltoolbar.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolbar.h b/linden/indra/newview/lltoolbar.h index c3ab579..52da849 100644 --- a/linden/indra/newview/lltoolbar.h +++ b/linden/indra/newview/lltoolbar.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolbrush.cpp b/linden/indra/newview/lltoolbrush.cpp index 210a1e7..f2f338e 100644 --- a/linden/indra/newview/lltoolbrush.cpp +++ b/linden/indra/newview/lltoolbrush.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolbrush.h b/linden/indra/newview/lltoolbrush.h index 8ca14ff..e6e4257 100644 --- a/linden/indra/newview/lltoolbrush.h +++ b/linden/indra/newview/lltoolbrush.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolcomp.cpp b/linden/indra/newview/lltoolcomp.cpp index 8898dcb..2c2c0fe 100644 --- a/linden/indra/newview/lltoolcomp.cpp +++ b/linden/indra/newview/lltoolcomp.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -755,6 +756,11 @@ BOOL LLToolCompGun::handleMouseUp(S32 x, S32 y, MASK mask) void LLToolCompGun::onMouseCaptureLost() { + if (mComposite) + { + mComposite->onMouseCaptureLost(); + return; + } mCur->onMouseCaptureLost(); // JC - I don't know if this is necessary. Maybe we could lose capture diff --git a/linden/indra/newview/lltoolcomp.h b/linden/indra/newview/lltoolcomp.h index d75cd11..029437c 100644 --- a/linden/indra/newview/lltoolcomp.h +++ b/linden/indra/newview/lltoolcomp.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltooldraganddrop.cpp b/linden/indra/newview/lltooldraganddrop.cpp index ffa124f..3956402 100644 --- a/linden/indra/newview/lltooldraganddrop.cpp +++ b/linden/indra/newview/lltooldraganddrop.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -878,7 +879,7 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop, BOOL handled = FALSE; - LLView* top_view = gViewerWindow->getTopView(); + LLView* top_view = gViewerWindow->getTopCtrl(); LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; @@ -1238,6 +1239,7 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj, return FALSE; } } +std::cout << "ASSET ID: " << new_item->getAssetUUID() << "\n"; hit_obj->updateInventory(new_item, TASK_INVENTORY_ASSET_KEY, true); } else if(!item->getPermissions().allowOperationBy(PERM_TRANSFER, @@ -1251,6 +1253,7 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj, // *FIX: may want to make sure agent can paint hit_obj. // make sure the object has the texture in it's inventory. +std::cout << "ASSET ID: " << new_item->getAssetUUID() << "\n"; hit_obj->updateInventory(new_item, TASK_INVENTORY_ASSET_KEY, true); } return TRUE; @@ -2327,7 +2330,7 @@ EAcceptance LLToolDragAndDrop::dad3dTextureObject( } if(!obj->permModify()) { - return ACCEPT_NO_LOCKED; + return ACCEPT_NO_LOCKED; } //If texture !copyable don't texture or you'll never get it back. if(!item->getPermissions().allowCopyBy(gAgent.getID())) diff --git a/linden/indra/newview/lltooldraganddrop.h b/linden/indra/newview/lltooldraganddrop.h index 4f94ed8..4f66f7d 100644 --- a/linden/indra/newview/lltooldraganddrop.h +++ b/linden/indra/newview/lltooldraganddrop.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolface.cpp b/linden/indra/newview/lltoolface.cpp index b855e0f..276d921 100644 --- a/linden/indra/newview/lltoolface.cpp +++ b/linden/indra/newview/lltoolface.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolface.h b/linden/indra/newview/lltoolface.h index 43c0a86..daf82b1 100644 --- a/linden/indra/newview/lltoolface.h +++ b/linden/indra/newview/lltoolface.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolfocus.cpp b/linden/indra/newview/lltoolfocus.cpp index 479d55c..733a47e 100644 --- a/linden/indra/newview/lltoolfocus.cpp +++ b/linden/indra/newview/lltoolfocus.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolfocus.h b/linden/indra/newview/lltoolfocus.h index 26a7085..b16fe81 100644 --- a/linden/indra/newview/lltoolfocus.h +++ b/linden/indra/newview/lltoolfocus.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolgrab.cpp b/linden/indra/newview/lltoolgrab.cpp index e186e4a..502e2be 100644 --- a/linden/indra/newview/lltoolgrab.cpp +++ b/linden/indra/newview/lltoolgrab.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolgrab.h b/linden/indra/newview/lltoolgrab.h index ad05295..7919c0d 100644 --- a/linden/indra/newview/lltoolgrab.h +++ b/linden/indra/newview/lltoolgrab.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolgun.cpp b/linden/indra/newview/lltoolgun.cpp index dfe97ae..d442d81 100644 --- a/linden/indra/newview/lltoolgun.cpp +++ b/linden/indra/newview/lltoolgun.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolgun.h b/linden/indra/newview/lltoolgun.h index 6884cb6..93b0b5b 100644 --- a/linden/indra/newview/lltoolgun.h +++ b/linden/indra/newview/lltoolgun.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolindividual.cpp b/linden/indra/newview/lltoolindividual.cpp index 96bd89e..3bcc210 100644 --- a/linden/indra/newview/lltoolindividual.cpp +++ b/linden/indra/newview/lltoolindividual.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolindividual.h b/linden/indra/newview/lltoolindividual.h index d7dd09d..e6f0df9 100644 --- a/linden/indra/newview/lltoolindividual.h +++ b/linden/indra/newview/lltoolindividual.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolmgr.cpp b/linden/indra/newview/lltoolmgr.cpp index b6e14a2..069bdac 100644 --- a/linden/indra/newview/lltoolmgr.cpp +++ b/linden/indra/newview/lltoolmgr.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolmgr.h b/linden/indra/newview/lltoolmgr.h index 5cf005a..e61bbc3 100644 --- a/linden/indra/newview/lltoolmgr.h +++ b/linden/indra/newview/lltoolmgr.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolmorph.cpp b/linden/indra/newview/lltoolmorph.cpp index a779554..ceb83b5 100644 --- a/linden/indra/newview/lltoolmorph.cpp +++ b/linden/indra/newview/lltoolmorph.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolmorph.h b/linden/indra/newview/lltoolmorph.h index ab1bf20..35ee724 100644 --- a/linden/indra/newview/lltoolmorph.h +++ b/linden/indra/newview/lltoolmorph.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolobjpicker.cpp b/linden/indra/newview/lltoolobjpicker.cpp index 56eab5a..411bdc0 100644 --- a/linden/indra/newview/lltoolobjpicker.cpp +++ b/linden/indra/newview/lltoolobjpicker.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolobjpicker.h b/linden/indra/newview/lltoolobjpicker.h index efe8be2..7a73304 100644 --- a/linden/indra/newview/lltoolobjpicker.h +++ b/linden/indra/newview/lltoolobjpicker.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolpie.cpp b/linden/indra/newview/lltoolpie.cpp index 4b29303..adc46e2 100644 --- a/linden/indra/newview/lltoolpie.cpp +++ b/linden/indra/newview/lltoolpie.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolpie.h b/linden/indra/newview/lltoolpie.h index fbfd1a6..949013f 100644 --- a/linden/indra/newview/lltoolpie.h +++ b/linden/indra/newview/lltoolpie.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolpipette.cpp b/linden/indra/newview/lltoolpipette.cpp index 8886150..139afc2 100755 --- a/linden/indra/newview/lltoolpipette.cpp +++ b/linden/indra/newview/lltoolpipette.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolpipette.h b/linden/indra/newview/lltoolpipette.h index e04bed7..1351084 100755 --- a/linden/indra/newview/lltoolpipette.h +++ b/linden/indra/newview/lltoolpipette.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolplacer.cpp b/linden/indra/newview/lltoolplacer.cpp index e246546..9741602 100644 --- a/linden/indra/newview/lltoolplacer.cpp +++ b/linden/indra/newview/lltoolplacer.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolplacer.h b/linden/indra/newview/lltoolplacer.h index ab90ca1..914f99d 100644 --- a/linden/indra/newview/lltoolplacer.h +++ b/linden/indra/newview/lltoolplacer.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolselect.cpp b/linden/indra/newview/lltoolselect.cpp index 924916c..9d02756 100644 --- a/linden/indra/newview/lltoolselect.cpp +++ b/linden/indra/newview/lltoolselect.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolselect.h b/linden/indra/newview/lltoolselect.h index 065e08f..2e24bc4 100644 --- a/linden/indra/newview/lltoolselect.h +++ b/linden/indra/newview/lltoolselect.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolselectland.cpp b/linden/indra/newview/lltoolselectland.cpp index eaad28c..855efd2 100644 --- a/linden/indra/newview/lltoolselectland.cpp +++ b/linden/indra/newview/lltoolselectland.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolselectland.h b/linden/indra/newview/lltoolselectland.h index 06ce1ee..3412d41 100644 --- a/linden/indra/newview/lltoolselectland.h +++ b/linden/indra/newview/lltoolselectland.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolselectrect.cpp b/linden/indra/newview/lltoolselectrect.cpp index 289ee6d..4e9bc9e 100644 --- a/linden/indra/newview/lltoolselectrect.cpp +++ b/linden/indra/newview/lltoolselectrect.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolselectrect.h b/linden/indra/newview/lltoolselectrect.h index 0065391..e246178 100644 --- a/linden/indra/newview/lltoolselectrect.h +++ b/linden/indra/newview/lltoolselectrect.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolview.cpp b/linden/indra/newview/lltoolview.cpp index fa8d65b..76de2e2 100644 --- a/linden/indra/newview/lltoolview.cpp +++ b/linden/indra/newview/lltoolview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltoolview.h b/linden/indra/newview/lltoolview.h index 2c12a52..749f9fe 100644 --- a/linden/indra/newview/lltoolview.h +++ b/linden/indra/newview/lltoolview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltracker.cpp b/linden/indra/newview/lltracker.cpp index 80d35dd..4125bb6 100644 --- a/linden/indra/newview/lltracker.cpp +++ b/linden/indra/newview/lltracker.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lltracker.h b/linden/indra/newview/lltracker.h index 5d11f21..e8299f7 100644 --- a/linden/indra/newview/lltracker.h +++ b/linden/indra/newview/lltracker.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lluiconstants.h b/linden/indra/newview/lluiconstants.h index d941e82..a51267a 100644 --- a/linden/indra/newview/lluiconstants.h +++ b/linden/indra/newview/lluiconstants.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lluploaddialog.cpp b/linden/indra/newview/lluploaddialog.cpp index 620133e..fc4f188 100644 --- a/linden/indra/newview/lluploaddialog.cpp +++ b/linden/indra/newview/lluploaddialog.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -81,7 +82,7 @@ LLUploadDialog::LLUploadDialog( const std::string& msg) setMessage(msg); // The dialog view is a root view - gViewerWindow->setTopView( this, NULL ); + gViewerWindow->setTopCtrl( this ); } void LLUploadDialog::setMessage( const std::string& msg) diff --git a/linden/indra/newview/lluploaddialog.h b/linden/indra/newview/lluploaddialog.h index 261e978..51f5d83 100644 --- a/linden/indra/newview/lluploaddialog.h +++ b/linden/indra/newview/lluploaddialog.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llurl.cpp b/linden/indra/newview/llurl.cpp index 0374ec9..a429b67 100644 --- a/linden/indra/newview/llurl.cpp +++ b/linden/indra/newview/llurl.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llurl.h b/linden/indra/newview/llurl.h index f60f06b..4dc8cfc 100644 --- a/linden/indra/newview/llurl.h +++ b/linden/indra/newview/llurl.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llurlwhitelist.cpp b/linden/indra/newview/llurlwhitelist.cpp index 3a8c952..e08ae42 100644 --- a/linden/indra/newview/llurlwhitelist.cpp +++ b/linden/indra/newview/llurlwhitelist.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llurlwhitelist.h b/linden/indra/newview/llurlwhitelist.h index 6f4289b..a0c3dec 100644 --- a/linden/indra/newview/llurlwhitelist.h +++ b/linden/indra/newview/llurlwhitelist.h @@ -5,6 +5,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lluserauth.cpp b/linden/indra/newview/lluserauth.cpp index 4b554a9..1513175 100644 --- a/linden/indra/newview/lluserauth.cpp +++ b/linden/indra/newview/lluserauth.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -34,6 +35,7 @@ #include "lldir.h" #include "llversion.h" +#include "viewer.h" #include "llviewerbuild.h" #include "llviewercontrol.h" #include "llxmlrpctransaction.h" @@ -118,14 +120,11 @@ void LLUserAuth::authenticate( XMLRPC_VectorAppendString(params, "passwd", dpasswd.c_str(), 0); XMLRPC_VectorAppendString(params, "start", start, 0); char buffer[MAX_STRING]; /* Flawfinder: ignore */ - snprintf(buffer, MAX_STRING, "%d", LL_VERSION_MAJOR); /* Flawfinder: ignore */ - XMLRPC_VectorAppendString(params, "major", buffer, 0); - snprintf(buffer, MAX_STRING, "%d", LL_VERSION_MINOR); /* Flawfinder: ignore */ - XMLRPC_VectorAppendString(params, "minor", buffer, 0); - snprintf(buffer, MAX_STRING, "%d", LL_VERSION_PATCH); /* Flawfinder: ignore */ - XMLRPC_VectorAppendString(params, "patch", buffer, 0); - snprintf(buffer, MAX_STRING, "%d", LL_VIEWER_BUILD); /* Flawfinder: ignore */ - XMLRPC_VectorAppendString(params, "build", buffer, 0); + // the version is treated as a single string + snprintf(buffer, MAX_STRING, "%d.%d.%d.%d", + LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD); /* Flawfinder: ignore */ + XMLRPC_VectorAppendString(params, "version", buffer, 0); + XMLRPC_VectorAppendString(params, "channel", gChannelName.c_str(), 0); XMLRPC_VectorAppendString(params, "platform", PLATFORM_STRING, 0); XMLRPC_VectorAppendString(params, "mac", hashed_mac.c_str(), 0); // A bit of security through obscurity: id0 is volume_serial diff --git a/linden/indra/newview/lluserauth.h b/linden/indra/newview/lluserauth.h index d50f5b4..22bcd48 100644 --- a/linden/indra/newview/lluserauth.h +++ b/linden/indra/newview/lluserauth.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvelocitybar.cpp b/linden/indra/newview/llvelocitybar.cpp index 403ff4f..c0c3a37 100644 --- a/linden/indra/newview/llvelocitybar.cpp +++ b/linden/indra/newview/llvelocitybar.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvelocitybar.h b/linden/indra/newview/llvelocitybar.h index 4a400b9..c6b06ac 100644 --- a/linden/indra/newview/llvelocitybar.h +++ b/linden/indra/newview/llvelocitybar.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewchildren.cpp b/linden/indra/newview/llviewchildren.cpp index f279ac0..8c88757 100644 --- a/linden/indra/newview/llviewchildren.cpp +++ b/linden/indra/newview/llviewchildren.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewchildren.h b/linden/indra/newview/llviewchildren.h index 6dce3d5..16470dd 100644 --- a/linden/indra/newview/llviewchildren.h +++ b/linden/indra/newview/llviewchildren.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerassetstorage.cpp b/linden/indra/newview/llviewerassetstorage.cpp index fd92d75..c7e9c97 100644 --- a/linden/indra/newview/llviewerassetstorage.cpp +++ b/linden/indra/newview/llviewerassetstorage.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerassetstorage.h b/linden/indra/newview/llviewerassetstorage.h index bb08ea2..8532e23 100644 --- a/linden/indra/newview/llviewerassetstorage.h +++ b/linden/indra/newview/llviewerassetstorage.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerbuild.h b/linden/indra/newview/llviewerbuild.h index 6c6930e..340d353 100644 --- a/linden/indra/newview/llviewerbuild.h +++ b/linden/indra/newview/llviewerbuild.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewercamera.cpp b/linden/indra/newview/llviewercamera.cpp index 598046a..3a21ddf 100644 --- a/linden/indra/newview/llviewercamera.cpp +++ b/linden/indra/newview/llviewercamera.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -96,6 +97,7 @@ void LLViewerCamera::updateCameraLocation(const LLVector3 ¢er, // Handy copies of last good GL matrices F64 gGLModelView[16]; +F64 gGLProjection[16]; S32 gGLViewport[4]; const LLMatrix4 &LLViewerCamera::getProjection() const @@ -250,6 +252,7 @@ void LLViewerCamera::setPerspective(BOOL for_selection, aspect, z_near, z_far); + glGetDoublev(GL_PROJECTION_MATRIX, gGLProjection); glGetFloatv(GL_PROJECTION_MATRIX, (float*)&gProjectionMat); glMatrixMode( GL_MODELVIEW ); diff --git a/linden/indra/newview/llviewercamera.h b/linden/indra/newview/llviewercamera.h index a7e600b..6109711 100644 --- a/linden/indra/newview/llviewercamera.h +++ b/linden/indra/newview/llviewercamera.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -109,6 +110,7 @@ public: extern LLViewerCamera *gCamera; extern F64 gGLModelView[16]; +extern F64 gGLProjection[16]; extern S32 gGLViewport[4]; #endif // LL_LLVIEWERCAMERA_H diff --git a/linden/indra/newview/llviewercontrol.cpp b/linden/indra/newview/llviewercontrol.cpp index e1aa3ae..61285d5 100644 --- a/linden/indra/newview/llviewercontrol.cpp +++ b/linden/indra/newview/llviewercontrol.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewercontrol.h b/linden/indra/newview/llviewercontrol.h index d9a2682..4324c38 100644 --- a/linden/indra/newview/llviewercontrol.h +++ b/linden/indra/newview/llviewercontrol.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -55,7 +56,7 @@ protected: //setting variables are declared in this function void declare_settings(); -void settings_version_fixup(); +void fixup_settings(); // saved at end of session extern LLControlGroup gSavedSettings; diff --git a/linden/indra/newview/llviewerdisplay.cpp b/linden/indra/newview/llviewerdisplay.cpp index 071b699..c2ef30a 100644 --- a/linden/indra/newview/llviewerdisplay.cpp +++ b/linden/indra/newview/llviewerdisplay.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -157,12 +158,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) LLGLDepthTest gls_depth(GL_TRUE, GL_TRUE, GL_LEQUAL); // No clue where this is getting unset, but safe enough to reset it here. - for (S32 j = 7; j >=0; j--) - { - glActiveTextureARB(GL_TEXTURE0_ARB+j); - glClientActiveTextureARB(GL_TEXTURE0_ARB+j); - j == 0 ? glEnable(GL_TEXTURE_2D) : glDisable(GL_TEXTURE_2D); - } + LLGLState::resetTextureStates(); #ifndef LL_RELEASE_FOR_DOWNLOAD LLGLState::checkStates(); @@ -277,7 +273,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) gViewerWindow->setShowProgress(TRUE); gViewerWindow->setProgressPercent(0); gAgent.setTeleportState( LLAgent::TELEPORT_REQUESTED ); - gAgent.setTeleportMessage("Requesting Teleport..."); + gAgent.setTeleportMessage( + LLAgent::sTeleportProgressMessages["requesting"]); break; case LLAgent::TELEPORT_REQUESTED: @@ -298,7 +295,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) gViewerWindow->setProgressCancelButtonVisible(FALSE, "Cancel"); gViewerWindow->setProgressPercent(75.f); gAgent.setTeleportState( LLAgent::TELEPORT_ARRIVING ); - gAgent.setTeleportMessage("Arriving..."); + gAgent.setTeleportMessage( + LLAgent::sTeleportProgressMessages["arriving"]); gImageList.mForceResetTextureStats = TRUE; break; @@ -601,11 +599,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) gPipeline.stateSort(hud_cam); } - if (LLVertexBuffer::sEnableVBOs) - { - LLImageGL::sBoundTextureMemory += LLVertexBuffer::sAllocatedBytes; - } - gPipeline.renderGeom(hud_cam); //restore type mask @@ -824,8 +817,10 @@ void render_ui_2d() glPushMatrix(); S32 half_width = (gViewerWindow->getWindowWidth() / 2); S32 half_height = (gViewerWindow->getWindowHeight() / 2); + glScalef(LLUI::sGLScaleFactor.mV[0], LLUI::sGLScaleFactor.mV[1], 1.f); glTranslatef((F32)half_width, (F32)half_height, 0.f); - glScalef(gAgent.getAvatarObject()->mHUDCurZoom, gAgent.getAvatarObject()->mHUDCurZoom, gAgent.getAvatarObject()->mHUDCurZoom); + F32 zoom = gAgent.getAvatarObject()->mHUDCurZoom; + glScalef(zoom,zoom,1.f); glColor4fv(LLColor4::white.mV); gl_rect_2d(-half_width, half_height, half_width, -half_height, FALSE); glPopMatrix(); diff --git a/linden/indra/newview/llviewerdisplay.h b/linden/indra/newview/llviewerdisplay.h index 00f0a57..9145a2d 100644 --- a/linden/indra/newview/llviewerdisplay.h +++ b/linden/indra/newview/llviewerdisplay.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewergenericmessage.cpp b/linden/indra/newview/llviewergenericmessage.cpp new file mode 100644 index 0000000..56b168b --- /dev/null +++ b/linden/indra/newview/llviewergenericmessage.cpp @@ -0,0 +1,97 @@ +/** + * @file llviewergenericmessage.cpp + * @brief Handle processing of "generic messages" which contain short lists of strings. + * @author James Cook + * + * Copyright (c) 2007-2007, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + */ + +#include "llviewerprecompiledheaders.h" + +#include "llviewergenericmessage.h" + +#include "lldispatcher.h" +#include "lluuid.h" +#include "message.h" + +#include "llagent.h" + + +LLDispatcher gGenericDispatcher; + + +void send_generic_message(const char* method, + const std::vector& strings, + const LLUUID& invoice) +{ + LLMessageSystem* msg = gMessageSystem; + msg->newMessage("GenericMessage"); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used + msg->nextBlock("MethodData"); + msg->addString("Method", method); + msg->addUUID("Invoice", invoice); + if(strings.empty()) + { + msg->nextBlock("ParamList"); + msg->addString("Parameter", NULL); + } + else + { + std::vector::const_iterator it = strings.begin(); + std::vector::const_iterator end = strings.end(); + for(; it != end; ++it) + { + msg->nextBlock("ParamList"); + msg->addString("Parameter", (*it).c_str()); + } + } + gAgent.sendReliableMessage(); +} + + + +void process_generic_message(LLMessageSystem* msg, void**) +{ + LLUUID agent_id; + msg->getUUID("AgentData", "AgentID", agent_id); + if (agent_id != gAgent.getID()) + { + llwarns << "GenericMessage for wrong agent" << llendl; + return; + } + + std::string request; + LLUUID invoice; + LLDispatcher::sparam_t strings; + LLDispatcher::unpackMessage(msg, request, invoice, strings); + + if(!gGenericDispatcher.dispatch(request, invoice, strings)) + { + llwarns << "GenericMessage " << request << " failed to dispatch" + << llendl; + } +} diff --git a/linden/indra/newview/llviewergenericmessage.h b/linden/indra/newview/llviewergenericmessage.h new file mode 100644 index 0000000..cf94d86 --- /dev/null +++ b/linden/indra/newview/llviewergenericmessage.h @@ -0,0 +1,46 @@ +/** + * @file llviewergenericmessage.h + * @brief Handle processing of "generic messages" which contain short lists of strings. + * @author James Cook + * + * Copyright (c) 2007-2007, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + */ + +#ifndef LLVIEWERGENERICMESSAGE_H +#define LLVIEWERGENERICMESSAGE_H + +class LLUUID; +class LLDispatcher; + + +void send_generic_message(const char* method, + const std::vector& strings, + const LLUUID& invoice = LLUUID::null); + +void process_generic_message(LLMessageSystem* msg, void**); + + +extern LLDispatcher gGenericDispatcher; + +#endif diff --git a/linden/indra/newview/llviewergesture.cpp b/linden/indra/newview/llviewergesture.cpp index fd98070..de8a098 100644 --- a/linden/indra/newview/llviewergesture.cpp +++ b/linden/indra/newview/llviewergesture.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -142,69 +143,6 @@ LLViewerGestureList::LLViewerGestureList() mIsLoaded = FALSE; } -void LLViewerGestureList::saveToServer() -{ - U8 *buffer = new U8[getMaxSerialSize()]; - - U8 *end = serialize(buffer); - - if (end - buffer > getMaxSerialSize()) - { - llerrs << "Wrote off end of buffer, serial size computation is wrong" << llendl; - } - - //U64 xfer_id = gXferManager->registerXfer(buffer, end - buffer); - // write to a file because mem<->mem xfer isn't implemented - LLUUID random_uuid; - char filename[LL_MAX_PATH]; /* Flawfinder: ignore */ - random_uuid.generate(); - random_uuid.toString(filename); - strcat(filename,".tmp"); /* Flawfinder: ignore */ - - char filename_and_path[LL_MAX_PATH]; /* Flawfinder: ignore */ - snprintf(filename_and_path, LL_MAX_PATH, "%s%s%s", /* Flawfinder: ignore */ - gDirUtilp->getTempDir().c_str(), - gDirUtilp->getDirDelimiter().c_str(), - filename); - - FILE* fp = LLFile::fopen(filename_and_path, "wb"); /* Flawfinder: ignore */ - - if (fp) - { - fwrite(buffer, end - buffer, 1, fp); - fclose(fp); - - gMessageSystem->newMessageFast(_PREHASH_GestureUpdate); - gMessageSystem->nextBlockFast(_PREHASH_AgentBlock); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - gMessageSystem->addStringFast(_PREHASH_Filename, filename); - gMessageSystem->addBOOLFast(_PREHASH_ToViewer, FALSE); - gMessageSystem->sendReliable(gUserServer); - } - - delete[] buffer; -} - -/* -void LLViewerGestureList::requestFromServer() -{ - gMessageSystem->newMessageFast(_PREHASH_GestureRequest); - gMessageSystem->nextBlockFast(_PREHASH_AgentBlock); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, agent_get_id()); - gMessageSystem->addU8("Reset", 0); - gMessageSystem->sendReliable(gUserServer); -} - -void LLViewerGestureList::requestResetFromServer( BOOL is_male ) -{ - gMessageSystem->newMessageFast(_PREHASH_GestureRequest); - gMessageSystem->nextBlockFast(_PREHASH_AgentBlock); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, agent_get_id()); - gMessageSystem->addU8("Reset", is_male ? 1 : 2); - gMessageSystem->sendReliable(gUserServer); - mIsLoaded = FALSE; -} -*/ // helper for deserialize that creates the right LLGesture subclass LLGesture *LLViewerGestureList::create_gesture(U8 **buffer, S32 max_size) @@ -266,14 +204,3 @@ void LLViewerGestureList::xferCallback(void *data, S32 size, void** /*user_data* llwarns << "Unable to load gesture list!" << llendl; } } - -// static -void LLViewerGestureList::processGestureUpdate(LLMessageSystem *msg, void** /*user_data*/) -{ - char remote_filename[MAX_STRING]; /* Flawfinder: ignore */ - msg->getStringFast(_PREHASH_AgentBlock, _PREHASH_Filename, MAX_STRING, remote_filename); - - - gXferManager->requestFile(remote_filename, LL_PATH_CACHE, msg->getSender(), TRUE, xferCallback, NULL, - LLXferManager::HIGH_PRIORITY); -} diff --git a/linden/indra/newview/llviewergesture.h b/linden/indra/newview/llviewergesture.h index 8d2e24f..5f6b795 100644 --- a/linden/indra/newview/llviewergesture.h +++ b/linden/indra/newview/llviewergesture.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -64,7 +65,6 @@ class LLViewerGestureList : public LLGestureList public: LLViewerGestureList(); - void saveToServer(); //void requestFromServer(); BOOL getIsLoaded() { return mIsLoaded; } @@ -76,7 +76,6 @@ public: BOOL matchPrefix(const std::string& in_str, std::string* out_str); static void xferCallback(void *data, S32 size, void** /*user_data*/, S32 status); - static void processGestureUpdate(LLMessageSystem *msg, void** /*user_data*/); protected: LLGesture *create_gesture(U8 **buffer, S32 max_size); diff --git a/linden/indra/newview/llviewerimage.cpp b/linden/indra/newview/llviewerimage.cpp index 5a745ae..2a7f346 100644 --- a/linden/indra/newview/llviewerimage.cpp +++ b/linden/indra/newview/llviewerimage.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -1034,7 +1035,7 @@ bool LLViewerImage::doLoadedCallbacks() destroyRawImage(); createRawImage(gl_discard, TRUE); - readBackRaw(gl_discard, mRawImage); + readBackRaw(gl_discard, mRawImage, false); mIsRawImageValid = TRUE; llassert_always(mRawImage.notNull()); llassert_always(!mNeedsAux || mAuxRawImage.notNull()); @@ -1061,8 +1062,10 @@ bool LLViewerImage::doLoadedCallbacks() // we're going to call them. llassert_always(mRawImage.notNull()); - llassert_always(!mNeedsAux || mAuxRawImage.notNull()); - + if(mNeedsAux && mAuxRawImage.isNull()) + { + llwarns << "Raw Image with no Aux Data for callback" << llendl; + } BOOL final = mRawDiscardLevel <= entryp->mDesiredDiscard ? TRUE : FALSE; //llinfos << "Running callback for " << getID() << llendl; //llinfos << mRawImage->getWidth() << "x" << mRawImage->getHeight() << llendl; diff --git a/linden/indra/newview/llviewerimage.h b/linden/indra/newview/llviewerimage.h index 54865ff..c62e5e4 100644 --- a/linden/indra/newview/llviewerimage.h +++ b/linden/indra/newview/llviewerimage.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerimagelist.cpp b/linden/indra/newview/llviewerimagelist.cpp index 456afdb..9da84fa 100644 --- a/linden/indra/newview/llviewerimagelist.cpp +++ b/linden/indra/newview/llviewerimagelist.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -178,6 +179,7 @@ void LLViewerImageList::doPreloadImages() preloadImage("inv_item_landmark_visited.tga", LLUUID::null, FALSE); preloadImage("inv_item_notecard.tga", LLUUID::null, FALSE); preloadImage("inv_item_object.tga", LLUUID::null, FALSE); + preloadImage("inv_item_object_multi.tga", LLUUID::null, FALSE); preloadImage("inv_item_pants.tga", LLUUID::null, FALSE); preloadImage("inv_item_script.tga", LLUUID::null, FALSE); preloadImage("inv_item_shape.tga", LLUUID::null, FALSE); @@ -243,6 +245,7 @@ void LLViewerImageList::doPreloadImages() preloadImage("resize_handle_bottom_right_blue.tga", LLUUID::null, FALSE); preloadImage("rounded_square.tga", LLUUID::null, FALSE); preloadImage("rounded_square_soft.tga", LLUUID::null, FALSE); + preloadImage("script_error.tga", LLUUID::null, TRUE); preloadImage("scrollbutton_down_in_blue.tga", LLUUID::null, FALSE); preloadImage("scrollbutton_down_out_blue.tga", LLUUID::null, FALSE); preloadImage("scrollbutton_left_in_blue.tga", LLUUID::null, FALSE); diff --git a/linden/indra/newview/llviewerimagelist.h b/linden/indra/newview/llviewerimagelist.h index 3f3e521..0a7f8b0 100644 --- a/linden/indra/newview/llviewerimagelist.h +++ b/linden/indra/newview/llviewerimagelist.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerinventory.cpp b/linden/indra/newview/llviewerinventory.cpp index 7c12f56..8f23346 100644 --- a/linden/indra/newview/llviewerinventory.cpp +++ b/linden/indra/newview/llviewerinventory.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerinventory.h b/linden/indra/newview/llviewerinventory.h index 3e81f90..c60f0e6 100644 --- a/linden/indra/newview/llviewerinventory.h +++ b/linden/indra/newview/llviewerinventory.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerjoint.cpp b/linden/indra/newview/llviewerjoint.cpp index a1294be..ca624bd 100644 --- a/linden/indra/newview/llviewerjoint.cpp +++ b/linden/indra/newview/llviewerjoint.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -272,7 +273,7 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass ) triangle_count += drawShape( pixelArea, FALSE ); } // third past respects z buffer and writes color - glColorMask(TRUE, TRUE, TRUE, TRUE); + glColorMask(TRUE, TRUE, TRUE, FALSE); { LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); triangle_count += drawShape( pixelArea, FALSE ); diff --git a/linden/indra/newview/llviewerjoint.h b/linden/indra/newview/llviewerjoint.h index 148f3a6..8d28a03 100644 --- a/linden/indra/newview/llviewerjoint.h +++ b/linden/indra/newview/llviewerjoint.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerjointattachment.cpp b/linden/indra/newview/llviewerjointattachment.cpp index 2a54a47..cec2ae3 100644 --- a/linden/indra/newview/llviewerjointattachment.cpp +++ b/linden/indra/newview/llviewerjointattachment.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerjointattachment.h b/linden/indra/newview/llviewerjointattachment.h index be671fb..0c8469c 100644 --- a/linden/indra/newview/llviewerjointattachment.h +++ b/linden/indra/newview/llviewerjointattachment.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerjointmesh.cpp b/linden/indra/newview/llviewerjointmesh.cpp index 3070cb4..216e29f 100644 --- a/linden/indra/newview/llviewerjointmesh.cpp +++ b/linden/indra/newview/llviewerjointmesh.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -53,6 +54,7 @@ #include "llvoavatar.h" #include "llsky.h" #include "pipeline.h" +#include "llglslshader.h" #if !LL_DARWIN && !LL_LINUX extern PFNGLWEIGHTPOINTERARBPROC glWeightPointerARB; @@ -65,7 +67,6 @@ static LLPointer sRenderBuffer = NULL; static const U32 sRenderMask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD; -LLMatrix4 gBlendMat; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- @@ -498,7 +499,7 @@ void LLViewerJointMesh::uploadJointMatrices() //cgGLSetParameterArray4f(gPipeline.mAvatarMatrix, offset, 1, vector); } } - glUniform4fvARB(gPipeline.mAvatarMatrixParam, 45, mat); + glUniform4fvARB(gAvatarMatrixParam, 45, mat); } } @@ -573,14 +574,14 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass) { glColor4f(0,0,0,1); - if (gPipeline.mMaterialIndex > 0) + if (gMaterialIndex > 0) { - glVertexAttrib4fvARB(gPipeline.mMaterialIndex, mColor.mV); + glVertexAttrib4fvARB(gMaterialIndex, mColor.mV); } - if (mShiny && gPipeline.mSpecularIndex > 0) + if (mShiny && gSpecularIndex > 0) { - glVertexAttrib4fARB(gPipeline.mSpecularIndex, 1,1,1,1); + glVertexAttrib4fARB(gSpecularIndex, 1,1,1,1); } } else @@ -902,89 +903,108 @@ BOOL LLViewerJointMesh::updateLOD(F32 pixel_area, BOOL activate) return (valid != activate); } + void LLViewerJointMesh::updateGeometry() { - if (mValid && mMesh && mFace && - mMesh->hasWeights() && - mFace->mVertexBuffer.notNull() && - gPipeline.getVertexShaderLevel(LLPipeline::SHADER_AVATAR) == 0) + if (!(mValid + && mMesh + && mFace + && mMesh->hasWeights() + && mFace->mVertexBuffer.notNull() + && LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR) == 0)) { - uploadJointMatrices(); - LLStrider o_vertices; - LLStrider o_normals; + return; + } + + uploadJointMatrices(); - //get vertex and normal striders - LLVertexBuffer *buffer = mFace->mVertexBuffer; - buffer->getVertexStrider(o_vertices, 0); - buffer->getNormalStrider(o_normals, 0); + LLStrider o_vertices; + LLStrider o_normals; + //get vertex and normal striders + LLVertexBuffer *buffer = mFace->mVertexBuffer; + buffer->getVertexStrider(o_vertices, 0); + buffer->getNormalStrider(o_normals, 0); + + F32 last_weight = F32_MAX; + LLMatrix4 gBlendMat; + LLMatrix3 gBlendRotMat; + + const F32* weights = mMesh->getWeights(); + const LLVector3* coords = mMesh->getCoords(); + const LLVector3* normals = mMesh->getNormals(); + for (U32 index = 0; index < mMesh->getNumVertices(); index++) + { + U32 bidx = index + mMesh->mFaceVertexOffset; + + // blend by first matrix + F32 w = weights[index]; + + // Maybe we don't have to change gBlendMat. + // Profiles of a single-avatar scene on a Mac show this to be a very + // common case. JC + if (w == last_weight) { - LLVector4 tpos0, tnorm0, tpos1, tnorm1, tbinorm0, tbinorm1; - F32 last_weight = F32_MAX; - LLMatrix3 gBlendRotMat; + o_vertices[bidx] = coords[index] * gBlendMat; + o_normals[bidx] = normals[index] * gBlendRotMat; + continue; + } + + last_weight = w; + S32 joint = llfloor(w); + w -= joint; - for (U32 index= 0; index < mMesh->getNumVertices(); index++) - { - // blend by first matrix - F32 w = mMesh->getWeights()[index]; - - if (w != last_weight) - { - last_weight = w; - - S32 joint = llfloor(w); - w -= joint; - - LLMatrix4 &m0 = gJointMat[joint+1]; - LLMatrix4 &m1 = gJointMat[joint+0]; - LLMatrix3 &n0 = gJointRot[joint+1]; - LLMatrix3 &n1 = gJointRot[joint+0]; - - if (w == 1.0f) - { - gBlendMat = m0; - gBlendRotMat = n0; - } - else - { - gBlendMat.mMatrix[VX][VX] = lerp(m1.mMatrix[VX][VX], m0.mMatrix[VX][VX], w); - gBlendMat.mMatrix[VX][VY] = lerp(m1.mMatrix[VX][VY], m0.mMatrix[VX][VY], w); - gBlendMat.mMatrix[VX][VZ] = lerp(m1.mMatrix[VX][VZ], m0.mMatrix[VX][VZ], w); - - gBlendMat.mMatrix[VY][VX] = lerp(m1.mMatrix[VY][VX], m0.mMatrix[VY][VX], w); - gBlendMat.mMatrix[VY][VY] = lerp(m1.mMatrix[VY][VY], m0.mMatrix[VY][VY], w); - gBlendMat.mMatrix[VY][VZ] = lerp(m1.mMatrix[VY][VZ], m0.mMatrix[VY][VZ], w); - - gBlendMat.mMatrix[VZ][VX] = lerp(m1.mMatrix[VZ][VX], m0.mMatrix[VZ][VX], w); - gBlendMat.mMatrix[VZ][VY] = lerp(m1.mMatrix[VZ][VY], m0.mMatrix[VZ][VY], w); - gBlendMat.mMatrix[VZ][VZ] = lerp(m1.mMatrix[VZ][VZ], m0.mMatrix[VZ][VZ], w); - - gBlendMat.mMatrix[VW][VX] = lerp(m1.mMatrix[VW][VX], m0.mMatrix[VW][VX], w); - gBlendMat.mMatrix[VW][VY] = lerp(m1.mMatrix[VW][VY], m0.mMatrix[VW][VY], w); - gBlendMat.mMatrix[VW][VZ] = lerp(m1.mMatrix[VW][VZ], m0.mMatrix[VW][VZ], w); - - gBlendRotMat.mMatrix[VX][VX] = lerp(n1.mMatrix[VX][VX], n0.mMatrix[VX][VX], w); - gBlendRotMat.mMatrix[VX][VY] = lerp(n1.mMatrix[VX][VY], n0.mMatrix[VX][VY], w); - gBlendRotMat.mMatrix[VX][VZ] = lerp(n1.mMatrix[VX][VZ], n0.mMatrix[VX][VZ], w); - - gBlendRotMat.mMatrix[VY][VX] = lerp(n1.mMatrix[VY][VX], n0.mMatrix[VY][VX], w); - gBlendRotMat.mMatrix[VY][VY] = lerp(n1.mMatrix[VY][VY], n0.mMatrix[VY][VY], w); - gBlendRotMat.mMatrix[VY][VZ] = lerp(n1.mMatrix[VY][VZ], n0.mMatrix[VY][VZ], w); - - gBlendRotMat.mMatrix[VZ][VX] = lerp(n1.mMatrix[VZ][VX], n0.mMatrix[VZ][VX], w); - gBlendRotMat.mMatrix[VZ][VY] = lerp(n1.mMatrix[VZ][VY], n0.mMatrix[VZ][VY], w); - gBlendRotMat.mMatrix[VZ][VZ] = lerp(n1.mMatrix[VZ][VZ], n0.mMatrix[VZ][VZ], w); - } - } + // No lerp required in this case. + if (w == 1.0f) + { + gBlendMat = gJointMat[joint+1]; + o_vertices[bidx] = coords[index] * gBlendMat; + gBlendRotMat = gJointRot[joint+1]; + o_normals[bidx] = normals[index] * gBlendRotMat; + continue; + } + + // Try to keep all the accesses to the matrix data as close + // together as possible. This function is a hot spot on the + // Mac. JC + LLMatrix4 &m0 = gJointMat[joint+1]; + LLMatrix4 &m1 = gJointMat[joint+0]; + + gBlendMat.mMatrix[VX][VX] = lerp(m1.mMatrix[VX][VX], m0.mMatrix[VX][VX], w); + gBlendMat.mMatrix[VX][VY] = lerp(m1.mMatrix[VX][VY], m0.mMatrix[VX][VY], w); + gBlendMat.mMatrix[VX][VZ] = lerp(m1.mMatrix[VX][VZ], m0.mMatrix[VX][VZ], w); - // write result - U32 bidx = index + mMesh->mFaceVertexOffset; + gBlendMat.mMatrix[VY][VX] = lerp(m1.mMatrix[VY][VX], m0.mMatrix[VY][VX], w); + gBlendMat.mMatrix[VY][VY] = lerp(m1.mMatrix[VY][VY], m0.mMatrix[VY][VY], w); + gBlendMat.mMatrix[VY][VZ] = lerp(m1.mMatrix[VY][VZ], m0.mMatrix[VY][VZ], w); - o_vertices[bidx] = mMesh->getCoords()[index] * gBlendMat; - o_normals[bidx] = mMesh->getNormals()[index] * gBlendRotMat; - } - } + gBlendMat.mMatrix[VZ][VX] = lerp(m1.mMatrix[VZ][VX], m0.mMatrix[VZ][VX], w); + gBlendMat.mMatrix[VZ][VY] = lerp(m1.mMatrix[VZ][VY], m0.mMatrix[VZ][VY], w); + gBlendMat.mMatrix[VZ][VZ] = lerp(m1.mMatrix[VZ][VZ], m0.mMatrix[VZ][VZ], w); + + gBlendMat.mMatrix[VW][VX] = lerp(m1.mMatrix[VW][VX], m0.mMatrix[VW][VX], w); + gBlendMat.mMatrix[VW][VY] = lerp(m1.mMatrix[VW][VY], m0.mMatrix[VW][VY], w); + gBlendMat.mMatrix[VW][VZ] = lerp(m1.mMatrix[VW][VZ], m0.mMatrix[VW][VZ], w); + + o_vertices[bidx] = coords[index] * gBlendMat; + + LLMatrix3 &n0 = gJointRot[joint+1]; + LLMatrix3 &n1 = gJointRot[joint+0]; + + gBlendRotMat.mMatrix[VX][VX] = lerp(n1.mMatrix[VX][VX], n0.mMatrix[VX][VX], w); + gBlendRotMat.mMatrix[VX][VY] = lerp(n1.mMatrix[VX][VY], n0.mMatrix[VX][VY], w); + gBlendRotMat.mMatrix[VX][VZ] = lerp(n1.mMatrix[VX][VZ], n0.mMatrix[VX][VZ], w); + + gBlendRotMat.mMatrix[VY][VX] = lerp(n1.mMatrix[VY][VX], n0.mMatrix[VY][VX], w); + gBlendRotMat.mMatrix[VY][VY] = lerp(n1.mMatrix[VY][VY], n0.mMatrix[VY][VY], w); + gBlendRotMat.mMatrix[VY][VZ] = lerp(n1.mMatrix[VY][VZ], n0.mMatrix[VY][VZ], w); + + gBlendRotMat.mMatrix[VZ][VX] = lerp(n1.mMatrix[VZ][VX], n0.mMatrix[VZ][VX], w); + gBlendRotMat.mMatrix[VZ][VY] = lerp(n1.mMatrix[VZ][VY], n0.mMatrix[VZ][VY], w); + gBlendRotMat.mMatrix[VZ][VZ] = lerp(n1.mMatrix[VZ][VZ], n0.mMatrix[VZ][VZ], w); + + o_normals[bidx] = normals[index] * gBlendRotMat; } } diff --git a/linden/indra/newview/llviewerjointmesh.h b/linden/indra/newview/llviewerjointmesh.h index 591b21c..f016da6 100644 --- a/linden/indra/newview/llviewerjointmesh.h +++ b/linden/indra/newview/llviewerjointmesh.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerjointshape.cpp b/linden/indra/newview/llviewerjointshape.cpp index c22cfbe..478c041 100644 --- a/linden/indra/newview/llviewerjointshape.cpp +++ b/linden/indra/newview/llviewerjointshape.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerjointshape.h b/linden/indra/newview/llviewerjointshape.h index 28d2c09..68f08ec 100644 --- a/linden/indra/newview/llviewerjointshape.h +++ b/linden/indra/newview/llviewerjointshape.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerjoystick.cpp b/linden/indra/newview/llviewerjoystick.cpp new file mode 100644 index 0000000..bef769e --- /dev/null +++ b/linden/indra/newview/llviewerjoystick.cpp @@ -0,0 +1,272 @@ +/** + * @file llviewerjoystick.cpp + * @brief Joystick functionality. + * + * Copyright (c) 2002-2007, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + */ + +#include "llviewerprecompiledheaders.h" +#include "llviewercontrol.h" +#include "llviewerwindow.h" +#include "llviewercamera.h" +#include "llviewerjoystick.h" +#include "viewer.h" +#include "llkeyboard.h" + +static LLQuaternion sFlycamRotation; +static LLVector3 sFlycamPosition; +static F32 sFlycamZoom; + +BOOL LLViewerJoystick::sOverrideCamera = FALSE; + +void LLViewerJoystick::updateCamera(BOOL reset) +{ + static F32 last_delta[] = {0,0,0,0,0,0,0}; + static F32 delta[] = { 0,0,0,0,0,0,0 }; + + LLWindow* window = gViewerWindow->getWindow(); + + F32 time = gFrameIntervalSeconds; + + S32 axis[] = + { + gSavedSettings.getS32("FlycamAxis0"), + gSavedSettings.getS32("FlycamAxis1"), + gSavedSettings.getS32("FlycamAxis2"), + gSavedSettings.getS32("FlycamAxis3"), + gSavedSettings.getS32("FlycamAxis4"), + gSavedSettings.getS32("FlycamAxis5"), + gSavedSettings.getS32("FlycamAxis6") + }; + + F32 axis_scale[] = + { + gSavedSettings.getF32("FlycamAxisScale0"), + gSavedSettings.getF32("FlycamAxisScale1"), + gSavedSettings.getF32("FlycamAxisScale2"), + gSavedSettings.getF32("FlycamAxisScale3"), + gSavedSettings.getF32("FlycamAxisScale4"), + gSavedSettings.getF32("FlycamAxisScale5"), + gSavedSettings.getF32("FlycamAxisScale6") + }; + + F32 dead_zone[] = + { + gSavedSettings.getF32("FlycamAxisDeadZone0"), + gSavedSettings.getF32("FlycamAxisDeadZone1"), + gSavedSettings.getF32("FlycamAxisDeadZone2"), + gSavedSettings.getF32("FlycamAxisDeadZone3"), + gSavedSettings.getF32("FlycamAxisDeadZone4"), + gSavedSettings.getF32("FlycamAxisDeadZone5"), + gSavedSettings.getF32("FlycamAxisDeadZone6") + }; + + if (reset) + { + sFlycamPosition = gCamera->getOrigin(); + sFlycamRotation = gCamera->getQuaternion(); + sFlycamZoom = gCamera->getView(); + + for (U32 i = 0; i < 7; i++) + { + last_delta[i] = -window->getJoystickAxis(axis[i]); + delta[i] = 0.f; + } + return; + } + + F32 cur_delta[7]; + F32 feather = gSavedSettings.getF32("FlycamFeathering"); + BOOL absolute = gSavedSettings.getBOOL("FlycamAbsolute"); + + for (U32 i = 0; i < 7; i++) + { + cur_delta[i] = -window->getJoystickAxis(axis[i]); + F32 tmp = cur_delta[i]; + if (absolute) + { + cur_delta[i] = cur_delta[i] - last_delta[i]; + } + last_delta[i] = tmp; + + if (cur_delta[i] > 0) + { + cur_delta[i] = llmax(cur_delta[i]-dead_zone[i], 0.f); + } + else + { + cur_delta[i] = llmin(cur_delta[i]+dead_zone[i], 0.f); + } + cur_delta[i] *= axis_scale[i]; + + if (!absolute) + { + cur_delta[i] *= time; + } + + delta[i] = delta[i] + (cur_delta[i]-delta[i])*time*feather; + } + + sFlycamPosition += LLVector3(delta) * sFlycamRotation; + + LLMatrix3 rot_mat(delta[3], + delta[4], + delta[5]); + + sFlycamRotation = LLQuaternion(rot_mat)*sFlycamRotation; + + if (gSavedSettings.getBOOL("FlycamAutoLeveling")) + { + LLMatrix3 level(sFlycamRotation); + + LLVector3 x = LLVector3(level.mMatrix[0]); + LLVector3 y = LLVector3(level.mMatrix[1]); + LLVector3 z = LLVector3(level.mMatrix[2]); + + y.mV[2] = 0.f; + y.normVec(); + + level.setRows(x,y,z); + level.orthogonalize(); + + LLQuaternion quat = LLQuaternion(level); + sFlycamRotation = nlerp(llmin(feather*time,1.f), sFlycamRotation, quat); + } + + if (gSavedSettings.getBOOL("FlycamZoomDirect")) + { + sFlycamZoom = last_delta[6]*axis_scale[6]+dead_zone[6]; + } + else + { + sFlycamZoom += delta[6]; + } + + LLMatrix3 mat(sFlycamRotation); + + gCamera->setView(sFlycamZoom); + gCamera->setOrigin(sFlycamPosition); + gCamera->mXAxis = LLVector3(mat.mMatrix[0]); + gCamera->mYAxis = LLVector3(mat.mMatrix[1]); + gCamera->mZAxis = LLVector3(mat.mMatrix[2]); +} + + +void LLViewerJoystick::scanJoystick() +{ + if (!sOverrideCamera) + { + static U32 joystick_state = 0; + static U32 button_state = 0; + + F32 xval = gViewerWindow->getWindow()->getJoystickAxis(0); + F32 yval = gViewerWindow->getWindow()->getJoystickAxis(1); + + if (xval <= -0.5f) + { + if (!(joystick_state & 0x1)) + { + gKeyboard->handleTranslatedKeyDown(KEY_PAD_LEFT, 0); + joystick_state |= 0x1; + } + } + else + { + if (joystick_state & 0x1) + { + gKeyboard->handleTranslatedKeyUp(KEY_PAD_LEFT, 0); + joystick_state &= ~0x1; + } + } + if (xval >= 0.5f) + { + if (!(joystick_state & 0x2)) + { + gKeyboard->handleTranslatedKeyDown(KEY_PAD_RIGHT, 0); + joystick_state |= 0x2; + } + } + else + { + if (joystick_state & 0x2) + { + gKeyboard->handleTranslatedKeyUp(KEY_PAD_RIGHT, 0); + joystick_state &= ~0x2; + } + } + if (yval <= -0.5f) + { + if (!(joystick_state & 0x4)) + { + gKeyboard->handleTranslatedKeyDown(KEY_PAD_UP, 0); + joystick_state |= 0x4; + } + } + else + { + if (joystick_state & 0x4) + { + gKeyboard->handleTranslatedKeyUp(KEY_PAD_UP, 0); + joystick_state &= ~0x4; + } + } + if (yval >= 0.5f) + { + if (!(joystick_state & 0x8)) + { + gKeyboard->handleTranslatedKeyDown(KEY_PAD_DOWN, 0); + joystick_state |= 0x8; + } + } + else + { + if (joystick_state & 0x8) + { + gKeyboard->handleTranslatedKeyUp(KEY_PAD_DOWN, 0); + joystick_state &= ~0x8; + } + } + + for( int i = 0; i < 15; i++ ) + { + if ( gViewerWindow->getWindow()->getJoystickButton(i) & 0x80 ) + { + if (!(button_state & (1<handleTranslatedKeyDown(KEY_BUTTON1+i, 0); + button_state |= (1<handleTranslatedKeyUp(KEY_BUTTON1+i, 0); + button_state &= ~(1<append(new LLMenuItemToggleGL("Disable Camera Constraints", &LLViewerCamera::sDisableCameraConstraints)); + menu->append(new LLMenuItemCheckGL("Joystick Flycam", + &handle_toggle_flycam,NULL,&check_flycam,NULL)); + menu->append(new LLMenuItemCheckGL("Mouse Smoothing", &menu_toggle_control, NULL, @@ -1008,6 +1014,10 @@ void init_debug_ui_menu(LLMenuGL* menu) menu->append(new LLMenuItemToggleGL("Debug Keys", &LLView::sDebugKeys)); menu->append(new LLMenuItemToggleGL("Debug WindowProc", &gDebugWindowProc)); menu->append(new LLMenuItemToggleGL("Debug Text Editor Tips", &gDebugTextEditorTips)); + menu->appendSeparator(); + menu->append(new LLMenuItemCheckGL("Show Time", menu_toggle_control, NULL, menu_check_control, (void*)"DebugShowTime")); + menu->append(new LLMenuItemCheckGL("Show Render Info", menu_toggle_control, NULL, menu_check_control, (void*)"DebugShowRenderInfo")); + menu->createJumpKeys(); } @@ -1177,6 +1187,9 @@ void init_debug_rendering_menu(LLMenuGL* menu) sub_menu->append(new LLMenuItemCheckGL("LightTrace",&LLPipeline::toggleRenderDebug, NULL, &LLPipeline::toggleRenderDebugControl, (void*)LLPipeline::RENDER_DEBUG_LIGHT_TRACE)); + sub_menu->append(new LLMenuItemCheckGL("Glow",&LLPipeline::toggleRenderDebug, NULL, + &LLPipeline::toggleRenderDebugControl, + (void*)LLPipeline::RENDER_DEBUG_GLOW)); sub_menu->append(new LLMenuItemCheckGL("Show Depth Buffer", &menu_toggle_control, @@ -1242,11 +1255,6 @@ void init_debug_rendering_menu(LLMenuGL* menu) item = new LLMenuItemCheckGL("Cheesy Beacon", menu_toggle_control, NULL, menu_check_control, (void*)"CheesyBeacon"); menu->append(item); -#if 0 // 1.9.2 - item = new LLMenuItemCheckGL("Vertex Shaders", toggle_vertex_shaders, NULL, check_vertex_shaders, (void*)"VertexShaderEnable", 'V', MASK_CONTROL|MASK_ALT); - item->setEnabled(gGLManager.mHasVertexShader); - menu->append(item); -#endif menu->createJumpKeys(); } @@ -1391,8 +1399,6 @@ void init_server_menu(LLMenuGL* menu) &handle_force_parcel_to_content, &enable_god_customer_service, NULL, 'C', MASK_SHIFT | MASK_ALT | MASK_CONTROL)); - //sub->append(new LLMenuItemCallGL("Toggle First Land bit", - // &handle_toggle_parcel_newbie)); sub->appendSeparator(); sub->append(new LLMenuItemCallGL("Claim Public Land", &handle_claim_public_land, &enable_god_customer_service)); @@ -1445,33 +1451,6 @@ void cleanup_menus() // Object pie menu //----------------------------------------------------------------------------- -class LLObjectRateCreator : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - LLFloaterRate::show(LLFloaterRate::RS_CREATOR); - return true; - } -}; - -class LLObjectRateOwner : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - // Don't allow rating of group owned objects. - LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); - if (!node) return true; - if (node->mPermissions->isGroupOwned()) - { - gViewerWindow->alertXml("CantRateOwnedByGroup"); - return true; - } - - LLFloaterRate::show(LLFloaterRate::RS_OWNER); - return true; - } -}; - class LLObjectReportAbuse : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -1481,59 +1460,6 @@ class LLObjectReportAbuse : public view_listener_t } }; -// Enable only when you didn't create it, and the creator -// is not the owner. -class LLObjectEnableRateCreator : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - LLUUID creator_id; - LLUUID owner_id; - LLString dummy; - BOOL identical_creator = gSelectMgr->selectGetCreator(creator_id, dummy); - - BOOL new_value; - if (!identical_creator) - { - new_value = FALSE; - } - else - { - new_value = (creator_id != gAgent.getID()); - } - gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); - return true; - } -}; - -// Enabled if object owner isn't the agent. -class LLObjectEnableRateOwner : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - LLUUID owner_id; - LLString dummy; - BOOL identical_owner = gSelectMgr->selectGetOwner(owner_id, dummy); - - BOOL new_value; - if (!identical_owner) - { - new_value = FALSE; - } - else if (owner_id.isNull()) - { - new_value = FALSE; - } - else - { - new_value = (owner_id != gAgent.getID()); - } - gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); - return true; - } -}; - - // Enabled it you clicked an object class LLObjectEnableReportAbuse : public view_listener_t { @@ -2257,20 +2183,6 @@ void login_done(S32 which, void *user) } - -class LLAvatarRate : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - LLVOAvatar* avatar = find_avatar_from_object( gViewerWindow->lastObjectHit() ); - if( avatar ) - { - LLFloaterRate::show( avatar->getID() ); - } - return true; - } -}; - void callback_leave_group(S32 option, void *userdata) { if (option == 0) @@ -3156,6 +3068,11 @@ void reset_view_final( BOOL proceed, void* ) gAgent.changeCameraToDefault(); + if (LLViewerJoystick::sOverrideCamera) + { + handle_toggle_flycam(NULL); + } + gAgent.resetView(!gFloaterTools->getVisible()); gFloaterTools->close(); @@ -3402,40 +3319,6 @@ void handle_claim_public_land(void*) gAgent.sendReliableMessage(); } -//void handle_toggle_parcel_newbie(void*) -//{ -// gParcelMgr->toggleParcelGodReserveForNewbie(); -//} - -void on_expunge_user(S32 option, const LLString& text, void*) -{ - if(option == -1) return; - llinfos << "on_expunge_user(" << option << "," << text << ")" << llendl; - LLMessageSystem* msg = gMessageSystem; - LLUUID user_id; - if(user_id.set(text)) - { - msg->newMessage("GodExpungeUser"); - msg->nextBlock("AgentData"); - msg->addUUID("AgentID", gAgent.getID()); - msg->addUUID("SessionID", gAgent.getSessionID()); - msg->nextBlock("ExpungeData"); - msg->addUUID("AgentID", user_id); - msg->sendReliable(gUserServer); - } - else - { - gViewerWindow->alertXml("InvalidUUID"); - } -} - -void handle_god_expunge_user(void*) -{ - gViewerWindow->alertXmlEditText("ExpungeUser", LLString::format_map_t(), - NULL, NULL, - on_expunge_user, NULL); -} - void handle_god_request_havok(void *) { if (gAgent.isGodlike()) @@ -5402,7 +5285,7 @@ void upload_new_resource(const LLString& src_filename, std::string name, LLString short_name = filename.substr(offset); // No extension - snprintf(error_message, /* Flawfinder: ignore */ + snprintf(error_message, /* Flawfinder: ignore */ MAX_STRING, "No file extension for the file: '%s'\nPlease make sure the file has a correct file extension", short_name.c_str()); @@ -5551,7 +5434,7 @@ void upload_new_resource(const LLString& src_filename, std::string name, else { fclose(in); - snprintf(error_message, MAX_STRING, "unknown linden resource file version in file: %s", src_filename.c_str()); /* Flawfinder: ignore */ + snprintf(error_message, MAX_STRING, "unknown linden resource file version in file: %s", src_filename.c_str()); /* Flawfinder: ignore */ args["[FILE]"] = src_filename; upload_error(error_message, "UnknownResourceFileVersion", filename, args); return; @@ -5587,7 +5470,7 @@ void upload_new_resource(const LLString& src_filename, std::string name, else { fclose(in); - snprintf(error_message, MAX_STRING, "Unable to create output file: %s", filename.c_str()); /* Flawfinder: ignore */ + snprintf(error_message, MAX_STRING, "Unable to create output file: %s", filename.c_str()); /* Flawfinder: ignore */ args["[FILE]"] = filename; upload_error(error_message, "UnableToCreateOutputFile", filename, args); return; @@ -6340,6 +6223,21 @@ void handle_dump_followcam(void*) LLFollowCamMgr::dump(); } +BOOL check_flycam(void*) +{ + return LLViewerJoystick::sOverrideCamera; +} + +void handle_toggle_flycam(void*) +{ + LLViewerJoystick::sOverrideCamera = !LLViewerJoystick::sOverrideCamera; + if (LLViewerJoystick::sOverrideCamera) + { + LLViewerJoystick::updateCamera(TRUE); + LLFloaterJoystick::show(NULL); + } +} + void handle_viewer_enable_message_log(void*) { gMessageSystem->startLogging(); @@ -6423,14 +6321,7 @@ class LLShowFloater : public view_listener_t { if (gParcelMgr->selectionEmpty()) { - if (gLastHitPosGlobal.isExactlyZero()) - { - gParcelMgr->selectParcelAt(gAgent.getPositionGlobal()); - } - else - { - gParcelMgr->selectParcelAt( gLastHitPosGlobal ); - } + gParcelMgr->selectParcelAt(gAgent.getPositionGlobal()); } LLFloaterLand::show(); @@ -6439,14 +6330,7 @@ class LLShowFloater : public view_listener_t { if (gParcelMgr->selectionEmpty()) { - if (gLastHitPosGlobal.isExactlyZero()) - { - gParcelMgr->selectParcelAt(gAgent.getPositionGlobal()); - } - else - { - gParcelMgr->selectParcelAt( gLastHitPosGlobal ); - } + gParcelMgr->selectParcelAt(gAgent.getPositionGlobal()); } gParcelMgr->startBuyLand(); @@ -6463,10 +6347,22 @@ class LLShowFloater : public view_listener_t { LLFloaterScriptDebug::show(LLUUID::null); } - else if (floater_name == "help") + else if (floater_name == "help f1") + { +#if LL_LIBXUL_ENABLED + gViewerHtmlHelp.show(); +#endif + } + else if (floater_name == "help in-world") + { +#if LL_LIBXUL_ENABLED + LLFloaterHtml::getInstance()->show( "in-world_help" ); +#endif + } + else if (floater_name == "help additional") { #if LL_LIBXUL_ENABLED - LLHtmlHelp::show(NULL); + LLFloaterHtml::getInstance()->show( "additional_help" ); #endif } else if (floater_name == "complaint reporter") @@ -8687,7 +8583,6 @@ void initialize_menu_actions() // Avatar pie menu (new LLObjectMute())->registerListener(gMenuHolder, "Avatar.Mute"); - (new LLAvatarRate())->registerListener(gMenuHolder, "Avatar.Rate"); (new LLAvatarAddFriend())->registerListener(gMenuHolder, "Avatar.AddFriend"); (new LLAvatarFreeze())->registerListener(gMenuHolder, "Avatar.Freeze"); (new LLAvatarDebug())->registerListener(gMenuHolder, "Avatar.Debug"); @@ -8709,9 +8604,7 @@ void initialize_menu_actions() (new LLObjectDelete())->registerListener(gMenuHolder, "Object.Delete"); (new LLObjectAttachToAvatar())->registerListener(gMenuHolder, "Object.AttachToAvatar"); (new LLObjectReturn())->registerListener(gMenuHolder, "Object.Return"); - (new LLObjectRateOwner())->registerListener(gMenuHolder, "Object.RateOwner"); (new LLObjectReportAbuse())->registerListener(gMenuHolder, "Object.ReportAbuse"); - (new LLObjectRateCreator())->registerListener(gMenuHolder, "Object.RateCreator"); (new LLObjectMute())->registerListener(gMenuHolder, "Object.Mute"); (new LLObjectBuy())->registerListener(gMenuHolder, "Object.Buy"); (new LLObjectEdit())->registerListener(gMenuHolder, "Object.Edit"); @@ -8723,9 +8616,7 @@ void initialize_menu_actions() (new LLObjectEnableDelete())->registerListener(gMenuHolder, "Object.EnableDelete"); (new LLObjectEnableWear())->registerListener(gMenuHolder, "Object.EnableWear"); (new LLObjectEnableReturn())->registerListener(gMenuHolder, "Object.EnableReturn"); - (new LLObjectEnableRateOwner())->registerListener(gMenuHolder, "Object.EnableRateOwner"); (new LLObjectEnableReportAbuse())->registerListener(gMenuHolder, "Object.EnableReportAbuse"); - (new LLObjectEnableRateCreator())->registerListener(gMenuHolder, "Object.EnableRateCreator"); (new LLObjectEnableMute())->registerListener(gMenuHolder, "Object.EnableMute"); (new LLObjectEnableBuy())->registerListener(gMenuHolder, "Object.EnableBuy"); diff --git a/linden/indra/newview/llviewermenu.h b/linden/indra/newview/llviewermenu.h index 0c42426..ac2a57a 100644 --- a/linden/indra/newview/llviewermenu.h +++ b/linden/indra/newview/llviewermenu.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp index 41d24fd..5dab363 100644 --- a/linden/indra/newview/llviewermessage.cpp +++ b/linden/indra/newview/llviewermessage.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -106,6 +107,7 @@ #include "llui.h" // for make_ui_sound #include "lluploaddialog.h" #include "llviewercamera.h" +#include "llviewergenericmessage.h" #include "llviewerinventory.h" #include "llviewermenu.h" #include "llviewerobject.h" @@ -142,8 +144,6 @@ extern BOOL gDebugClicks; extern void bad_network_handler(); -LLDispatcher gGenericDispatcher; - // function prototypes void open_offer(const std::vector& items); void friendship_offer_callback(S32 option, void* user_data); @@ -1559,61 +1559,135 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) break; } case IM_GROUP_VOTE: + { + LLUUID *userdata = new LLUUID(session_id); + args["[NAME]"] = name; + args["[MESSAGE]"] = message; + LLNotifyBox::showXml("GroupVote", args, + &group_vote_callback, userdata); + } + break; + + case IM_GROUP_ELECTION_DEPRECATED: + { + llwarns << "Received IM: IM_GROUP_ELECTION_DEPRECATED" << llendl; + } + break; + + case IM_SESSION_911_SEND: + { + //this is just the same code as IM_SESSION_SEND for a bit + //I was too lazy to make this a function....sorry - jwolk + if (!is_linden && is_busy) { - LLUUID *userdata = new LLUUID(session_id); - args["[NAME]"] = name; - args["[MESSAGE]"] = message; - LLNotifyBox::showXml("GroupVote", args, - &group_vote_callback, userdata); + return; + } + + // standard message, not from system + char saved[MAX_STRING]; /* Flawfinder: ignore */ + saved[0] = '\0'; + if(offline == IM_OFFLINE) + { + char time_buf[TIME_STR_LENGTH]; /* Flawfinder: ignore */ + snprintf(saved, /* Flawfinder: ignore */ + MAX_STRING, + "(Saved %s) ", + formatted_time(timestamp, time_buf)); + } + + snprintf(buffer, /* Flawfinder: ignore */ + sizeof(buffer), + "%s%s%s%s", + name, + separator_string, + saved, + (message+message_offset)); + + BOOL is_this_agent = FALSE; + if(from_id == gAgentID) + { + from_id = LLUUID::null; + is_this_agent = TRUE; } - break; - case IM_GROUP_ELECTION_DEPRECATED: + gIMView->addMessage( + session_id, + from_id, + name, + buffer, + (char*)binary_bucket, + IM_SESSION_ADD, + parent_estate_id, + region_id, + position); + + snprintf(buffer, sizeof(buffer), "IM: %s%s%s%s", name, separator_string, saved, (message+message_offset)); /* Flawfinder: ignore */ + chat.mText = buffer; + LLFloaterChat::addChat(chat, TRUE, is_this_agent); + + //ok, now we want to add a teleport button if we are receving + //a message from not ourself + LLFloaterIMPanel* panel = + gIMView->findFloaterBySession(session_id); + + if (panel && !is_this_agent ) { - llwarns << "Received IM: IM_GROUP_ELECTION_DEPRECATED" << llendl; + //don't add a teleport button for yourself + panel->addTeleportButton(); } break; + } case IM_SESSION_SEND: + { + if (!is_linden && is_busy) { - if (!is_linden && is_busy) + return; + } + + // System messages, specifically "Foo Bar has left this session" + // are not shown unless you actually have that session open. + // Band-aid. JC + if (offline == IM_ONLINE + && chat.mFromName == SYSTEM_FROM + && !gIMView->hasSession(session_id)) { return; } - - // standard message, not from system - char saved[MAX_STRING]; /* Flawfinder: ignore */ - saved[0] = '\0'; - if(offline == IM_OFFLINE) - { - char time_buf[TIME_STR_LENGTH]; /* Flawfinder: ignore */ - snprintf(saved, /* Flawfinder: ignore */ - MAX_STRING, - "(Saved %s) ", - formatted_time(timestamp, time_buf)); - } - snprintf(buffer, sizeof(buffer), "%s%s%s%s", name, separator_string, saved, (message+message_offset)); /* Flawfinder: ignore */ - BOOL is_this_agent = FALSE; - if(from_id == gAgentID) - { - from_id = LLUUID::null; - is_this_agent = TRUE; - } - gIMView->addMessage( - session_id, - from_id, - name, - buffer, - (char*)binary_bucket, - IM_SESSION_ADD, - parent_estate_id, - region_id, - position); - - snprintf(buffer, sizeof(buffer), "IM: %s%s%s%s", name, separator_string, saved, (message+message_offset)); /* Flawfinder: ignore */ - chat.mText = buffer; - LLFloaterChat::addChat(chat, TRUE, is_this_agent); + + // standard message, not from system + char saved[MAX_STRING]; /* Flawfinder: ignore */ + saved[0] = '\0'; + if(offline == IM_OFFLINE) + { + char time_buf[TIME_STR_LENGTH]; /* Flawfinder: ignore */ + snprintf(saved, /* Flawfinder: ignore */ + MAX_STRING, + "(Saved %s) ", + formatted_time(timestamp, time_buf)); } - break; + snprintf(buffer, sizeof(buffer), "%s%s%s%s", name, separator_string, saved, (message+message_offset)); /* Flawfinder: ignore */ + BOOL is_this_agent = FALSE; + if(from_id == gAgentID) + { + from_id = LLUUID::null; + is_this_agent = TRUE; + } + gIMView->addMessage( + session_id, + from_id, + name, + buffer, + (char*)binary_bucket, + IM_SESSION_ADD, + parent_estate_id, + region_id, + position); + + snprintf(buffer, sizeof(buffer), "IM: %s%s%s%s", name, separator_string, saved, (message+message_offset)); /* Flawfinder: ignore */ + chat.mText = buffer; + LLFloaterChat::addChat(chat, TRUE, is_this_agent); + } + break; case IM_FROM_TASK: if (is_busy && !is_owned_by_me) @@ -1684,21 +1758,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) } break; - case IM_LURE_911: - { - // HACK -- the from_id is the im_session_id - LLFloaterIMPanel* panel = gIMView->findFloaterBySession(session_id); - if (panel) - { - panel->addTeleportButton(from_id); - } - else - { - llinfos << "LLFloaterIMPanel not found for " << session_id << " from " << from_id << llendl; - } - } - break; - case IM_GOTO_URL: { char* url = new char[binary_bucket_size]; @@ -2308,7 +2367,18 @@ void process_teleport_progress(LLMessageSystem* msg, void**) char buffer[MAX_STRING]; /* Flawfinder: ignore */ msg->getString("Info", "Message", MAX_STRING, buffer); lldebugs << "teleport progress: " << buffer << llendl; - gAgent.setTeleportMessage(buffer); + + //Sorta hacky...default to using simulator raw messages + //if we don't find the coresponding mapping in our progress mappings + LLString message = buffer; + + if (LLAgent::sTeleportProgressMessages.find(buffer) != + LLAgent::sTeleportProgressMessages.end() ) + { + message = LLAgent::sTeleportProgressMessages[buffer]; + } + + gAgent.setTeleportMessage(LLAgent::sTeleportProgressMessages[message]); } class LLFetchInWelcomeArea : public LLInventoryFetchDescendentsObserver @@ -2465,7 +2535,7 @@ void process_teleport_finish(LLMessageSystem* msg, void**) send_complete_agent_movement(sim_host); gAgent.setTeleportState( LLAgent::TELEPORT_MOVING ); - gAgent.setTeleportMessage("Contacting New Region..."); + gAgent.setTeleportMessage(LLAgent::sTeleportProgressMessages["contacting"]); regionp->setSeedCapability(std::string(seedCap)); @@ -2501,6 +2571,8 @@ void process_avatar_init_complete(LLMessageSystem* msg, void**) void process_agent_movement_complete(LLMessageSystem* msg, void**) { + gAgentMovementCompleted = TRUE; + LLUUID agent_id; msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); LLUUID session_id; @@ -3903,7 +3975,16 @@ void process_alert_core(const char* buffer, BOOL modal) } // Translate system messages here. - if (buffer[0] == '/') + const char ALERT_PREFIX[] = "ALERT: "; + const size_t ALERT_PREFIX_LEN = sizeof(ALERT_PREFIX) - 1; + if (!strncmp(buffer, ALERT_PREFIX, ALERT_PREFIX_LEN)) + { + // Allow the server to spawn a named alert so that server alerts can be + // translated out of English. JC + std::string alert_name(buffer + ALERT_PREFIX_LEN); + LLAlertDialog::showXml(alert_name); + } + else if (buffer[0] == '/') { // System message is important, show in upper-right box not tip LLString text(buffer+1); @@ -4295,7 +4376,7 @@ void process_teleport_failed(LLMessageSystem *msg, void**) msg->getStringFast(_PREHASH_Info, _PREHASH_Reason, STD_STRING_BUF_SIZE, reason); LLStringBase::format_map_t args; - args["[REASON]"] = reason; + args["[REASON]"] = LLAgent::sTeleportErrorMessages[reason]; gViewerWindow->alertXml("CouldNotTeleportReason", args); if( gAgent.getTeleportState() != LLAgent::TELEPORT_NONE ) @@ -4449,25 +4530,6 @@ void handle_lure_callback_godlike(S32 option, void* userdata) handle_lure_callback(option, LLString::null, userdata); } -void send_lure_911(void** user_data, S32 result) -{ - LLUUID im_session_id(*((LLUUID*)user_data)); - LLString name; - gAgent.getName(name); - LLString text = name + " needs help"; // this text is ignored for 911 lures - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_StartLure); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_Info); - msg->addU8Fast(_PREHASH_LureType, (U8)IM_LURE_911); - msg->addStringFast(_PREHASH_Message, text.c_str()); - msg->nextBlockFast(_PREHASH_TargetData); - msg->addUUIDFast(_PREHASH_TargetID, im_session_id); - gAgent.sendReliableMessage(); -} - void handle_lure(const LLUUID& invitee) { LLDynamicArray ids; @@ -4985,59 +5047,6 @@ void onCovenantLoadComplete(LLVFS *vfs, LLFloaterBuyLand::updateCovenantText(covenant_text, asset_uuid); } -void send_generic_message(const char* method, - const std::vector& strings, - const LLUUID& invoice) -{ - LLMessageSystem* msg = gMessageSystem; - msg->newMessage("GenericMessage"); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used - msg->nextBlock("MethodData"); - msg->addString("Method", method); - msg->addUUID("Invoice", invoice); - if(strings.empty()) - { - msg->nextBlock("ParamList"); - msg->addString("Parameter", NULL); - } - else - { - std::vector::const_iterator it = strings.begin(); - std::vector::const_iterator end = strings.end(); - for(; it != end; ++it) - { - msg->nextBlock("ParamList"); - msg->addString("Parameter", (*it).c_str()); - } - } - gAgent.sendReliableMessage(); -} - - -void process_generic_message(LLMessageSystem* msg, void**) -{ - LLUUID agent_id; - msg->getUUID("AgentData", "AgentID", agent_id); - if (agent_id != gAgent.getID()) - { - llwarns << "GenericMessage for wrong agent" << llendl; - return; - } - - std::string request; - LLUUID invoice; - LLDispatcher::sparam_t strings; - LLDispatcher::unpackMessage(msg, request, invoice, strings); - - if(!gGenericDispatcher.dispatch(request, invoice, strings)) - { - llwarns << "GenericMessage " << request << " failed to dispatch" - << llendl; - } -} void process_feature_disabled_message(LLMessageSystem* msg, void**) { @@ -5062,3 +5071,6 @@ void invalid_message_callback(LLMessageSystem* msg, { bad_network_handler(); } + +// Please do not add more message handlers here. This file is huge. +// Put them in a file related to the functionality you are implementing. JC diff --git a/linden/indra/newview/llviewermessage.h b/linden/indra/newview/llviewermessage.h index 258003e..ce8f6a7 100644 --- a/linden/indra/newview/llviewermessage.h +++ b/linden/indra/newview/llviewermessage.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -28,12 +29,10 @@ #ifndef LL_LLVIEWERMESSAGE_H #define LL_LLVIEWERMESSAGE_H -//#include "linked_lists.h" #include "llinstantmessage.h" #include "lltransactiontypes.h" #include "lluuid.h" #include "stdenums.h" -#include "message.h" // // Forward declarations @@ -42,6 +41,7 @@ class LLColor4; class LLViewerObject; class LLInventoryObject; class LLInventoryItem; +class LLMessageSystem; class LLViewerRegion; // @@ -188,8 +188,6 @@ void process_decline_callingcard(LLMessageSystem* msg, void**); // Message system exception prototypes void invalid_message_callback(LLMessageSystem*, void*, EMessageException); -void send_lure_911(void** user_data, S32 result); - void process_initiate_download(LLMessageSystem* msg, void**); void inventory_offer_callback(S32 option, void* user_data); @@ -208,15 +206,7 @@ struct LLOfferInfo LLHost mHost; }; -void send_generic_message(const char* method, - const std::vector& strings, - const LLUUID& invoice = LLUUID::null); - -void process_generic_message(LLMessageSystem* msg, void**); - void process_feature_disabled_message(LLMessageSystem* msg, void**); -extern LLDispatcher gGenericDispatcher; - #endif diff --git a/linden/indra/newview/llviewernetwork.cpp b/linden/indra/newview/llviewernetwork.cpp index d870871..4cdbd5c 100644 --- a/linden/indra/newview/llviewernetwork.cpp +++ b/linden/indra/newview/llviewernetwork.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewernetwork.h b/linden/indra/newview/llviewernetwork.h index 4c90c5b..eb9610b 100644 --- a/linden/indra/newview/llviewernetwork.h +++ b/linden/indra/newview/llviewernetwork.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerobject.cpp b/linden/indra/newview/llviewerobject.cpp index a1a971f..5cb65b6 100644 --- a/linden/indra/newview/llviewerobject.cpp +++ b/linden/indra/newview/llviewerobject.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -4631,6 +4632,13 @@ void LLViewerObject::setRegion(LLViewerRegion *regionp) llassert(regionp); mLatestRecvPacketID = 0; mRegionp = regionp; + + for (child_list_t::iterator i = getChildren().begin(); i != getChildren().end(); ++i) + { + LLViewerObject* child = *i; + child->setRegion(regionp); + } + setChanged(MOVED | SILHOUETTE); updateDrawable(FALSE); } diff --git a/linden/indra/newview/llviewerobject.h b/linden/indra/newview/llviewerobject.h index 7176d24..cdf2214 100644 --- a/linden/indra/newview/llviewerobject.h +++ b/linden/indra/newview/llviewerobject.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerobjectlist.cpp b/linden/indra/newview/llviewerobjectlist.cpp index 8c15906..44aa5c7 100644 --- a/linden/indra/newview/llviewerobjectlist.cpp +++ b/linden/indra/newview/llviewerobjectlist.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerobjectlist.h b/linden/indra/newview/llviewerobjectlist.h index f92c989..309def1 100644 --- a/linden/indra/newview/llviewerobjectlist.h +++ b/linden/indra/newview/llviewerobjectlist.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerparcelmgr.cpp b/linden/indra/newview/llviewerparcelmgr.cpp index a21d2f7..3d4bbe5 100644 --- a/linden/indra/newview/llviewerparcelmgr.cpp +++ b/linden/indra/newview/llviewerparcelmgr.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -1366,7 +1367,6 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use LLUUID owner_id; BOOL is_group_owned; U32 auction_id = 0; - BOOL is_reserved = FALSE; S32 claim_price_per_meter = 0; S32 rent_price_per_meter = 0; S32 claim_date = 0; @@ -1443,7 +1443,6 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use msg->getUUIDFast(_PREHASH_ParcelData, _PREHASH_OwnerID, owner_id); msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_IsGroupOwned, is_group_owned); msg->getU32Fast(_PREHASH_ParcelData, _PREHASH_AuctionID, auction_id); - msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_ReservedNewbie, is_reserved); msg->getS32Fast( _PREHASH_ParcelData, _PREHASH_ClaimDate, claim_date); msg->getS32Fast( _PREHASH_ParcelData, _PREHASH_ClaimPrice, claim_price_per_meter); msg->getS32Fast( _PREHASH_ParcelData, _PREHASH_RentPrice, rent_price_per_meter); @@ -1480,7 +1479,6 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use parcel->setAABBMax(aabb_max); parcel->setAuctionID(auction_id); - parcel->setReservedForNewbie(is_reserved); parcel->setOwnershipStatus((LLParcel::EOwnershipStatus)status); parcel->setSimWideMaxPrimCapacity(sw_max_prims); @@ -2233,16 +2231,10 @@ bool LLViewerParcelMgr::canAgentBuyParcel(LLParcel* parcel, bool forGroup) const bool isOwner = parcelOwner == (forGroup ? gAgent.getGroupID() : gAgent.getID()); - bool isAvailable - = parcel->getReservedForNewbie() - ? (!forGroup && gStatusBar->getSquareMetersCommitted() == 0) - : true; - // *TODO: should be based on never_owned_land, see SL-10728 - bool isAuthorized = (authorizeBuyer.isNull() || (gAgent.getID() == authorizeBuyer)); - return isForSale && !isOwner && isAuthorized && isAvailable && isEmpowered; + return isForSale && !isOwner && isAuthorized && isEmpowered; } @@ -2587,6 +2579,6 @@ bool LLParcelSelection::hasOthersSelected() const LLParcelSelection* get_null_parcel_selection() { - static LLParcelSelectionHandle null_ptr = new LLParcelSelection(); - return null_ptr; + static LLParcelSelection null_selection; + return &null_selection; } diff --git a/linden/indra/newview/llviewerparcelmgr.h b/linden/indra/newview/llviewerparcelmgr.h index c970611..bade8ef 100644 --- a/linden/indra/newview/llviewerparcelmgr.h +++ b/linden/indra/newview/llviewerparcelmgr.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -221,12 +222,6 @@ public: // make the selected parcel a content parcel. void sendParcelGodForceToContent(); - // Take the selected parcel, and toggle it's 'reserved for newbie' - // status. - // *NOTE: There is no longer a newbie toggle. It is a linden sale - // for newbie now. - //void toggleParcelGodReserveForNewbie(); - // Pack information about this parcel and send it to the region // containing the southwest corner of the selection. // If want_reply_to_update, simulator will send back a ParcelProperties diff --git a/linden/indra/newview/llviewerparceloverlay.cpp b/linden/indra/newview/llviewerparceloverlay.cpp index 36a4449..d5ad910 100644 --- a/linden/indra/newview/llviewerparceloverlay.cpp +++ b/linden/indra/newview/llviewerparceloverlay.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerparceloverlay.h b/linden/indra/newview/llviewerparceloverlay.h index 98cc19a..d444d96 100644 --- a/linden/indra/newview/llviewerparceloverlay.h +++ b/linden/indra/newview/llviewerparceloverlay.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerpartsim.cpp b/linden/indra/newview/llviewerpartsim.cpp index 2658e67..8c06381 100644 --- a/linden/indra/newview/llviewerpartsim.cpp +++ b/linden/indra/newview/llviewerpartsim.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -249,13 +250,13 @@ void LLViewerPartGroup::removePart(const S32 part_num) void LLViewerPartGroup::updateParticles(const F32 dt) { LLMemType mt(LLMemType::MTYPE_PARTICLES); - S32 i, count; + S32 i; LLVector3 gravity(0.f, 0.f, -9.8f); LLViewerRegion *regionp = getRegion(); - count = (S32) mParticles.size(); - for (i = 0; i < count; i++) + S32 end = (S32) mParticles.size(); + for (i = 0; i < end; i++) { LLVector3 a(0.f, 0.f, 0.f); LLViewerPart& part = *((LLViewerPart*) mParticles[i]); @@ -364,9 +365,8 @@ void LLViewerPartGroup::updateParticles(const F32 dt) // Kill dead particles (either flagged dead, or too old) if ((part.mLastUpdateTime > part.mMaxAge) || (LLViewerPart::LL_PART_DEAD_MASK == part.mFlags)) { - removePart(i); - i--; - count--; + end--; + LLPointer::swap(mParticles[i], mParticles[end]); } else { @@ -375,13 +375,24 @@ void LLViewerPartGroup::updateParticles(const F32 dt) { // Transfer particles between groups gWorldPointer->mPartSim.put(&part); - removePart(i); - i--; - count--; + end--; + LLPointer::swap(mParticles[i], mParticles[end]); } } } + S32 removed = (S32)mParticles.size() - end; + if (removed > 0) + { + // we removed one or more particles, so flag this group for update + mParticles.erase(mParticles.begin() + end, mParticles.end()); + if (mVOPartGroupp.notNull()) + { + gPipeline.markRebuild(mVOPartGroupp->mDrawable, LLDrawable::REBUILD_ALL, TRUE); + } + LLViewerPartSim::decPartCount(removed); + } + // Kill the viewer object if this particle group is empty if (mParticles.empty()) { @@ -480,7 +491,7 @@ LLViewerPartGroup *LLViewerPartSim::put(LLViewerPart* part) const F32 MAX_MAG = 1000000.f*1000000.f; // 1 million if (part->mPosAgent.magVecSquared() > MAX_MAG || !part->mPosAgent.isFinite()) { -#if !LL_RELEASE_FOR_DOWNLOAD +#if 0 && !LL_RELEASE_FOR_DOWNLOAD llwarns << "LLViewerPartSim::put Part out of range!" << llendl; llwarns << part->mPosAgent << llendl; #endif diff --git a/linden/indra/newview/llviewerpartsim.h b/linden/indra/newview/llviewerpartsim.h index c1ef43b..88eb065 100644 --- a/linden/indra/newview/llviewerpartsim.h +++ b/linden/indra/newview/llviewerpartsim.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerpartsource.cpp b/linden/indra/newview/llviewerpartsource.cpp index 33e6df4..333c0ac 100644 --- a/linden/indra/newview/llviewerpartsource.cpp +++ b/linden/indra/newview/llviewerpartsource.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerpartsource.h b/linden/indra/newview/llviewerpartsource.h index 15f7ba2..3fd6b85 100644 --- a/linden/indra/newview/llviewerpartsource.h +++ b/linden/indra/newview/llviewerpartsource.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerprecompiledheaders.cpp b/linden/indra/newview/llviewerprecompiledheaders.cpp index 3880a70..16ac4a7 100644 --- a/linden/indra/newview/llviewerprecompiledheaders.cpp +++ b/linden/indra/newview/llviewerprecompiledheaders.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerprecompiledheaders.h b/linden/indra/newview/llviewerprecompiledheaders.h index 8ba45fc..cc2af01 100644 --- a/linden/indra/newview/llviewerprecompiledheaders.h +++ b/linden/indra/newview/llviewerprecompiledheaders.h @@ -5,6 +5,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerregion.cpp b/linden/indra/newview/llviewerregion.cpp index 88d8a40..51b1ebe 100644 --- a/linden/indra/newview/llviewerregion.cpp +++ b/linden/indra/newview/llviewerregion.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -34,7 +35,6 @@ #include "llhttpclient.h" #include "llregionflags.h" #include "llregionhandle.h" -#include "llsdmessagesystem.h" #include "llsurface.h" #include "message.h" //#include "vmath.h" @@ -43,6 +43,7 @@ #include "llagent.h" #include "llcallingcard.h" +#include "llcaphttpsender.h" #include "lldir.h" #include "lleventpoll.h" #include "llfloatergodtools.h" @@ -57,6 +58,12 @@ #include "llvocache.h" #include "llvoclouds.h" #include "llworld.h" +#include "viewer.h" + +// Viewer object cache version, change if object update +// format changes. JC +const U32 INDRA_OBJECT_CACHE_VERSION = 12; + extern BOOL gNoRender; @@ -161,6 +168,7 @@ LLViewerRegion::~LLViewerRegion() delete mParcelOverlay; delete mLandp; delete mEventPoll; + LLHTTPSender::clearSender(mHost); saveCache(); } @@ -441,7 +449,6 @@ LLVector3 LLViewerRegion::getCenterAgent() const return gAgent.getPosAgentFromGlobal(mCenterGlobal); } - void LLViewerRegion::setRegionNameAndZone(const char* name_and_zone) { LLString name_zone(name_and_zone); @@ -724,21 +731,6 @@ F32 LLViewerRegion::getCompositionXY(const S32 x, const S32 y) const return getComposition()->getValueScaled((F32)x, (F32)y); } - -// ---------------- Friends ---------------- - -std::ostream& operator<<(std::ostream &s, const LLViewerRegion ®ion) -{ - s << "{ "; - s << region.mHost; - s << " mOriginGlobal = " << region.getOriginGlobal()<< "\n"; - s << "}"; - return s; -} - - -// ---------------- Protected Member Functions ---------------- - void LLViewerRegion::calculateCenterGlobal() { mCenterGlobal = mOriginGlobal; @@ -754,7 +746,24 @@ void LLViewerRegion::calculateCenterGlobal() } } +void LLViewerRegion::calculateCameraDistance() +{ + mCameraDistanceSquared = (F32)(gAgent.getCameraPositionGlobal() - getCenterGlobal()).magVecSquared(); +} +// ---------------- Friends ---------------- + +std::ostream& operator<<(std::ostream &s, const LLViewerRegion ®ion) +{ + s << "{ "; + s << region.mHost; + s << " mOriginGlobal = " << region.getOriginGlobal()<< "\n"; + s << "}"; + return s; +} + + +// ---------------- Protected Member Functions ---------------- void LLViewerRegion::updateNetStats() { @@ -1293,35 +1302,34 @@ void LLViewerRegion::setSeedCapability(const std::string& url) capabilityNames.append("SendUserReport"); capabilityNames.append("SendUserReportWithScreenshot"); capabilityNames.append("RequestTextureDownload"); + capabilityNames.append("UntrustedSimulatorMessage"); + LLHTTPClient::post(url, capabilityNames, BaseCapabilitiesComplete::build(this)); } static LLEventPoll* createViewerEventPoll(const std::string& url) { - static LLHTTPNode eventRoot; - static bool eventRootServicesAdded = false; - if (!eventRootServicesAdded) - { - LLSDMessageSystem::useServices(); - LLHTTPRegistrar::buildAllServices(eventRoot); - eventRootServicesAdded = true; - } - - return new LLEventPoll(url, eventRoot); + return new LLEventPoll(url); } void LLViewerRegion::setCapability(const std::string& name, const std::string& url) { - mCapabilities[name] = url; - - if (name == "EventQueueGet") + if(name == "EventQueueGet") { delete mEventPoll; mEventPoll = NULL; mEventPoll = createViewerEventPoll(url); } + else if(name == "UntrustedSimulatorMessage") + { + LLHTTPSender::setSender(mHost, new LLCapHTTPSender(url)); + } + else + { + mCapabilities[name] = url; + } } std::string LLViewerRegion::getCapability(const std::string& name) const diff --git a/linden/indra/newview/llviewerregion.h b/linden/indra/newview/llviewerregion.h index 69a8f19..5b7ce17 100644 --- a/linden/indra/newview/llviewerregion.h +++ b/linden/indra/newview/llviewerregion.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -227,9 +228,19 @@ public: void unpackRegionHandshake(); void calculateCenterGlobal(); + void calculateCameraDistance(); friend std::ostream& operator<<(std::ostream &s, const LLViewerRegion ®ion); +public: + struct CompareDistance + { + bool operator()(const LLViewerRegion* const& lhs, const LLViewerRegion* const& rhs) + { + return lhs->mCameraDistanceSquared < rhs->mCameraDistanceSquared; + } + }; + protected: void disconnectAllNeighbors(); void initStats(); @@ -284,13 +295,15 @@ protected: U32 mPingDelay; F32 mDeltaTime; // Time since last measurement of lastPackets, Bits, etc + // Misc LLVLComposition *mCompositionp; // Composition layer for the surface U32 mRegionFlags; // includes damage flags U8 mSimAccess; F32 mBillableFactor; U32 mMaxTasks; // max prim count - + F32 mCameraDistanceSquared; // updated once per frame + // Maps local ids to cache entries. // Regions can have order 10,000 objects, so assume // a structure of size 2^14 = 16,000 diff --git a/linden/indra/newview/llviewerreputation.cpp b/linden/indra/newview/llviewerreputation.cpp deleted file mode 100644 index 3ee4ab3..0000000 --- a/linden/indra/newview/llviewerreputation.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/** - * @file llviewerreputation.cpp - * @brief Viewer-side reputation system handling. - * - * Copyright (c) 2002-2007, Linden Research, Inc. - * - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlife.com/developers/opensource/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at http://secondlife.com/developers/opensource/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include "llviewerprecompiledheaders.h" - -#include "llviewerreputation.h" - -// linden library includes -#include "llerror.h" -#include "llnamevalue.h" -#include "message.h" -#include "lluuid.h" -#include "llinstantmessage.h" -#include "lldbstrings.h" - -// viewer includes -#include "llagent.h" -#include "llviewerregion.h" - -// constants -const F32 REP_AGENT_SCORE_POS = 1.0f; // positive rating changes score by this much -const F32 REP_AGENT_SCORE_NEG = -1.0f; -const F32 REP_OBJECT_SCORE_POS = 1.0f; -const F32 REP_OBJECT_SCORE_NEG = -1.0f; - - -// Send a reputation assignment for an agent. -// Forward through the receiving agent's simulator. -void send_reputation_agent_assign(const LLUUID& rator_id, - const LLUUID& ratee_id, - F32 behavior, - F32 appearance, - F32 building, - const char* text) -{ - LLMessageSystem* msg = gMessageSystem; - if (!msg) return; - - msg->newMessageFast(_PREHASH_ReputationAgentAssign); - msg->nextBlockFast(_PREHASH_DataBlock); - msg->addUUIDFast(_PREHASH_RatorID, rator_id ); - msg->addUUIDFast(_PREHASH_RateeID, ratee_id ); - msg->addF32Fast(_PREHASH_Behavior, behavior ); - msg->addF32Fast(_PREHASH_Appearance, appearance ); - msg->addF32Fast(_PREHASH_Building, building ); - msg->sendReliable( gAgent.getRegion()->getHost() ); - - // Send instant message to the person rated. - LLString name; - gAgent.getName(name); - - BOOL any_positive = (behavior > 0.f || appearance > 0.f || building > 0.f); - BOOL any_negative = (behavior < 0.f || appearance < 0.f || building < 0.f); - - LLString message(name); - if (any_positive && !any_negative) - { - message.append(" rated you positively: "); - } - else if (any_negative && !any_positive) - { - message.append(" rated you negatively: "); - } - else - { - message.append(" rated you: "); - } - - if (text && strlen(text) > 0) /* Flawfinder: ignore */ - { - message.append(text); - } - else - { - message.append("(no message)"); - } - - pack_instant_message( - msg, - gAgent.getID(), - FALSE, - gAgent.getSessionID(), - ratee_id, - SYSTEM_FROM, - message.c_str(), - IM_ONLINE, - IM_CONSOLE_AND_CHAT_HISTORY); - gAgent.sendReliableMessage(); -} diff --git a/linden/indra/newview/llviewerreputation.h b/linden/indra/newview/llviewerreputation.h deleted file mode 100644 index 04c8fd3..0000000 --- a/linden/indra/newview/llviewerreputation.h +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @file llviewerreputation.h - * @brief Viewer-side handling of reputation system - * - * Copyright (c) 2002-2007, Linden Research, Inc. - * - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlife.com/developers/opensource/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at http://secondlife.com/developers/opensource/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef LLVIEWERREPUTATION_H -#define LLVIEWERREPUTATION_H - -class LLMessageSystem; -class LLUUID; - - -// messaging -void send_reputation_agent_assign( const LLUUID& rator, const LLUUID& ratee, F32 behavior, F32 appearance, F32 building, const char* text = NULL); -void send_reputation_agent_request(const LLUUID& ratee_id); - - -#endif diff --git a/linden/indra/newview/llviewerstats.cpp b/linden/indra/newview/llviewerstats.cpp index c7d2ee2..4ad1155 100644 --- a/linden/indra/newview/llviewerstats.cpp +++ b/linden/indra/newview/llviewerstats.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerstats.h b/linden/indra/newview/llviewerstats.h index 22f6e57..81650dd 100644 --- a/linden/indra/newview/llviewerstats.h +++ b/linden/indra/newview/llviewerstats.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewertexteditor.cpp b/linden/indra/newview/llviewertexteditor.cpp index f84c875..826c411 100644 --- a/linden/indra/newview/llviewertexteditor.cpp +++ b/linden/indra/newview/llviewertexteditor.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -342,7 +343,16 @@ void LLEmbeddedItems::bindEmbeddedChars( const LLFontGL* font ) } break; case LLAssetType::AT_CLOTHING: img_name = "inv_item_clothing.tga"; break; - case LLAssetType::AT_OBJECT: img_name = "inv_item_object.tga"; break; + case LLAssetType::AT_OBJECT: + if (item->getFlags() & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS) + { + img_name = "inv_item_object_multi.tga"; + } + else + { + img_name = "inv_item_object.tga"; + } + break; case LLAssetType::AT_NOTECARD: img_name = "inv_item_notecard.tga"; break; case LLAssetType::AT_LSL_TEXT: img_name = "inv_item_script.tga"; break; case LLAssetType::AT_BODYPART: img_name = "inv_item_bodypart.tga"; break; @@ -594,7 +604,7 @@ BOOL LLViewerTextEditor::handleMouseDown(S32 x, S32 y, MASK mask) { mDragItem = item_at_pos; mDragItemSaved = LLEmbeddedItems::getEmbeddedItemSaved(wc); - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); mMouseDownX = x; mMouseDownY = y; S32 screen_x; @@ -656,7 +666,7 @@ BOOL LLViewerTextEditor::handleMouseDown(S32 x, S32 y, MASK mask) setCursorAtLocalPos( x, y, TRUE ); startSelection(); } - gFocusMgr.setMouseCapture( this, &LLTextEditor::onMouseCaptureLost ); + gFocusMgr.setMouseCapture( this ); } handled = TRUE; @@ -686,7 +696,7 @@ BOOL LLViewerTextEditor::handleHover(S32 x, S32 y, MASK mask) } if( getVisible() ) { - if(gFocusMgr.getMouseCapture() == this ) + if(hasMouseCapture() ) { if( mIsSelecting ) { @@ -839,7 +849,7 @@ BOOL LLViewerTextEditor::handleMouseUp(S32 x, S32 y, MASK mask) // Delay cursor flashing mKeystrokeTimer.reset(); - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { if (mDragItem) { @@ -852,7 +862,7 @@ BOOL LLViewerTextEditor::handleMouseUp(S32 x, S32 y, MASK mask) } } mDragItem = NULL; - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); handled = TRUE; } @@ -1443,12 +1453,14 @@ BOOL LLViewerTextEditor::exportBuffer( LLString& buffer ) { LLNotecard nc(LLNotecard::MAX_SIZE); - std::vector > embedded_items; - mEmbeddedItemList->getEmbeddedItemList(embedded_items); - - nc.setItems(embedded_items); + // Get the embedded text and update the item list to just be the used items nc.setText(getEmbeddedText()); + // Now get the used items and copy the list to the notecard + std::vector > embedded_items; + mEmbeddedItemList->getEmbeddedItemList(embedded_items); + nc.setItems(embedded_items); + std::stringstream out_stream; nc.exportStream(out_stream); diff --git a/linden/indra/newview/llviewertexteditor.h b/linden/indra/newview/llviewertexteditor.h index da980d1..6665203 100644 --- a/linden/indra/newview/llviewertexteditor.h +++ b/linden/indra/newview/llviewertexteditor.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewertextureanim.cpp b/linden/indra/newview/llviewertextureanim.cpp index bd4d0ef..d608088 100644 --- a/linden/indra/newview/llviewertextureanim.cpp +++ b/linden/indra/newview/llviewertextureanim.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewertextureanim.h b/linden/indra/newview/llviewertextureanim.h index c5b4e84..0477455 100644 --- a/linden/indra/newview/llviewertextureanim.h +++ b/linden/indra/newview/llviewertextureanim.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerthrottle.cpp b/linden/indra/newview/llviewerthrottle.cpp index 7f09937..1db94ec 100644 --- a/linden/indra/newview/llviewerthrottle.cpp +++ b/linden/indra/newview/llviewerthrottle.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerthrottle.h b/linden/indra/newview/llviewerthrottle.h index c9157bd..e56e623 100644 --- a/linden/indra/newview/llviewerthrottle.h +++ b/linden/indra/newview/llviewerthrottle.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvieweruictrlfactory.cpp b/linden/indra/newview/llvieweruictrlfactory.cpp index 3523c88..efab1cc 100644 --- a/linden/indra/newview/llvieweruictrlfactory.cpp +++ b/linden/indra/newview/llvieweruictrlfactory.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvieweruictrlfactory.h b/linden/indra/newview/llvieweruictrlfactory.h index dffc93d..de9964e 100644 --- a/linden/indra/newview/llvieweruictrlfactory.h +++ b/linden/indra/newview/llvieweruictrlfactory.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewervisualparam.cpp b/linden/indra/newview/llviewervisualparam.cpp index b255235..fd6561d 100644 --- a/linden/indra/newview/llviewervisualparam.cpp +++ b/linden/indra/newview/llviewervisualparam.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewervisualparam.h b/linden/indra/newview/llviewervisualparam.h index c8bdcf9..9f469e5 100644 --- a/linden/indra/newview/llviewervisualparam.h +++ b/linden/indra/newview/llviewervisualparam.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llviewerwindow.cpp b/linden/indra/newview/llviewerwindow.cpp index a4d38f8..9498dbd 100644 --- a/linden/indra/newview/llviewerwindow.cpp +++ b/linden/indra/newview/llviewerwindow.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -62,7 +63,6 @@ #include "llxfermanager.h" #include "message.h" #include "object_flags.h" -#include "text_out.h" #include "lltimer.h" #include "timing.h" #include "llviewermenu.h" @@ -353,7 +353,216 @@ void LLViewerWindow::printFeedback() } #endif //SABINRIG +//////////////////////////////////////////////////////////////////////////// +// +// LLDebugText +// + +class LLDebugText +{ +private: + struct Line + { + Line(const std::string& in_text, S32 in_x, S32 in_y) : text(in_text), x(in_x), y(in_y) {} + std::string text; + S32 x,y; + }; + + LLViewerWindow *mWindow; + + typedef std::vector line_list_t; + line_list_t mLineList; + LLColor4 mTextColor; + +public: + LLDebugText(LLViewerWindow* window) : mWindow(window) {} + + void addText(S32 x, S32 y, const std::string &text) + { + mLineList.push_back(Line(text, x, y)); + } + + void update() + { + std::string wind_vel_text; + std::string wind_vector_text; + std::string rwind_vel_text; + std::string rwind_vector_text; + std::string audio_text; + + // Draw the statistics in a light gray + // and in a thin font + mTextColor = LLColor4( 0.86f, 0.86f, 0.86f, 1.f ); + + // Draw stuff growing up from right lower corner of screen + U32 xpos = mWindow->getWindowWidth() - 350; + U32 ypos = 64; + const U32 y_inc = 20; + + if (gSavedSettings.getBOOL("DebugShowTime")) + { + const U32 y_inc2 = 15; + for (std::map::reverse_iterator iter = gDebugTimers.rbegin(); + iter != gDebugTimers.rend(); ++iter) + { + S32 idx = iter->first; + LLFrameTimer& timer = iter->second; + F32 time = timer.getElapsedTimeF32(); + S32 hours = (S32)(time / (60*60)); + S32 mins = (S32)((time - hours*(60*60)) / 60); + S32 secs = (S32)((time - hours*(60*60) - mins*60)); + addText(xpos, ypos, llformat(" Debug %d: %d:%02d:%02d", idx, hours,mins,secs)); ypos += y_inc2; + } + + F32 time = gFrameTimeSeconds; + S32 hours = (S32)(time / (60*60)); + S32 mins = (S32)((time - hours*(60*60)) / 60); + S32 secs = (S32)((time - hours*(60*60) - mins*60)); + addText(xpos, ypos, llformat("Time: %d:%02d:%02d", hours,mins,secs)); ypos += y_inc; + } + + if (gDisplayCameraPos) + { + std::string camera_view_text; + std::string camera_center_text; + std::string agent_view_text; + std::string agent_left_text; + std::string agent_center_text; + std::string agent_root_center_text; + + LLVector3d tvector; // Temporary vector to hold data for printing. + + // Update camera center, camera view, wind info every other frame + tvector = gAgent.getPositionGlobal(); + agent_center_text = llformat("AgentCenter %f %f %f", + (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); + + if (gAgent.getAvatarObject()) + { + tvector = gAgent.getPosGlobalFromAgent(gAgent.getAvatarObject()->mRoot.getWorldPosition()); + agent_root_center_text = llformat("AgentRootCenter %f %f %f", + (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); + } + else + { + agent_root_center_text = "---"; + } + + tvector = LLVector4(gAgent.getFrameAgent().getAtAxis()); + agent_view_text = llformat("AgentAtAxis %f %f %f", + (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); + + tvector = LLVector4(gAgent.getFrameAgent().getLeftAxis()); + agent_left_text = llformat("AgentLeftAxis %f %f %f", + (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); + + tvector = gAgent.getCameraPositionGlobal(); + camera_center_text = llformat("CameraCenter %f %f %f", + (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); + + tvector = LLVector4(gCamera->getAtAxis()); + camera_view_text = llformat("CameraAtAxis %f %f %f", + (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); + + addText(xpos, ypos, agent_center_text); ypos += y_inc; + addText(xpos, ypos, agent_root_center_text); ypos += y_inc; + addText(xpos, ypos, agent_view_text); ypos += y_inc; + addText(xpos, ypos, agent_left_text); ypos += y_inc; + addText(xpos, ypos, camera_center_text); ypos += y_inc; + addText(xpos, ypos, camera_view_text); ypos += y_inc; + } + + if (gDisplayWindInfo) + { + wind_vel_text = llformat("Wind velocity %.2f m/s", gWindVec.magVec()); + wind_vector_text = llformat("Wind vector %.2f %.2f %.2f", gWindVec.mV[0], gWindVec.mV[1], gWindVec.mV[2]); + rwind_vel_text = llformat("RWind vel %.2f m/s", gRelativeWindVec.magVec()); + rwind_vector_text = llformat("RWind vec %.2f %.2f %.2f", gRelativeWindVec.mV[0], gRelativeWindVec.mV[1], gRelativeWindVec.mV[2]); + + addText(xpos, ypos, wind_vel_text); ypos += y_inc; + addText(xpos, ypos, wind_vector_text); ypos += y_inc; + addText(xpos, ypos, rwind_vel_text); ypos += y_inc; + addText(xpos, ypos, rwind_vector_text); ypos += y_inc; + } + if (gDisplayWindInfo) + { + if (gAudiop) + { + audio_text= llformat("Audio for wind: %d", gAudiop->isWindEnabled()); + } + addText(xpos, ypos, audio_text); ypos += y_inc; + } + if (gDisplayFOV) + { + addText(xpos, ypos, llformat("FOV: %2.1f deg", RAD_TO_DEG * gCamera->getView())); + ypos += y_inc; + } + if (gSavedSettings.getBOOL("DebugShowRenderInfo")) + { + if (gPipeline.getUseVertexShaders() == 0) + { + addText(xpos, ypos, "Shaders Disabled"); + ypos += y_inc; + } + addText(xpos, ypos, llformat("%d MB Vertex Data", LLVertexBuffer::sAllocatedBytes/(1024*1024))); + ypos += y_inc; + + addText(xpos, ypos, llformat("%d Pending Lock", LLVertexBuffer::sLockedList.size())); + ypos += y_inc; + + addText(xpos, ypos, llformat("%d Vertex Buffers", LLVertexBuffer::sGLCount)); + ypos += y_inc; + } + + if (LLPipeline::getRenderParticleBeacons(NULL)) + { + addText(xpos, ypos, "Viewing particle beacons (blue)"); + ypos += y_inc; + } + if (LLPipeline::toggleRenderTypeControlNegated((void*)LLPipeline::RENDER_TYPE_PARTICLES)) + { + addText(xpos, ypos, "Hiding particles"); + ypos += y_inc; + } + if (LLPipeline::getRenderPhysicalBeacons(NULL)) + { + addText(xpos, ypos, "Viewing physical object beacons (green)"); + ypos += y_inc; + } + if (LLPipeline::getRenderScriptedBeacons(NULL)) + { + addText(xpos, ypos, "Viewing scripted object beacons (red)"); + ypos += y_inc; + } + if (LLPipeline::getRenderSoundBeacons(NULL)) + { + addText(xpos, ypos, "Viewing sound beacons (yellow)"); + ypos += y_inc; + } + } + + void draw() + { + for (line_list_t::iterator iter = mLineList.begin(); + iter != mLineList.end(); ++iter) + { + const Line& line = *iter; + LLFontGL::sMonospace->renderUTF8(line.text, 0, (F32)line.x, (F32)line.y, mTextColor, + LLFontGL::LEFT, LLFontGL::TOP, + LLFontGL::NORMAL, S32_MAX, S32_MAX, NULL, FALSE); + } + mLineList.clear(); + } + +}; + +void LLViewerWindow::updateDebugText() +{ + mDebugText->update(); +} + +//////////////////////////////////////////////////////////////////////////// // // LLViewerWindow // @@ -420,12 +629,20 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask } // Topmost view gets a chance before the hierarchy - LLView* top_view = gFocusMgr.getTopView(); - if (top_view) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + BOOL mouse_over_top_ctrl = FALSE; + if (top_ctrl) { S32 local_x, local_y; - top_view->screenPointToLocal( x, y, &local_x, &local_y ); - if (top_view->pointInView(local_x, local_y) && top_view->handleMouseDown(local_x, local_y, mask)) return TRUE; + top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); + if (top_ctrl->pointInView(local_x, local_y)) + { + mouse_over_top_ctrl = TRUE; + if(top_ctrl->handleMouseDown(local_x, local_y, mask)) + { + return TRUE; + } + } } // Give the UI views a chance to process the click @@ -436,6 +653,11 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask llinfos << "Left Mouse Down" << LLView::sMouseHandlerMessage << llendl; LLView::sMouseHandlerMessage = ""; } + if (top_ctrl && top_ctrl->hasFocus() && !mouse_over_top_ctrl) + { + // always defocus top view if we click off of it + top_ctrl->setFocus(FALSE); + } return TRUE; } else if (LLView::sDebugMouseHandling) @@ -443,6 +665,12 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask llinfos << "Left Mouse Down not handled by view" << llendl; } + if (top_ctrl && top_ctrl->hasFocus() && !mouse_over_top_ctrl) + { + // always defocus top view if we click off of it + top_ctrl->setFocus(FALSE); + } + if (gDisconnected) { return FALSE; @@ -498,12 +726,20 @@ BOOL LLViewerWindow::handleDoubleClick(LLWindow *window, LLCoordGL pos, MASK ma } // Check for hit on UI. - LLView* top_view = gFocusMgr.getTopView(); - if (top_view) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + BOOL mouse_over_top_ctrl = FALSE; + if (top_ctrl) { S32 local_x, local_y; - top_view->screenPointToLocal( x, y, &local_x, &local_y ); - if (top_view->pointInView(local_x, local_y) && top_view->handleDoubleClick(local_x, local_y, mask)) return TRUE; + top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); + if (top_ctrl->pointInView(local_x, local_y)) + { + mouse_over_top_ctrl = TRUE; + if(top_ctrl->handleDoubleClick(local_x, local_y, mask)) + { + return TRUE; + } + } } if (mRootView->handleDoubleClick(x, y, mask)) @@ -513,6 +749,11 @@ BOOL LLViewerWindow::handleDoubleClick(LLWindow *window, LLCoordGL pos, MASK ma llinfos << "Left Mouse Down" << LLView::sMouseHandlerMessage << llendl; LLView::sMouseHandlerMessage = ""; } + if (top_ctrl && top_ctrl->hasFocus() && !mouse_over_top_ctrl) + { + // always defocus top view if we click off of it + top_ctrl->setFocus(FALSE); + } return TRUE; } else if (LLView::sDebugMouseHandling) @@ -520,7 +761,13 @@ BOOL LLViewerWindow::handleDoubleClick(LLWindow *window, LLCoordGL pos, MASK ma llinfos << "Left Mouse Down not handled by view" << llendl; } - // Why is this here? JC 9/3/2002 + if (top_ctrl && top_ctrl->hasFocus() && !mouse_over_top_ctrl) + { + // always defocus top view if we click off of it + top_ctrl->setFocus(FALSE); + } + + // Why is this here? JC 9/3/2002 if (gNoRender) { return TRUE; @@ -593,12 +840,12 @@ BOOL LLViewerWindow::handleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask) return mouse_captor->handleMouseUp(local_x, local_y, mask); } - LLView* top_view = gFocusMgr.getTopView(); - if (top_view) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + if (top_ctrl) { S32 local_x, local_y; - top_view->screenPointToLocal( x, y, &local_x, &local_y ); - handled = top_view->pointInView(local_x, local_y) && top_view->handleMouseUp(local_x, local_y, mask); + top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); + handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleMouseUp(local_x, local_y, mask); } if( !handled ) @@ -689,12 +936,20 @@ BOOL LLViewerWindow::handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK return mouse_captor->handleRightMouseDown(local_x, local_y, mask); } - LLView* top_view = gFocusMgr.getTopView(); - if (top_view) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + BOOL mouse_over_top_ctrl = FALSE; + if (top_ctrl) { S32 local_x, local_y; - top_view->screenPointToLocal( x, y, &local_x, &local_y ); - if (top_view->pointInView(local_x, local_y) && top_view->handleRightMouseDown(local_x, local_y, mask)) return TRUE; + top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); + if (top_ctrl->pointInView(local_x, local_y)) + { + mouse_over_top_ctrl = TRUE; + if(top_ctrl->handleRightMouseDown(local_x, local_y, mask)) + { + return TRUE; + } + } } if( mRootView->handleRightMouseDown(x, y, mask) ) @@ -704,6 +959,11 @@ BOOL LLViewerWindow::handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK llinfos << "Right Mouse Down" << LLView::sMouseHandlerMessage << llendl; LLView::sMouseHandlerMessage = ""; } + if (top_ctrl && top_ctrl->hasFocus() && !mouse_over_top_ctrl) + { + // always defocus top view if we click off of it + top_ctrl->setFocus(FALSE); + } return TRUE; } else if (LLView::sDebugMouseHandling) @@ -711,6 +971,12 @@ BOOL LLViewerWindow::handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK llinfos << "Right Mouse Down not handled by view" << llendl; } + if (top_ctrl && top_ctrl->hasFocus() && !mouse_over_top_ctrl) + { + // always defocus top view if we click off of it + top_ctrl->setFocus(FALSE); + } + if (gToolMgr) { if(gToolMgr->getCurrentTool()->handleRightMouseDown( x, y, mask ) ) @@ -792,12 +1058,12 @@ BOOL LLViewerWindow::handleRightMouseUp(LLWindow *window, LLCoordGL pos, MASK m return mouse_captor->handleRightMouseUp(local_x, local_y, mask); } - LLView* top_view = gFocusMgr.getTopView(); - if (top_view) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + if (top_ctrl) { S32 local_x, local_y; - top_view->screenPointToLocal( x, y, &local_x, &local_y ); - handled = top_view->pointInView(local_x, local_y) && top_view->handleRightMouseUp(local_x, local_y, mask); + top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); + handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleRightMouseUp(local_x, local_y, mask); } if( !handled ) @@ -931,7 +1197,7 @@ void LLViewerWindow::handleFocusLost(LLWindow *window) { gToolMgr->onAppFocusLost(); } - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); if (gMenuBarView) { @@ -1224,6 +1490,8 @@ LLViewerWindow::LLViewerWindow( LLFontManager::initClass(); + // Initialize OpenGL Renderer + if (!gFeatureManagerp->isFeatureAvailable("RenderVBO") || !gGLManager.mHasVertexBufferObject) { @@ -1236,8 +1504,27 @@ LLViewerWindow::LLViewerWindow( // stuff like AGP if we think that it'll crash the viewer. // gFeatureManagerp->initGraphicsFeatureMasks(); + + // The ATI Mobility Radeon with 1.15.0 causes crashes in FMOD on startup for + // unknown reasons, but only if you have an old settings.ini file. + // In this case, force the graphics settings back to recommended, but only + // do it once. JC + std::string gpu_string = gFeatureManagerp->getGPUString(); + LLString::toLower(gpu_string); + bool upgrade_to_1_15 = (gSavedSettings.getString("LastRunVersion") != "1.15.0"); + bool mobility_radeon = (gpu_string.find("mobility radeon") != std::string::npos); + bool mobility_radeon_upgrade_hack = upgrade_to_1_15 && mobility_radeon; + if (mobility_radeon_upgrade_hack) + { + llinfos << "1.15.0 update on Mobility Radeon" << llendl; + llinfos << "Forcing recommended graphics settings" << llendl; + llinfos << "Forcing audio off" << llendl; + gUseAudio = FALSE; + } + if (gFeatureManagerp->isSafe() - || (gSavedSettings.getS32("LastFeatureVersion") != gFeatureManagerp->getVersion())) + || (gSavedSettings.getS32("LastFeatureVersion") != gFeatureManagerp->getVersion()) + || mobility_radeon_upgrade_hack) { gFeatureManagerp->applyRecommendedFeatures(); } @@ -1249,16 +1536,30 @@ LLViewerWindow::LLViewerWindow( idx = LLViewerImageList::getMaxVideoRamSetting(-2); // get max recommended setting gSavedSettings.setS32("GraphicsCardMemorySetting", idx); } - + + // If we crashed while initializng GL stuff last time, disable certain features + if (gSavedSettings.getBOOL("RenderInitError")) + { + mInitAlert = "DisplaySettingsNoShaders"; + gSavedSettings.setBOOL("VertexShaderEnable", FALSE); + } + if (!gNoRender) { // // Initialize GL stuff // + // Set this flag in case we crash while initializing GL + gSavedSettings.setBOOL("RenderInitError", TRUE); + gSavedSettings.saveToFile( gSettingsFileName, TRUE ); + gPipeline.init(); stop_glerror(); initGLDefaults(); + + gSavedSettings.setBOOL("RenderInitError", FALSE); + gSavedSettings.saveToFile( gSettingsFileName, TRUE ); } // @@ -1303,6 +1604,9 @@ LLViewerWindow::LLViewerWindow( // sync the keyboard's setting with the saved setting gSavedSettings.getControl("NumpadControl")->firePropertyChanged(); + + mDebugText = new LLDebugText(this); + } void LLViewerWindow::initGLDefaults() @@ -1651,6 +1955,8 @@ void LLViewerWindow::initWorldUI() LLViewerWindow::~LLViewerWindow() { + delete mDebugText; + gSavedSettings.setS32("FloaterViewBottom", gFloaterView->getRect().mBottom); // Cleanup global views @@ -1864,6 +2170,10 @@ void LLViewerWindow::reshape(S32 width, S32 height) } } +void LLViewerWindow::drawDebugText() +{ + mDebugText->draw(); +} void LLViewerWindow::draw() { @@ -1935,7 +2245,7 @@ void LLViewerWindow::draw() { LLGLSTexture gls_texture; - show_text_gl(); + drawDebugText(); } if (gToolMgr) @@ -1947,7 +2257,7 @@ void LLViewerWindow::draw() if( gAgent.cameraMouselook() ) { drawMouselookInstructions(); - stop_glerror(); + stop_glerror(); } // Draw all nested UI views. @@ -1955,16 +2265,16 @@ void LLViewerWindow::draw() mRootView->draw(); // Draw optional on-top-of-everyone view - LLView* top_view = gFocusMgr.getTopView(); - if (top_view && top_view->getVisible()) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + if (top_ctrl && top_ctrl->getVisible()) { S32 screen_x, screen_y; - top_view->localPointToScreen(0, 0, &screen_x, &screen_y); + top_ctrl->localPointToScreen(0, 0, &screen_x, &screen_y); glMatrixMode(GL_MODELVIEW); LLUI::pushMatrix(); LLUI::translate( (F32) screen_x, (F32) screen_y, 0.f); - top_view->draw(); + top_ctrl->draw(); LLUI::popMatrix(); } @@ -2084,7 +2394,7 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) // cursor modes, etc, and re-enable. //if (gFocusMgr.getMouseCapture()) //{ - // gFocusMgr.setMouseCapture(NULL, NULL); + // gFocusMgr.setMouseCapture(NULL); // return TRUE; //} } @@ -2150,10 +2460,10 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) // Topmost view gets a chance before the hierarchy // *FIX: get rid of this? - LLView* top_view = gFocusMgr.getTopView(); - if (top_view) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + if (top_ctrl) { - if( top_view->handleKey( key, mask, TRUE ) ) + if( top_ctrl->handleKey( key, mask, TRUE ) ) { return TRUE; } @@ -2226,8 +2536,8 @@ BOOL LLViewerWindow::handleUnicodeChar(llwchar uni_char, MASK mask) } // Topmost view gets a chance before the hierarchy - LLView* top_view = gFocusMgr.getTopView(); - if (top_view && top_view->handleUnicodeChar( uni_char, FALSE ) ) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + if (top_ctrl && top_ctrl->handleUnicodeChar( uni_char, FALSE ) ) { return TRUE; } @@ -2263,13 +2573,13 @@ void LLViewerWindow::handleScrollWheel(S32 clicks) return; } - LLView* top_view = gFocusMgr.getTopView(); - if (top_view) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + if (top_ctrl) { S32 local_x; S32 local_y; - top_view->screenPointToLocal( mCurrentMousePoint.mX, mCurrentMousePoint.mY, &local_x, &local_y ); - if (top_view->handleScrollWheel(local_x, local_y, clicks)) return; + top_ctrl->screenPointToLocal( mCurrentMousePoint.mX, mCurrentMousePoint.mY, &local_x, &local_y ); + if (top_ctrl->handleScrollWheel(local_x, local_y, clicks)) return; } if (mRootView->handleScrollWheel(mCurrentMousePoint.mX, mCurrentMousePoint.mY, clicks) ) @@ -2415,8 +2725,8 @@ BOOL LLViewerWindow::handlePerFrameHover() BOOL handled = FALSE; - BOOL handled_by_top_view = FALSE; - LLView* top_view = gFocusMgr.getTopView(); + BOOL handled_by_top_ctrl = FALSE; + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture(); if( mouse_captor ) @@ -2438,12 +2748,12 @@ BOOL LLViewerWindow::handlePerFrameHover() } else { - if (top_view) + if (top_ctrl) { S32 local_x, local_y; - top_view->screenPointToLocal( x, y, &local_x, &local_y ); - handled = top_view->pointInView(local_x, local_y) && top_view->handleHover(local_x, local_y, mask); - handled_by_top_view = TRUE; + top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); + handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleHover(local_x, local_y, mask); + handled_by_top_ctrl = TRUE; } if ( !handled ) @@ -2530,11 +2840,11 @@ BOOL LLViewerWindow::handlePerFrameHover() mouse_captor->screenPointToLocal( x, y, &local_x, &local_y ); tool_tip_handled = mouse_captor->handleToolTip( local_x, local_y, tool_tip_msg, &screen_sticky_rect ); } - else if (handled_by_top_view) + else if (handled_by_top_ctrl) { S32 local_x, local_y; - top_view->screenPointToLocal( x, y, &local_x, &local_y ); - tool_tip_handled = top_view->handleToolTip( local_x, local_y, tool_tip_msg, &screen_sticky_rect ); + top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); + tool_tip_handled = top_ctrl->handleToolTip( local_x, local_y, tool_tip_msg, &screen_sticky_rect ); } else { @@ -3026,7 +3336,7 @@ void LLViewerWindow::hitObjectOrLandGlobalAsync(S32 x, S32 y_from_bot, MASK mask glViewport(scaled_x - (PICK_HALF_WIDTH + 2), scaled_y - (PICK_HALF_WIDTH + 2), PICK_DIAMETER + 4, PICK_DIAMETER + 4); stop_glerror(); - glClearColor(0.f, 0.f, 0.f, 1.f); + glClearColor(0.f, 0.f, 0.f, 0.f); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); // Draw the objects so the user can select them. @@ -3117,7 +3427,7 @@ void LLViewerWindow::hitUIElementAsync(S32 x, S32 y_from_bot, MASK mask, void (* glViewport(x - (PICK_HALF_WIDTH + 2), y_from_bot - (PICK_HALF_WIDTH + 2), PICK_DIAMETER + 4, PICK_DIAMETER + 4); stop_glerror(); - glClearColor(0.f, 0.f, 0.f, 1.f); + glClearColor(0.f, 0.f, 0.f, 0.f); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); // Draw the objects so the user can select them. @@ -3993,7 +4303,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei gDisplaySwapBuffers = FALSE; if (type == SNAPSHOT_TYPE_OBJECT_ID) { - glClearColor(0.f, 0.f, 0.f, 1.f); + glClearColor(0.f, 0.f, 0.f, 0.f); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); gCamera->setZoomParameters(scale_factor, subimage_x+(subimage_y*llceil(scale_factor))); @@ -4174,9 +4484,9 @@ BOOL LLViewerWindow::childHasKeyboardFocus(const LLView* parent) const return gFocusMgr.childHasKeyboardFocus( parent ); } -void LLViewerWindow::setMouseCapture(LLMouseHandler* new_captor,void (*on_capture_lost)(LLMouseHandler* old_captor)) +void LLViewerWindow::setMouseCapture(LLMouseHandler* new_captor) { - gFocusMgr.setMouseCapture( new_captor, on_capture_lost ); + gFocusMgr.setMouseCapture( new_captor ); } LLMouseHandler* LLViewerWindow::getMouseCaptor() const @@ -4184,11 +4494,6 @@ LLMouseHandler* LLViewerWindow::getMouseCaptor() const return gFocusMgr.getMouseCapture(); } -BOOL LLViewerWindow::hasMouseCapture(const LLMouseHandler* possible_captor) const -{ - return possible_captor == gFocusMgr.getMouseCapture(); -} - S32 LLViewerWindow::getWindowHeight() const { return mVirtualWindowRect.getHeight(); @@ -4209,19 +4514,19 @@ S32 LLViewerWindow::getWindowDisplayWidth() const return mWindowRect.getWidth(); } -LLView* LLViewerWindow::getTopView() const +LLUICtrl* LLViewerWindow::getTopCtrl() const { - return gFocusMgr.getTopView(); + return gFocusMgr.getTopCtrl(); } -BOOL LLViewerWindow::hasTopView(LLView* view) const +BOOL LLViewerWindow::hasTopCtrl(LLView* view) const { - return view == gFocusMgr.getTopView(); + return view == gFocusMgr.getTopCtrl(); } -void LLViewerWindow::setTopView(LLView* new_top,void (*on_top_lost)(LLView* old_top)) +void LLViewerWindow::setTopCtrl(LLUICtrl* new_top) { - gFocusMgr.setTopView( new_top, on_top_lost ); + gFocusMgr.setTopCtrl( new_top ); } void LLViewerWindow::setupViewport(S32 x_offset, S32 y_offset) @@ -4829,6 +5134,8 @@ LLAlertDialog* LLViewerWindow::alertXmlEditText(const std::string& xml_filename, return alert; } +//////////////////////////////////////////////////////////////////////////// + LLBottomPanel::LLBottomPanel(const LLString &name, const LLRect &rect) : LLPanel(name, rect, FALSE), mIndicator(NULL) diff --git a/linden/indra/newview/llviewerwindow.h b/linden/indra/newview/llviewerwindow.h index debe509..e6a9a14 100644 --- a/linden/indra/newview/llviewerwindow.h +++ b/linden/indra/newview/llviewerwindow.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -126,8 +127,8 @@ public: BOOL getLeftMouseDown() const { return mLeftMouseDown; } BOOL getRightMouseDown() const { return mRightMouseDown; } - LLView* getTopView() const; - BOOL hasTopView(LLView* view) const; + LLUICtrl* getTopCtrl() const; + BOOL hasTopCtrl(LLView* view) const; void setupViewport(S32 x_offset = 0, S32 y_offset = 0); void setup3DRender(); @@ -144,7 +145,9 @@ public: void getTargetWindow(BOOL& fullscreen, S32& width, S32& height) const; // The 'target' is where the user wants the window to be. It may not be // there yet, because we may be supressing fullscreen prior to login. - + + const LLString& getInitAlert() { return mInitAlert; } + // // MANIPULATORS // @@ -179,17 +182,18 @@ public: BOOL hasKeyboardFocus( const LLUICtrl* possible_focus ) const; BOOL childHasKeyboardFocus( const LLView* parent ) const; - void setMouseCapture(LLMouseHandler* new_captor,void (*on_capture_lost)(LLMouseHandler* old_captor)); // new_captor = NULL to release the mouse. - BOOL hasMouseCapture(const LLMouseHandler* possible_captor ) const; + void setMouseCapture(LLMouseHandler* new_captor); // new_captor = NULL to release the mouse. LLMouseHandler* getMouseCaptor() const; - void setTopView(LLView* new_top, void (*on_top_lost)(LLView* old_top)); // set new_top = NULL to release top_view. + void setTopCtrl(LLUICtrl* new_top); // set new_top = NULL to release top_view. void reshape(S32 width, S32 height); void sendShapeToSim(); void draw(); // void drawSelectedObjects(); + void updateDebugText(); + void drawDebugText(); static void loadUserImage(void **cb_data, const LLUUID &uuid); @@ -207,7 +211,7 @@ public: BOOL saveSnapshot(const LLString& filename, S32 image_width, S32 image_height, BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR); BOOL rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, BOOL keep_window_aspect = TRUE, - BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR ); + BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR ); BOOL saveImageNumbered(LLImageRaw *raw, const LLString& extension = ""); void playSnapshotAnimAndSound(); @@ -278,7 +282,7 @@ private: void stopGL(BOOL save_state = TRUE); void restoreGL(const LLString& progress_message = LLString::null); void initFonts(F32 zoom_factor = 1.f); - + void analyzeHit( S32 x, // input S32 y_from_bot, // input @@ -291,6 +295,7 @@ private: F32* hit_u_coord, // output F32* hit_v_coord); // output + public: LLWindow* mWindow; // graphical window object @@ -333,13 +338,18 @@ protected: LLString mOverlayTitle; // Used for special titles such as "Second Life - Special E3 2003 Beta" + BOOL mIgnoreActivate; + U8* mPickBuffer; + + LLString mInitAlert; // Window / GL initialization requires an alert + + class LLDebugText* mDebugText; // Internal class for debug text + +protected: static char sSnapshotBaseName[LL_MAX_PATH]; /* Flawfinder: ignore */ static char sSnapshotDir[LL_MAX_PATH]; /* Flawfinder: ignore */ static char sMovieBaseName[LL_MAX_PATH]; /* Flawfinder: ignore */ - - BOOL mIgnoreActivate; - U8* mPickBuffer; }; class LLBottomPanel : public LLPanel diff --git a/linden/indra/newview/llvlcomposition.cpp b/linden/indra/newview/llvlcomposition.cpp index e0cb40d..af0fe96 100644 --- a/linden/indra/newview/llvlcomposition.cpp +++ b/linden/indra/newview/llvlcomposition.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -284,7 +285,7 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y, ddiscard++; min_dim /= 2; } - if (!mDetailTextures[i]->readBackRaw(ddiscard, mRawImages[i])) + if (!mDetailTextures[i]->readBackRaw(ddiscard, mRawImages[i], false)) { llwarns << "Unable to read raw data for terrain detail texture: " << mDetailTextures[i]->getID() << llendl; mRawImages[i] = NULL; diff --git a/linden/indra/newview/llvlcomposition.h b/linden/indra/newview/llvlcomposition.h index 7cae9ec..964fdfe 100644 --- a/linden/indra/newview/llvlcomposition.h +++ b/linden/indra/newview/llvlcomposition.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvlmanager.cpp b/linden/indra/newview/llvlmanager.cpp index 4ac22e2..f4d117d 100644 --- a/linden/indra/newview/llvlmanager.cpp +++ b/linden/indra/newview/llvlmanager.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvlmanager.h b/linden/indra/newview/llvlmanager.h index 67acfac..f26c3ce 100644 --- a/linden/indra/newview/llvlmanager.h +++ b/linden/indra/newview/llvlmanager.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvoavatar.cpp b/linden/indra/newview/llvoavatar.cpp index 7113177..25c6eb6 100644 --- a/linden/indra/newview/llvoavatar.cpp +++ b/linden/indra/newview/llvoavatar.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -109,6 +110,7 @@ #include "llwearablelist.h" #include "llworld.h" #include "pipeline.h" +#include "llglslshader.h" #include "viewer.h" #include "lscript_byteformat.h" @@ -2575,7 +2577,7 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) } // update wind effect - if ((gPipeline.getVertexShaderLevel(LLPipeline::SHADER_AVATAR) >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH)) + if ((LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR) >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH)) { F32 hover_strength = 0.f; F32 time_delta = mRippleTimer.getElapsedTimeF32() - mRippleTimeLast; @@ -3034,38 +3036,30 @@ void LLVOAvatar::updateCharacter(LLAgent &agent) // clear debug text mDebugText.clear(); - if (LLVOAvatar::sShowAnimationDebug) { - LLString playing_anims; - for (LLMotion* motionp = mMotionController.getFirstActiveMotion(); - motionp; - motionp = mMotionController.getNextActiveMotion()) + for (LLMotionController::motion_list_t::iterator iter = mMotionController.getActiveMotions().begin(); + iter != mMotionController.getActiveMotions().end(); ++iter) + { + LLMotion* motionp = *iter; + if (motionp->getMinPixelArea() < getPixelArea()) { - if (motionp->getMinPixelArea() < getPixelArea()) + std::string output; + if (motionp->getName().empty()) { - char output[MAX_STRING]; /* Flawfinder: ignore */ - if (motionp->getName().empty()) - { - snprintf( /* Flawfinder: ignore */ - output, - MAX_STRING, - "%s - %d", - motionp->getID().asString().c_str(), - (U32)motionp->getPriority()); - } - else - { - snprintf( /* Flawfinder: ignore */ - output, - MAX_STRING, - "%s - %d", - motionp->getName().c_str(), - (U32)motionp->getPriority()); - } - addDebugText(output); + output = llformat("%s - %d", + motionp->getID().asString().c_str(), + (U32)motionp->getPriority()); } + else + { + output = llformat("%s - %d", + motionp->getName().c_str(), + (U32)motionp->getPriority()); + } + addDebugText(output); } + } } if (gNoRender) @@ -3086,6 +3080,13 @@ void LLVOAvatar::updateCharacter(LLAgent &agent) return; } + // For fading out the names above heads, only let the timer + // run if we're visible. + if (mDrawable.notNull() && !mDrawable->isVisible()) + { + mTimeVisible.reset(); + } + if (!mIsSelf && !isVisible()) { return; @@ -3116,13 +3117,6 @@ void LLVOAvatar::updateCharacter(LLAgent &agent) getOffObject(); } - // For fading out the names above heads, only let the timer - // run if we're visible. - if (mDrawable.notNull() && !mDrawable->isVisible()) - { - mTimeVisible.reset(); - } - //-------------------------------------------------------------------- // create local variables in world coords for region position values //-------------------------------------------------------------------- @@ -4611,7 +4605,7 @@ S32 LLVOAvatar::getCollisionVolumeID(std::string &name) //----------------------------------------------------------------------------- // addDebugText() //----------------------------------------------------------------------------- -void LLVOAvatar::addDebugText(const char* text) + void LLVOAvatar::addDebugText(const std::string& text) { mDebugText.append(1, '\n'); mDebugText.append(text); @@ -6355,7 +6349,7 @@ BOOL LLVOAvatar::getLocalTextureRaw(S32 index, LLImageRaw* image_raw) } else { - if( mLocalTexture[ index ]->readBackRaw(-1, image_raw) ) + if( mLocalTexture[ index ]->readBackRaw(-1, image_raw, false) ) { success = TRUE; } @@ -9210,7 +9204,7 @@ void LLVOAvatar::writeCAL3D(std::string& path, std::string& file_base) continue; } LLPointer raw_image = new LLImageRaw; - viewer_imagep->readBackRaw(-1, raw_image); + viewer_imagep->readBackRaw(-1, raw_image, false); BOOL success = tga_image->encode(raw_image); success = tga_image->save(filename); } @@ -9225,7 +9219,7 @@ void LLVOAvatar::writeCAL3D(std::string& path, std::string& file_base) else { LLPointer raw_image = new LLImageRaw; - viewer_imagep->readBackRaw(-1, raw_image); + viewer_imagep->readBackRaw(-1, raw_image, false); BOOL success = tga_image->encode(raw_image); success = tga_image->save(filename); } diff --git a/linden/indra/newview/llvoavatar.h b/linden/indra/newview/llvoavatar.h index ff37848..2a2c0f0 100644 --- a/linden/indra/newview/llvoavatar.h +++ b/linden/indra/newview/llvoavatar.h @@ -5,6 +5,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -387,7 +388,7 @@ public: virtual LLVector3 getVolumePos(S32 joint_index, LLVector3& volume_offset); virtual LLJoint* findCollisionVolume(U32 volume_id); virtual S32 getCollisionVolumeID(std::string &name); - virtual void addDebugText(const char* text); + virtual void addDebugText(const std::string& text); virtual const LLUUID& getID(); virtual LLJoint *getJoint( const std::string &name ); diff --git a/linden/indra/newview/llvocache.cpp b/linden/indra/newview/llvocache.cpp index 18a1639..f249c87 100644 --- a/linden/indra/newview/llvocache.cpp +++ b/linden/indra/newview/llvocache.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvocache.h b/linden/indra/newview/llvocache.h index b3169c3..73620c8 100644 --- a/linden/indra/newview/llvocache.h +++ b/linden/indra/newview/llvocache.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvoclouds.cpp b/linden/indra/newview/llvoclouds.cpp index 7d1d958..24084cf 100644 --- a/linden/indra/newview/llvoclouds.cpp +++ b/linden/indra/newview/llvoclouds.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvoclouds.h b/linden/indra/newview/llvoclouds.h index a8846e9..5d9fc72 100644 --- a/linden/indra/newview/llvoclouds.h +++ b/linden/indra/newview/llvoclouds.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvograss.cpp b/linden/indra/newview/llvograss.cpp index 9201549..5d9c581 100644 --- a/linden/indra/newview/llvograss.cpp +++ b/linden/indra/newview/llvograss.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvograss.h b/linden/indra/newview/llvograss.h index 023db03..54f9cce 100644 --- a/linden/indra/newview/llvograss.h +++ b/linden/indra/newview/llvograss.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvoground.cpp b/linden/indra/newview/llvoground.cpp index 0ae6ed8..8c116c1 100644 --- a/linden/indra/newview/llvoground.cpp +++ b/linden/indra/newview/llvoground.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvoground.h b/linden/indra/newview/llvoground.h index 5b995f8..2d73440 100644 --- a/linden/indra/newview/llvoground.h +++ b/linden/indra/newview/llvoground.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvoinventorylistener.cpp b/linden/indra/newview/llvoinventorylistener.cpp index 5c4f918..739cd0b 100644 --- a/linden/indra/newview/llvoinventorylistener.cpp +++ b/linden/indra/newview/llvoinventorylistener.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvoinventorylistener.h b/linden/indra/newview/llvoinventorylistener.h index c52d281..4cb90a6 100644 --- a/linden/indra/newview/llvoinventorylistener.h +++ b/linden/indra/newview/llvoinventorylistener.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvolumesliderctrl.cpp b/linden/indra/newview/llvolumesliderctrl.cpp index 760fa5c..54cfa30 100644 --- a/linden/indra/newview/llvolumesliderctrl.cpp +++ b/linden/indra/newview/llvolumesliderctrl.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -81,7 +82,7 @@ void LLVolumeSliderCtrl::draw() outline_color, FALSE); - if (gFocusMgr.getMouseCapture() == this) + if (hasMouseCapture()) { // Thumb LLRect rect(mDragStartThumbRect); diff --git a/linden/indra/newview/llvolumesliderctrl.h b/linden/indra/newview/llvolumesliderctrl.h index 605fd59..096ecc3 100644 --- a/linden/indra/newview/llvolumesliderctrl.h +++ b/linden/indra/newview/llvolumesliderctrl.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvopartgroup.cpp b/linden/indra/newview/llvopartgroup.cpp index a51ae9c..28aeb29 100644 --- a/linden/indra/newview/llvopartgroup.cpp +++ b/linden/indra/newview/llvopartgroup.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvopartgroup.h b/linden/indra/newview/llvopartgroup.h index 3dc07c0..ede249d 100644 --- a/linden/indra/newview/llvopartgroup.h +++ b/linden/indra/newview/llvopartgroup.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvosky.cpp b/linden/indra/newview/llvosky.cpp index 4ed5353..68fee1a 100644 --- a/linden/indra/newview/llvosky.cpp +++ b/linden/indra/newview/llvosky.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -188,7 +189,7 @@ inline F32 color_intens ( const LLColor4 &col ) inline F32 color_avg ( const LLColor3 &col ) { - return color_intens(col) / 3; + return color_intens(col) / 3.f; } inline void color_gamma_correct(LLColor3 &col) @@ -462,7 +463,7 @@ void LLSkyTex::create(const F32 brightness_scale, const LLColor3& multiscatt) } U32* pix = (U32*)(data + offset); - LLColor4 temp = LLColor4(col); + LLColor4 temp = LLColor4(col, 0); LLColor4U temp1 = LLColor4U(temp); *pix = temp1.mAll; } @@ -636,7 +637,6 @@ void LLVOSky::restoreGL() calcBrightnessScaleAndColors(); - // Water is currently broken on Mac. if (gSavedSettings.getBOOL("RenderWater") && gGLManager.mHasCubeMap) { LLCubeMap* cube_map = getCubeMap(); @@ -776,7 +776,7 @@ LLColor3 LLVOSky::calcSkyColorInDir(const LLVector3 &dir) { LLColor3 col, transp; - if (dir.mV[VZ] < -0.02) + if (dir.mV[VZ] < -0.02f) { col = LLColor3(llmax(mFogColor[0],0.2f), llmax(mFogColor[1],0.2f), llmax(mFogColor[2],0.27f)); float x = 1.0f-fabsf(-0.1f-dir.mV[VZ]); @@ -826,15 +826,18 @@ void LLVOSky::calcSkyColorInDir(LLColor3& res, LLColor3& transp, const LLVector3 const F32 e_pow_k = (F32)LL_FAST_EXP(K); F32 step = FIRST_STEP * (1 - 1 / e_pow_k); + // Initialize outside the loop because we write into them every iteration. JC + LLColor3 air_sca_opt_depth; + LLColor3 haze_sca_opt_depth; + LLColor3 air_transp; + for (S32 s = 0; s < NO_STEPS; ++s) { h = calcHeight(cur_pos); step *= e_pow_k; - LLColor3 air_sca_opt_depth; LLHaze::calcAirSca(h, air_sca_opt_depth); air_sca_opt_depth *= step; - LLColor3 haze_sca_opt_depth; mHaze.calcSigSca(h, haze_sca_opt_depth); haze_sca_opt_depth *= step; @@ -844,7 +847,6 @@ void LLVOSky::calcSkyColorInDir(LLColor3& res, LLColor3& transp, const LLVector3 if (calcHitsEarth(cur_pos, tosun) < 0) // calculates amount of in-scattered light from the sun { //visibility check is too expensive - LLColor3 air_transp; mTransp.calcTransp(calcUpVec(cur_pos) * tosun, h, air_transp); air_transp *= transp; res += air_sca_opt_depth * air_transp; @@ -1251,18 +1253,14 @@ BOOL LLVOSky::updateSky() mSkyTex[side].createGLImage(mSkyTex[side].getWhich(FALSE)); } next_frame = 0; - //llSkyTex::stepCurrent(); } - if (!gSavedSettings.getBOOL("RenderDynamicReflections")) + std::vector > images; + for (S32 side = 0; side < 6; side++) { - std::vector > images; - for (S32 side = 0; side < 6; side++) - { - images.push_back(mSkyTex[side].getImageRaw(FALSE)); - } - mCubeMap->init(images); + images.push_back(mSkyTex[side].getImageRaw(FALSE)); } + mCubeMap->init(images); } } diff --git a/linden/indra/newview/llvosky.h b/linden/indra/newview/llvosky.h index 0ca56dc..568e924 100644 --- a/linden/indra/newview/llvosky.h +++ b/linden/indra/newview/llvosky.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -61,19 +62,12 @@ const F32 INV_NO_STEPS = 1.f/NO_STEPS; // constants used in calculation of scattering coeff of clear air const F32 sigma = 0.035f; -const F32 fsigma = (6+3*sigma)/(6.f-7.f*sigma); +const F32 fsigma = (6.f + 3.f * sigma) / (6.f-7.f*sigma); const F64 Ndens = 2.55e25; const F64 Ndens2 = Ndens*Ndens; -// !!! *FIX: This #define should be in llcommon somewhere... -// We should not be #defining anything with leading underscores and -// much less double leading underscores since that is always vendor -// specific. Change this to something like LL_FORCE_INLINE. -#ifdef __GNUC__ -#define __forceinline inline __attribute__((always_inline)) -#endif -__forceinline LLColor3 color_div(const LLColor3 &col1, const LLColor3 &col2) +LL_FORCE_INLINE LLColor3 color_div(const LLColor3 &col1, const LLColor3 &col2) { return LLColor3( col1.mV[0] / col2.mV[0], @@ -140,7 +134,7 @@ private: public: static F32 getInterpVal() { return sInterpVal; } static void setInterpVal(const F32 v) { sInterpVal = v; } - static BOOL doInterpolate() { return sInterpVal > 0.001; } + static BOOL doInterpolate() { return sInterpVal > 0.001f; } void bindTexture(BOOL curr = TRUE); @@ -311,7 +305,7 @@ public: }; -__forceinline LLColor3 refr_ind_calc(const LLColor3 &wave_length) +LL_FORCE_INLINE LLColor3 refr_ind_calc(const LLColor3 &wave_length) { LLColor3 refr_ind; for (S32 i = 0; i < 3; ++i) @@ -325,7 +319,7 @@ __forceinline LLColor3 refr_ind_calc(const LLColor3 &wave_length) } -__forceinline LLColor3 calc_air_sca_sea_level() +LL_FORCE_INLINE LLColor3 calc_air_sca_sea_level() { const static LLColor3 WAVE_LEN(675, 520, 445); const static LLColor3 refr_ind = refr_ind_calc(WAVE_LEN); @@ -690,6 +684,7 @@ public: public: static F32 sNighttimeBrightness; // [0,2] default = 1.0 + LLFace *mFace[FACE_COUNT]; protected: LLPointer mSunTexturep; @@ -719,8 +714,7 @@ protected: BOOL mWeatherChange; F32 mCloudDensity; F32 mWind; - LLFace *mFace[FACE_COUNT]; - + BOOL mInitialized; BOOL mForceUpdate; //flag to force instantaneous update of cubemap LLVector3 mLastLightingDirection; diff --git a/linden/indra/newview/llvostars.cpp b/linden/indra/newview/llvostars.cpp index a4568ce..5af052d 100644 --- a/linden/indra/newview/llvostars.cpp +++ b/linden/indra/newview/llvostars.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvostars.h b/linden/indra/newview/llvostars.h index 10b644e..cb71f5b 100644 --- a/linden/indra/newview/llvostars.h +++ b/linden/indra/newview/llvostars.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvosurfacepatch.cpp b/linden/indra/newview/llvosurfacepatch.cpp index 88e610b..8089596 100644 --- a/linden/indra/newview/llvosurfacepatch.cpp +++ b/linden/indra/newview/llvosurfacepatch.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -88,21 +89,21 @@ public: //============================================================================ LLVOSurfacePatch::LLVOSurfacePatch(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) -: LLStaticViewerObject(id, LL_VO_SURFACE_PATCH, regionp) + : LLStaticViewerObject(id, LL_VO_SURFACE_PATCH, regionp), + mDirtiedPatch(FALSE), + mPool(NULL), + mBaseComp(0), + mPatchp(NULL), + mDirtyTexture(FALSE), + mDirtyTerrain(FALSE), + mLastNorthStride(0), + mLastEastStride(0), + mLastStride(0), + mLastLength(0) { // Terrain must draw during selection passes so it can block objects behind it. mbCanSelect = TRUE; - - mBaseComp = 0; setScale(LLVector3(16.f, 16.f, 16.f)); // Hack for setting scale for bounding boxes/visibility. - mPool = NULL; - mDirtiedPatch = FALSE; - mLastStride = 0; - mLastNorthStride = 0; - mLastEastStride = 0; - mLastLength = 0; - - mDirtyTerrain = TRUE; } diff --git a/linden/indra/newview/llvosurfacepatch.h b/linden/indra/newview/llvosurfacepatch.h index 75d57cb..ec26065 100644 --- a/linden/indra/newview/llvosurfacepatch.h +++ b/linden/indra/newview/llvosurfacepatch.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvotextbubble.cpp b/linden/indra/newview/llvotextbubble.cpp index ee0359b..676f6cb 100644 --- a/linden/indra/newview/llvotextbubble.cpp +++ b/linden/indra/newview/llvotextbubble.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvotextbubble.h b/linden/indra/newview/llvotextbubble.h index bd1d241..2a2fa43 100644 --- a/linden/indra/newview/llvotextbubble.h +++ b/linden/indra/newview/llvotextbubble.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvotree.cpp b/linden/indra/newview/llvotree.cpp index 382f9a6..45a9e0a 100644 --- a/linden/indra/newview/llvotree.cpp +++ b/linden/indra/newview/llvotree.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvotree.h b/linden/indra/newview/llvotree.h index fb35dd9..65a0797 100644 --- a/linden/indra/newview/llvotree.h +++ b/linden/indra/newview/llvotree.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvotreenew.h b/linden/indra/newview/llvotreenew.h index 936028a..611c341 100644 --- a/linden/indra/newview/llvotreenew.h +++ b/linden/indra/newview/llvotreenew.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvovolume.cpp b/linden/indra/newview/llvovolume.cpp index f425687..0a778e4 100644 --- a/linden/indra/newview/llvovolume.cpp +++ b/linden/indra/newview/llvovolume.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -276,60 +277,41 @@ void LLVOVolume::animateTextures() for (S32 i = start; i <= end; i++) { - LLQuaternion quat; - LLVector3 scale(1,1,1); - LLFace* facep = mDrawable->getFace(i); const LLTextureEntry* te = facep->getTextureEntry(); - LLMatrix4& tex_mat = facep->mTextureMatrix; if (!te) { continue; } + if (!(result & LLViewerTextureAnim::ROTATE)) { te->getRotation(&rot); } - - { - F32 axis = -1; - F32 s,t; - te->getScale(&s,&t); - if (s < 0) - { - axis = -axis; - } - if (t < 0) - { - axis = -axis; - } - quat.setQuat(rot, 0, 0, axis); - } - if (!(result & LLViewerTextureAnim::TRANSLATE)) { te->getOffset(&off_s,&off_t); } + if (!(result & LLViewerTextureAnim::SCALE)) + { + te->getScale(&scale_s, &scale_t); + } + LLVector3 scale(scale_s, scale_t, 1.f); LLVector3 trans(off_s+0.5f, off_t+0.5f, 0.f); - + LLQuaternion quat; + quat.setQuat(rot, 0, 0, -1.f); + + LLMatrix4& tex_mat = facep->mTextureMatrix; tex_mat.identity(); tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f)); tex_mat.rotate(quat); - if (!(result & LLViewerTextureAnim::SCALE)) - { - te->getScale(&scale_s, &scale_t); - } - - { - scale.setVec(scale_s, scale_t, 1.f); - LLMatrix4 mat; - mat.initAll(scale, LLQuaternion(), LLVector3()); - tex_mat *= mat; - } - + LLMatrix4 mat; + mat.initAll(scale, LLQuaternion(), LLVector3()); + tex_mat *= mat; + tex_mat.translate(trans); } } @@ -2022,13 +2004,13 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, LLVOVolume* volume = (LLVOVolume*) facep->getViewerObject(); BOOL is_light = volume->mDrawable->isLight(); -// U8 alpha = is_light ? 196 : 160; + U8 alpha = is_light ? 196 : 160; LLColor3 col = is_light ? volume->getLightColor() : LLColor3(0,0,0); LLColor4 col2 = facep->getRenderColor(); draw_info->mGlowColor.setVec((U8) (col.mV[0]*col2.mV[0]*255), (U8) (col.mV[1]*col2.mV[1]*255), (U8) (col.mV[2]*col2.mV[2]*255), - 196); + alpha); draw_info->mTextureMatrix = tex_mat; validate_draw_info(*draw_info); } @@ -2333,7 +2315,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) registerFace(group, facep, LLRenderPass::PASS_BUMP); } - if (vobj->getIsLight()) + if (vobj->getIsLight() || + (LLPipeline::sRenderGlow && facep->isState(LLFace::FULLBRIGHT))) { registerFace(group, facep, LLRenderPass::PASS_GLOW); } diff --git a/linden/indra/newview/llvovolume.h b/linden/indra/newview/llvovolume.h index 9fb8ca4..80e4e8a 100644 --- a/linden/indra/newview/llvovolume.h +++ b/linden/indra/newview/llvovolume.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvowater.cpp b/linden/indra/newview/llvowater.cpp index a57aa8b..0697d82 100644 --- a/linden/indra/newview/llvowater.cpp +++ b/linden/indra/newview/llvowater.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llvowater.h b/linden/indra/newview/llvowater.h index 20fda7e..a0c85c0 100644 --- a/linden/indra/newview/llvowater.h +++ b/linden/indra/newview/llvowater.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llwaterpatch.cpp b/linden/indra/newview/llwaterpatch.cpp index 6c71861..f6a8640 100644 --- a/linden/indra/newview/llwaterpatch.cpp +++ b/linden/indra/newview/llwaterpatch.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llwaterpatch.h b/linden/indra/newview/llwaterpatch.h index 7779d60..f4eddf6 100644 --- a/linden/indra/newview/llwaterpatch.h +++ b/linden/indra/newview/llwaterpatch.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llwearable.cpp b/linden/indra/newview/llwearable.cpp index 3e3f7ab..4dc3080 100644 --- a/linden/indra/newview/llwearable.cpp +++ b/linden/indra/newview/llwearable.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llwearable.h b/linden/indra/newview/llwearable.h index cfae5a5..1e953f5 100644 --- a/linden/indra/newview/llwearable.h +++ b/linden/indra/newview/llwearable.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llwearablelist.cpp b/linden/indra/newview/llwearablelist.cpp index 10079f8..b345ab0 100644 --- a/linden/indra/newview/llwearablelist.cpp +++ b/linden/indra/newview/llwearablelist.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llwearablelist.h b/linden/indra/newview/llwearablelist.h index 3780dae..632f5af 100644 --- a/linden/indra/newview/llwearablelist.h +++ b/linden/indra/newview/llwearablelist.h @@ -4,6 +4,7 @@ * * Copyright (c) 2002-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llweb.cpp b/linden/indra/newview/llweb.cpp index fe9f919..910f0c4 100644 --- a/linden/indra/newview/llweb.cpp +++ b/linden/indra/newview/llweb.cpp @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llweb.h b/linden/indra/newview/llweb.h index 85dae4b..8bc402c 100644 --- a/linden/indra/newview/llweb.h +++ b/linden/indra/newview/llweb.h @@ -5,6 +5,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llwebbrowserctrl.cpp b/linden/indra/newview/llwebbrowserctrl.cpp index 7df2da4..bd671fa 100644 --- a/linden/indra/newview/llwebbrowserctrl.cpp +++ b/linden/indra/newview/llwebbrowserctrl.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -50,8 +51,10 @@ LLWebBrowserCtrl::LLWebBrowserCtrl( const std::string& name, const LLRect& rect mBorder(NULL), mFrequentUpdates( true ), mOpenLinksInExternalBrowser( false ), + mOpenSecondLifeLinksInMap( true ), mHomePageUrl( "" ), - mIgnoreUIScale( true ) + mIgnoreUIScale( true ), + mAlwaysRefresh( false ) { S32 screen_width = mIgnoreUIScale ? llround((F32)mRect.getWidth() * LLUI::sGLScaleFactor.mV[VX]) : mRect.getWidth(); S32 screen_height = mIgnoreUIScale ? llround((F32)mRect.getHeight() * LLUI::sGLScaleFactor.mV[VY]) : mRect.getHeight(); @@ -63,12 +66,11 @@ LLWebBrowserCtrl::LLWebBrowserCtrl( const std::string& name, const LLRect& rect // the locale to protect it, as exotic/non-C locales // causes our code lots of general critical weirdness // and crashness. (SL-35450) - char *saved_locale = setlocale(LC_ALL, NULL); + std::string saved_locale = setlocale(LC_ALL, NULL); #endif // LL_LINUX mEmbeddedBrowserWindowId = LLMozLib::getInstance()->createBrowserWindow( gViewerWindow->getPlatformWindow(), screen_width, screen_height ); #if LL_LINUX - if (saved_locale) - setlocale(LC_ALL, saved_locale); + setlocale(LC_ALL, saved_locale.c_str() ); #endif // LL_LINUX } @@ -133,6 +135,13 @@ void LLWebBrowserCtrl::setOpenInExternalBrowser( bool valIn ) }; //////////////////////////////////////////////////////////////////////////////// +// open secondlife:// links in map automatically or not +void LLWebBrowserCtrl::setOpenSecondLifeLinksInMap( bool valIn ) +{ + mOpenSecondLifeLinksInMap = valIn; +}; + +//////////////////////////////////////////////////////////////////////////////// // BOOL LLWebBrowserCtrl::handleHover( S32 x, S32 y, MASK mask ) { @@ -163,7 +172,7 @@ BOOL LLWebBrowserCtrl::handleMouseUp( S32 x, S32 y, MASK mask ) convertInputCoords(x, y); LLMozLib::getInstance()->mouseUp( mEmbeddedBrowserWindowId, x, y ); - gViewerWindow->setMouseCapture( 0, 0 ); + gViewerWindow->setMouseCapture( NULL ); return TRUE; } @@ -175,7 +184,7 @@ BOOL LLWebBrowserCtrl::handleMouseDown( S32 x, S32 y, MASK mask ) convertInputCoords(x, y); LLMozLib::getInstance()->mouseDown( mEmbeddedBrowserWindowId, x, y ); - gViewerWindow->setMouseCapture( this, 0 ); + gViewerWindow->setMouseCapture( this ); setFocus( TRUE ); @@ -198,6 +207,8 @@ void LLWebBrowserCtrl::onFocusLost() LLMozLib::getInstance()->focusBrowser( mEmbeddedBrowserWindowId, false ); gViewerWindow->focusClient(); + + LLUICtrl::onFocusLost(); } //////////////////////////////////////////////////////////////////////////////// @@ -516,38 +527,48 @@ void LLWebBrowserCtrl::onClickLinkSecondLife( const EventType& eventIn ) { if ( LLString::compareInsensitive( eventIn.getStringValue().substr( 0, protocol.length() ).c_str(), protocol.c_str() ) == 0 ) { - // parse out sim name and coordinates - LLURLSimString::setString( eventIn.getStringValue() ); - LLURLSimString::parse(); - - // if there is a world map - if ( gFloaterWorldMap ) + if ( mOpenSecondLifeLinksInMap ) { - #if ! LL_RELEASE_FOR_DOWNLOAD - llinfos << "MOZ> opening map to " << LLURLSimString::sInstance.mSimName.c_str() << " at " << LLURLSimString::sInstance.mX << "," << LLURLSimString::sInstance.mY << "," << LLURLSimString::sInstance.mZ << llendl; - #endif - - // mark where the destination is - gFloaterWorldMap->trackURL( LLURLSimString::sInstance.mSimName.c_str(), - LLURLSimString::sInstance.mX, - LLURLSimString::sInstance.mY, - LLURLSimString::sInstance.mZ ); - - // display map - LLFloaterWorldMap::show( NULL, TRUE ); - } - else - // if there is no world map, assume we're on the login page.. (this might be bad but I don't see a way to tell if you're at login or not) - { - // refresh the login page and force the location combo box to be visible - LLPanelLogin::refreshLocation( true ); + openMapAtlocation( eventIn.getStringValue() ); }; + + // chain this event on to observers of an instance of LLWebBrowserCtrl + LLWebBrowserCtrlEvent event( eventIn.getStringValue() ); + mEventEmitter.update( &LLWebBrowserCtrlObserver::onClickLinkSecondLife, event ); }; }; +} - // chain this event on to observers of an instance of LLWebBrowserCtrl - LLWebBrowserCtrlEvent event( eventIn.getStringValue() ); - mEventEmitter.update( &LLWebBrowserCtrlObserver::onClickLinkSecondLife, event ); +//////////////////////////////////////////////////////////////////////////////// +// virtual +void LLWebBrowserCtrl::openMapAtlocation( std::string second_life_url ) +{ + // parse out sim name and coordinates + LLURLSimString::setString( second_life_url ); + LLURLSimString::parse(); + + // if there is a world map + if ( gFloaterWorldMap ) + { + #if ! LL_RELEASE_FOR_DOWNLOAD + llinfos << "MOZ> opening map to " << LLURLSimString::sInstance.mSimName.c_str() << " at " << LLURLSimString::sInstance.mX << "," << LLURLSimString::sInstance.mY << "," << LLURLSimString::sInstance.mZ << llendl; + #endif + + // mark where the destination is + gFloaterWorldMap->trackURL( LLURLSimString::sInstance.mSimName.c_str(), + LLURLSimString::sInstance.mX, + LLURLSimString::sInstance.mY, + LLURLSimString::sInstance.mZ ); + + // display map + LLFloaterWorldMap::show( NULL, TRUE ); + } + else + // if there is no world map, assume we're on the login page.. (this might be bad but I don't see a way to tell if you're at login or not) + { + // refresh the login page and force the location combo box to be visible + LLPanelLogin::refreshLocation( true ); + }; } //////////////////////////////////////////////////////////////////////////////// @@ -575,7 +596,7 @@ LLWebBrowserTexture::~LLWebBrowserTexture() BOOL LLWebBrowserTexture::render() { // frequent updates turned on? - if ( mWebBrowserCtrl->getFrequentUpdates() ) + if ( mWebBrowserCtrl->getFrequentUpdates() || mWebBrowserCtrl->getAlwaysRefresh() ) { // only update mozilla/texture occasionally if ( mElapsedTime.getElapsedTimeF32() > ( 1.0f / 15.0f ) ) @@ -591,12 +612,13 @@ BOOL LLWebBrowserTexture::render() if ( actual_rowspan < 1 || browser_depth < 2 ) return FALSE; + // width can change after it's rendered - (Mozilla bug# 24721) S32 pagebuffer_width = actual_rowspan / browser_depth; - + + // Browser depth hasn't changed. if(mLastBrowserDepth == browser_depth) { - // Browser depth hasn't changed. Just grab the pixels. - + // Just grab the pixels. mTexture->setSubImage( pixels, pagebuffer_width, mBrowserHeight, 0, 0, pagebuffer_width, mBrowserHeight ); @@ -605,7 +627,7 @@ BOOL LLWebBrowserTexture::render() { // Browser depth has changed -- need to recreate texture to match. resize(mBrowserWidth, mBrowserHeight); - } + }; }; }; diff --git a/linden/indra/newview/llwebbrowserctrl.h b/linden/indra/newview/llwebbrowserctrl.h index e6f9005..7097036 100644 --- a/linden/indra/newview/llwebbrowserctrl.h +++ b/linden/indra/newview/llwebbrowserctrl.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -185,6 +186,7 @@ class LLWebBrowserCtrl : bool canNavigateBack(); bool canNavigateForward(); void setOpenInExternalBrowser( bool valIn ); + void setOpenSecondLifeLinksInMap( bool valIn ); void setHomePageUrl( const std::string urlIn ); std::string getHomePageUrl(); @@ -195,6 +197,12 @@ class LLWebBrowserCtrl : void setIgnoreUIScale(bool ignore) { mIgnoreUIScale = ignore; } bool getIgnoreUIScale() { return mIgnoreUIScale; } + // map releated control (this should be moved eventually) + void openMapAtlocation( std::string second_life_url ); + + void setAlwaysRefresh(bool refresh) { mAlwaysRefresh = refresh; } + bool getAlwaysRefresh() { return mAlwaysRefresh; } + // over-rides virtual BOOL handleKey( KEY key, MASK mask, BOOL called_from_parent ); virtual BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent); @@ -230,8 +238,10 @@ class LLWebBrowserCtrl : LLViewBorder* mBorder; bool mFrequentUpdates; bool mOpenLinksInExternalBrowser; + bool mOpenSecondLifeLinksInMap; std::string mHomePageUrl; bool mIgnoreUIScale; + bool mAlwaysRefresh; }; //////////////////////////////////////////////////////////////////////////////// diff --git a/linden/indra/newview/llwind.cpp b/linden/indra/newview/llwind.cpp index 5180b8f..247e28c 100644 --- a/linden/indra/newview/llwind.cpp +++ b/linden/indra/newview/llwind.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llwind.h b/linden/indra/newview/llwind.h index be044ec..af7a8bb 100644 --- a/linden/indra/newview/llwind.h +++ b/linden/indra/newview/llwind.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llwindebug.cpp b/linden/indra/newview/llwindebug.cpp index 772ded4..6221b85 100644 --- a/linden/indra/newview/llwindebug.cpp +++ b/linden/indra/newview/llwindebug.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llwindebug.h b/linden/indra/newview/llwindebug.h index 4e620bc..50e168c 100644 --- a/linden/indra/newview/llwindebug.h +++ b/linden/indra/newview/llwindebug.h @@ -4,6 +4,7 @@ * * Copyright (c) 2004-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llworld.cpp b/linden/indra/newview/llworld.cpp index cf85eab..9c71ee4 100644 --- a/linden/indra/newview/llworld.cpp +++ b/linden/indra/newview/llworld.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -30,6 +31,7 @@ #include "llworld.h" #include "indra_constants.h" +#include "llstl.h" #include "llagent.h" #include "llviewercontrol.h" @@ -109,8 +111,7 @@ LLWorld::LLWorld(const U32 grids_per_region, const F32 meters_per_grid) LLWorld::~LLWorld() { gObjectList.killAllObjects(); - - mRegionList.deleteAllData(); + for_each(mRegionList.begin(), mRegionList.end(), DeletePointer()); } @@ -170,9 +171,9 @@ LLViewerRegion* LLWorld::addRegion(const U64 ®ion_handle, const LLHost &host) regionp->mCloudLayer.setWidth((F32)mWidth); regionp->mCloudLayer.setWindPointer(®ionp->mWind); - mRegionList.addData(regionp); - mActiveRegionList.addData(regionp); - mCulledRegionList.addData(regionp); + mRegionList.push_back(regionp); + mActiveRegionList.push_back(regionp); + mCulledRegionList.push_back(regionp); // Find all the adjacent regions, and attach them. @@ -224,9 +225,10 @@ void LLWorld::removeRegion(const LLHost &host) if (regionp == gAgent.getRegion()) { - LLViewerRegion *reg; - for (reg = mRegionList.getFirstData(); reg; reg = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* reg = *iter; llwarns << "RegionDump: " << reg->getName() << " " << reg->getHost() << " " << reg->getOriginGlobal() @@ -249,42 +251,23 @@ void LLWorld::removeRegion(const LLHost &host) from_region_handle(regionp->getHandle(), &x, &y); llinfos << "Removing region " << x << ":" << y << llendl; - // This code can probably be blitzed now... - if (!mRegionList.removeData(regionp)) - { - for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData()) - { - llwarns << "RegionDump: " << regionp->getName() - << " " << regionp->getHost() - << " " << regionp->getOriginGlobal() - << llendl; - } - - llerrs << "Region list is broken" << llendl; - } - - if (!mActiveRegionList.removeData(regionp)) - { - llwarns << "LLWorld.mActiveRegionList is broken." << llendl; - } - if (!mCulledRegionList.removeData(regionp)) - { - if (!mVisibleRegionList.removeData(regionp)) - { - llwarns << "LLWorld.mCulled/mVisibleRegionList are broken" << llendl;; - } - } + mRegionList.remove(regionp); + mActiveRegionList.remove(regionp); + mCulledRegionList.remove(regionp); + mVisibleRegionList.remove(regionp); + delete regionp; updateWaterObjects(); } -LLViewerRegion *LLWorld::getRegion(const LLHost &host) +LLViewerRegion* LLWorld::getRegion(const LLHost &host) { - LLViewerRegion *regionp; - for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; if (regionp->getHost() == host) { return regionp; @@ -293,16 +276,17 @@ LLViewerRegion *LLWorld::getRegion(const LLHost &host) return NULL; } -LLViewerRegion *LLWorld::getRegionFromPosAgent(const LLVector3 &pos) +LLViewerRegion* LLWorld::getRegionFromPosAgent(const LLVector3 &pos) { return getRegionFromPosGlobal(gAgent.getPosGlobalFromAgent(pos)); } -LLViewerRegion *LLWorld::getRegionFromPosGlobal(const LLVector3d &pos) +LLViewerRegion* LLWorld::getRegionFromPosGlobal(const LLVector3d &pos) { - LLViewerRegion *regionp; - for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; if (regionp->pointInRegionGlobal(pos)) { return regionp; @@ -376,11 +360,12 @@ LLVector3d LLWorld::clipToVisibleRegions(const LLVector3d &start_pos, const LLVe return regionp->getPosGlobalFromRegion(LLVector3(final_region_pos)); } -LLViewerRegion *LLWorld::getRegionFromHandle(const U64 &handle) +LLViewerRegion* LLWorld::getRegionFromHandle(const U64 &handle) { - LLViewerRegion *regionp; - for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; if (regionp->getHandle() == handle) { return regionp; @@ -393,9 +378,10 @@ LLViewerRegion *LLWorld::getRegionFromHandle(const U64 &handle) void LLWorld::updateAgentOffset(const LLVector3d &offset_global) { #if 0 - LLViewerRegion *regionp; - for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; regionp->setAgentOffset(offset_global); } #endif @@ -404,9 +390,10 @@ void LLWorld::updateAgentOffset(const LLVector3d &offset_global) BOOL LLWorld::positionRegionValidGlobal(const LLVector3d &pos_global) { - LLViewerRegion *regionp; - for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; if (regionp->pointInRegionGlobal(pos_global)) { return TRUE; @@ -571,32 +558,29 @@ void LLWorld::updateVisibilities() gCamera->setFar(mLandFarClip); - LLViewerRegion *regionp; - F32 diagonal_squared = F_SQRT2 * F_SQRT2 * mWidth * mWidth; // Go through the culled list and check for visible regions - for (regionp = mCulledRegionList.getFirstData(); - regionp; - regionp = mCulledRegionList.getNextData()) + for (region_list_t::iterator iter = mCulledRegionList.begin(); + iter != mCulledRegionList.end(); ) { + region_list_t::iterator curiter = iter++; + LLViewerRegion* regionp = *curiter; F32 height = regionp->getLand().getMaxZ() - regionp->getLand().getMinZ(); F32 radius = 0.5f*fsqrtf(height * height + diagonal_squared); if (!regionp->getLand().hasZData() || gCamera->sphereInFrustum(regionp->getCenterAgent(), radius)) { - mCulledRegionList.removeCurrentData(); - mVisibleRegionList.addDataAtEnd(regionp); + mCulledRegionList.erase(curiter); + mVisibleRegionList.push_back(regionp); } } - F32 last_dist_squared = 0.0f; - F32 dist_squared; - - // Update all of the visible regions and make single bubble-sort pass - for (regionp = mVisibleRegionList.getFirstData(); - regionp; - regionp = mVisibleRegionList.getNextData()) + // Update all of the visible regions + for (region_list_t::iterator iter = mVisibleRegionList.begin(); + iter != mVisibleRegionList.end(); ) { + region_list_t::iterator curiter = iter++; + LLViewerRegion* regionp = *curiter; if (!regionp->getLand().hasZData()) { continue; @@ -606,44 +590,35 @@ void LLWorld::updateVisibilities() F32 radius = 0.5f*fsqrtf(height * height + diagonal_squared); if (gCamera->sphereInFrustum(regionp->getCenterAgent(), radius)) { + regionp->calculateCameraDistance(); if (!gNoRender) { regionp->getLand().updatePatchVisibilities(gAgent); } - - // sort by distance... closer regions to the front - // Note: regions use absolute frame so we use the agent's center - dist_squared = (F32)(gAgent.getCameraPositionGlobal() - regionp->getCenterGlobal()).magVecSquared(); - if (dist_squared < last_dist_squared) - { - mVisibleRegionList.swapCurrentWithPrevious(); - } - else - { - last_dist_squared = dist_squared; - } } else { - mVisibleRegionList.removeCurrentData(); - mCulledRegionList.addData(regionp); + mVisibleRegionList.erase(curiter); + mCulledRegionList.push_back(regionp); } } + // Sort visible regions + mVisibleRegionList.sort(LLViewerRegion::CompareDistance()); + gCamera->setFar(cur_far_clip); } void LLWorld::updateRegions(F32 max_update_time) { - LLViewerRegion *regionp; LLTimer update_timer; BOOL did_one = FALSE; // Perform idle time updates for the regions (and associated surfaces) - for (regionp = mRegionList.getFirstData(); - regionp; - regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; F32 max_time = max_update_time - update_timer.getElapsedTimeF32(); if (did_one && max_time <= 0.f) break; @@ -664,47 +639,45 @@ void LLWorld::updateClouds(const F32 dt) // don't move clouds in snapshot mode return; } - LLViewerRegion *regionp; - if (mActiveRegionList.getLength()) + if (mActiveRegionList.size()) { // Update all the cloud puff positions, and timer based stuff // such as death decay - for (regionp = mActiveRegionList.getFirstData(); - regionp; - regionp = mActiveRegionList.getNextData()) + for (region_list_t::iterator iter = mActiveRegionList.begin(); + iter != mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; regionp->mCloudLayer.updatePuffs(dt); } // Reshuffle who owns which puffs - for (regionp = mActiveRegionList.getFirstData(); - regionp; - regionp = mActiveRegionList.getNextData()) + for (region_list_t::iterator iter = mActiveRegionList.begin(); + iter != mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; regionp->mCloudLayer.updatePuffOwnership(); } // Add new puffs - for (regionp = mActiveRegionList.getFirstData(); - regionp; - regionp = mActiveRegionList.getNextData()) + for (region_list_t::iterator iter = mActiveRegionList.begin(); + iter != mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; regionp->mCloudLayer.updatePuffCount(); } } } -LLCloudGroup *LLWorld::findCloudGroup(const LLCloudPuff &puff) +LLCloudGroup* LLWorld::findCloudGroup(const LLCloudPuff &puff) { - LLViewerRegion *regionp; - if (mActiveRegionList.getLength()) + if (mActiveRegionList.size()) { // Update all the cloud puff positions, and timer based stuff // such as death decay - for (regionp = mActiveRegionList.getFirstData(); - regionp; - regionp = mActiveRegionList.getNextData()) + for (region_list_t::iterator iter = mActiveRegionList.begin(); + iter != mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; LLCloudGroup *groupp = regionp->mCloudLayer.findCloudGroup(puff); if (groupp) { @@ -721,11 +694,12 @@ void LLWorld::renderPropertyLines() S32 region_count = 0; S32 vertex_count = 0; - LLViewerRegion* region; - for (region = mVisibleRegionList.getFirstData(); region; region = mVisibleRegionList.getNextData() ) + for (region_list_t::iterator iter = mVisibleRegionList.begin(); + iter != mVisibleRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; region_count++; - vertex_count += region->renderPropertyLines(); + vertex_count += regionp->renderPropertyLines(); } } @@ -734,10 +708,11 @@ void LLWorld::updateNetStats() { F32 bits = 0.f; U32 packets = 0; - LLViewerRegion *regionp; - for (regionp = mActiveRegionList.getFirstData(); regionp; regionp = mActiveRegionList.getNextData()) + for (region_list_t::iterator iter = mActiveRegionList.begin(); + iter != mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; regionp->updateNetStats(); bits += regionp->mBitStat.getCurrent(); packets += llfloor( regionp->mPacketsStat.getCurrent() ); @@ -772,27 +747,24 @@ void LLWorld::updateNetStats() void LLWorld::printPacketsLost() { - LLViewerRegion *regionp; - llinfos << "Simulators:" << llendl; llinfos << "----------" << llendl; LLCircuitData *cdp = NULL; - for (regionp = mActiveRegionList.getFirstData(); - regionp; - regionp = mActiveRegionList.getNextData()) + for (region_list_t::iterator iter = mActiveRegionList.begin(); + iter != mActiveRegionList.end(); ++iter) + { + LLViewerRegion* regionp = *iter; + cdp = gMessageSystem->mCircuitInfo.findCircuit(regionp->getHost()); + if (cdp) { - cdp = gMessageSystem->mCircuitInfo.findCircuit(regionp->getHost()); - if (cdp) - { - LLVector3d range = regionp->getCenterGlobal() - gAgent.getPositionGlobal(); + LLVector3d range = regionp->getCenterGlobal() - gAgent.getPositionGlobal(); - llinfos << regionp->getHost() << ", range: " << range.magVec() << - " packets lost: " << - cdp->getPacketsLost() << llendl; - } + llinfos << regionp->getHost() << ", range: " << range.magVec() + << " packets lost: " << cdp->getPacketsLost() << llendl; } - + } + llinfos << "UserServer:" << llendl; llinfos << "-----------" << llendl; @@ -805,9 +777,11 @@ void LLWorld::printPacketsLost() void LLWorld::processCoarseUpdate(LLMessageSystem* msg, void** user_data) { - LLViewerRegion* region = NULL; - region = gWorldp->getRegion(msg->getSender()); - if( region ) region->updateCoarseLocations(msg); + LLViewerRegion* region = gWorldp->getRegion(msg->getSender()); + if( region ) + { + region->updateCoarseLocations(msg); + } } F32 LLWorld::getLandFarClip() const @@ -828,49 +802,58 @@ void LLWorld::updateWaterObjects() { return; } - S32 min_x, min_y, max_x, max_y; - U32 region_x, region_y; - - S32 rwidth = llfloor(getRegionWidthInMeters()); - - // First, determine the min and max "box" of water objects - LLViewerRegion *regionp; - regionp = mRegionList.getFirstData(); - - if (!regionp) + if (mRegionList.empty()) { llwarns << "No regions!" << llendl; return; } - from_region_handle(regionp->getHandle(), ®ion_x, ®ion_y); - min_x = max_x = region_x; - min_y = max_y = region_y; + // First, determine the min and max "box" of water objects + bool first = true; + S32 min_x = 0; + S32 min_y = 0; + S32 max_x = 0; + S32 max_y = 0; + U32 region_x, region_y; - LLVOWater *waterp; + S32 rwidth = llfloor(getRegionWidthInMeters()); - for (; regionp; regionp = mRegionList.getNextData()) + + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; from_region_handle(regionp->getHandle(), ®ion_x, ®ion_y); - min_x = llmin(min_x, (S32)region_x); - min_y = llmin(min_y, (S32)region_y); - max_x = llmax(max_x, (S32)region_x); - max_y = llmax(max_y, (S32)region_y); - waterp = regionp->getLand().getWaterObj(); + if (first) + { + first = false; + min_x = max_x = region_x; + min_y = max_y = region_y; + } + else + { + min_x = llmin(min_x, (S32)region_x); + min_y = llmin(min_y, (S32)region_y); + max_x = llmax(max_x, (S32)region_x); + max_y = llmax(max_y, (S32)region_y); + } + LLVOWater* waterp = regionp->getLand().getWaterObj(); if (waterp) { gObjectList.updateActive(waterp); } } - for (waterp = mHoleWaterObjects.getFirstData(); waterp; waterp = mHoleWaterObjects.getNextData()) + for (std::list::iterator iter = mHoleWaterObjects.begin(); + iter != mHoleWaterObjects.end(); ++ iter) { + LLVOWater* waterp = *iter; gObjectList.killObject(waterp); } - mHoleWaterObjects.removeAllNodes(); + mHoleWaterObjects.clear(); // We only want to fill in holes for stuff that's near us, say, within 512m - regionp = gAgent.getRegion(); + LLViewerRegion* regionp = gAgent.getRegion(); from_region_handle(regionp->getHandle(), ®ion_x, ®ion_y); min_x = llmax((S32)region_x - 512, min_x); @@ -887,14 +870,14 @@ void LLWorld::updateWaterObjects() U64 region_handle = to_region_handle(x, y); if (!getRegionFromHandle(region_handle)) { - waterp = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_WATER, gAgent.getRegion()); + LLVOWater* waterp = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_WATER, gAgent.getRegion()); waterp->setUseTexture(FALSE); gPipeline.addObject(waterp); waterp->setPositionGlobal(LLVector3d(x + rwidth/2, y + rwidth/2, DEFAULT_WATER_HEIGHT)); waterp->setScale(LLVector3((F32)rwidth, (F32)rwidth, 0.f)); - mHoleWaterObjects.addData(waterp); + mHoleWaterObjects.push_back(waterp); } } } @@ -943,7 +926,7 @@ void LLWorld::updateWaterObjects() const S32 water_center_y = center_y + llround((wy + dim[1]) * 0.5f * gDirAxes[dir][1]); - waterp = mEdgeWaterObjects[dir]; + LLVOWater* waterp = mEdgeWaterObjects[dir]; if (!waterp || waterp->isDead()) { // The edge water objects can be dead because they're attached to the region that the @@ -971,7 +954,7 @@ void LLWorld::updateWaterObjects() //llinfos << "End water update" << llendl; } -LLViewerImage *LLWorld::getDefaultWaterTexture() +LLViewerImage* LLWorld::getDefaultWaterTexture() { return mDefaultWaterTexturep; } @@ -988,10 +971,10 @@ U64 LLWorld::getSpaceTimeUSec() const void LLWorld::requestCacheMisses() { - for(LLViewerRegion* regionp = mRegionList.getFirstData(); - regionp; - regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; regionp->requestCacheMisses(); } } @@ -999,10 +982,10 @@ void LLWorld::requestCacheMisses() LLString LLWorld::getInfoString() { LLString info_string("World Info:\n"); - for (LLViewerRegion* regionp = mRegionList.getFirstData(); - regionp; - regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; info_string += regionp->getInfoString(); } return info_string; @@ -1011,10 +994,10 @@ LLString LLWorld::getInfoString() void LLWorld::disconnectRegions() { LLMessageSystem* msg = gMessageSystem; - for(LLViewerRegion* regionp = mRegionList.getFirstData(); - regionp; - regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; if (regionp == gAgent.getRegion()) { // Skip the main agent @@ -1094,8 +1077,11 @@ void process_region_handshake(LLMessageSystem* msg, void** user_data) void send_agent_pause() { // world not initialized yet - if (!gWorldp) return; - + if (!gWorldp) + { + return; + } + gMessageSystem->newMessageFast(_PREHASH_AgentPause); gMessageSystem->nextBlockFast(_PREHASH_AgentData); gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID); @@ -1104,11 +1090,10 @@ void send_agent_pause() gAgentPauseSerialNum++; gMessageSystem->addU32Fast(_PREHASH_SerialNum, gAgentPauseSerialNum); - LLViewerRegion *regionp; - for (regionp = gWorldp->mActiveRegionList.getFirstData(); - regionp; - regionp = gWorldp->mActiveRegionList.getNextData()) + for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin(); + iter != gWorldp->mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; gMessageSystem->sendReliable(regionp->getHost()); } @@ -1132,11 +1117,10 @@ void send_agent_resume() gMessageSystem->addU32Fast(_PREHASH_SerialNum, gAgentPauseSerialNum); - LLViewerRegion *regionp; - for (regionp = gWorldp->mActiveRegionList.getFirstData(); - regionp; - regionp = gWorldp->mActiveRegionList.getNextData()) + for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin(); + iter != gWorldp->mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; gMessageSystem->sendReliable(regionp->getHost()); } diff --git a/linden/indra/newview/llworld.h b/linden/indra/newview/llworld.h index b10b287..d2482ac 100644 --- a/linden/indra/newview/llworld.h +++ b/linden/indra/newview/llworld.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -29,8 +30,6 @@ #define LL_LLWORLD_H #include "llpatchvertexarray.h" -#include "doublelinkedlist.h" -#include "linked_lists.h" #include "llmath.h" //#include "vmath.h" @@ -141,14 +140,17 @@ public: U64 getSpaceTimeUSec() const; LLString getInfoString(); + public: - LLDoubleLinkedList mActiveRegionList; + typedef std::list region_list_t; + + region_list_t mActiveRegionList; LLViewerPartSim mPartSim; private: - LLLinkedList mRegionList; - LLDoubleLinkedList mVisibleRegionList; - LLDoubleLinkedList mCulledRegionList; + region_list_t mRegionList; + region_list_t mVisibleRegionList; + region_list_t mCulledRegionList; // Number of points on edge const U32 mWidth; @@ -175,7 +177,7 @@ private: U32 mMinRegionY; U32 mMaxRegionY; - LLLinkedList mHoleWaterObjects; + std::list mHoleWaterObjects; LLPointer mEdgeWaterObjects[8]; LLPointer mDefaultWaterTexturep; diff --git a/linden/indra/newview/llworldmap.cpp b/linden/indra/newview/llworldmap.cpp index 0bdab0d..f2a2c90 100644 --- a/linden/indra/newview/llworldmap.cpp +++ b/linden/indra/newview/llworldmap.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llworldmap.h b/linden/indra/newview/llworldmap.h index 9678b37..c4af7d8 100644 --- a/linden/indra/newview/llworldmap.h +++ b/linden/indra/newview/llworldmap.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llworldmapview.cpp b/linden/indra/newview/llworldmapview.cpp index 65a084d..01dd1b8 100644 --- a/linden/indra/newview/llworldmapview.cpp +++ b/linden/indra/newview/llworldmapview.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -1789,7 +1790,7 @@ BOOL outside_slop(S32 x, S32 y, S32 start_x, S32 start_y) BOOL LLWorldMapView::handleMouseDown( S32 x, S32 y, MASK mask ) { - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); mMouseDownPanX = llround(sPanX); mMouseDownPanY = llround(sPanY); @@ -1801,7 +1802,7 @@ BOOL LLWorldMapView::handleMouseDown( S32 x, S32 y, MASK mask ) BOOL LLWorldMapView::handleMouseUp( S32 x, S32 y, MASK mask ) { - if (this == gFocusMgr.getMouseCapture()) + if (hasMouseCapture()) { if (mPanning) { @@ -1828,7 +1829,7 @@ BOOL LLWorldMapView::handleMouseUp( S32 x, S32 y, MASK mask ) handleClick(x, y, mask, &hit_type, &id); } gViewerWindow->showCursor(); - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); return TRUE; } return FALSE; @@ -1874,7 +1875,7 @@ void LLWorldMapView::updateVisibleBlocks() BOOL LLWorldMapView::handleHover( S32 x, S32 y, MASK mask ) { - if (this == gFocusMgr.getMouseCapture()) + if (hasMouseCapture()) { if (mPanning || outside_slop(x, y, mMouseDownX, mMouseDownY)) { diff --git a/linden/indra/newview/llworldmapview.h b/linden/indra/newview/llworldmapview.h index f2912bd..7eeb554 100644 --- a/linden/indra/newview/llworldmapview.h +++ b/linden/indra/newview/llworldmapview.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/llxmlrpctransaction.cpp b/linden/indra/newview/llxmlrpctransaction.cpp index d84f5c6..896508c 100644 --- a/linden/indra/newview/llxmlrpctransaction.cpp +++ b/linden/indra/newview/llxmlrpctransaction.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -238,6 +239,7 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip) curl_easy_setopt(mCurl, CURLOPT_ERRORBUFFER, &mCurlErrorBuffer); curl_easy_setopt(mCurl, CURLOPT_CAINFO, gDirUtilp->getCAFile().c_str()); curl_easy_setopt(mCurl, CURLOPT_SSL_VERIFYPEER, gVerifySSLCert); + curl_easy_setopt(mCurl, CURLOPT_SSL_VERIFYHOST, gVerifySSLCert? 2 : 0); /* Setting the DNS cache timeout to -1 disables it completely. This might help with bug #503 */ diff --git a/linden/indra/newview/llxmlrpctransaction.h b/linden/indra/newview/llxmlrpctransaction.h index d2e4613..460cfbe 100644 --- a/linden/indra/newview/llxmlrpctransaction.h +++ b/linden/indra/newview/llxmlrpctransaction.h @@ -4,6 +4,7 @@ * * Copyright (c) 2006-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/lsl_guide.html b/linden/indra/newview/lsl_guide.html index 6f3796f..33c2499 100644 --- a/linden/indra/newview/lsl_guide.html +++ b/linden/indra/newview/lsl_guide.html @@ -15055,6 +15055,16 @@ HREF="#AEN5604" >. If linknumber is LINK_SET, set the alpha of + all objects in the linked set. If >>>>>> .merge-right.r59207 >face is . If linknumber is LINK_SET, set the color of + all objects in the linked set. If >>>>>> .merge-right.r59207 >face is llSetLinkPrimitiveParams(integer linknumber, list rules);

llSetLinkPrimitiveParams(integer linknumber, list rules);

Sets the primitive parameters of the linked child + specified by linknumber. A value of 0 means + no link, 1 the root, 2 for first child, etc. If + linknumber is LINK_SET, set the primitive parameters + of all objects in the linked set. The rules + list is identical to that of + llSetPrimitiveParams.


A.235. llSetLinkTexture

llSetLinkTexture(integer linknumber, string texture, integer face);

Sets the texture of the linked child + specified by linknumber. A value of 0 means + no link, 1 the root, 2 for first child, etc. If + linknumber is LINK_SET, set the texture of + all objects in the linked set. If face is + ALL_SIDES, set the texture + of all faces.


A.236. llSetLocalRot

>>>>>> .merge-right.r59207 >llSetLocalRot(rotation rot);

+ + - - + + + + + + - - + + - - + + + + + + - - + + @@ -1511,6 +1515,10 @@ > + + @@ -1627,10 +1635,6 @@ > - - @@ -2233,6 +2237,10 @@ > + + @@ -2889,6 +2897,10 @@ > + + @@ -3005,10 +3017,6 @@ > - - diff --git a/linden/indra/newview/noise.cpp b/linden/indra/newview/noise.cpp index 528e799..930c91e 100644 --- a/linden/indra/newview/noise.cpp +++ b/linden/indra/newview/noise.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/noise.h b/linden/indra/newview/noise.h index 63ad3ab..142718a 100644 --- a/linden/indra/newview/noise.h +++ b/linden/indra/newview/noise.h @@ -4,6 +4,7 @@ * * Copyright (c) 2000-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/pipeline.cpp b/linden/indra/newview/pipeline.cpp index 1a5b4f1..5d4618e 100644 --- a/linden/indra/newview/pipeline.cpp +++ b/linden/indra/newview/pipeline.cpp @@ -4,6 +4,7 @@ * * Copyright (c) 2005-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -44,7 +45,7 @@ #include "material_codes.h" #include "timing.h" #include "v3color.h" -#include "llui.h" +#include "llui.h" #include "llglheaders.h" // newview includes @@ -89,6 +90,9 @@ #include "llworld.h" #include "viewer.h" #include "llcubemap.h" +#include "lldebugmessagebox.h" +#include "llglslshader.h" +#include "llviewerjoystick.h" #ifdef _DEBUG // Debug indices is disabled for now for debug performance - djs 4/24/02 @@ -128,77 +132,6 @@ S32 gTrivialAccepts = 0; BOOL gRenderForSelect = FALSE; -//glsl parameter tables -const char* LLPipeline::sReservedAttribs[] = -{ - "materialColor", - "specularColor", - "binormal" -}; - -U32 LLPipeline::sReservedAttribCount = LLPipeline::GLSL_END_RESERVED_ATTRIBS; - -const char* LLPipeline::sAvatarAttribs[] = -{ - "weight", - "clothing", - "gWindDir", - "gSinWaveParams", - "gGravity" -}; - -U32 LLPipeline::sAvatarAttribCount = sizeof(LLPipeline::sAvatarAttribs)/sizeof(char*); - -const char* LLPipeline::sAvatarUniforms[] = -{ - "matrixPalette" -}; - -U32 LLPipeline::sAvatarUniformCount = 1; - -const char* LLPipeline::sReservedUniforms[] = -{ - "diffuseMap", - "specularMap", - "bumpMap", - "environmentMap", - "scatterMap" -}; - -U32 LLPipeline::sReservedUniformCount = LLPipeline::GLSL_END_RESERVED_UNIFORMS; - -const char* LLPipeline::sTerrainUniforms[] = -{ - "detail0", - "detail1", - "alphaRamp" -}; - -U32 LLPipeline::sTerrainUniformCount = sizeof(LLPipeline::sTerrainUniforms)/sizeof(char*); - -const char* LLPipeline::sShinyUniforms[] = -{ - "origin" -}; - -U32 LLPipeline::sShinyUniformCount = sizeof(LLPipeline::sShinyUniforms)/sizeof(char*); - -const char* LLPipeline::sWaterUniforms[] = -{ - "screenTex", - "eyeVec", - "time", - "d1", - "d2", - "lightDir", - "specular", - "lightExp", - "fbScale", - "refScale" -}; - -U32 LLPipeline::sWaterUniformCount = sizeof(LLPipeline::sWaterUniforms)/sizeof(char*); - //---------------------------------------- void stamp(F32 x, F32 y, F32 xs, F32 ys) @@ -215,6 +148,14 @@ void stamp(F32 x, F32 y, F32 xs, F32 ys) glEnd(); } +U32 nhpo2(U32 v) +{ + U32 r = 1; + while (r < v) { + r *= 2; + } + return r; +} //---------------------------------------- @@ -229,10 +170,13 @@ BOOL LLPipeline::sRenderSoundBeacons = FALSE; BOOL LLPipeline::sUseOcclusion = FALSE; BOOL LLPipeline::sSkipUpdate = FALSE; BOOL LLPipeline::sDynamicReflections = FALSE; +BOOL LLPipeline::sRenderGlow = FALSE; LLPipeline::LLPipeline() : + mScreenTex(0), mCubeBuffer(NULL), - mCubeList(0), + mGlowMap(0), + mGlowBuffer(0), mVertexShadersEnabled(FALSE), mVertexShadersLoaded(0), mLastRebuildPool(NULL), @@ -244,16 +188,21 @@ LLPipeline::LLPipeline() : mWaterPool(NULL), mGroundPool(NULL), mSimplePool(NULL), + mGlowPool(NULL), mBumpPool(NULL), mLightMask(0), mLightMovingMask(0) { - + mFramebuffer[0] = mFramebuffer[1] = 0; + mCubeFrameBuffer = 0; + mCubeDepth = 0; } void LLPipeline::init() { LLMemType mt(LLMemType::MTYPE_PIPELINE); + + mInitialized = TRUE; stop_glerror(); @@ -275,6 +224,7 @@ void LLPipeline::init() getPool(LLDrawPool::POOL_ALPHA_POST_WATER); getPool(LLDrawPool::POOL_SIMPLE); getPool(LLDrawPool::POOL_BUMP); + getPool(LLDrawPool::POOL_GLOW); mTrianglesDrawnStat.reset(); resetFrameStats(); @@ -293,14 +243,7 @@ void LLPipeline::init() // Enable features stop_glerror(); - setShaders(); -} - -void LLPipeline::LLScatterShader::init(GLhandleARB shader, int map_stage) -{ - glUseProgramObjectARB(shader); - glUniform1iARB(glGetUniformLocationARB(shader, "scatterMap"), map_stage); - glUseProgramObjectARB(0); + LLShaderMgr::setShaders(); } LLPipeline::~LLPipeline() @@ -358,20 +301,12 @@ void LLPipeline::cleanup() mGroundPool = NULL; delete mSimplePool; mSimplePool = NULL; + delete mGlowPool; + mGlowPool = NULL; delete mBumpPool; mBumpPool = NULL; - if (mCubeBuffer) - { - delete mCubeBuffer; - mCubeBuffer = NULL; - } - - if (mCubeList) - { - glDeleteLists(mCubeList, 1); - mCubeList = 0; - } + releaseGLBuffers(); mBloomImagep = NULL; mBloomImage2p = NULL; @@ -412,376 +347,68 @@ void LLPipeline::destroyGL() clearRenderMap(); resetVertexBuffers(); - if (mCubeBuffer) - { - delete mCubeBuffer; - mCubeBuffer = NULL; - } - - if (mCubeList) - { - glDeleteLists(mCubeList, 1); - mCubeList = 0; - } -} - -void LLPipeline::restoreGL() -{ - resetVertexBuffers(); - - if (mVertexShadersEnabled) - { - setShaders(); - } - - for (U32 i = 0; i < mObjectPartition.size()-1; i++) - { - if (mObjectPartition[i]) - { - mObjectPartition[i]->restoreGL(); - } - } -} - -//============================================================================ -// Load Shader - -static LLString get_object_log(GLhandleARB ret) -{ - LLString res; - - //get log length - GLint length; - glGetObjectParameterivARB(ret, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length); - if (length > 0) - { - //the log could be any size, so allocate appropriately - GLcharARB* log = new GLcharARB[length]; - glGetInfoLogARB(ret, length, &length, log); - res = LLString(log); - delete[] log; - } - return res; -} - -void LLPipeline::dumpObjectLog(GLhandleARB ret, BOOL warns) -{ - LLString log = get_object_log(ret); - if (warns) - { - llwarns << log << llendl; - } - else - { - llinfos << log << llendl; - } + releaseGLBuffers(); } -GLhandleARB LLPipeline::loadShader(const LLString& filename, S32 cls, GLenum type) +void LLPipeline::releaseGLBuffers() { - GLenum error; - error = glGetError(); - if (error != GL_NO_ERROR) - { - llwarns << "GL ERROR entering loadShader(): " << error << llendl; - } - - llinfos << "Loading shader file: " << filename << llendl; - - if (filename.empty()) - { - return 0; - } - - - //read in from file - FILE* file = NULL; - - S32 try_gpu_class = mVertexShaderLevel[cls]; - S32 gpu_class; - - //find the most relevant file - for (gpu_class = try_gpu_class; gpu_class > 0; gpu_class--) - { //search from the current gpu class down to class 1 to find the most relevant shader - std::stringstream fname; - fname << gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "shaders/class"); - fname << gpu_class << "/" << filename; - -// llinfos << "Looking in " << fname.str().c_str() << llendl; - file = fopen(fname.str().c_str(), "r"); /* Flawfinder: ignore */ - if (file) - { - break; // done - } - } - - if (file == NULL) + if (mGlowMap) { - llinfos << "GLSL Shader file not found: " << filename << llendl; - return 0; + glDeleteTextures(1, &mGlowMap); + mGlowMap = 0; } - //we can't have any lines longer than 1024 characters - //or any shaders longer than 1024 lines... deal - DaveP - GLcharARB buff[1024]; - GLcharARB* text[1024]; - GLuint count = 0; - - //copy file into memory - while(fgets(buff, 1024, file) != NULL) - { - text[count++] = strdup(buff); - } - fclose(file); - - //create shader object - GLhandleARB ret = glCreateShaderObjectARB(type); - error = glGetError(); - if (error != GL_NO_ERROR) - { - llwarns << "GL ERROR in glCreateShaderObjectARB: " << error << llendl; - } - else - { - //load source - glShaderSourceARB(ret, count, (const GLcharARB**) text, NULL); - error = glGetError(); - if (error != GL_NO_ERROR) - { - llwarns << "GL ERROR in glShaderSourceARB: " << error << llendl; - } - else - { - //compile source - glCompileShaderARB(ret); - error = glGetError(); - if (error != GL_NO_ERROR) - { - llwarns << "GL ERROR in glCompileShaderARB: " << error << llendl; - } - } - } - //free memory - for (GLuint i = 0; i < count; i++) - { - free(text[i]); - } - if (error == GL_NO_ERROR) - { - //check for errors - GLint success = GL_TRUE; - glGetObjectParameterivARB(ret, GL_OBJECT_COMPILE_STATUS_ARB, &success); - error = glGetError(); - if (error != GL_NO_ERROR || success == GL_FALSE) - { - //an error occured, print log - llwarns << "GLSL Compilation Error: (" << error << ") in " << filename << llendl; - dumpObjectLog(ret); - ret = 0; - } - } - else + if (mGlowBuffer) { - ret = 0; + glDeleteTextures(1, &mGlowBuffer); + mGlowBuffer = 0; } - stop_glerror(); - //successfully loaded, save results -#if 1 // 1.9.1 - if (ret) - { - mVertexShaderLevel[cls] = try_gpu_class; - } - else - { - if (mVertexShaderLevel[cls] > 1) - { - mVertexShaderLevel[cls] = mVertexShaderLevel[cls] - 1; - ret = loadShader(filename,cls,type); - if (ret && mMaxVertexShaderLevel[cls] > mVertexShaderLevel[cls]) - { - mMaxVertexShaderLevel[cls] = mVertexShaderLevel[cls]; - } - } - } -#else - if (ret) - { - S32 max = -1; - /*if (try_gpu_class == mMaxVertexShaderLevel[cls]) - { - max = gpu_class; - }*/ - saveVertexShaderLevel(cls,try_gpu_class,max); - } - else + if (mScreenTex) { - if (mVertexShaderLevel[cls] > 1) - { - mVertexShaderLevel[cls] = mVertexShaderLevel[cls] - 1; - ret = loadShader(f,cls,type); - if (ret && mMaxVertexShaderLevel[cls] > mVertexShaderLevel[cls]) - { - saveVertexShaderLevel(cls, mVertexShaderLevel[cls], mVertexShaderLevel[cls]); - } - } + glDeleteTextures(1, &mScreenTex); + mScreenTex = 0; } -#endif - return ret; -} -BOOL LLPipeline::linkProgramObject(GLhandleARB obj, BOOL suppress_errors) -{ - //check for errors - glLinkProgramARB(obj); - GLint success = GL_TRUE; - glGetObjectParameterivARB(obj, GL_OBJECT_LINK_STATUS_ARB, &success); - if (!suppress_errors && success == GL_FALSE) + if (mCubeBuffer) { - //an error occured, print log - llwarns << "GLSL Linker Error:" << llendl; + delete mCubeBuffer; + mCubeBuffer = NULL; } - LLString log = get_object_log(obj); - LLString::toLower(log); - if (log.find("software") != LLString::npos) + if (mCubeFrameBuffer) { - llwarns << "GLSL Linker: Running in Software:" << llendl; - success = GL_FALSE; - suppress_errors = FALSE; + glDeleteFramebuffersEXT(1, &mCubeFrameBuffer); + glDeleteRenderbuffersEXT(1, &mCubeDepth); + mCubeDepth = mCubeFrameBuffer = 0; } - if (!suppress_errors) - { - dumpObjectLog(obj, !success); - } - - return success; -} -BOOL LLPipeline::validateProgramObject(GLhandleARB obj) -{ - //check program validity against current GL - glValidateProgramARB(obj); - GLint success = GL_TRUE; - glGetObjectParameterivARB(obj, GL_OBJECT_VALIDATE_STATUS_ARB, &success); - if (success == GL_FALSE) - { - llwarns << "GLSL program not valid: " << llendl; - dumpObjectLog(obj); - } - else + if (mFramebuffer[0]) { - dumpObjectLog(obj, FALSE); + glDeleteFramebuffersEXT(2, mFramebuffer); + mFramebuffer[0] = mFramebuffer[1] = 0; } - - return success; } -//============================================================================ -// Shader Management - -void LLPipeline::setShaders() +void LLPipeline::restoreGL() { - sDynamicReflections = gSavedSettings.getBOOL("RenderDynamicReflections"); - - //hack to reset buffers that change behavior with shaders resetVertexBuffers(); - if (gViewerWindow) - { - gViewerWindow->setCursor(UI_CURSOR_WAIT); - } - - // Lighting - setLightingDetail(-1); - - // Shaders - for (S32 i=0; irestoreGL(); } } - if (gViewerWindow) - { - gViewerWindow->setCursor(UI_CURSOR_ARROW); - } } + BOOL LLPipeline::canUseVertexShaders() { if (!gGLManager.mHasVertexShader || @@ -799,468 +426,10 @@ BOOL LLPipeline::canUseVertexShaders() void LLPipeline::unloadShaders() { - mObjectSimpleProgram.unload(); - mObjectShinyProgram.unload(); - mObjectBumpProgram.unload(); - mObjectAlphaProgram.unload(); - mWaterProgram.unload(); - mTerrainProgram.unload(); - mGroundProgram.unload(); - mAvatarProgram.unload(); - mAvatarEyeballProgram.unload(); - mAvatarPickProgram.unload(); - mHighlightProgram.unload(); - - mVertexShaderLevel[SHADER_LIGHTING] = 0; - mVertexShaderLevel[SHADER_OBJECT] = 0; - mVertexShaderLevel[SHADER_AVATAR] = 0; - mVertexShaderLevel[SHADER_ENVIRONMENT] = 0; - mVertexShaderLevel[SHADER_INTERFACE] = 0; - - mLightVertex = mLightFragment = mScatterVertex = mScatterFragment = 0; + LLShaderMgr::unloadShaders(); mVertexShadersLoaded = 0; } -#if 0 // 1.9.2 -// Any time shader options change -BOOL LLPipeline::loadShaders() -{ - unloadShaders(); - - if (!canUseVertexShaders()) - { - return FALSE; - } - - S32 light_class = mMaxVertexShaderLevel[SHADER_LIGHTING]; - if (getLightingDetail() == 0) - { - light_class = 1; // Use minimum lighting shader - } - else if (getLightingDetail() == 1) - { - light_class = 2; // Use medium lighting shader - } - mVertexShaderLevel[SHADER_LIGHTING] = light_class; - //mVertexShaderLevel[SHADER_OBJECT] = llmin(mMaxVertexShaderLevel[SHADER_OBJECT], gSavedSettings.getS32("VertexShaderLevelObject")); - mVertexShaderLevel[SHADER_OBJECT] = 0; - mVertexShaderLevel[SHADER_AVATAR] = llmin(mMaxVertexShaderLevel[SHADER_AVATAR], gSavedSettings.getS32("VertexShaderLevelAvatar")); - mVertexShaderLevel[SHADER_ENVIRONMENT] = llmin(mMaxVertexShaderLevel[SHADER_ENVIRONMENT], gSavedSettings.getS32("VertexShaderLevelEnvironment")); - mVertexShaderLevel[SHADER_INTERFACE] = mMaxVertexShaderLevel[SHADER_INTERFACE]; - - BOOL loaded = loadShadersLighting(); - if (loaded) - { - loadShadersEnvironment(); // Must load this before object/avatar for scatter - loadShadersObject(); - loadShadersAvatar(); - loadShadersInterface(); - mVertexShadersLoaded = 1; - } - else - { - unloadShaders(); - mVertexShadersEnabled = FALSE; - mVertexShadersLoaded = 0; //-1; // -1 = failed - setLightingDetail(-1); - } - - return loaded; -} -#endif - -BOOL LLPipeline::loadShadersLighting() -{ - // Load light dependency shaders first - // All of these have to load for any shaders to function - - std::string lightvertex = "lighting/lightV.glsl"; - //get default light function implementation - mLightVertex = loadShader(lightvertex, SHADER_LIGHTING, GL_VERTEX_SHADER_ARB); - if( !mLightVertex ) - { - llwarns << "Failed to load " << lightvertex << llendl; - return FALSE; - } - - std::string lightfragment = "lighting/lightF.glsl"; - mLightFragment = loadShader(lightfragment, SHADER_LIGHTING, GL_FRAGMENT_SHADER_ARB); - if ( !mLightFragment ) - { - llwarns << "Failed to load " << lightfragment << llendl; - return FALSE; - } - - // NOTE: Scatter shaders use the ENVIRONMENT detail level - - std::string scattervertex = "environment/scatterV.glsl"; - mScatterVertex = loadShader(scattervertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB); - if ( !mScatterVertex ) - { - llwarns << "Failed to load " << scattervertex << llendl; - return FALSE; - } - - std::string scatterfragment = "environment/scatterF.glsl"; - mScatterFragment = loadShader(scatterfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB); - if ( !mScatterFragment ) - { - llwarns << "Failed to load " << scatterfragment << llendl; - return FALSE; - } - - return TRUE; -} - -BOOL LLPipeline::loadShadersEnvironment() -{ - GLhandleARB baseObjects[] = - { - mLightFragment, - mLightVertex, - mScatterFragment, - mScatterVertex - }; - S32 baseCount = 4; - - BOOL success = TRUE; - - if (mVertexShaderLevel[SHADER_ENVIRONMENT] == 0) - { - mWaterProgram.unload(); - mGroundProgram.unload(); - mTerrainProgram.unload(); - return FALSE; - } - - if (success) - { - //load water vertex shader - std::string waterfragment = "environment/waterF.glsl"; - std::string watervertex = "environment/waterV.glsl"; - mWaterProgram.mProgramObject = glCreateProgramObjectARB(); - mWaterProgram.attachObjects(baseObjects, baseCount); - mWaterProgram.attachObject(loadShader(watervertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB)); - mWaterProgram.attachObject(loadShader(waterfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB)); - - success = mWaterProgram.mapAttributes(); - if (success) - { - success = mWaterProgram.mapUniforms(sWaterUniforms, sWaterUniformCount); - } - if (!success) - { - llwarns << "Failed to load " << watervertex << llendl; - } - } - if (success) - { - //load ground vertex shader - std::string groundvertex = "environment/groundV.glsl"; - std::string groundfragment = "environment/groundF.glsl"; - mGroundProgram.mProgramObject = glCreateProgramObjectARB(); - mGroundProgram.attachObjects(baseObjects, baseCount); - mGroundProgram.attachObject(loadShader(groundvertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB)); - mGroundProgram.attachObject(loadShader(groundfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB)); - - success = mGroundProgram.mapAttributes(); - if (success) - { - success = mGroundProgram.mapUniforms(); - } - if (!success) - { - llwarns << "Failed to load " << groundvertex << llendl; - } - } - - if (success) - { - //load terrain vertex shader - std::string terrainvertex = "environment/terrainV.glsl"; - std::string terrainfragment = "environment/terrainF.glsl"; - mTerrainProgram.mProgramObject = glCreateProgramObjectARB(); - mTerrainProgram.attachObjects(baseObjects, baseCount); - mTerrainProgram.attachObject(loadShader(terrainvertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB)); - mTerrainProgram.attachObject(loadShader(terrainfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB)); - success = mTerrainProgram.mapAttributes(); - if (success) - { - success = mTerrainProgram.mapUniforms(sTerrainUniforms, sTerrainUniformCount); - } - if (!success) - { - llwarns << "Failed to load " << terrainvertex << llendl; - } - } - - if( !success ) - { - mVertexShaderLevel[SHADER_ENVIRONMENT] = 0; - mMaxVertexShaderLevel[SHADER_ENVIRONMENT] = 0; - return FALSE; - } - - if (gWorldPointer) - { - gWorldPointer->updateWaterObjects(); - } - - return TRUE; -} - -BOOL LLPipeline::loadShadersObject() -{ - GLhandleARB baseObjects[] = - { - mLightFragment, - mLightVertex, - mScatterFragment, - mScatterVertex - }; - S32 baseCount = 4; - - BOOL success = TRUE; - - if (mVertexShaderLevel[SHADER_OBJECT] == 0) - { - mObjectShinyProgram.unload(); - mObjectSimpleProgram.unload(); - mObjectBumpProgram.unload(); - mObjectAlphaProgram.unload(); - return FALSE; - } - -#if 0 - if (success) - { - //load object (volume/tree) vertex shader - std::string simplevertex = "objects/simpleV.glsl"; - std::string simplefragment = "objects/simpleF.glsl"; - mObjectSimpleProgram.mProgramObject = glCreateProgramObjectARB(); - mObjectSimpleProgram.attachObjects(baseObjects, baseCount); - mObjectSimpleProgram.attachObject(loadShader(simplevertex, SHADER_OBJECT, GL_VERTEX_SHADER_ARB)); - mObjectSimpleProgram.attachObject(loadShader(simplefragment, SHADER_OBJECT, GL_FRAGMENT_SHADER_ARB)); - success = mObjectSimpleProgram.mapAttributes(); - if (success) - { - success = mObjectSimpleProgram.mapUniforms(); - } - if( !success ) - { - llwarns << "Failed to load " << simplevertex << llendl; - } - } - - if (success) - { - //load object bumpy vertex shader - std::string bumpshinyvertex = "objects/bumpshinyV.glsl"; - std::string bumpshinyfragment = "objects/bumpshinyF.glsl"; - mObjectBumpProgram.mProgramObject = glCreateProgramObjectARB(); - mObjectBumpProgram.attachObjects(baseObjects, baseCount); - mObjectBumpProgram.attachObject(loadShader(bumpshinyvertex, SHADER_OBJECT, GL_VERTEX_SHADER_ARB)); - mObjectBumpProgram.attachObject(loadShader(bumpshinyfragment, SHADER_OBJECT, GL_FRAGMENT_SHADER_ARB)); - success = mObjectBumpProgram.mapAttributes(); - if (success) - { - success = mObjectBumpProgram.mapUniforms(); - } - if( !success ) - { - llwarns << "Failed to load " << bumpshinyvertex << llendl; - } - } - - if (success) - { - //load object alpha vertex shader - std::string alphavertex = "objects/alphaV.glsl"; - std::string alphafragment = "objects/alphaF.glsl"; - mObjectAlphaProgram.mProgramObject = glCreateProgramObjectARB(); - mObjectAlphaProgram.attachObjects(baseObjects, baseCount); - mObjectAlphaProgram.attachObject(loadShader(alphavertex, SHADER_OBJECT, GL_VERTEX_SHADER_ARB)); - mObjectAlphaProgram.attachObject(loadShader(alphafragment, SHADER_OBJECT, GL_FRAGMENT_SHADER_ARB)); - - success = mObjectAlphaProgram.mapAttributes(); - if (success) - { - success = mObjectAlphaProgram.mapUniforms(); - } - if( !success ) - { - llwarns << "Failed to load " << alphavertex << llendl; - } - } -#endif - - if (success) - { - //load shiny vertex shader - std::string shinyvertex = "objects/shinyV.glsl"; - std::string shinyfragment = "objects/shinyF.glsl"; - mObjectShinyProgram.mProgramObject = glCreateProgramObjectARB(); - mObjectShinyProgram.attachObjects(baseObjects, baseCount); - mObjectShinyProgram.attachObject(loadShader(shinyvertex, SHADER_OBJECT, GL_VERTEX_SHADER_ARB)); - mObjectShinyProgram.attachObject(loadShader(shinyfragment, SHADER_OBJECT, GL_FRAGMENT_SHADER_ARB)); - - success = mObjectShinyProgram.mapAttributes(); - if (success) - { - success = mObjectShinyProgram.mapUniforms(LLPipeline::sShinyUniforms, LLPipeline::sShinyUniformCount); - } - if( !success ) - { - llwarns << "Failed to load " << shinyvertex << llendl; - } - } - - if( !success ) - { - mVertexShaderLevel[SHADER_OBJECT] = 0; - mMaxVertexShaderLevel[SHADER_OBJECT] = 0; - return FALSE; - } - - return TRUE; -} - -BOOL LLPipeline::loadShadersAvatar() -{ - GLhandleARB baseObjects[] = - { - mLightFragment, - mLightVertex, - mScatterFragment, - mScatterVertex - }; - S32 baseCount = 4; - - BOOL success = TRUE; - - if (mVertexShaderLevel[SHADER_AVATAR] == 0) - { - mAvatarProgram.unload(); - mAvatarEyeballProgram.unload(); - mAvatarPickProgram.unload(); - return FALSE; - } - - if (success) - { - //load specular (eyeball) vertex program - std::string eyeballvertex = "avatar/eyeballV.glsl"; - std::string eyeballfragment = "avatar/eyeballF.glsl"; - mAvatarEyeballProgram.mProgramObject = glCreateProgramObjectARB(); - mAvatarEyeballProgram.attachObjects(baseObjects, baseCount); - mAvatarEyeballProgram.attachObject(loadShader(eyeballvertex, SHADER_AVATAR, GL_VERTEX_SHADER_ARB)); - mAvatarEyeballProgram.attachObject(loadShader(eyeballfragment, SHADER_AVATAR, GL_FRAGMENT_SHADER_ARB)); - success = mAvatarEyeballProgram.mapAttributes(); - if (success) - { - success = mAvatarEyeballProgram.mapUniforms(); - } - if( !success ) - { - llwarns << "Failed to load " << eyeballvertex << llendl; - } - } - - if (success) - { - mAvatarSkinVertex = loadShader("avatar/avatarSkinV.glsl", SHADER_AVATAR, GL_VERTEX_SHADER_ARB); - //load avatar vertex shader - std::string avatarvertex = "avatar/avatarV.glsl"; - std::string avatarfragment = "avatar/avatarF.glsl"; - - mAvatarProgram.mProgramObject = glCreateProgramObjectARB(); - mAvatarProgram.attachObjects(baseObjects, baseCount); - mAvatarProgram.attachObject(mAvatarSkinVertex); - mAvatarProgram.attachObject(loadShader(avatarvertex, SHADER_AVATAR, GL_VERTEX_SHADER_ARB)); - mAvatarProgram.attachObject(loadShader(avatarfragment, SHADER_AVATAR, GL_FRAGMENT_SHADER_ARB)); - - success = mAvatarProgram.mapAttributes(sAvatarAttribs, sAvatarAttribCount); - if (success) - { - success = mAvatarProgram.mapUniforms(sAvatarUniforms, sAvatarUniformCount); - } - if( !success ) - { - llwarns << "Failed to load " << avatarvertex << llendl; - } - } - - if (success) - { - //load avatar picking shader - std::string pickvertex = "avatar/pickAvatarV.glsl"; - std::string pickfragment = "avatar/pickAvatarF.glsl"; - mAvatarPickProgram.mProgramObject = glCreateProgramObjectARB(); - mAvatarPickProgram.attachObject(loadShader(pickvertex, SHADER_AVATAR, GL_VERTEX_SHADER_ARB)); - mAvatarPickProgram.attachObject(loadShader(pickfragment, SHADER_AVATAR, GL_FRAGMENT_SHADER_ARB)); - mAvatarPickProgram.attachObject(mAvatarSkinVertex); - - success = mAvatarPickProgram.mapAttributes(sAvatarAttribs, sAvatarAttribCount); - if (success) - { - success = mAvatarPickProgram.mapUniforms(sAvatarUniforms, sAvatarUniformCount); - } - if( !success ) - { - llwarns << "Failed to load " << pickvertex << llendl; - } - } - - if( !success ) - { - mVertexShaderLevel[SHADER_AVATAR] = 0; - mMaxVertexShaderLevel[SHADER_AVATAR] = 0; - return FALSE; - } - - return TRUE; -} - -BOOL LLPipeline::loadShadersInterface() -{ - BOOL success = TRUE; - - if (mVertexShaderLevel[SHADER_INTERFACE] == 0) - { - mHighlightProgram.unload(); - return FALSE; - } - - if (success) - { - //load highlighting shader - std::string highlightvertex = "interface/highlightV.glsl"; - std::string highlightfragment = "interface/highlightF.glsl"; - mHighlightProgram.mProgramObject = glCreateProgramObjectARB(); - mHighlightProgram.attachObject(loadShader(highlightvertex, SHADER_INTERFACE, GL_VERTEX_SHADER_ARB)); - mHighlightProgram.attachObject(loadShader(highlightfragment, SHADER_INTERFACE, GL_FRAGMENT_SHADER_ARB)); - - success = mHighlightProgram.mapAttributes(); - if (success) - { - success = mHighlightProgram.mapUniforms(); - } - if( !success ) - { - llwarns << "Failed to load " << highlightvertex << llendl; - } - } - - if( !success ) - { - mVertexShaderLevel[SHADER_INTERFACE] = 0; - mMaxVertexShaderLevel[SHADER_INTERFACE] = 0; - return FALSE; - } - - return TRUE; -} - //============================================================================ void LLPipeline::enableShadows(const BOOL enable_shadows) @@ -1298,7 +467,7 @@ S32 LLPipeline::setLightingDetail(S32 level) if (mVertexShadersLoaded == 1) { - gPipeline.setShaders(); + LLShaderMgr::setShaders(); } } return mLightingDetail; @@ -1372,6 +541,10 @@ LLDrawPool *LLPipeline::findPool(const U32 type, LLViewerImage *tex0) poolp = mSimplePool; break; + case LLDrawPool::POOL_GLOW: + poolp = mGlowPool; + break; + case LLDrawPool::POOL_TREE: poolp = get_if_there(mTreePools, (uintptr_t)tex0, (LLDrawPool*)0 ); break; @@ -2315,7 +1488,7 @@ void renderScriptedBeacons(LLDrawable* drawablep) && !vobj->getParent() && vobj->flagScripted()) { - gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 0.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f)); + gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 0.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth")); } } @@ -2327,7 +1500,7 @@ void renderPhysicalBeacons(LLDrawable* drawablep) && !vobj->getParent() && vobj->usePhysics()) { - gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(0.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f)); + gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(0.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth")); } } @@ -2339,7 +1512,7 @@ void renderParticleBeacons(LLDrawable* drawablep) && vobj->isParticleSource()) { LLColor4 light_blue(0.5f, 0.5f, 1.f, 0.5f); - gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", light_blue, LLColor4(1.f, 1.f, 1.f, 0.5f)); + gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", light_blue, LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth")); } } @@ -2560,7 +1733,7 @@ void LLPipeline::postSort(LLCamera& camera) LLVector3d pos_global = sourcep->getPositionGlobal(); LLVector3 pos = gAgent.getPosAgentFromGlobal(pos_global); //pos += LLVector3(0.f, 0.f, 0.2f); - gObjectList.addDebugBeacon(pos, "", LLColor4(1.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f)); + gObjectList.addDebugBeacon(pos, "", LLColor4(1.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth")); } } @@ -2641,10 +1814,10 @@ void LLPipeline::renderHighlights() LLGLEnable color_mat(GL_COLOR_MATERIAL); disableLights(); - if ((mVertexShaderLevel[SHADER_INTERFACE] > 0)) + if ((LLShaderMgr::sVertexShaderLevel[LLShaderMgr::SHADER_INTERFACE] > 0)) { - mHighlightProgram.bind(); - gPipeline.mHighlightProgram.vertexAttrib4f(LLPipeline::GLSL_MATERIAL_COLOR,1,0,0,0.5f); + gHighlightProgram.bind(); + gHighlightProgram.vertexAttrib4f(LLShaderMgr::MATERIAL_COLOR,1,0,0,0.5f); } if (hasRenderDebugFeatureMask(RENDER_DEBUG_FEATURE_SELECTED)) @@ -2683,9 +1856,9 @@ void LLPipeline::renderHighlights() // have touch-handlers. mHighlightFaces.clear(); - if (mVertexShaderLevel[SHADER_INTERFACE] > 0) + if (LLShaderMgr::sVertexShaderLevel[LLShaderMgr::SHADER_INTERFACE] > 0) { - mHighlightProgram.unbind(); + gHighlightProgram.unbind(); } } @@ -2765,11 +1938,13 @@ void LLPipeline::renderGeom(LLCamera& camera) // // stop_glerror(); - BOOL did_hud_elements = FALSE; + BOOL did_hud_elements = LLDrawPoolWater::sSkipScreenCopy; BOOL occlude = sUseOcclusion; U32 cur_type = 0; + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); + if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PICKING)) { gObjectList.renderObjectsForSelect(camera); @@ -2777,8 +1952,7 @@ void LLPipeline::renderGeom(LLCamera& camera) else { LLFastTimer t(LLFastTimer::FTM_POOLS); - calcNearbyLights(); - + calcNearbyLights(camera); pool_set_t::iterator iter1 = mPools.begin(); while ( iter1 != mPools.end() ) { @@ -2824,6 +1998,7 @@ void LLPipeline::renderGeom(LLCamera& camera) } poolp->endRenderPass(i); #ifndef LL_RELEASE_FOR_DOWNLOAD +#if LL_DEBUG_GL GLint depth; glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, &depth); if (depth > 3) @@ -2834,6 +2009,7 @@ void LLPipeline::renderGeom(LLCamera& camera) LLGLState::checkTextureChannels(); LLGLState::checkClientArrays(); #endif +#endif } } else @@ -2854,9 +2030,9 @@ void LLPipeline::renderGeom(LLCamera& camera) } #ifndef LL_RELEASE_FOR_DOWNLOAD - LLGLState::checkStates(); - LLGLState::checkTextureChannels(); - LLGLState::checkClientArrays(); + LLGLState::checkStates(); + LLGLState::checkTextureChannels(); + LLGLState::checkClientArrays(); #endif if (occlude) @@ -2886,6 +2062,40 @@ void LLPipeline::renderGeom(LLCamera& camera) // Contains a list of the faces of objects that are physical or // have touch-handlers. mHighlightFaces.clear(); + + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + + if (!hasRenderType(LLPipeline::RENDER_TYPE_HUD) && + !LLDrawPoolWater::sSkipScreenCopy && + sRenderGlow && + gGLManager.mHasFramebufferObject) + { + const U32 glow_res = nhpo2(gSavedSettings.getS32("RenderGlowResolution")); + if (mGlowMap == 0) + { + glGenTextures(1, &mGlowMap); + glBindTexture(GL_TEXTURE_2D, mGlowMap); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, glow_res, glow_res, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + } + + if (mGlowBuffer == 0) + { + glGenTextures(1, &mGlowBuffer); + glBindTexture(GL_TEXTURE_2D, mGlowBuffer); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, glow_res, glow_res, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + } + + bindScreenToTexture(); + renderBloom(mScreenTex, mGlowMap, mGlowBuffer, glow_res, LLVector2(0,0), mScreenScale); + } } void LLPipeline::processOcclusion(LLCamera& camera) @@ -3241,6 +2451,18 @@ void LLPipeline::addToQuickLookup( LLDrawPool* new_poolp ) } break; + case LLDrawPool::POOL_GLOW: + if (mGlowPool) + { + llassert(0); + llwarns << "Ignoring duplicate glow pool." << llendl; + } + else + { + mGlowPool = (LLRenderPass*) new_poolp; + } + break; + case LLDrawPool::POOL_TREE: mTreePools[ uintptr_t(new_poolp->getTexture()) ] = new_poolp ; break; @@ -3360,6 +2582,11 @@ void LLPipeline::removeFromQuickLookup( LLDrawPool* poolp ) mSimplePool = NULL; break; + case LLDrawPool::POOL_GLOW: + llassert(mGlowPool == poolp); + mGlowPool = NULL; + break; + case LLDrawPool::POOL_TREE: #ifdef _DEBUG { @@ -3545,7 +2772,7 @@ static F32 calc_light_dist(LLVOVolume* light, const LLVector3& cam_pos, F32 max_ return dist; } -void LLPipeline::calcNearbyLights() +void LLPipeline::calcNearbyLights(LLCamera& camera) { if (mLightingDetail >= 1) { @@ -3553,34 +2780,39 @@ void LLPipeline::calcNearbyLights() // begin() == the closest light and rbegin() == the farthest light const S32 MAX_LOCAL_LIGHTS = 6; // LLVector3 cam_pos = gAgent.getCameraPositionAgent(); - LLVector3 cam_pos = gAgent.getPositionAgent(); + LLVector3 cam_pos = LLPipeline::sSkipUpdate || LLViewerJoystick::sOverrideCamera ? + camera.getOrigin() : + gAgent.getPositionAgent(); F32 max_dist = LIGHT_MAX_RADIUS * 4.f; // ignore enitrely lights > 4 * max light rad // UPDATE THE EXISTING NEARBY LIGHTS - light_set_t cur_nearby_lights; - for (light_set_t::iterator iter = mNearbyLights.begin(); - iter != mNearbyLights.end(); iter++) + if (!LLPipeline::sSkipUpdate) { - const Light* light = &(*iter); - LLDrawable* drawable = light->drawable; - LLVOVolume* volight = drawable->getVOVolume(); - if (!volight || !drawable->isState(LLDrawable::LIGHT)) - { - drawable->clearState(LLDrawable::NEARBY_LIGHT); - continue; - } - if (light->fade <= -LIGHT_FADE_TIME) - { - drawable->clearState(LLDrawable::NEARBY_LIGHT); - } - else + light_set_t cur_nearby_lights; + for (light_set_t::iterator iter = mNearbyLights.begin(); + iter != mNearbyLights.end(); iter++) { - F32 dist = calc_light_dist(volight, cam_pos, max_dist); - cur_nearby_lights.insert(Light(drawable, dist, light->fade)); + const Light* light = &(*iter); + LLDrawable* drawable = light->drawable; + LLVOVolume* volight = drawable->getVOVolume(); + if (!volight || !drawable->isState(LLDrawable::LIGHT)) + { + drawable->clearState(LLDrawable::NEARBY_LIGHT); + continue; + } + if (light->fade <= -LIGHT_FADE_TIME) + { + drawable->clearState(LLDrawable::NEARBY_LIGHT); + } + else + { + F32 dist = calc_light_dist(volight, cam_pos, max_dist); + cur_nearby_lights.insert(Light(drawable, dist, light->fade)); + } } + mNearbyLights = cur_nearby_lights; } - mNearbyLights = cur_nearby_lights; // FIND NEW LIGHTS THAT ARE IN RANGE light_set_t new_nearby_lights; @@ -3715,7 +2947,7 @@ void LLPipeline::setupHWLights(LLDrawPool* pool) LLColor4 light_color = light->getLightColor(); light_color.mV[3] = 0.0f; - F32 fade = iter->fade; + F32 fade = LLPipeline::sSkipUpdate ? 1.f : iter->fade; if (fade < LIGHT_FADE_TIME) { // fade in/out light @@ -4261,257 +3493,6 @@ BOOL LLPipeline::getRenderSoundBeacons(void*) return sRenderSoundBeacons; } -//=============================== -// LLGLSL Shader implementation -//=============================== -LLGLSLShader::LLGLSLShader() -: mProgramObject(0) -{ } - -void LLGLSLShader::unload() -{ - stop_glerror(); - mAttribute.clear(); - mTexture.clear(); - mUniform.clear(); - - if (mProgramObject) - { - GLhandleARB obj[1024]; - GLsizei count; - - glGetAttachedObjectsARB(mProgramObject, 1024, &count, obj); - for (GLsizei i = 0; i < count; i++) - { - glDeleteObjectARB(obj[i]); - } - - glDeleteObjectARB(mProgramObject); - - mProgramObject = 0; - } - - //hack to make apple not complain - glGetError(); - - stop_glerror(); -} - -void LLGLSLShader::attachObject(GLhandleARB object) -{ - if (object != 0) - { - stop_glerror(); - glAttachObjectARB(mProgramObject, object); - stop_glerror(); - } - else - { - llwarns << "Attempting to attach non existing shader object. " << llendl; - } -} - -void LLGLSLShader::attachObjects(GLhandleARB* objects, S32 count) -{ - for (S32 i = 0; i < count; i++) - { - attachObject(objects[i]); - } -} - -BOOL LLGLSLShader::mapAttributes(const char** attrib_names, S32 count) -{ - //link the program - BOOL res = link(); - - mAttribute.clear(); - mAttribute.resize(LLPipeline::sReservedAttribCount + count, -1); - - if (res) - { //read back channel locations - - //read back reserved channels first - for (S32 i = 0; i < (S32) LLPipeline::sReservedAttribCount; i++) - { - const char* name = LLPipeline::sReservedAttribs[i]; - S32 index = glGetAttribLocationARB(mProgramObject, name); - if (index != -1) - { - mAttribute[i] = index; - llinfos << "Attribute " << name << " assigned to channel " << index << llendl; - } - } - - for (S32 i = 0; i < count; i++) - { - const char* name = attrib_names[i]; - S32 index = glGetAttribLocationARB(mProgramObject, name); - if (index != -1) - { - mAttribute[LLPipeline::sReservedAttribCount + i] = index; - llinfos << "Attribute " << name << " assigned to channel " << index << llendl; - } - } - - return TRUE; - } - - return FALSE; -} - -void LLGLSLShader::mapUniform(GLint index, const char** uniform_names, S32 count) -{ - if (index == -1) - { - return; - } - - GLenum type; - GLsizei length; - GLint size; - char name[1024]; /* Flawfinder: ignore */ - name[0] = 0; - - glGetActiveUniformARB(mProgramObject, index, 1024, &length, &size, &type, name); - - //find the index of this uniform - for (S32 i = 0; i < (S32) LLPipeline::sReservedUniformCount; i++) - { - if (mUniform[i] == -1 && !strncmp(LLPipeline::sReservedUniforms[i],name, strlen(LLPipeline::sReservedUniforms[i]))) /* Flawfinder: ignore */ - { - //found it - S32 location = glGetUniformLocationARB(mProgramObject, name); - mUniform[i] = location; - llinfos << "Uniform " << name << " is at location " << location << llendl; - mTexture[i] = mapUniformTextureChannel(location, type); - return; - } - } - - for (S32 i = 0; i < count; i++) - { - if (mUniform[i+LLPipeline::sReservedUniformCount] == -1 && - !strncmp(uniform_names[i],name, strlen(uniform_names[i]))) /* Flawfinder: ignore */ - { - //found it - S32 location = glGetUniformLocationARB(mProgramObject, name); - mUniform[i+LLPipeline::sReservedUniformCount] = location; - llinfos << "Uniform " << name << " is at location " << location << " stored in index " << - (i+LLPipeline::sReservedUniformCount) << llendl; - mTexture[i+LLPipeline::sReservedUniformCount] = mapUniformTextureChannel(location, type); - return; - } - } - - //llinfos << "Unknown uniform: " << name << llendl; - } - -GLint LLGLSLShader::mapUniformTextureChannel(GLint location, GLenum type) -{ - if (type >= GL_SAMPLER_1D_ARB && type <= GL_SAMPLER_2D_RECT_SHADOW_ARB) - { //this here is a texture - glUniform1iARB(location, mActiveTextureChannels); - llinfos << "Assigned to texture channel " << mActiveTextureChannels << llendl; - return mActiveTextureChannels++; - } - return -1; -} - -BOOL LLGLSLShader::mapUniforms(const char** uniform_names, S32 count) -{ - BOOL res = TRUE; - - mActiveTextureChannels = 0; - mUniform.clear(); - mTexture.clear(); - - //initialize arrays - mUniform.resize(count + LLPipeline::sReservedUniformCount, -1); - mTexture.resize(count + LLPipeline::sReservedUniformCount, -1); - - - - bind(); - - //get the number of active uniforms - GLint activeCount; - glGetObjectParameterivARB(mProgramObject, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &activeCount); - - for (S32 i = 0; i < activeCount; i++) - { - mapUniform(i, uniform_names, count); - } - - unbind(); - - return res; -} - -BOOL LLGLSLShader::link(BOOL suppress_errors) -{ - return gPipeline.linkProgramObject(mProgramObject, suppress_errors); -} - -void LLGLSLShader::bind() -{ - glUseProgramObjectARB(mProgramObject); - if (mAttribute.size() > 0) - { - gPipeline.mMaterialIndex = mAttribute[0]; - } -} - -void LLGLSLShader::unbind() -{ - for (U32 i = 0; i < mAttribute.size(); ++i) - { - vertexAttrib4f(i, 0,0,0,1); - } - glUseProgramObjectARB(0); -} - -S32 LLGLSLShader::enableTexture(S32 uniform, S32 mode) -{ - if (uniform < 0 || uniform >= (S32)mTexture.size()) - { - llerrs << "LLGLSLShader::enableTexture: uniform out of range: " << uniform << llendl; - } - S32 index = mTexture[uniform]; - if (index != -1) - { - glActiveTextureARB(GL_TEXTURE0_ARB+index); - glEnable(mode); - } - return index; -} - -S32 LLGLSLShader::disableTexture(S32 uniform, S32 mode) -{ - S32 index = mTexture[uniform]; - if (index != -1) - { - glActiveTextureARB(GL_TEXTURE0_ARB+index); - glDisable(mode); - } - return index; -} - -void LLGLSLShader::vertexAttrib4f(U32 index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ - if (mAttribute[index] > 0) - { - glVertexAttrib4fARB(mAttribute[index], x, y, z, w); - } -} - -void LLGLSLShader::vertexAttrib4fv(U32 index, GLfloat* v) -{ - if (mAttribute[index] > 0) - { - glVertexAttrib4fvARB(mAttribute[index], v); - } -} - LLViewerObject* LLPipeline::pickObject(const LLVector3 &start, const LLVector3 &end, LLVector3 &collision) { LLDrawable* drawable = mObjectPartition[PARTITION_VOLUME]->pickDrawable(start, end, collision); @@ -4647,6 +3628,14 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam, glGenTextures(1, &blur_tex); } + BOOL reattach = FALSE; + if (mCubeFrameBuffer == 0) + { + glGenFramebuffersEXT(1, &mCubeFrameBuffer); + glGenRenderbuffersEXT(1, &mCubeDepth); + reattach = TRUE; + } + BOOL toggle_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI); if (toggle_ui) { @@ -4663,6 +3652,7 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam, (1 << LLPipeline::RENDER_TYPE_CLOUDS) | //(1 << LLPipeline::RENDER_TYPE_STARS) | //(1 << LLPipeline::RENDER_TYPE_AVATAR) | + (1 << LLPipeline::RENDER_TYPE_GLOW) | (1 << LLPipeline::RENDER_TYPE_GRASS) | (1 << LLPipeline::RENDER_TYPE_VOLUME) | (1 << LLPipeline::RENDER_TYPE_TERRAIN) | @@ -4694,11 +3684,45 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam, LLVector3 origin = cube_cam.getOrigin(); - gPipeline.calcNearbyLights(); + gPipeline.calcNearbyLights(cube_cam); + cube_map->bind(); for (S32 i = 0; i < 6; i++) { + GLint res_x, res_y; + glGetTexLevelParameteriv(cube_face[i], 0, GL_TEXTURE_WIDTH, &res_x); + glGetTexLevelParameteriv(cube_face[i], 0, GL_TEXTURE_HEIGHT, &res_y); + + if (res_x != res || res_y != res) + { + glTexImage2D(cube_face[i],0,GL_RGBA,res,res,0,GL_RGBA,GL_FLOAT,NULL); + reattach = TRUE; + } + } + cube_map->disable(); + + if (reattach) + { + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mCubeDepth); + GLint res_x, res_y; + glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_WIDTH_EXT, &res_x); + glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_HEIGHT_EXT, &res_y); + + if (res_x != res || res_y != res) + { + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT,GL_DEPTH_COMPONENT24,res,res); + } + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); + } + + for (S32 i = 0; i < 6; i++) + { + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mCubeFrameBuffer); + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, + cube_face[i], cube_map->getGLName(), 0); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, mCubeDepth); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(90.f, 1.f, 0.1f, 1024.f); @@ -4707,7 +3731,6 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam, apply_cube_face_rotation(i); - glTranslatef(-origin.mV[0], -origin.mV[1], -origin.mV[2]); cube_cam.setOrigin(origin); LLViewerCamera::updateFrustumPlanes(cube_cam); @@ -4715,18 +3738,15 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam, gPipeline.updateCull(cube_cam); gPipeline.stateSort(cube_cam); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); gPipeline.renderGeom(cube_cam); - - cube_map->enable(0); - cube_map->bind(); - glCopyTexImage2D(cube_face[i], 0, GL_RGB, 0, 0, res, res, 0); - cube_map->disable(); } + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + cube_cam.setOrigin(origin); gPipeline.resetDrawOrders(); - gPipeline.mShinyOrigin.setVec(cube_cam.getOrigin(), cube_cam.getFar()*2.f); + gShinyOrigin.setVec(cube_cam.getOrigin(), cube_cam.getFar()*2.f); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); @@ -4740,14 +3760,12 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam, { gPipeline.toggleRenderDebugFeature((void*)LLPipeline::RENDER_DEBUG_FEATURE_UI); } - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); LLDrawPoolWater::sSkipScreenCopy = FALSE; } //send cube map vertices and texture coordinates void render_cube_map() { - U32 idx[36]; idx[0] = 1; idx[1] = 0; idx[2] = 2; //front @@ -4794,7 +3812,7 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out, U32 { LLGLEnable cube(GL_TEXTURE_CUBE_MAP_ARB); LLGLDepthTest depth(GL_FALSE); - + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); @@ -4807,9 +3825,9 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out, U32 S32 kernel = 2; F32 step = 90.f/res; - F32 alpha = 1.f/((kernel*2+1)); + F32 alpha = 1.f/((kernel*2)+1); - glColor4f(1,1,1,alpha); + glColor4f(alpha,alpha,alpha,alpha*1.25f); S32 x = 0; @@ -4831,7 +3849,7 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out, U32 }; - glBlendFunc(GL_SRC_ALPHA_SATURATE, GL_ONE); + glBlendFunc(GL_ONE, GL_ONE); //3-axis blur for (U32 j = 0; j < 3; j++) { @@ -4863,7 +3881,7 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out, U32 } for (U32 i = 0; i < 6; i++) { - glCopyTexImage2D(cube_face[i], 0, GL_RGB, 0, i*res, res, res, 0); + glCopyTexImage2D(cube_face[i], 0, GL_RGBA, 0, i*res, res, res, 0); } } @@ -4873,6 +3891,158 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out, U32 glPopMatrix(); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glClear(GL_COLOR_BUFFER_BIT); +} + +void LLPipeline::bindScreenToTexture() +{ + LLGLEnable gl_texture_2d(GL_TEXTURE_2D); + + GLint* viewport = (GLint*) gGLViewport; + GLuint resX = nhpo2(viewport[2]); + GLuint resY = nhpo2(viewport[3]); + + if (mScreenTex == 0) + { + glGenTextures(1, &mScreenTex); + glBindTexture(GL_TEXTURE_2D, mScreenTex); + + gImageList.updateMaxResidentTexMem(-1, resX*resY*3); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, resX, resY, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + } + + glBindTexture(GL_TEXTURE_2D, mScreenTex); + GLint cResX; + GLint cResY; + glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &cResX); + glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &cResY); + + if (cResX != (GLint)resX || cResY != (GLint)resY) + { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, resX, resY, 0, GL_RGB, GL_FLOAT, NULL); + gImageList.updateMaxResidentTexMem(-1, resX*resY*3); + } + + glCopyTexSubImage2D(GL_TEXTURE_2D, 0, viewport[0], viewport[1], 0, 0, viewport[2], viewport[3]); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + + mScreenScale.mV[0] = (float) viewport[2]/resX; + mScreenScale.mV[1] = (float) viewport[3]/resY; + + LLImageGL::sBoundTextureMemory += resX * resY * 3; } +void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res, LLVector2 tc1, LLVector2 tc2) +{ + gGlowProgram.bind(); + + LLGLEnable tex(GL_TEXTURE_2D); + LLGLDepthTest depth(GL_FALSE); + LLGLDisable blend(GL_BLEND); + LLGLDisable cull(GL_CULL_FACE); + + if (mFramebuffer[0] == 0) + { + glGenFramebuffersEXT(2, mFramebuffer); + } + + GLint viewport[4]; + glGetIntegerv(GL_VIEWPORT, viewport); + glViewport(0,0,res,res); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + glBindTexture(GL_TEXTURE_2D, source); + + S32 kernel = gSavedSettings.getS32("RenderGlowSize")*2; + + LLGLDisable test(GL_ALPHA_TEST); + + F32 delta = 1.f/(res*gSavedSettings.getF32("RenderGlowStrength")); + + for (S32 i = 0; i < kernel; i++) + { + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFramebuffer[i%2]); + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, + GL_COLOR_ATTACHMENT0_EXT, + GL_TEXTURE_2D, + i%2 == 0 ? buffer : dest, 0); + + glBindTexture(GL_TEXTURE_2D, i == 0 ? source : + i%2==0 ? dest : + buffer); + + glUniform1fARB(gGlowProgram.mUniform[LLShaderMgr::GLOW_DELTA],delta); + + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(tc1.mV[0], tc1.mV[1]); + glVertex2f(-1,-1); + + glTexCoord2f(tc1.mV[0], tc2.mV[1]); + glVertex2f(-1,1); + + glTexCoord2f(tc2.mV[0], tc1.mV[1]); + glVertex2f(1,-1); + + glTexCoord2f(tc2.mV[0], tc2.mV[1]); + glVertex2f(1,1); + glEnd(); + + tc1.setVec(0,0); + tc2.setVec(1,1); + + } + + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + gGlowProgram.unbind(); + + glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); + + if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_GLOW)) + { + glClear(GL_COLOR_BUFFER_BIT); + } + + glBindTexture(GL_TEXTURE_2D, dest); + { + LLGLEnable blend(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + + glBegin(GL_TRIANGLE_STRIP); + glColor4f(1,1,1,1); + glTexCoord2f(tc1.mV[0], tc1.mV[1]); + glVertex2f(-1,-1); + + glTexCoord2f(tc1.mV[0], tc2.mV[1]); + glVertex2f(-1,1); + + glTexCoord2f(tc2.mV[0], tc1.mV[1]); + glVertex2f(1,-1); + + glTexCoord2f(tc2.mV[0], tc2.mV[1]); + glVertex2f(1,1); + glEnd(); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); +} \ No newline at end of file diff --git a/linden/indra/newview/pipeline.h b/linden/indra/newview/pipeline.h index 158c420..a8c92cc 100644 --- a/linden/indra/newview/pipeline.h +++ b/linden/indra/newview/pipeline.h @@ -4,6 +4,7 @@ * * Copyright (c) 2001-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -62,41 +63,6 @@ bool LLRayAABB(const LLVector3 ¢er, const LLVector3 &size, const LLVector3& BOOL LLLineSegmentAABB(const LLVector3& start, const LLVector3& end, const LLVector3& center, const LLVector3& size); BOOL setup_hud_matrices(BOOL for_select); -class LLGLSLShader -{ -public: - LLGLSLShader(); - - void unload(); - void attachObject(GLhandleARB object); - void attachObjects(GLhandleARB* objects = NULL, S32 count = 0); - BOOL mapAttributes(const char** attrib_names = NULL, S32 count = 0); - BOOL mapUniforms(const char** uniform_names = NULL, S32 count = 0); - void mapUniform(GLint index, const char** uniform_names = NULL, S32 count = 0); - void vertexAttrib4f(U32 index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - void vertexAttrib4fv(U32 index, GLfloat* v); - - GLint mapUniformTextureChannel(GLint location, GLenum type); - - - //enable/disable texture channel for specified uniform - //if given texture uniform is active in the shader, - //the corresponding channel will be active upon return - //returns channel texture is enabled in from [0-MAX) - S32 enableTexture(S32 uniform, S32 mode = GL_TEXTURE_2D); - S32 disableTexture(S32 uniform, S32 mode = GL_TEXTURE_2D); - - BOOL link(BOOL suppress_errors = FALSE); - void bind(); - void unbind(); - - GLhandleARB mProgramObject; - std::vector mAttribute; - std::vector mUniform; - std::vector mTexture; - S32 mActiveTextureChannels; -}; - class LLPipeline { public: @@ -106,10 +72,13 @@ public: void destroyGL(); void restoreGL(); void resetVertexBuffers(); + void releaseGLBuffers(); void resetVertexBuffers(LLDrawable* drawable); void setUseVBO(BOOL use_vbo); void generateReflectionMap(LLCubeMap* cube_map, LLCamera& camera, GLsizei res); void blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out, U32 res); + void bindScreenToTexture(); + void renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res, LLVector2 tc1, LLVector2 tc2); void init(); void cleanup(); @@ -164,17 +133,7 @@ public: void setUseVertexShaders(BOOL use_shaders); BOOL getUseVertexShaders() const { return mVertexShadersEnabled; } BOOL canUseVertexShaders(); - BOOL setVertexShaderLevel(S32 type, S32 level); - S32 getVertexShaderLevel(S32 type) const { return mVertexShaderLevel[type]; } - S32 getMaxVertexShaderLevel(S32 type) const { return mMaxVertexShaderLevel[type]; } - - void setShaders(); - void dumpObjectLog(GLhandleARB ret, BOOL warns = TRUE); - BOOL linkProgramObject(GLhandleARB obj, BOOL suppress_errors = FALSE); - BOOL validateProgramObject(GLhandleARB obj); - GLhandleARB loadShader(const LLString& filename, S32 cls, GLenum type); - // phases void resetFrameStats(); @@ -214,7 +173,7 @@ public: S32 getVisibleCount() const { return mVisibleList.size(); } S32 getLightCount() const { return mLights.size(); } - void calcNearbyLights(); + void calcNearbyLights(LLCamera& camera); void setupHWLights(LLDrawPool* pool); void setupAvatarLights(BOOL for_edit = FALSE); void enableLights(U32 mask, F32 shadow_factor); @@ -264,11 +223,6 @@ private: void initShaders(BOOL force); void unloadShaders(); BOOL loadShaders(); - BOOL loadShadersLighting(); - BOOL loadShadersObject(); - BOOL loadShadersAvatar(); - BOOL loadShadersEnvironment(); - BOOL loadShadersInterface(); void saveVertexShaderLevel(S32 type, S32 level, S32 max); void addToQuickLookup( LLDrawPool* new_poolp ); void removeFromQuickLookup( LLDrawPool* poolp ); @@ -276,15 +230,7 @@ private: public: enum {GPU_CLASS_MAX = 3 }; - enum EShaderClass - { - SHADER_LIGHTING, - SHADER_OBJECT, - SHADER_AVATAR, - SHADER_ENVIRONMENT, - SHADER_INTERFACE, - SHADER_COUNT - }; + enum LLRenderTypeMask { // Following are pool types (some are also object types) @@ -298,6 +244,8 @@ public: RENDER_TYPE_TREE = LLDrawPool::POOL_TREE, RENDER_TYPE_WATER = LLDrawPool::POOL_WATER, RENDER_TYPE_ALPHA = LLDrawPool::POOL_ALPHA, + RENDER_TYPE_GLOW = LLDrawPool::POOL_GLOW, + // Following are object types (only used in drawable mRenderType) RENDER_TYPE_HUD = LLDrawPool::NUM_POOL_TYPES, RENDER_TYPE_VOLUME, @@ -344,7 +292,8 @@ public: RENDER_DEBUG_TEXTURE_AREA = 0x08000, RENDER_DEBUG_FACE_AREA = 0x10000, RENDER_DEBUG_PARTICLES = 0x20000, - RENDER_DEBUG_TEXTURE_ANIM = 0x40000, + RENDER_DEBUG_GLOW = 0x40000, + RENDER_DEBUG_TEXTURE_ANIM = 0x80000, }; LLPointer mAlphaSizzleImagep; @@ -372,6 +321,11 @@ public: LLSpatialPartition* getSpatialPartition(LLViewerObject* vobj); LLSpatialPartition* getSpatialPartition(U32 index); + void updateCamera(BOOL reset = FALSE); + + LLVector3 mFlyCamPosition; + LLQuaternion mFlyCamRotation; + BOOL mBackfaceCull; S32 mTrianglesDrawn; LLStat mTrianglesDrawnStat; @@ -395,135 +349,29 @@ public: static BOOL sUseOcclusion; static BOOL sSkipUpdate; //skip lod updates static BOOL sDynamicReflections; + static BOOL sRenderGlow; - //cube map for anti-aliasing reflections - LLCubeMap* mCubeBuffer; - GLuint mCubeList; + //screen texture + GLuint mScreenTex; + LLVector2 mScreenScale; - class LLScatterShader - { - public: - static void init(GLhandleARB shader, int map_stage); - }; - - //utility shader objects (not shader programs) - GLhandleARB mLightVertex; - GLhandleARB mLightFragment; - GLhandleARB mScatterVertex; - GLhandleARB mScatterFragment; - - //global (reserved slot) shader parameters - static const char* sReservedAttribs[]; - static U32 sReservedAttribCount; + //texture for making the glow + GLuint mGlowMap; + GLuint mGlowBuffer; - typedef enum - { - GLSL_MATERIAL_COLOR = 0, - GLSL_SPECULAR_COLOR, - GLSL_BINORMAL, - GLSL_END_RESERVED_ATTRIBS - } eGLSLReservedAttribs; - - static const char* sReservedUniforms[]; - static U32 sReservedUniformCount; - - typedef enum - { - GLSL_DIFFUSE_MAP = 0, - GLSL_SPECULAR_MAP, - GLSL_BUMP_MAP, - GLSL_ENVIRONMENT_MAP, - GLSL_END_RESERVED_UNIFORMS - } eGLSLReservedUniforms; + //framebuffer objects for off-screen scratch space + GLuint mFramebuffer[2]; - static const char* sShinyUniforms[]; - static U32 sShinyUniformCount; - - typedef enum - { - GLSL_SHINY_ORIGIN = GLSL_END_RESERVED_UNIFORMS - } eShinyUniforms; - - LLVector4 mShinyOrigin; - - //object shaders - LLGLSLShader mObjectSimpleProgram; - LLGLSLShader mObjectAlphaProgram; - LLGLSLShader mObjectBumpProgram; - LLGLSLShader mObjectShinyProgram; - - //water parameters - static const char* sWaterUniforms[]; - static U32 sWaterUniformCount; - - typedef enum - { - GLSL_WATER_SCREENTEX = GLSL_END_RESERVED_UNIFORMS, - GLSL_WATER_EYEVEC, - GLSL_WATER_TIME, - GLSL_WATER_WAVE_DIR1, - GLSL_WATER_WAVE_DIR2, - GLSL_WATER_LIGHT_DIR, - GLSL_WATER_SPECULAR, - GLSL_WATER_SPECULAR_EXP, - GLSL_WATER_FBSCALE, - GLSL_WATER_REFSCALE - } eWaterUniforms; - - - //terrain parameters - static const char* sTerrainUniforms[]; - static U32 sTerrainUniformCount; + //dynamic cube map scratch space + LLCubeMap* mCubeBuffer; - typedef enum - { - GLSL_TERRAIN_DETAIL0 = GLSL_END_RESERVED_UNIFORMS, - GLSL_TERRAIN_DETAIL1, - GLSL_TERRAIN_ALPHARAMP - } eTerrainUniforms; - - //environment shaders - LLGLSLShader mTerrainProgram; - LLGLSLShader mGroundProgram; - LLGLSLShader mWaterProgram; - - //interface shaders - LLGLSLShader mHighlightProgram; + //frambuffer object for rendering dynamic cube maps + GLuint mCubeFrameBuffer; - //avatar shader parameter tables - static const char* sAvatarAttribs[]; - static U32 sAvatarAttribCount; - - typedef enum - { - GLSL_AVATAR_WEIGHT = GLSL_END_RESERVED_ATTRIBS, - GLSL_AVATAR_CLOTHING, - GLSL_AVATAR_WIND, - GLSL_AVATAR_SINWAVE, - GLSL_AVATAR_GRAVITY - } eAvatarAttribs; - - static const char* sAvatarUniforms[]; - static U32 sAvatarUniformCount; - - typedef enum - { - GLSL_AVATAR_MATRIX = GLSL_END_RESERVED_UNIFORMS - } eAvatarUniforms; - - //avatar skinning utility shader object - GLhandleARB mAvatarSkinVertex; + //depth buffer object for rendering dynamic cube maps + GLuint mCubeDepth; - //avatar shader handles - LLGLSLShader mAvatarProgram; - LLGLSLShader mAvatarEyeballProgram; - LLGLSLShader mAvatarPickProgram; - //current avatar shader parameter pointer - GLint mAvatarMatrixParam; - GLint mMaterialIndex; - GLint mSpecularIndex; - LLColor4 mSunDiffuse; LLVector3 mSunDir; @@ -535,13 +383,12 @@ public: LLSpatialGroup::sg_vector_t mDrawableGroups; void clearRenderMap(); - -protected: + + BOOL mInitialized; BOOL mVertexShadersEnabled; S32 mVertexShadersLoaded; // 0 = no, 1 = yes, -1 = failed - S32 mVertexShaderLevel[SHADER_COUNT]; - S32 mMaxVertexShaderLevel[SHADER_COUNT]; - + +protected: U32 mRenderTypeMask; U32 mRenderFeatureMask; U32 mRenderDebugFeatureMask; @@ -643,6 +490,7 @@ protected: LLDrawPool* mWaterPool; LLDrawPool* mGroundPool; LLRenderPass* mSimplePool; + LLDrawPool* mGlowPool; LLDrawPool* mBumpPool; // Note: no need to keep an quick-lookup to avatar pools, since there's only one per avatar diff --git a/linden/indra/newview/randgauss.h b/linden/indra/newview/randgauss.h index c5bddca..d27ece1 100644 --- a/linden/indra/newview/randgauss.h +++ b/linden/indra/newview/randgauss.h @@ -4,6 +4,7 @@ * * Copyright (c) 2003-2007, Linden Research, Inc. * + * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement diff --git a/linden/indra/newview/releasenotes.txt b/linden/indra/newview/releasenotes.txt index 5fd9230..2fc26c7 100644 --- a/linden/indra/newview/releasenotes.txt +++ b/linden/indra/newview/releasenotes.txt @@ -1,3 +1,98 @@ +Release Notes for Second Life 1.15.0(2) April 25, 2007 +===================================== + +Changes: +* Improved Help menu with links to additional resources +* 'Add as Friend' button added to Profile +* Added buttons to the IM window to scroll to the first and last tabs +* Added parcel flag for Mature Content +** Parcel searches use the parcel rating instead of the region rating +* Share With Group checkbox is cleared after object is deeded to group +* Groups list window taller and resizable +* Residents are now notified if they are the only ones present in a group IM or conference session +* Rating system removed from Profile +* Group Search improvements +** Searches are done against the full text of the group, including charter +** Search index is updated daily; new groups may take 24 hours to appear +** Clicking on a group found via search still shows up-to-date information +* Alpha textures sorted more accurately +** Example: the hollow inner surface of a sphere will no longer draw on top of the outer surface +** This change may cause content using alpha textures to appear differently +* Larger debug beacons (View > Beacon) +** You can now set the beacon size in Preferences -> Adv. Graphics (Range is 1-127) + +LSL changes: +* LSL Wiki browser embedded in the viewer +** When editing a script, select a keyword, then select Help > LSL Wiki Help. in the Script window +* New function: string llStringTrim(string src, integer trim_type) +** STRING_TRIM_HEAD: trim all leading spaces in src +** STRING_TRIM_TAIL: trim all trailing spaces in src +** STRING_TRIM: trim all leading and trailing spaces in src + +Notes: +* LSL Wiki is not editable from within the Second Life viewer +* PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY and PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY flags + were added to llGetParcelFlags()/llSetParcelFlags in a previous release, but not + documented. These will now appear correctly in the script editor. +* On systems with ATI Mobility X300/X600/X700 graphics cards, when upgrading from a previous + version of Second Life, sound may be disabled on the first run of the viewer. It + should function correctly on the second run. +* HUD objects may temporarily appear in the wrong position following a region crossing. + +Bug fixes: +* Removed First Land filter in Search +* Improved performance of inventory operations +* Improved recognition of some processor types +* Fixed About Land reporting the wrong parcel when teleporting between estates +* Fixed a source of stalled Pending Uploads +* Fixed Texture Repeats Per Face rounding incorrectly when tabbing between fields +* Fixed objects appearing in two places while moving in editor +* Fixed a client crash with some mobile ATI chipsets +* Fixed button images when first running SL +* Fixed selecting group roles not updating UI +* Fixed avatar names not appearing when Show Avatar Names Temporarily is enabled +* Fixed New IM showing (nobody) for group names +* Fixed task email failing between regions +* Fixed broken embedded landmarks when editing their notecard +* Fixed a case where you could not modify your modifiable object +* Fixed attachments disappearing a minute after teleport +* Fixed ability to set Mature on parcels in non-Mature regions +* Fixed saving changes to notecards in contents +* Fixed HUD positioning guide misaligning when UI Size changed +* Fixed a case where no-copy objects could be lost during rez +* Fixed textures in windows only stretching horizontally +* Fixed texture animation rotation changing when Flip is enabled +* Fixed erroneous 'User has left this session' messages +* Fixed display bug with a cube with Path Cut Begin/End set to .150 +* Fixed disappearing alpha HUD prims +* Fixed menu bar processing keystrokes when moused over +* Fixed detached IM windows not resizing +* Fixed animated textures when using llSetColor, llSetLinkColor, or PRIM_PROPERTIES +* Fixed HUD object movement when logging in at a no-script area +* Fixed HUD objects not loading new textures +* Fixed HUD objects becoming invisible the first time they are attached from inworld +* Fixed 'IM All Contacts In Folder' +* Fixed a viewer crash in the name cache +* Fixed Undo resetting position only on root prim +* Fixed Texture Picker search not showing results +* Fixed IM window reverting to default size +* Fixed overriding stand-up animation freezing you in place +* Fixed Appearance mode showing back of avatar +* Fixed: VWR-14: Inconsistency with reading binary data in llpolymesh.cpp +* Fixed: VWR-45: trivial patch, initialize variables +* Fixed: VWR-94: Buffer overflow in decoding image. +* Fixed: VWR-97: Several iterator bugs in llmessage +* Fixed: VWR-100: Messages form OpenJPEG only in debug mode +* Fixed: VWR-109: Characters from fallback fonts don't scale properly +* Fixed: VWR-123: OpenJPEG meta decode, Second Life patches +* Fixed: VWR-130: llimagejpeg.h remove jinclude.h +* Fixed: VWR-144: HUD and possibly other alpha touch area problems +* Fixed: VWR-188: Patch: Refactor options handling in SConstruct +* Fixed: VWR-198: Missing line of code in source on FFSAVE_WAV +* Fixed: VWR-200: money(); events in a linked sets fail to trigger +* Fixed: VWR-261: lldir_mac.cpp @brief description is wrong + + Release Notes for Second Life 1.14.0(1) March 30, 2007 ===================================== Fixes: @@ -29,8 +124,8 @@ Changes: ** Alpha sorting changes to improve performance ** Modified texture animations to use hardware acceleration ** Light objects now affect themselves. -*** NOTE: This may cause some objects that are lights to "wash out" requiring some content to be adjusted -* Setting an object for sale enables "Buy Copy" by default instead of "Buy Original" +*** NOTE: This may cause some objects that are lights to 'wash out' requiring some content to be adjusted +* Setting an object for sale enables 'Buy Copy' by default instead of 'Buy Original' * User inworld money transaction history floater removed ** Transaction history can be viewed via secondlife.com * Moving your avatar no longer deselects objects in build mode automatically @@ -66,7 +161,7 @@ Bug fixes: * Fixed attachments leaving inventory after detaching * Fixed Alt-menu taking focus after Alt-zooming * Fixed menus not closing when something else is clicked -* Fixed Friends list not showing online friends on login if "Can see my online status" is disabled +* Fixed Friends list not showing online friends on login if 'Can see my online status' is disabled * Fixed World -> Buy Land menu failures * Fixed LSL email converting numbers in the email body to 0 * Fixed focus issues when closing a window @@ -116,834 +211,509 @@ Bug fixes: * Fixed textures in the distance not reducing priority * Avatars out of view are no longer animated -Release Notes for Second Life 1.13.3(2) January 30, 2007 +Release Notes for Second Life 1.13.4(59510) March 22, 2007 ===================================== Changes: -* It is no longer possible to only search for online residents -* Online status is no longer indicated in the Search -> People results list -** The online status inside the profile shows 'Currently Online' or remains blank -*** Friends can see your Online status if you give permission via the Friends list -*** Anyone can see your Online status if 'Make my online status visible only to my Friends' is unchecked +* Legacy particle system replacements +* 'Share with Group' checkbox now cleared when deeding objects -Bug fixes: -* Fixed script email across simulators +Bugs Fixed: +* Fixed llParticleSystem( [] ) not shutting down reliably +* Fixed SVC-48: llSetScriptState is failing in some tasks +* Fixed SVC-47: llSetPrimitiveParameters with multiple setposition calls capped at 10m, affecting home made TPs +* Fixed SVC-15: Random Prim Drift -Release Notes for Second Life 1.13.2(15) January 25, 2007 +Release Notes for Second Life 1.13.4(59329) March 16, 2007 ===================================== Changes: -* Tapping Alt to focus on menus has been disabled -* Separate settings.ini file used by Beta and First Look clients -** Uninstalling these clients will no longer remove Second Life user settings +* Replaced deprecated legacy particle systems (llMakeExplosion, llMakeFire, llMakeSmoke, llMakeFountain) + with llparticleSystem approximations -Bug fixes: -* Alt-mouseclick no longer puts focus on the menus -* Popup warnings for sandbox regions reflect changes made in 1.13.2(11) -* Fixed error while editing profile if you have a classified -* Fixed Buy Pass option in pie menu not appearing unless access list for avatars is enabled -* Fixed build tool not changing type until you use another menu -* Fixed dragging position arrows sideways moves object vertically -* Fixed clicking More/Less in editor selects Create -* Fixed loud noise in wind on dual core systems -* Fixed a client crash - -Release Notes for Second Life 1.13.2(12) January 19, 2007 +Release Notes for Second Life 1.13.4(8) March 12, 2007 ===================================== Bug fixes: -* Fixed client crash caused by managing estate telehubs -* Fixed client crash caused by corrupt gestures -* Fixed a simulator crash -* Fixed loose clothing appearing tight upon login -* Fixed Ctrl-Alt-A disabling texture animation -* Fixed Search displaying First Land parcels that are unavailable -* Fixed some scripts not receiving email on simulator startup -* Fixed a slowdown during region crossings -* Fixed Edit -> Focus showing incorrect floater contents -* Fixed Buy Land and Buy Pass pie menu options - -Release Notes for Second Life 1.13.2(11) January 17, 2007 -===================================== -New features: -* Added 'Copy SLURL to clipboard' command in World Map +* Fixed picks not appearing with older viewer +* Fixed money() event failing to fire in a linked set +Release Notes for Second Life 1.13.4(7) March 9, 2007 +===================================== Changes: -* Linux: Flash icon when new IM arrives -* Sandbox region deletion now operates using parcel auto-return times -** Non-copyable objects will be returned to inventory -* 'Report Bug' command moved to Tools menu -* Added 'BETA' indicator to languages to reflect the status -* Rights dialog on Friends list now shows the friend whose rights are being edited -* Searching all Classifieds returns 100 results at a time (with Next and Prev buttons to flip through) -* 'Show Online Status in Search' renamed to 'Make my Online Status Visible in Search' -* Restored ability to use Alt to control camera, while still enabling menu access -** Holding down Alt and pressing WASD (etc) moves the camera -** Tapping Alt places focus on the menus. -* Added PickerContextOpacity to settings.xml +* World -> Account History opens L$ transaction history instead of US$ transaction history Bug fixes: -* Fixed a bug preventing Right Click > Buy from working -* Searching Places with multi-word phrases now returns expected results -* Fixed estate ban failing if more than 63 names are on the list -* Fixed ability to type accented characters using Option (Alt) as a modifier key on Mac -* Fixed capabilities under MacOS 10.3.9 (region crossings now work) -* Alt+Tab no longer activates the menus -* Menu no longer converts mouse hover into focus -* Menus now only show access key underlines when menu is invoked by the keyboard -* Double-clicking within an object's inventory now sets focus to the opened floater -* Hover tip for llMessageLinked() now lists LINK_ROOT and LINK_THIS -* Fixed incorrect sizing of button images in several floaters -* Purging an item from the trash now closes any associated preview windows -* Attempting to delete (not purge) an item from the trash no longer changes selection -* Fixed a bug where objects could not be reattached after being dropped -* Fixed viewer crash when deleting a playing animation -* Fixed viewer crash when opening/closing textures in object contents -* 'Xyz is typing...' no longer causes IM tab to flash -* Profiles opened from other UI now select correct tab -* Added more specific messages for cases where llSetPos() fails -* Ctrl+Arrow keys now move insertion point a word at a time in text fields -* ESC reverts text entry in all fields except Chat/IM (was commiting changes) -* Searching for people now correctly respects offline/online setting -* Texture and color picker 'shadow' only shown when dragging the picker -* Floaters will now dock above any media controls -* Arrow keys will now refresh Search tab contents -* Parcel selection now cleared when closing the Edit Terrain floater -* Parcel name is now updated in the database when changed -* Gesture steps now save correctly -* Fixed a messaging bug causing scripts to be truncated -* Fixed missing spaces in Korean translations -* Fixed a crash when using Search > All -* Fixed a crash after right-clicking -* Fixed a crash when closing the snapshot window before postcard is sent -* Fixed IM windows resizing to default on open/closing of sessions -* Fixed land buying error indicating nothing is selected -* Fixed several client crashes -* Fixed multiple selection in friends list vanishing if friend rights are changed -* Fixed About Land showing info only for the parcel the avatar is over -* Fixed changes to 'Show Online Status in Search' failing after the first change -* Fixed a bug that prevented selecting Buy Land in the pie menu when land is for sale -* Fixed toggling inventory closes all folders except the active one -* Fixed client crash when dragging object on Z-axis while using vertically-oriented llSetCameraEyeOffset -* Fixed receiving inventory from an object steals focus -* Fixed erroneous entry in Mac Start Location field -* Fixed texture repeats being applied to other prims upon linking -* Fixed ability to move focus to Estate window tabs via keyboard -* Fixed object contents only displaying one item -* Fixed truncated land types in Search -> Land Sales - -Release Notes for Second Life 1.13.1(6) December 21, 2006 +* Fixed a simulator crash with llParcelDetails +* Fixed flex objects vanishing when LOD changes +* Fixed flex objects not updating when modified +* Fixed flex objects disappearing when linked +* Fixed repositioning of HUD attachments when viewer is resized +* Fixed objects copied to/from notecards stating they are missing from database + +Release Notes for Second Life 1.13.4(6) March 8, 2007 ===================================== -Bug fixes: -* Don't display an erroneous 'Critical Message' during login for new residents +Changes: +* Light emiting objects are now affected by their own light -Release Notes for Second Life 1.13.1(5) December 15, 2006 +Fixes: +* Offline IMs now appear upon login +* Fixed autoupdate on Mac viewers +* Fixed Capslock key detection +* Fixed llSetLinkPrimitiveParams to move specified child prim +* Fixed linux client mozilla runtime +* Fixed texture animations to ignore texture 'Flip' flags +* Fixed animated textures with texture offset enabled +* Fixed attachments becoming disembodied when attaching an object +* Fixed a viewer crash that occurs when opening a script in a prim +* Fixed classifieds being deleted instead of auto-renewing +* Fixed jerky/stuttering physics based movement for hover vehicles +* Fix for paying child prim not triggering money event. + + +Release Notes for Second Life 1.13.3(58877) March 6, 2007 ===================================== -New features: -* Added French, Portuguese, and Spanish language options +Fixes: +* Fix for animated textures ignoring texture offset. +* Fix for animated textures not ignoring flip flags. +* Fix for light emitting objects not being lit by their own light. +* Fix for Textures not being applied to the entire prim +* Fix for Viewer occasionally getting stuck in drag select mode +* Fix for Client crashes when deleting objects +* Fix for Pay dialog is corrupted when attempting to pay while in busy mode +* Fix for Not able to delete objects which contain no copy items -Other changes: -* Added TypeAheadTimeout to settings.xml -** configures the timeout for type-ahead select in combo boxes and scroll lists +Release Notes for Second Life 1.13.4(5) March 6, 2007 +===================================== Bug fixes: -* Fixed carriage returns appearing as '?' in group notices -* Fixed tab order in customize avatar floater -* Fixed rezzing objects that overflow the parcel's prim allowance sends objects to (0,0,0) -* Fixed language drop-down list showing '???' for Japanese and Korean in en-us -* Fixed TOS floater HTML text overlaying plain text version -* Fixed weird border and truncated OK button on system messages when clicked -* Fixed group notices containing broken subjects/formatting and duplicated text -* Fixed rearranging tear-off menus -* Fixed selecting text in read-only fields -* Fixed Home key not toggling fly when chat field is empty -* Fixed Friends list multi-selection - -Release Notes for Second Life 1.13.1(4) December 13, 2006 +* Fixed 'Select Texture' applying changes to all sides +* Fixed textures resizing outside their window +* Fixed object rezzing being affected by Object Entry rules instead of Create Object rules +* Fixed drag select mode sticking after mouse button release +* Fixed a client crash when viewing objects +* Fixed content icon for sounds and animations added to an object +* Fixed texture request for textures quickly cycling between visible and not visible +* Fixed several failure cases for offline IM-to-email +* Fixed retrieval of group member list +* Fixed landmark resizing after tear-off +* Fixed ability to delete objects containing no-copy items +* Fixed single items being created in tabbed window + + +Release Notes for Second Life 1.13.4(4) February 28, 2007 ===================================== -UI changes: -* Hitting enter now clicks the currently-focused button, or the default button if there is one -** If a button has an orange highlight, Enter will press it -* Ctrl-W closes the currently-focused floater -* Ctrl-[ and Ctrl-] now move through preferences tabs -* Esc closes menus, then defocuses floaters, then resets the camera position -* By default, hitting enter in an empty chatbar no longer closes the chatbar -** Turn on the 'close chat after hitting return' preference if you want this behavior -* Arrow keys always control the avatar when the chat bar is empty, regardless of the status of the 'arrow keys move avatar when chatting' preference -* Enter closes and opens highlighted inventory folder -* Can move through radio options using left/right as well as up/down -* Give focus to the IM text field when you reopen it -* IM window doesn't close if you hit Ctrl-T when it's unfocused -* Floaters handle all keystrokes when focused -** Hitting Enter won't chat when focus is on the UI -* Ctrl-Tab and Tab will get you (almost) anywhere -* Ctrl-Tab cycles through floaters, toolbars, etc. -** Floaters are cycled in the order they were opened, and reordered so that it's easy to switch between the two most recent -* Hitting TAB when nothing has focus goes to chat bar, if available -* Opening a floater automatically puts focus there -* Focus appearance now makes more sense: focused floaters have opaque backgrounds, and lightened title bars; unfocused floaters are transparent -* Clicking in world (or hitting ESC) will remove focus from the UI, and make all floaters transparent -* Alt key access to menus. Hold down Alt and navigate via the underlined letters -* Visual integration of context-sensitive controls with the bottom panel -* Improved focus behavior of notifications and group notifications, and their appearance -* Type-ahead find in listboxes and combo boxes -** When focus is on the widget, type the first few letters of the desired selection and the selection will move as you type -** Very useful for long lists such as the Friends list or the Script function combo box -** Type-ahead find is visually indicated with an oblong highlight. -* Type-ahead find cycles through the items in a list or combo that have the same first letter -** Example: repeatedly typing 'r' will put selection on each element of the list that starts with 'r' -* 'Cone of context' for color pickers and texture pickers -* Objects visually lose focus when application loses focus, and regain them when application is refocused -* Storage of last focused item in floaters, so that focusing a floater puts focus back where it was last time you were using it -* Mini-map can't take focus, nor can camera/movement controls -* Have to double-click on the mini-map to open the main map -* Mousewheel zooms on the mini-map, and the scale limits allow you to zoom in more -* IM tabs opened by you are added to the right of the open tab (IM tabs opened by other means open to the far right, as before) -* Removed tab characters from most text editors except for the notecard and script editors -* Deprecated Alt-WASD for moving the camera (these keys now select the appropriate menus) -** Use Alt-arrow keys instead -* Hitting enter when in preferences will now close and commit them - -Other changes: -* 'Access from Mainland' renamed to 'Public Access' in Estate Tools -* 'Contact Support' link added to Help menu pointing to Second Life Knowledge Base contact page +Changes: +* Moving your avatar no longer deselects objects in build mode automatically Bug fixes: -* Focus is correctly paced in the text field when opening and reopening search -* Using arrow keys to select radio group options now commits selection -* Enter key now works correctly on dropdown boxes -* Fixed duplicate IMs or IM-to-email being sent (repeatedly) -* Fixed objects disappearing if they were made flexible via script -* Fixed a cause of failed estate-to-estate teleports -* Generalized flexi implementation for attachments and non-attachments -* Fixed several integer fields being displayed as float values -* Fixed pie menu options for non-English languages -* Fixed group notice panel not accepting text -* Removed incorrect notice that friends could track each other on the map (they cannot) -* Fixed bug affecting color of scripted/resident chat -* Temp objects can enter full parcels -* Fixed client crash when closing tabbed gestures without saving -* Fixed boolean values in Debug Settings not remembering the correct values -* Fixed strange characters in popup messages in Preferences -* Fixed incorrect counts for simulator prim usage -* Fixed floating point drift (and prim drift) in llTargetOmega -* Fixed textures on HUDs not rezing until right-clicked -* Fixed friends list scrolling to the top after a change -* Fixed a crash caused by tearing off menus in the script editor -* Fixed ability to add yourself to your friends list -* Fixed offline notification that a resident left your group (should not send email) -* Fixed object contents 'Copy to Inventory' and 'Copy and Wear' -* Fixed typed-ahead for Search and Friends list -* Fixed Recent Items showing all folders -* Fixed Texture Picker showing all folders -* Fixed failed estate-to-estate teleports -* Fixed a memory leak on the Intel Mac -* Fixed greyed Terms of Service agree/disagree options if user cancelled TOS notice - -Release Notes for Second Life 1.13.0(10) December 4, 2006 +* Fixed edit crosshairs moving while crossing region boundary +* Fixed text entry in Mac/Linux embedded browser + +Release Notes for Second Life 1.13.4(3) February 26, 2007 ===================================== Bug fixes: -* Fixed Search dialog running queries when opened -* Fixed inventory showing not-worn items as worn -* Fixed IM window resizing when closing/opening session -* Fixed missing languages in Preferences -* Linux client's crash-reporter is now fully-functional by default +* Fixed single-click failure for objects +* Fixed status bar obscured when debug is off +* Fixed escape key behavior +* Fixed strange object counts in About Land when no parcel selected +* Fixed avatar animations when editing an attached object +* Fixed Offer Teleport appearing in your own profile +* Fixed incorrect date display in group notices -Release Notes for Second Life 1.13.0(8) November 29, 2006 +Release Notes for Second Life 1.13.4(2) February 26, 2007 ===================================== -New Features: -* Added a new tab to the Profile called Web which will show a web page of the profile owner's choice -* URLs in chat and IM are now clickable links -** Supports http:// and https:// as well as secondlife:// links -* New options in Preferences/IM allow you to log IMs and/or chat -** The log file location can be specified -** Additional option 'show end of last IM conversation' -* Notecards now support international characters -* Updated Friends UI -** Set permissions for your friends to see you online/on the map -** Conference IM multiple friends by multi-selecting in the Friends list -** See who has granted you permission to modify their objects in the Friends list -* New option in Preferences > Communication to set whether you show as online in Search -* Estate visibility -** The estate visibility concept is simplified to just access permissions -** All classifieds and events are now viewable regardless of estate location on the grid. The Teen Grid and Main Grid are still separate. -** All regions within a grid now viewable, regardless of estate -** Online status is no longer hidden based on visibility of an estate +Bug fixes: +* Clicking a menu a second time closes the menu +* Fixed closing a blue dialog closes all dialogs +* Fixed retrieval of archived group proposals +* Fixed Ctrl-P shortcut failing when inventory has focus +* Fixed objects using llGiveInventoryList spamming owner when recipient is Busy +* Fixed no copy objects disappearing when given via llGiveInventory to a Busy avatar + +Release Notes for Second Life 1.13.4(1) February 21, 2007 +===================================== +Changes: +* User inworld money transaction history floater removed +** Transaction history can be viewed via secondlife.com +* Added 'Empty Lost and Found' option +* Added 'Use Custom Port' option to Preferences to specify network port +* Objects set for sale are Buy Copy by default (instead of Buy Original) +* Increased Classified's maximum L$ payable from 99999 to 999999 +* Added '?' button next to Partner field explaining partnering LSL changes: * New script commands -** integer llGetObjectPrimCount(key id) -*** Returns the prim count for any specific object in a sim -** list llGetParcelPrimOwners(vector pos) -*** Returns a list of up to 100 agents who own objects in the parcel, and the number of objects they own -** integer llGetParcelMaxPrims(vector pos, integer sim_wide) -*** If sim_wide is TRUE, returns the total maximum number of prims allowed on the parcel -*** If sim_wide is FALSE, returns the maximum number of prims this individual parcel supports -** integer llGetParcelPrimCount(vector pos, integer category, bool sim_wide) -*** If sim_wide is TRUE, returns the number of objects on all parcels owned by the same owner in the category specified -*** If sim_wide is FALSE, returns the number of objects on this specific parcel in the category specified -*** Categories are: -**** PARCEL_COUNT_TOTAL: all prims on the parcel(s) -**** PARCEL_COUNT_OWNER: prims owned by the parcel owner -**** PARCEL_COUNT_GROUP: prims not owned by the parcel owner, but set to or owned by the group of the parcel -**** PARCEL_COUNT_OTHER: prims not in GROUP or OWNER -**** PARCEL_COUNT_TEMP: All temp on rez prims -**** PARCEL_COUNT_SELECTED: All selected or ridden prims -** list llGetParcelDetails(vector pos, list details) -*** Returns of a list of the details (PARCEL_DETAILS_NAME, _DESC, _OWNER, _GROUP, _AREA) in the order they are in the details list, for the parcel at pos - -Other changes: -* IM shows resident's name and '...' if they are typing -* Chat, IM, and script chat (llSay/llWhisper/llShout) max length increased to 1023 characters -* '/me' emotes properly in IM (e.g. '/me laughs' becomes '[your name] laughs') -* Busy Mode message is now account-specific -* URL color is an option in Preferences -* Texture asset IDs no longer sent to the viewer unless necessary -* Adding performance logging based on agent frame rate -* A confirmation prompt now appears when emptying inventory trash -* Altered scripted movement/resizing of prims to better resemble 1.12 smooth behavior -* Korean characters should display properly on Mac OS X -* Linux client's cache, settings and logs now live in ~/.secondlife -* Options for Proxy removed from Preferences -** These options were intended for Mozilla only and did not function -* Vehicles permitted to enter object entry blocked areas -* New README-client.txt file for Linux client -* Several viewer rendering performance improvements -* Parcel owners can block objects from entering their parcels -* Option added to allow only group members to create objects on parcel -* Fixed a simulator crash related to region for sale information -* Updated Mozilla libraries to 1.8.0.8 -* Linux client now has a working crash-reporter +** void llSetLinkPrimitiveParams( integer linknumber, list rules ) +** void llSetLinkTexture( integer linknumber, string texture, integer face ) +* More documentation is available using Help > Scripting Guide... Bug fixes: -* You can now correctly fly a vehicle above the ban limits of a parcel when banned -* Fixed Linux crash when displaying certain UI elements -* 'Upload Image' will now ignore multiple clicks to avoid duplicate uploads -* First names which are numbers will now be shown correctly in chat -* Fixed the ability for group owners to remove members from roles -* Fixed a crashing bug with tearing off menus from scripting window -* Fixed a viewer crash when right-clicking on certain objects -* Fixed a viewer crash when changing prim shape -* Fixed a client crash with 'Hide Selected' -* Fixed a simulator crash -* Fixed scripted chat length longer than 255 characters -* Fixed URLs that wrap over two lines -* Fixed clickable area of URLs -* Fixed login screen drawing incorrectly before loading -* Fixed release of camera controls when exiting a vehicle -* Fixed level-of-detail issues in flexible prims -* Fixed tori LOD to reduce gaps -* Fixed Prev and Next buttons for Find -> People and Find -> Groups -* Fixed object size not updating with spinners or mousewheel -* Fixed detaching attachments when the parcel at <0,0,0> is full -* Fixed a client crash with textures that are not sized in powers of 2 -* Fixed a client crash when adjusting cut on a multicolored object -* Fixed mouse cursor when hovering over URLs -* Fixed text that isn't a URL becoming hyperlinked -* Fixed attachments disappearing beyond 25m -* Fixed viewer crash on MacOS when running in Thousands of colors -* Can now edit attachments even when a parcel is full -* Fixed some bugs related to banning users from estates -* Script energy recalculated on link and unlink -* Multiple inventory items opened at once open in one tabbed window -* Fixed IM Pending flashing on conversations that are already open -* Fixed Live Help messages being inserted in the wrong place in chat history -* Fixed blank low resolution terrain after clearing cache -* Fixed a cause of ghosted objects (full parcels and region boundaries) -* Fixed gestures being opened multiple times -* Fixed object buoyancy when setting STATUS_ROTATE_X,Y,and Z in a list -* Fixed reduced priority of textures in the distance -* Fixed Unicode characters in busy mode string resetting Preferences -* Fixed a client crash with bumpmaps on Macs -* Fixed a client crash with landmarks in tabbed windows -* Fixed a client crash when right-clicking a payment notification window -* Fixed a client crash for llLoadURL - -Release Notes for Second Life 1.12.3(6) November 1, 2006 -===================================== -Other changes: -* Updated Mozilla libraries -* Clear Cache button also clears Mozilla cache -* Mac Mozilla browser profile no longer saved inside application bundle -* Browser agent string now identifies Second Life and SL Client version -* Mozilla lib version added to Help->About Second Life -* Added new user clothing to local files (speeds up appearance for new avatars) -* Terms of Service cannot be agreed to until the page has fully loaded +* Fixed taken items not appearing until relog +* Fixed friends list abilities not being applied to friends +* Fixed objects failing to attach when selected from a distance +* Fixed replies to offline IM-to-email messages +* Fixed renaming a no-copy clothing item during Make New Outfit +* Fixed rezzed objects appearing at (0,0,0) if you have create rights, but are not wearing your title +* Fixed modify for gestures/notecards in a prim +* Fixed incorrect context menus for items in an object +* Fixed confirmation dialog when uploading immages, sounds, animations, or snapshots +* Fixed a viewer crash while taking an object +* Fixed a viewer crash after modifying a script inside a prim +* Fixed a viewer crash in People search with Picks tab +* Fixed a script runtime error (list inside a while/do-while loop) +* Fixed login screen not loading unless cache is cleared +* Fixed Ctrl-W not closing snapshot floater +* Fixed Ctrl-W not giving focus to next window +* Fixed Search->Places not showing public estate parcels while on private estate +* Fixed LSL converting numbers in body of email to 0 +* Fixed rejection of avatars as sit targets +* Fixed blurry web browser widgets with UI Scale != 1.0 +* Fixed notecards opened in tabbed windows extending outside the preview window +* Fixed opening multiple object inventory items not using tabbed windows +* Fixed accidental selection of highly transparent objects +* Fixed keyboard focus after selecting function dropdown in script editor +* Fixed Build button in toolbar disabled on land where 'Create Objects' is set to group, even when avatar is in the correct group +* Fixed Buy Dialog displays incorrect Prim Count when using prim multipliers +* Fixed folders not retaining their closed status once opened in inventory +* Fixed IMs of type IM_BUSY_AUTO_RESPONSE ignore mute +* Fixed World->Buy Land menu failures +* Fixed Friends list not displaying online friends on login if 'Can see my online status' is disabled +* Fixed menus remaining open when something else is clicked +* Fixed menus taking focus when leaving alt-zoom +* Fixed accidental loss of no-copy textures by applying them to a prim +* Fixed members of a group cannot set their home location when land is only set to a group and not deeded +* Fixed sitting avatar standing up when close are dragged onto the avatar -Bug fixes: -* Fixed changes not saved on gestures when edited within a prim -* Fixed missing local HTML Loading files -* Fixed new clothing appearing white on other avatars -* Fixed auto-detect hardware staying on for Mac -* Fixed login screen not launching links in new window on PPC Mac -* Fixed resolution box remaining grey after switching from windowed to fullscreen -* Fixed 'Auto-detect' not unchecking when user changes aspect ratio -* Fixed RSS feed refresh obscuring news headlines -* Fixed script command window not dismissing once it has been scrolled -* Fixed colored noise on Quicktime when first playing back a movie -* Fixed clickable area for objects in notecards -* Fixed Debug Settings not saving changes - -Linux fixes: -* Assorted library fixes -* Work around an X bug in full-screen mouse handling - -Release Notes for Second Life 1.12.3(4) October 25, 2006 +Linux client fixes: +* Added Linux embedded Mozilla client +* Fixed Linux client crash on shutdown + +Release Notes for Second Life 1.13.3(2) January 30, 2007 ===================================== -New features: -* New login interface pulls images and information from the web site -* 'Languages' added to Profile - -Other changes: -* Simulator savestates save to local disk in certain situations (grid shutdown, rolling restart, etc.) -** This should decrease downtime for grid shutdown/startup -* Terms of Service displayed in HTML -* Sell Land floater no longer accepts commas/decimals (which were causing price failures) -* Renamed Land -> Options -> Show in Search (was Show in Find Places) -* Mac resize-window widget made easier to locate and use -* Estate managers can now terraform +Changes: +* It is no longer possible to only search for online residents +* Online status is no longer indicated in the Search -> People results list +** The online status inside the profile shows 'Currently Online' or remains blank +*** Friends can see your Online status if you give permission via the Friends list +*** Anyone can see your Online status if 'Make my online status visible only to my Friends' is unchecked -Bug fixes: -* Closing/opening the inventory clears the search bar -* Improved load balancing for Orientation Islands -* Corrected network throttle to relax it after it has been tightened -* Fixed tooltips appearing for invisible windows -* Fixed dropping image on your profile sending image to last profile viewed -* Fixed About Land's Return Objects for objects owned by parcel owner -* Fixed window resize arrows on Mac for different UI Sizes -* Fixed Enter key immediately sending Mac crash reports -* Fixed IM window resizing on closing/opening a session -* Fixed login failing when group name/title contains multi-byte characters -* Fixed animations being uploaded with spread fingers -* Fixed texture repeats when an object is stretched -* Fixed 'share with group' when deselected/selected -* Fixed a client crash with blank profile URLs -* Fixed inability to open second IM session from Find->People -* Fixed web profiles not automatically loading -* Fixed misaligned/disappearing Appearance sliders -* Fixed a client crash while changing the aspect ratio -* Fixed a client crash with Path Cut Begin -* Fixed Top Scripts always showing a total script time of 0.0 -* Fixed buttons in Profile (Pay, Rate, etc.) -* Fixed an incorrect uninstaller error message -* Fixed Rename to Folder Name in Appearance -* Fixed ampersand in Busy message causing preferences to revert to default +Release Notes for Second Life 1.13.3(58716) March 1, 2007 -Linux client fixes: -* File upload/download dialogs (windowed mode only) +more -* URLs now launch in an external web browser -* ESD is now the default audio device where available -* Fix numeric keypad handling -* Fix hang when detecting corrupt cache +Fixes: +* Fix for: Textures that quickly cycle between visible and not visible never getting successfully requested +* Fix for: Textures applied via 'Select Texture' are applied to all sides. +* Fix for: Object selection moves to the next sim when crossing region boundary while objects are selected +* Fix for: Landmarks window can be resized +* Fix for: Textures should remain within their window when the viewer is resized +* Fix for: Single items are being created in a tabbed window +* Fix for: 'linux mozilla embedding support should be compile-time optional' + +Beta Grid Only: +* Fix for: Object Entry rules block rezing of objects. + +Release Notes for Second Life 1.13.3(58603) March 1, 2007 + +Changes: +(Note: this change was introduced several versions ago be we forgot to put this in the release notes) +* The following 4 particle commands have been deprecated for some time, and no longer work: +** llMakeExplosion http://wiki.secondlife.com/wiki/LlMakeExplosion +** llMakeFire http://wiki.secondlife.com/wiki/LlMakeFire +** llMakeFountain http://wiki.secondlife.com/wiki/LlMakeFountain +** llMakeSmoke http://wiki.secondlife.com/wiki/LlMakeSmoke +** Please use llParticleSystem (http://wiki.secondlife.com/wiki/LlParticleSystem) instead. +* Set the executable name back to SecondLifeFirstLook.exe (1.13.3(58537) inadvertently set it to SecondLifePreveiw.exe -Release Notes for Second Life 1.12.2(7) October 11, 2006 -===================================== -Other changes: -* llPushObject restrictions now prevent objects from being pushed -* Rolling update warnings are now broadcast repeatedly (5m, 4m, 3m, 2m, 60s, 45s, 30s, and 15s) and with earlier warning +Fixes: +* Fixed a bug with image requests, should reduce the latency when loading uncached images +* Rediced frame rate spikes when spinning. +* Fixed bad normals on tapered geometry. +* Fix for bump maps not taking effect immediately. +* Fix for animated texture coordinates not resetting when animation stops. + +Release Notes for Second Life 1.13.3(58537) February 27, 2007 + +Changes: +* Modified texture animations to use hardware acceleration +* Improved framerate when rotating in certain areas that were lagging + +From the main development branch since 1.13.3.2 +(note: some of these were introduced in previous First Look releases) + +Changes: +* User inworld money transaction history floater removed +** Transaction history can be viewed via secondlife.com +* Added 'Empty Lost and Found' option +* Added 'Use Custom Port' option to Preferences to specify network port +* Objects set for sale are Buy Copy by default (instead of Buy Original) +* Increased Classified's maximum L$ payable from 99999 to 999999 +* Added '?' button next to Partner field explaining partnering Bug fixes: -* 'Share with group' checkbox now correctly shows the permission setting -* Fixed a viewer crash with Top Scripts and 'Show Beacon' -* Fixed a viewer crash when creating a landmark -* Fixed a bug where inventory was showing unworn items as worn -* Fixed 'Copy to Inventory' and 'Copy and Wear' -* Fixed a bug where descending into a parcel where you were banned would bounce you to 0,0 -* 'Return All' and 'Return Selected' in Estate Tools now function correctly -* Group members no longer blocked from group-owned parcel if payment levels blocked -* Estate owners/managers are now exempt from access lists on their own estates -* Error message 'you cannot log in until (time)' now displays correct time -* Offline friendship message no longer says '(resident) has to be your friend...' -* MacBook Pro: Function keys should no longer cause arrow keys to be 'stuck' -* Reduced occurrences of gray avatars and avatars with 'missing image' textures -* Several simulator and dataserver crash fixes -* Lots of changes to make the client/server protocols more secure +* Fixed single-click failure for objects +* Fixed status bar obscured when debug is off +* Fixed escape key behavior +* Fixed strange object counts in About Land when no parcel selected +* Fixed avatar animations when editing an attached object +* Fixed Offer Teleport appearing in your own profile +* Fixed incorrect date display in group notices +* Clicking a menu a second time closes the menu +* Fixed closing a blue dialog closes all dialogs +* Fixed retrieval of archived group proposals +* Fixed Ctrl-P shortcut failing when inventory has focus +* Fixed objects using llGiveInventoryList spamming owner when recipient is Busy +* Fixed no copy objects disappearing when given via llGiveInventory to a Busy avatar +* Fixed taken items not appearing until relog +* Fixed friends list abilities not being applied to friends +* Fixed objects failing to attach when selected from a distance +* Fixed replies to offline IM-to-email messages +* Fixed renaming a no-copy clothing item during Make New Outfit +* Fixed rezzed objects appearing at (0,0,0) if you have create rights, but are not wearing your title +* Fixed modify for gestures/notecards in a prim +* Fixed incorrect context menus for items in an object +* Fixed confirmation dialog when uploading immages, sounds, animations, or snapshots +* Fixed a viewer crash while taking an object +* Fixed a viewer crash after modifying a script inside a prim +* Fixed a viewer crash in People search with Picks tab +* Fixed a script runtime error (list inside a while/do-while loop) +* Fixed login screen not loading unless cache is cleared +* Fixed Ctrl-W not closing snapshot floater +* Fixed Ctrl-W not giving focus to next window +* Fixed Search->Places not showing public estate parcels while on private estate +* Fixed LSL converting numbers in body of email to 0 +* Fixed rejection of avatars as sit targets +* Fixed blurry web browser widgets with UI Scale != 1.0 +* Fixed notecards opened in tabbed windows extending outside the preview window +* Fixed opening multiple object inventory items not using tabbed windows +* Fixed accidental selection of highly transparent objects +* Fixed keyboard focus after selecting function dropdown in script editor +* Fixed Build button in toolbar disabled on land where 'Create Objects' is set to group, even when avatar is in the correct group +* Fixed Buy Dialog displays incorrect Prim Count when using prim multipliers +* Fixed folders not retaining their closed status once opened in inventory +* Fixed IMs of type IM_BUSY_AUTO_RESPONSE ignore mute +* Fixed World->Buy Land menu failures +* Fixed Friends list not displaying online friends on login if 'Can see my online status' is disabled +* Fixed menus remaining open when something else is clicked +* Fixed menus taking focus when leaving alt-zoom +* Fixed accidental loss of no-copy textures by applying them to a prim +* Fixed members of a group cannot set their home location when land is only set to a group and not deeded +* Fixed sitting avatar standing up when close are dragged onto the avatar Linux client fixes: - * MMX-enhanced image decoding - * Resolve crash: 'undefined symbol: glXGetProcAddress' - * No longer lose streaming music after visiting a dead stream - * Startup script now exposes alpha-testing configuration options - * Disable troublesome GL extensions by default. See startup script to enable. +* Added Linux embedded Mozilla client +* Fixed Linux client crash on shutdown -Release Notes for Second Life 1.12.1(13) September 27, 2006 -===================================== -Bug fixes: -* Fixed Macintosh autoupdater -** Older clients should use the website download if issues are experienced +Release Notes for Second Life 1.13.3(58390) February 23, 2007 -Release Notes for Second Life 1.12.1(12) September 27, 2006 -===================================== -Other changes: -* Updated Mac custom cursor file format and API -* Alt-Shift-H (Windows) / Opt-Shift-H (Macintosh) hides HUD Attachments -* Clock labelled as Pacific Time (previously SLT) +Fixes: +* Fix for HUD objects being invisible on attach +* Fix for HUD objects not repositioning +* Fix for attachments getting left behind +* Fix for flexible objects not updating on modification. +* Fix for slow scrolling textures and tiny prims being invisible. +* Fix for not being able to change viewer language in firstlook +* Fix for Viewer crash when switching between full screen and windowes with multiple threads +* Fix for additional texture bandwidth usage in First look +* Fix for low detail terrain textures failing to load +* Fix for picking through transparent objects. +* Fix for Lighting turning bright orange or red intermittantly in rendering pipeline focus preview. +* Fix for dismissing one blue dialogs dismisses all blue dialogs +* Fix for Avatar not changing anmations while editing an attached object +* Fix for Object counts in About Land change when floater loses focus +* Fix for clicking a menu a second time not closing it +* Fix for First Look viewer interacting poorly with Norton Antivirus (Note: Unless you tell Norton Anti Virus to exclude the Second Life cache directory, it will delay texture loading, but should no longer affect frame rate) +* Fix for crash on 945G when editing objects. + +Release Notes for Second Life 1.13.3(58185) February 20, 2007 -Bug fixes: -* Fixed typos in Buy Land Floater -* Fixed typo when joining a group with a fee -* Fixed texture picker opening all folders -* Fixed a 'level of detail' issue causing performance degradation -* Inventory window refreshes after renaming a folder -* Classified asks to save when OK is selected -* Top Scripts shows a list when opened -* Trash doesn't close when purging an item -* Torn IM windows can be minimized - -Release Notes for Second Life 1.12.1(11) September 22, 2006 -===================================== -Other changes: -* Added new option when buying land back from a group you have contributions in: -** 'Remove XXXX square meters of contribution from group' -*** This option is checked by default, and will remove group contribution associated with the parcel -** This option (and its default setting) should greatly reduce accidental land holdings and mis-billings -* New keyboard commands for IM windows: -** Ctrl-[ and Ctrl-] toggle between IM windows -** Ctrl-Shift-W closes the active IM window -* Textures can no longer be uploaded or displayed at 2048x2048 resolution -** Prevents several crash issues -** Existing textures above 1024x1024 will be decoded at 1024x1024 resolution -* Estate owners/managers are exempt from access lists (but can still be banlisted) -* Script and Notecard windows remember their last size -* Offline Instant Messages that have not been received for ninety (90) days will be deleted -* Double-clicking a name in Friends list once again opens an IM for that resident -* Pay button restored to Friends list +Changes: +* Fixed a texture prioritization bug +* Sped up texture cache maintenance on startup Bug fixes: -* Fixed tooltips getting cut off -* Fixed dead space above chat/toolbar -* Fixed classified ads showing 'Ad placed: Not yet published' -* Fixed extra object in Buy Copy floater -* Fixed mute via profile -* Fixed warning 'assigndangerousmemberwarning is missing from alerts.xml' -* Fixed Script Warning window causing visual glitches -* Fixed 'Apply to Selection' button in Edit Terrain -* Fixed Bug Report window mentioning abuse report -* Fixed a copy-paste method that was failing in Inventory -* Fixed 'Attach To->' from inventory -* Fixed 'Return All' and 'Return Selected' -* Fixed highlight selection for several text windows -* Right-clicking a large inventory folder no longer creates a large client/server load -* Next button appears for Search -> Events when there are over 200 events -* Search Events should sort properly -* Texture Mapping no longer has repeated options -* Copy option is available when selecting multiple items in Inventory -* Buy Currency appears correctly in Buy Land floater -* Open contents floater moves with window resize -* Folders can once again be purged from trash -* Texture picker remembers 'Apply Immediately' setting -* Animations can have their properties changed -* Scripted \n nextline option now being handled correctly by chat history/debug channel and onscreen -* New scripts no longer show 'New Script' in editor window (i.e. after being renamed) -* Fixed several client crashes - -Release Notes for Second Life 1.12.1(10) September 21, 2006 -===================================== -Bug fixes: -* 'Missing Image' and gray avatar textures should not get stuck any more -* New presence code to address friends list not updating correctly, etc. -* Fix for Group IM failures caused by the presence issue fix -* Improvements to automated defenses against replicator attacks -* Performance improvements when multiple objects are being returned +* Fixed accidental loss of no-copy texture when applied to a prim +* Fixed incorrect context menu for items inside an object +* Fixed Linux client crash on startup +* Fixed Ctrl-W failing to give focus to the next window +* Fixed renaming no-copy object during Make New Outfit +* Fixed group members cannot set home when land is Set to group but not deeded +* Lost and Found now has an Empty folder option -Release Notes for Second Life 1.12.1(9) September 14, 2006 -===================================== -Bug fixes: -* Fixed incorrect llTargetOmega() spin rates -* Fixed IM window resizing on close/open -* IM window saves size across sessions -* Inventory can once again be dropped on any part of a resident's profile -* Pay dialog scales for larger buttons -* Fixed Top Scripts/Top Colliders highlighting incorrect object -* Fixed mute for scripted give inventory (particularly for group-owned objects) -* Further improvements when editing long notecards or scripts - -Release Notes for Second Life 1.12.1(8) September 14, 2006 -===================================== -Bug fixes: -* Fixed an issue causing large amounts of packet loss to occur when downloading textures -* Resolved a crash when seeing other avatars -* Fixed a bug causing low framerate in some regions +Release Notes for Second Life 1.13.3(58100) February 16, 2007 + +New feature: +* Linux client features embedded Mozilla + +Changes: +* Texture Pipeline Architecture +** Significant redesign of texture pipeline +** Improved texture caching +** Unlimited texture cache size +** Texture cache can be relocated +* Render Pipeline Architecture +** Significant changes to render pipeline +** Introduction of Vertex Buffer Objects for improved stability +** Better batching of geometry for improved render performance (on some systems) +** Alpha sorting changes to improve performance +* Added display that shows intersection of prims with translation plane when building. +* Objects set for sale default to 'Buy Copy' instead of 'Buy Original' -Release Notes for Second Life 1.12.1(7) September 13, 2006 -===================================== Bug fixes: -* Resolved an issue where avatar textures would not bake +* Fixed a viewer crash when taking an object +* Fixed viewer not loading after logout if cache is not cleared +* Closing window passes focus to the next window +* Fixed blurry web browser widgets +* Fixed notecards in tabbd window extending outside the preview window +* Fixed web browser widgets blurred when UI scale != 1.0 +* Updated link to Help -> Scripting Wiki +* Fixed viewer crash when opening a script at the same time as other inventory objects +* Fixed Build not enabling for group members on land where only group members can build +* Fixed World -> Buy Land menu failures +* Fixed menus not closing when other things are clicked +* Fixed objects rezed from Library, edited, and taken to inventory being placed in Library -Release Notes for Second Life 1.12.1(6) September 13, 2006 -===================================== -New features: -* Estate access and ban lists boosted up to 300 entries (previously 63) -* Estate land management now allows subdividing and joining of parcels -* Right-clicking an animation allows you to play it from inventory -* The ability to stop animations has been added to the Tools menu -** The 'Play Locally' and 'Play in World' buttons (when an animation is opened in Inventory) change to 'Stop' when clicked -** This allows you to stop the animation while it's playing - -Other changes: -* Residents can be invited to your Friends list, even while they are offline -* Particle systems now 'muted' when a resident is muted -* Double-clicking a group name in a profile now opens that group's info page -* Added texture dimensions to all texture preview windows -* Added 'Mute' to inventory transfer notifications. Clicking mute will put that person on your mute list. -* Added timestamp and land resale/join information to About Land -> Covenant -* Changed the default draw distance for low end machines to improve frame rate -* Help menu now has a link to Release Notes -* Improved OS detection for Windows XP 64Bit, Windows 2003 Server, and Windows Vista -* Changed back-end mechanics for storing avatar textures for improved performance and robustness -LSL changes: -* llHTTPRequest throttling changed -** Requests are now limited to once per second per primitive. +Release Notes for Second Life 1.13.3(58018) February 14, 2007 -Bug fixes: -* Find -> Places categories now match the ones you can select in About Land -* Fixed text for 'Land can be bought direct' at low resolutions -* Fixed scaling for several UI elements at low resolutions -* Location coordinates are now correct when the World Map is resized -* Inventory search ignores events that make items bold -* Removed a leftover reference to telehubs -* Improved parcel ban detection at high altitudes -* Fixed World map hover tips when taking a screenshot -* Fixed group object owner ID in llHTTPRequest() headers -* Fixed an inability to leave groups on Mac/Linux -* Fixed double-click in UI -* Fixed ESC not leaving Mouselook -* Texture tab shows repeats per meter -* Fixed appearance of View -> Property Lines -* Restored 'Deny access by payment status' to Estate menu -* Fixed llDialog buttons not performing the correct actions -* Fixed fullbright not working -* No-copy objects can be deleted through the pie menu -* Fixed the keyboard shortcut for View -> Look at last chatter -* Fixed chatbar not opening with Enter key -* Fixed World -> My Land not displaying the land you own -* Items can be set for sale/not for sale in inventory -* Corrected 'restrict pushing' wording in UI to be more consistent -* Friends list shows who has modify rights -* Fixed Pay dialog displaying incorrect payee -* Fixed right-click Create in inventory places inventory in wrong folder -* Can once again change properties of an item in an objects contents -* Restored missing menu items from inventory menu; menus can now be torn off -* Fixed bandwidth gauge - no longed pegged in the red zone at low usage -* Fixed land showing For Sale to Anyone even when a specific resident is chosen -* Fixed right-click on inventory folders showing wrong options -* Fixed Rate label in pie menus -* Fixed sorting for Top Objects and Top Scripts -* Fixed terrain detail in Preferences displaying wrong setting -* Fixed Tools -> Select Only My Objects/Moveable Objects -* Avatars in Adult Second Life can remove all clothing once again -* Removed under-clothing menus for Teen Second Life avatars -* Reordered Place categories for consistency across UI -* Various UI adjustments and tweaks -* Corrected various UI typos -* Fixed several client crashes - -Release Notes for Second Life 1.12.0(15) August 25, 2006 -===================================== -Bug fixes: -* Fixed a viewer crash when opening the bug reporter. +Changes: +* Removed particle throttling; while a performance win in some areas, caused too many bad artifacts -Release Notes for Second Life 1.12.0(14) August 25, 2006 -===================================== -New features: -* The map Beacon has been visually enhanced -* 'Mute by Name' allows you to manually add objects or Residents to your Mute List - -Other changes: -* Usability improvements to the Abuse Reporter UI layout -** Dialog boxes removed from AR snapshots -** Added field for Abuse Location (if different from present location) -* Abuse reports concerning copyright claims will be directed to the DMCA protocol -* Abuse Reports require all fields (except object selection) to be filled in (prevents blank Abuse Reports) -* 'Wear Clothing Now' is off by default when buying clothing -* Reinstated Parcel Size to the About Land dialog -* Automatic Edit Camera Movement preference is now Off by default +Fixes: +* VWR-108 Fix for out of bounds error in avatar vertex shader attribute array. +* Fix for toggling selection beam +* Fix for LOD issues with small objects. +* Fix for planar guide grid swimming around in local grid mode. +* Fxed Texture priorities when turning around in place -Bug fixes: -* Fixed Z coordinate being ignored when teleporting via the map -* Fixed group members with only the invite ability inviting others to Everyone -* Fixed script event change() not firing when script dropped into object inventory -* Fixed assigning a group role to multiple people -* Fixed group General tab updating display of member roles -* Fixed Gesture text fields only accepting a single character -* Fixed the Reset button for covenants -* Text fields should now scroll one character at a time -* Fixed Fast Timers scrolling off the screen -* Fixed Group Land not always displaying all parcels -* Fixed sun flashing orange when right-clicking an object -* Fixed Residents being asked to buy passes to land that is also restricted to group members -* Group members with 'ban list' ability can now change 'deny by payment method' -* Fixed Help->Manage My Account -* Instances of 'Find' renamed to 'Search' for consistency -* No-fly icon checks the parcel's fly restriction instead of the avatar's (displays in god mode) -* UI space for money display increased to prevent overlap -* Fixed parcel names overlapping UI elements at the top of the screen -* Fixed textures stretching while Stretch Textures is off - -Release Notes for Second Life 1.12.0(13) August 23, 2006 -===================================== -New features: -* Support for Covenants -** Covenants may now be associated with Estates -** These documents detail land use rules and restrictions -** Available in About Land -** Covenants are visible to anyone - -* Estate Land Sales -** Estate owners/managers are now able to sell land to other Residents for L$ -** 'Allow Land Transfer' option in 'Region/Estate > General' tab enables Estate Owners and Managers to sell parcels, and buyers to resell them -*** Estate owners/managers may specify rules for land sale and usage in Covenants -*** Buyers of the land on private estates may be limited in their ability to re-sell land depending on settings determined by Estate owner/manager -** Group land on estate has been changed -*** Land on estates, owned by a group or by anyone other than the estate owner, can no longer be subdivided or joined -*** Only parcels that are owned by the estate owner can be subdivided -*** Only Estate Owners and Estate Managers can subdivide the estate owner's parcels - -* Group Enhancements -** Group limit per user increased from 15 to 25 -** Group member minimum reduced from 3 to 2 -** The group information user interface has been redesigned - -* Group Notices -** Group notices can be created in the 'Group Information > Notices' tab -** Group notices can include an attachment -** Group notices are sent to all group members -** Members may opt to not receive these notices in the 'Group Information > General' tab -** Members can browse the last 30 days of notice history -** Members with IM to Email set will receive these notices offline - -* Group Roles -** Groups can be configured using the 'Group Information > Members & Roles' tab -** A group is now composed of up to 10 user-configured Roles -*** The 'Everyone' and 'Owner' roles count for these purposes -* Group powers to return objects from parcels are divided based on Owned by group, Set to group, and Not group related -** Residents may hold more than one Role in a group -** Each role can be configured to allow certain group Actions -** Each role gets its own title -** Members of a group are assigned to Roles to define the Actions they can perform in that group -** Group members are always a part of that group's 'Everyone' role -** Example: -*** Current groups have two Roles: 'Everyone' and 'Officer' -*** All group members can do Actions allowed by the 'Everyone' role, such as voting on proposals -*** Only group members assigned to the 'Officer' role can do Actions such as invite new members -** Groups now have a special role: 'Owner' -** 'Owners' have full control over the group, but cannot remove other 'Owners' -** Promoting group members to Owner warns user that this change is irreversible -** The last owner of a group cannot leave without selecting a successor -** Current groups will have members selected to be 'Owners' based on the first to match these rules: -*** 1) A founder in the group -*** 2) Officers with 512 or more sq. m. land contributed -*** 3) All officers -*** 4) Nobody (no 'Owner' role is created) -*** Owner and Everyone roles cannot be renamed - -* New Sell Land interface -** Specify sell price, Sell To resident, and sale of objects all simultaneously -** Residents muse specify a specific resident or manually select 'Sell to Anyone' before the dialog is completed -** This new interface should greatly reduce accidental land sales - -Improved Snapshot Interface -* 'Freeze Frame' toggle added to snapshots -** Remove checkbox to restore old snapshot behavior +Release Notes for Second Life 1.13.3(57947) February 13, 2007 -LSL changes: -* Scripts will not start running until the 'Running' box is manually checked -* The following script commands now work on group-owned objects: -** llGiveInventory -** llGiveInventoryList -** llInstantMessage -** llRemoteLoadScriptPin - -Other changes: -* Selection effect particles can now be disabled independently (Tools->Show Selection Beam) -* Group-owned objects can be muted -** If a group owned object offers you an item, the blue box will say 'Keep', 'Discard', and 'Mute' -** Mute adds the group to your Mute List and all objects owned by that group will be muted -** Muted group owned objects will not be able to IM you or send you items -* Group elections have been removed -* Provided greater visibility for any fee incurred while joining a group -** Group membership now uses the membership fee at the time of invitation instead of the fee at the time invitation is accepted -* Group-owned objects that you have control over are now highlighted on the mini-map. -* 'Show in Group List' checked by default -* Added ability to deny access to Parcels/Estates based on Pay Info Level -* 'Grant Modify Rights' has been changed to be more comprehensive -** You can now allow the person being granted rights greater freedom of modification -** Friends list now shows when modify rights are granted -* Default attachment point changed from head to right hand -* Reversed positions of 'Take Copy' and 'Wear' in pie menu -* Icon for push restriction added -* 'Edit Land' is now 'Edit Terrain' -* Altered formula for temp-on-rez limits (generally to be more permissive) -* Temp vehicles are not reclaimed until all passengers unsit -* Improved wording of error message while joining parcels on an estate (parcels must be owned by estate owner) -* Parcel joins and subdivides uncheck the For Sale box -* Ban list now disables when a parcel is sold -* In-world links to the Forums and Wiki now point to the Knowledge Base and Blogs -* Clicking in text fields in Edit Tools selects the input position without highlighting the entire field -* Ctrl-F now puts keyboard focus on the Find text box -* Added art for eyedropper -* 'No Fly' is visible in God mode -* Font information for scroll list headers can now be provided by the user -* Improved look and feel of several windows +Changes: +Significant changes to texture prioritization -Bug fixes: -* Fixed tracking residents via Show on Map -* Fixed default button highlighted while other button selected -* Fixed button states during mouseovers -* Fixed dragging item into object contents -* Fixed a simulator crash with notices -* Fixed persistence of Global Time in Region/Estate -* Fixed incoming IMs stealing focus from Abuse and Bug reports -* Fixed a client crash with 'Set Scripts Not Running in Selection' -* Fixed alignment of Search window panels -* Improved detection of rapid mouse clicks -* Camera and movement controls do not gain keyboard focus -* Camera and movement controls persist across sessions -* Fixed a client crash while connecting to downed simulator -* Fixed a client crash with F1 Help -* Frontmost floater gets Return key only if it has keyboard focus -* Improved appearance of alpha objects in Object Silhouette mode -* Objects with 'No Copy' permissions should delete to owner -* Fixed client crash with chat bar and 'Kick user from estate' -* Fixed Name and Description highlighting after Return is pressed -* Fixed Z-coordinate in classified ads -* Fixed LSL XML-RPC for attachments breaking on teleport -* Fixed returned object continuing to affect sim prim usage -* Crash Reporter remembers its previous settings -* Fixed client crash and asset loss while editing complex objects -* Fixed artifacts in LOD changes -* Dragging past the end of a text field no longer scrolls the text -* Aspect ratio corrects when toggling fullscreen -* Edit menu now has a detach option for skirt layers -* Fixed a cause of slow rezzing of textures and tree details -* Fixed an issue that would prevent simstate autosaves -* Fixed a bug causing region crossing performance to degrade in 1.11 -* Fixed text in several windows and improved tool tips -* Several actions have been updated so that the Apply button can be used when modifying them -* Group creation failure no longer charges you for creating group -* Client no longer crashes when copying a selection in the Create menu -* Clicking Cancel when changes need to be applied no longer stops Second Life client from closing -* Crossing a region into a parcel where you are banned no longer causes avatar to float through parcel or go into orbit -* Corrected issue causing Estate Owners to get unexpected results when teleporting to a parcel where they are banned on their estate -* Last item in a list can once again be highlighted and selected -* Declined objects are correctly removed from recipients inventory -* Delete key now works as expected in the Tools > Edit window -* Client no longer crashes when right clicking certain parcels -* Group names cannot be shorter than 4 characters or longer than 35 characters -* Abandoned parcels on the mainland now properly report owner as 'Governor Linden' -* Client no longer crashes when user selects land over two parcels, then clicks 'About Land' -* Autoreturn settings can now be changed -* User is now notified when receiving snapshots, notecards, and landmarks -* Apply now updates all changed elements in a window -* Correct various 'Apply' buttons to grey out once clicked -* Group-owned objects appear as 'owned' in About Land -> Objects when on group owned land -* Ctrl-D (duplicate) now works on group-owned objects with the proper permissions -* Land owners can always fly on their parcel (unless the entire sim restricts flight) -* Fixed a bug that caused the Create Group dialog to discard all data if the group name already exists -* Resolved numerous issues with scroll lists causing information not to load or be displayed improperly -* Group contribution no longer displayed as a negative number -* Mainland parcels now displayed in map overlay regardless of your location -* Residents can now retrieve no-modify objects they own from other people's parcels -* Resolved several exploits +Fixes: +Fix for object flicker. +Fix for HUD objects not moving properly when viewer is resized. +Fix for scale handles not updating on mouse drag. +Fix for undo not working. +Fix for dark foot shadows. +Fix for tree picking alpha threshold too low. +Fix for stars staying out during the day. -Linux client fixes: -* No linux client specific fixes in this version +Release Notes for Second Life 1.13.3(57876) February 9, 2006 + +Changes: +Improved LOD and alpha sorting +Improved edits reverting with linked objects + +Fixes: +* Fixed a few crashes +* 'Clear Cache' was failing if the cache location was on a changed +* 'Clear Cache' was not deleting the texture cache on OSX +* Some Textures were never caching correctly + +Release Notes for Second Life 1.13.3(57837) February 8, 2006 + +Fixes: +* Fixed a major issue with texture requests where textures that first appeard behind you were not getting requested until you moved closer or zoomed in on them +* Fixed a bug where 'skip this message' settings were not being remembered +* Fixed several particle bugs, including some OSX specifix ones +* Fixed several crash bugs + +Release Notes for Second Life 1.13.3(57787) February 7, 2006 + +Notes: +* This release will clear the cache on startup to eliminate potentially corrupt caches +Changes: +* Reduced the frequency of drag-edit updates to reduce the likelihood of changes reverting due to missed updates +Fixes: +* Fixed a bug where small flexi objects were sometimes stuck floating around an avatar +* Fixed a significant memory leak +* Fixed some issues with the texture cache +* Fixed a bug where textures that were partially mapped to objects were not rezing +* Fixed several crash bugs +* Wind volume slider now takes effect immediately + +Release Notes for Second Life 1.13.3(57679) February 5, 2006 +Fixes: +* Fix: Animating textures (using llSetTextureAnim) do not update their pixel area +* Fix for disappearing hud objects. +* Fix for yellow avatars on some ATI cards. +* Fix for flexi LOD issues +* Fix for stars visible with 'Force Sun' +* Several crash bugs fixed +Fixes not specific to 'First Look' +* Fix for library objects returning to library after being taken from world +* Added help button for partner info in profile panel +* Added inventory cache verification to reduce bugs due to cache corruption + +Release Notes for Second Life 1.13.2(57573) February 1, 2006 + +Fixes: +* Fixed: Chat text fadeout bug +* Fixed: Yellow fog in snapshots +* Fixed: Hardware detection incorrect for ATI X1900 and other cards +* Fixed: Several crash bugs +* Fixed: Missing login screen +* Fixed: Avatar preview in image update missing + +Release Notes for Second Life 1.13.2(57463) January 30, 2006 + +Changes: +* Cache location can be set by residents +* Textures from last scene are pre fetched, improving loading speed of inital speed + +Fixes: +* Fixed: Avatars seated on objects don't move with objects +* Fixed: More issues with prim selection silhouettes +* Fixed: HUDS with transparent textures disappear when camera goes underwater +* Fixed: Slowdown rendering Alpha objects +* Fixed: Client crashes attempting to move a HUD attachment + +Release Notes for Second Life 1.13.2(57270) January 26, 2006 +Changes: +Added display that shows intersection of prims with translation plane when building. +Fixes: +* Fixed crash when changing lighting detail. +* Fixed silhouette highlight render bug. + +Release Notes for Second Life 1.13.2(57208) January 25, 2006 +Changes: +* IMPORTANT: 'First Look' now maintains its own settings. When this version is installed, settings will all be set to default values. +* IMPORTANT: Uninstalling 'First Look' will no longer remove any user settings +* More optimizations +* Stability improvements +Fixes: +* Fixed bright red/orange ambient lighting at night +* Fixed right-clicking on avatar names +* Fixed LOD flicker on trees +* Fixed missing avatar from upload window +* Fixed bug with HUD attachments not appearing or rezing at the correct resolution +* Fixed bug wit llSetPos +* Fixed prim selection silhouettes +* Fixed white invisiprim bug +* Fixed smoke texture bug +* Fixed alpha sorting issues +* Fixed Highlight Transparent + +Release Notes for Second Life 1.13.2(56900) January 18, 2006 +Changes: +* More framerate improvements +* Improved texture LOD calculation +* 'Enable VBO' option now defaults to on in most cases, and no longer conflicts with similar trunk version option +Fixes: +* Appearance of other avatars not changing +* Shiny Brightness and Darkness don't work +* Shiny doesn't work on black objects +* Textures are failing to load to 100% clarity when repeats per face is less than 1.00 +* Low res 'cutout' images not transparent + +Release Notes for Second Life 1.13.1(56671) January 11, 2006 +Changes: +* Texture Pipeline Architecture +** Significant redesign of texture pipeline +** Improved texture caching +** Unlimited texture cache size +* Render Pipeline Architecture +** Significant changes to render pipeline +** Introduction of Vertex Buffer Objects for improved stability +** Better batching of geometry for improved render performance (on some systems) +** Alpha sorting changes to improve performance +** Better particle system limits diff --git a/linden/indra/newview/res-sdl/arrow.BMP b/linden/indra/newview/res-sdl/arrow.BMP deleted file mode 100644 index a8f6da6..0000000 Binary files a/linden/indra/newview/res-sdl/arrow.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/arrowcop.BMP b/linden/indra/newview/res-sdl/arrowcop.BMP deleted file mode 100644 index 1a26a0d..0000000 Binary files a/linden/indra/newview/res-sdl/arrowcop.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/arrowcopmulti.BMP b/linden/indra/newview/res-sdl/arrowcopmulti.BMP deleted file mode 100644 index 48f153c..0000000 Binary files a/linden/indra/newview/res-sdl/arrowcopmulti.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/arrowdrag.BMP b/linden/indra/newview/res-sdl/arrowdrag.BMP deleted file mode 100644 index cd868ee..0000000 Binary files a/linden/indra/newview/res-sdl/arrowdrag.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/circleandline.BMP b/linden/indra/newview/res-sdl/circleandline.BMP deleted file mode 100644 index 284ae8b..0000000 Binary files a/linden/indra/newview/res-sdl/circleandline.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/cross.BMP b/linden/indra/newview/res-sdl/cross.BMP deleted file mode 100644 index 0b4672d..0000000 Binary files a/linden/indra/newview/res-sdl/cross.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/hand.BMP b/linden/indra/newview/res-sdl/hand.BMP deleted file mode 100644 index 2a092fb..0000000 Binary files a/linden/indra/newview/res-sdl/hand.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/ibeam.BMP b/linden/indra/newview/res-sdl/ibeam.BMP deleted file mode 100644 index 820904a..0000000 Binary files a/linden/indra/newview/res-sdl/ibeam.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/ll_icon.BMP b/linden/indra/newview/res-sdl/ll_icon.BMP deleted file mode 100644 index 4a44aaf..0000000 Binary files a/linden/indra/newview/res-sdl/ll_icon.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/llarrow.BMP b/linden/indra/newview/res-sdl/llarrow.BMP deleted file mode 100644 index a8f6da6..0000000 Binary files a/linden/indra/newview/res-sdl/llarrow.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/llarrowdrag.BMP b/linden/indra/newview/res-sdl/llarrowdrag.BMP deleted file mode 100644 index cd868ee..0000000 Binary files a/linden/indra/newview/res-sdl/llarrowdrag.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/llarrowdragmulti.BMP b/linden/indra/newview/res-sdl/llarrowdragmulti.BMP deleted file mode 100644 index fb528bc..0000000 Binary files a/linden/indra/newview/res-sdl/llarrowdragmulti.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/llarrowlocked.BMP b/linden/indra/newview/res-sdl/llarrowlocked.BMP deleted file mode 100644 index 0aaa441..0000000 Binary files a/linden/indra/newview/res-sdl/llarrowlocked.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/llgrablocked.BMP b/linden/indra/newview/res-sdl/llgrablocked.BMP deleted file mode 100644 index 8474396..0000000 Binary files a/linden/indra/newview/res-sdl/llgrablocked.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/llno.BMP b/linden/indra/newview/res-sdl/llno.BMP deleted file mode 100644 index 284ae8b..0000000 Binary files a/linden/indra/newview/res-sdl/llno.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/llnolocked.BMP b/linden/indra/newview/res-sdl/llnolocked.BMP deleted file mode 100644 index 61f0170..0000000 Binary files a/linden/indra/newview/res-sdl/llnolocked.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/lltoolcamera.BMP b/linden/indra/newview/res-sdl/lltoolcamera.BMP deleted file mode 100644 index c961d7a..0000000 Binary files a/linden/indra/newview/res-sdl/lltoolcamera.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/lltoolcreate.BMP b/linden/indra/newview/res-sdl/lltoolcreate.BMP deleted file mode 100644 index 08a4a93..0000000 Binary files a/linden/indra/newview/res-sdl/lltoolcreate.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/lltoolfocus.BMP b/linden/indra/newview/res-sdl/lltoolfocus.BMP deleted file mode 100644 index afb90a9..0000000 Binary files a/linden/indra/newview/res-sdl/lltoolfocus.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/lltoolgrab.BMP b/linden/indra/newview/res-sdl/lltoolgrab.BMP deleted file mode 100644 index f2ac68b..0000000 Binary files a/linden/indra/newview/res-sdl/lltoolgrab.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/lltoolland.BMP b/linden/indra/newview/res-sdl/lltoolland.BMP deleted file mode 100644 index 64e6365..0000000 Binary files a/linden/indra/newview/res-sdl/lltoolland.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/lltoolpan.BMP b/linden/indra/newview/res-sdl/lltoolpan.BMP deleted file mode 100644 index ffbef21..0000000 Binary files a/linden/indra/newview/res-sdl/lltoolpan.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/lltoolpipette.BMP b/linden/indra/newview/res-sdl/lltoolpipette.BMP deleted file mode 100644 index 2d27118..0000000 Binary files a/linden/indra/newview/res-sdl/lltoolpipette.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/lltoolrotate.BMP b/linden/indra/newview/res-sdl/lltoolrotate.BMP deleted file mode 100644 index dd84673..0000000 Binary files a/linden/indra/newview/res-sdl/lltoolrotate.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/lltoolscale.BMP b/linden/indra/newview/res-sdl/lltoolscale.BMP deleted file mode 100644 index 882515e..0000000 Binary files a/linden/indra/newview/res-sdl/lltoolscale.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/lltooltranslate.BMP b/linden/indra/newview/res-sdl/lltooltranslate.BMP deleted file mode 100644 index d084f6a..0000000 Binary files a/linden/indra/newview/res-sdl/lltooltranslate.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/lltoolzoomin.BMP b/linden/indra/newview/res-sdl/lltoolzoomin.BMP deleted file mode 100644 index e4e46cc..0000000 Binary files a/linden/indra/newview/res-sdl/lltoolzoomin.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/lltoolzoomout.BMP b/linden/indra/newview/res-sdl/lltoolzoomout.BMP deleted file mode 100644 index 7f95838..0000000 Binary files a/linden/indra/newview/res-sdl/lltoolzoomout.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/sizenesw.BMP b/linden/indra/newview/res-sdl/sizenesw.BMP deleted file mode 100644 index 559579f..0000000 Binary files a/linden/indra/newview/res-sdl/sizenesw.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/sizens.BMP b/linden/indra/newview/res-sdl/sizens.BMP deleted file mode 100644 index 8373077..0000000 Binary files a/linden/indra/newview/res-sdl/sizens.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/sizenwse.BMP b/linden/indra/newview/res-sdl/sizenwse.BMP deleted file mode 100644 index 6d069fa..0000000 Binary files a/linden/indra/newview/res-sdl/sizenwse.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/sizewe.BMP b/linden/indra/newview/res-sdl/sizewe.BMP deleted file mode 100644 index 878df45..0000000 Binary files a/linden/indra/newview/res-sdl/sizewe.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/toolbuy.BMP b/linden/indra/newview/res-sdl/toolbuy.BMP deleted file mode 100644 index a00bdb2..0000000 Binary files a/linden/indra/newview/res-sdl/toolbuy.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/toolopen.BMP b/linden/indra/newview/res-sdl/toolopen.BMP deleted file mode 100644 index 93c7e44..0000000 Binary files a/linden/indra/newview/res-sdl/toolopen.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/toolpay.BMP b/linden/indra/newview/res-sdl/toolpay.BMP deleted file mode 100644 index 314b93a..0000000 Binary files a/linden/indra/newview/res-sdl/toolpay.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/toolpickobject.BMP b/linden/indra/newview/res-sdl/toolpickobject.BMP deleted file mode 100644 index 25469fc..0000000 Binary files a/linden/indra/newview/res-sdl/toolpickobject.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/toolpickobject2.BMP b/linden/indra/newview/res-sdl/toolpickobject2.BMP deleted file mode 100644 index 09df69e..0000000 Binary files a/linden/indra/newview/res-sdl/toolpickobject2.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/toolpickobject3.BMP b/linden/indra/newview/res-sdl/toolpickobject3.BMP deleted file mode 100644 index fc28698..0000000 Binary files a/linden/indra/newview/res-sdl/toolpickobject3.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/toolsit.BMP b/linden/indra/newview/res-sdl/toolsit.BMP deleted file mode 100644 index ca911ec..0000000 Binary files a/linden/indra/newview/res-sdl/toolsit.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/wait.BMP b/linden/indra/newview/res-sdl/wait.BMP deleted file mode 100644 index 26dec59..0000000 Binary files a/linden/indra/newview/res-sdl/wait.BMP and /dev/null differ diff --git a/linden/indra/newview/res-sdl/working.BMP b/linden/indra/newview/res-sdl/working.BMP deleted file mode 100644 index 26dec59..0000000 Binary files a/linden/indra/newview/res-sdl/working.BMP and /dev/null differ diff --git a/linden/indra/newview/res/arrow.BMP b/linden/indra/newview/res/arrow.BMP deleted file mode 100644 index a8f6da6..0000000 Binary files a/linden/indra/newview/res/arrow.BMP and /dev/null differ diff --git a/linden/indra/newview/res/arrow.cur b/linden/indra/newview/res/arrow.cur deleted file mode 100644 index d11b688..0000000 Binary files a/linden/indra/newview/res/arrow.cur and /dev/null differ diff --git a/linden/indra/newview/res/arrowcop.cur b/linden/indra/newview/res/arrowcop.cur deleted file mode 100644 index 8b5902c..0000000 Binary files a/linden/indra/newview/res/arrowcop.cur and /dev/null differ diff --git a/linden/indra/newview/res/arrowcopmulti.cur b/linden/indra/newview/res/arrowcopmulti.cur deleted file mode 100644 index 2620522..0000000 Binary files a/linden/indra/newview/res/arrowcopmulti.cur and /dev/null differ diff --git a/linden/indra/newview/res/arrowdrag.BMP b/linden/indra/newview/res/arrowdrag.BMP deleted file mode 100644 index cd868ee..0000000 Binary files a/linden/indra/newview/res/arrowdrag.BMP and /dev/null differ diff --git a/linden/indra/newview/res/arrowdrag.cur b/linden/indra/newview/res/arrowdrag.cur deleted file mode 100644 index 77b2d1a..0000000 Binary files a/linden/indra/newview/res/arrowdrag.cur and /dev/null differ diff --git a/linden/indra/newview/res/bitmap2.bmp b/linden/indra/newview/res/bitmap2.bmp deleted file mode 100644 index 770b075..0000000 Binary files a/linden/indra/newview/res/bitmap2.bmp and /dev/null differ diff --git a/linden/indra/newview/res/circleandline.BMP b/linden/indra/newview/res/circleandline.BMP deleted file mode 100644 index 284ae8b..0000000 Binary files a/linden/indra/newview/res/circleandline.BMP and /dev/null differ diff --git a/linden/indra/newview/res/circleandline.cur b/linden/indra/newview/res/circleandline.cur deleted file mode 100644 index 00050f5..0000000 Binary files a/linden/indra/newview/res/circleandline.cur and /dev/null differ diff --git a/linden/indra/newview/res/install_icon.BMP b/linden/indra/newview/res/install_icon.BMP deleted file mode 100644 index 09df573..0000000 Binary files a/linden/indra/newview/res/install_icon.BMP and /dev/null differ diff --git a/linden/indra/newview/res/install_icon.ico b/linden/indra/newview/res/install_icon.ico deleted file mode 100644 index 5cfc56e..0000000 Binary files a/linden/indra/newview/res/install_icon.ico and /dev/null differ diff --git a/linden/indra/newview/res/ll_icon.BMP b/linden/indra/newview/res/ll_icon.BMP deleted file mode 100644 index 3a9964c..0000000 Binary files a/linden/indra/newview/res/ll_icon.BMP and /dev/null differ diff --git a/linden/indra/newview/res/ll_icon.ico b/linden/indra/newview/res/ll_icon.ico deleted file mode 100644 index c35a3fa..0000000 Binary files a/linden/indra/newview/res/ll_icon.ico and /dev/null differ diff --git a/linden/indra/newview/res/llarrow.BMP b/linden/indra/newview/res/llarrow.BMP deleted file mode 100644 index a8f6da6..0000000 Binary files a/linden/indra/newview/res/llarrow.BMP and /dev/null differ diff --git a/linden/indra/newview/res/llarrow.cur b/linden/indra/newview/res/llarrow.cur deleted file mode 100644 index 8a922d7..0000000 Binary files a/linden/indra/newview/res/llarrow.cur and /dev/null differ diff --git a/linden/indra/newview/res/llarrowdrag.BMP b/linden/indra/newview/res/llarrowdrag.BMP deleted file mode 100644 index cd868ee..0000000 Binary files a/linden/indra/newview/res/llarrowdrag.BMP and /dev/null differ diff --git a/linden/indra/newview/res/llarrowdrag.cur b/linden/indra/newview/res/llarrowdrag.cur deleted file mode 100644 index 77b2d1a..0000000 Binary files a/linden/indra/newview/res/llarrowdrag.cur and /dev/null differ diff --git a/linden/indra/newview/res/llarrowdragmulti.cur b/linden/indra/newview/res/llarrowdragmulti.cur deleted file mode 100644 index f0853b8..0000000 Binary files a/linden/indra/newview/res/llarrowdragmulti.cur and /dev/null differ diff --git a/linden/indra/newview/res/llarrowlocked.BMP b/linden/indra/newview/res/llarrowlocked.BMP deleted file mode 100644 index 0aaa441..0000000 Binary files a/linden/indra/newview/res/llarrowlocked.BMP and /dev/null differ diff --git a/linden/indra/newview/res/llarrowlocked.cur b/linden/indra/newview/res/llarrowlocked.cur deleted file mode 100644 index 5b81f14..0000000 Binary files a/linden/indra/newview/res/llarrowlocked.cur and /dev/null differ diff --git a/linden/indra/newview/res/llgrablocked.BMP b/linden/indra/newview/res/llgrablocked.BMP deleted file mode 100644 index 8474396..0000000 Binary files a/linden/indra/newview/res/llgrablocked.BMP and /dev/null differ diff --git a/linden/indra/newview/res/llgrablocked.cur b/linden/indra/newview/res/llgrablocked.cur deleted file mode 100644 index 73dea15..0000000 Binary files a/linden/indra/newview/res/llgrablocked.cur and /dev/null differ diff --git a/linden/indra/newview/res/llno.BMP b/linden/indra/newview/res/llno.BMP deleted file mode 100644 index 284ae8b..0000000 Binary files a/linden/indra/newview/res/llno.BMP and /dev/null differ diff --git a/linden/indra/newview/res/llno.cur b/linden/indra/newview/res/llno.cur deleted file mode 100644 index 00050f5..0000000 Binary files a/linden/indra/newview/res/llno.cur and /dev/null differ diff --git a/linden/indra/newview/res/llnolocked.BMP b/linden/indra/newview/res/llnolocked.BMP deleted file mode 100644 index 61f0170..0000000 Binary files a/linden/indra/newview/res/llnolocked.BMP and /dev/null differ diff --git a/linden/indra/newview/res/llnolocked.cur b/linden/indra/newview/res/llnolocked.cur deleted file mode 100644 index dfa4a05..0000000 Binary files a/linden/indra/newview/res/llnolocked.cur and /dev/null differ diff --git a/linden/indra/newview/res/lltoolcamera.BMP b/linden/indra/newview/res/lltoolcamera.BMP deleted file mode 100644 index c961d7a..0000000 Binary files a/linden/indra/newview/res/lltoolcamera.BMP and /dev/null differ diff --git a/linden/indra/newview/res/lltoolcamera.cur b/linden/indra/newview/res/lltoolcamera.cur deleted file mode 100644 index e0f1946..0000000 Binary files a/linden/indra/newview/res/lltoolcamera.cur and /dev/null differ diff --git a/linden/indra/newview/res/lltoolcreate.BMP b/linden/indra/newview/res/lltoolcreate.BMP deleted file mode 100644 index 08a4a93..0000000 Binary files a/linden/indra/newview/res/lltoolcreate.BMP and /dev/null differ diff --git a/linden/indra/newview/res/lltoolcreate.cur b/linden/indra/newview/res/lltoolcreate.cur deleted file mode 100644 index 716f328..0000000 Binary files a/linden/indra/newview/res/lltoolcreate.cur and /dev/null differ diff --git a/linden/indra/newview/res/lltoolfocus.BMP b/linden/indra/newview/res/lltoolfocus.BMP deleted file mode 100644 index afb90a9..0000000 Binary files a/linden/indra/newview/res/lltoolfocus.BMP and /dev/null differ diff --git a/linden/indra/newview/res/lltoolfocus.cur b/linden/indra/newview/res/lltoolfocus.cur deleted file mode 100644 index 7b38ad3..0000000 Binary files a/linden/indra/newview/res/lltoolfocus.cur and /dev/null differ diff --git a/linden/indra/newview/res/lltoolgrab.BMP b/linden/indra/newview/res/lltoolgrab.BMP deleted file mode 100644 index f2ac68b..0000000 Binary files a/linden/indra/newview/res/lltoolgrab.BMP and /dev/null differ diff --git a/linden/indra/newview/res/lltoolgrab.cur b/linden/indra/newview/res/lltoolgrab.cur deleted file mode 100644 index 4484001..0000000 Binary files a/linden/indra/newview/res/lltoolgrab.cur and /dev/null differ diff --git a/linden/indra/newview/res/lltoolland.BMP b/linden/indra/newview/res/lltoolland.BMP deleted file mode 100644 index 64e6365..0000000 Binary files a/linden/indra/newview/res/lltoolland.BMP and /dev/null differ diff --git a/linden/indra/newview/res/lltoolland.cur b/linden/indra/newview/res/lltoolland.cur deleted file mode 100644 index e22ef6c..0000000 Binary files a/linden/indra/newview/res/lltoolland.cur and /dev/null differ diff --git a/linden/indra/newview/res/lltoolpan.BMP b/linden/indra/newview/res/lltoolpan.BMP deleted file mode 100644 index ffbef21..0000000 Binary files a/linden/indra/newview/res/lltoolpan.BMP and /dev/null differ diff --git a/linden/indra/newview/res/lltoolpan.cur b/linden/indra/newview/res/lltoolpan.cur deleted file mode 100644 index 0a34866..0000000 Binary files a/linden/indra/newview/res/lltoolpan.cur and /dev/null differ diff --git a/linden/indra/newview/res/lltoolpipette.cur b/linden/indra/newview/res/lltoolpipette.cur deleted file mode 100644 index b478096..0000000 Binary files a/linden/indra/newview/res/lltoolpipette.cur and /dev/null differ diff --git a/linden/indra/newview/res/lltoolrotate.BMP b/linden/indra/newview/res/lltoolrotate.BMP deleted file mode 100644 index dd84673..0000000 Binary files a/linden/indra/newview/res/lltoolrotate.BMP and /dev/null differ diff --git a/linden/indra/newview/res/lltoolrotate.cur b/linden/indra/newview/res/lltoolrotate.cur deleted file mode 100644 index adbadae..0000000 Binary files a/linden/indra/newview/res/lltoolrotate.cur and /dev/null differ diff --git a/linden/indra/newview/res/lltoolscale.BMP b/linden/indra/newview/res/lltoolscale.BMP deleted file mode 100644 index 882515e..0000000 Binary files a/linden/indra/newview/res/lltoolscale.BMP and /dev/null differ diff --git a/linden/indra/newview/res/lltoolscale.cur b/linden/indra/newview/res/lltoolscale.cur deleted file mode 100644 index 4b6d20b..0000000 Binary files a/linden/indra/newview/res/lltoolscale.cur and /dev/null differ diff --git a/linden/indra/newview/res/lltooltranslate.BMP b/linden/indra/newview/res/lltooltranslate.BMP deleted file mode 100644 index d084f6a..0000000 Binary files a/linden/indra/newview/res/lltooltranslate.BMP and /dev/null differ diff --git a/linden/indra/newview/res/lltooltranslate.cur b/linden/indra/newview/res/lltooltranslate.cur deleted file mode 100644 index 2df80de..0000000 Binary files a/linden/indra/newview/res/lltooltranslate.cur and /dev/null differ diff --git a/linden/indra/newview/res/lltoolzoomin.BMP b/linden/indra/newview/res/lltoolzoomin.BMP deleted file mode 100644 index e4e46cc..0000000 Binary files a/linden/indra/newview/res/lltoolzoomin.BMP and /dev/null differ diff --git a/linden/indra/newview/res/lltoolzoomin.cur b/linden/indra/newview/res/lltoolzoomin.cur deleted file mode 100644 index 0b5d801..0000000 Binary files a/linden/indra/newview/res/lltoolzoomin.cur and /dev/null differ diff --git a/linden/indra/newview/res/lltoolzoomout.BMP b/linden/indra/newview/res/lltoolzoomout.BMP deleted file mode 100644 index 7f95838..0000000 Binary files a/linden/indra/newview/res/lltoolzoomout.BMP and /dev/null differ diff --git a/linden/indra/newview/res/lltoolzoomout.cur b/linden/indra/newview/res/lltoolzoomout.cur deleted file mode 100644 index b33e68d..0000000 Binary files a/linden/indra/newview/res/lltoolzoomout.cur and /dev/null differ diff --git a/linden/indra/newview/res/loginbackground.bmp b/linden/indra/newview/res/loginbackground.bmp deleted file mode 100644 index 288a0b0..0000000 Binary files a/linden/indra/newview/res/loginbackground.bmp and /dev/null differ diff --git a/linden/indra/newview/res/newViewRes.rc b/linden/indra/newview/res/newViewRes.rc index eeeb1eb..e544a39 100644 --- a/linden/indra/newview/res/newViewRes.rc +++ b/linden/indra/newview/res/newViewRes.rc @@ -227,8 +227,8 @@ TOOLPIPETTE CURSOR "toolpipette.cur" // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,14,0,0 - PRODUCTVERSION 1,14,0,0 + FILEVERSION 1,15,0,2 + PRODUCTVERSION 1,15,0,2 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -245,12 +245,12 @@ BEGIN BEGIN VALUE "CompanyName", "Linden Lab" VALUE "FileDescription", "Second Life" - VALUE "FileVersion", "1.14.0.0" + VALUE "FileVersion", "1.15.0.2" VALUE "InternalName", "Second Life" VALUE "LegalCopyright", "Copyright © 2001-2007, Linden Research, Inc." VALUE "OriginalFilename", "SecondLife.exe" VALUE "ProductName", "Second Life" - VALUE "ProductVersion", "1.14.0.0" + VALUE "ProductVersion", "1.15.0.2" END END BLOCK "VarFileInfo" diff --git a/linden/indra/newview/res/toolbuy.cur b/linden/indra/newview/res/toolbuy.cur deleted file mode 100644 index c61cd76..0000000 Binary files a/linden/indra/newview/res/toolbuy.cur and /dev/null differ diff --git a/linden/indra/newview/res/toolopen.cur b/linden/indra/newview/res/toolopen.cur deleted file mode 100644 index 8408f7c..0000000 Binary files a/linden/indra/newview/res/toolopen.cur and /dev/null differ diff --git a/linden/indra/newview/res/toolpay.cur b/linden/indra/newview/res/toolpay.cur deleted file mode 100644 index 93940e9..0000000 Binary files a/linden/indra/newview/res/toolpay.cur and /dev/null differ diff --git a/linden/indra/newview/res/toolpickobject.BMP b/linden/indra/newview/res/toolpickobject.BMP deleted file mode 100644 index 25469fc..0000000 Binary files a/linden/indra/newview/res/toolpickobject.BMP and /dev/null differ diff --git a/linden/indra/newview/res/toolpickobject.cur b/linden/indra/newview/res/toolpickobject.cur deleted file mode 100644 index ba482b5..0000000 Binary files a/linden/indra/newview/res/toolpickobject.cur and /dev/null differ diff --git a/linden/indra/newview/res/toolpickobject2.BMP b/linden/indra/newview/res/toolpickobject2.BMP deleted file mode 100644 index 09df69e..0000000 Binary files a/linden/indra/newview/res/toolpickobject2.BMP and /dev/null differ diff --git a/linden/indra/newview/res/toolpickobject2.cur b/linden/indra/newview/res/toolpickobject2.cur deleted file mode 100644 index b168f8d..0000000 Binary files a/linden/indra/newview/res/toolpickobject2.cur and /dev/null differ diff --git a/linden/indra/newview/res/toolpickobject3.BMP b/linden/indra/newview/res/toolpickobject3.BMP deleted file mode 100644 index fc28698..0000000 Binary files a/linden/indra/newview/res/toolpickobject3.BMP and /dev/null differ diff --git a/linden/indra/newview/res/toolpickobject3.cur b/linden/indra/newview/res/toolpickobject3.cur deleted file mode 100644 index 457c3a6..0000000 Binary files a/linden/indra/newview/res/toolpickobject3.cur and /dev/null differ diff --git a/linden/indra/newview/res/toolpipette.cur b/linden/indra/newview/res/toolpipette.cur deleted file mode 100644 index b478096..0000000 Binary files a/linden/indra/newview/res/toolpipette.cur and /dev/null differ diff --git a/linden/indra/newview/res/toolsit.cur b/linden/indra/newview/res/toolsit.cur deleted file mode 100644 index 60b0e77..0000000 Binary files a/linden/indra/newview/res/toolsit.cur and /dev/null differ diff --git a/linden/indra/newview/res/uninstall_icon.BMP b/linden/indra/newview/res/uninstall_icon.BMP deleted file mode 100644 index 562b566..0000000 Binary files a/linden/indra/newview/res/uninstall_icon.BMP and /dev/null differ diff --git a/linden/indra/newview/res/uninstall_icon.ico b/linden/indra/newview/res/uninstall_icon.ico deleted file mode 100644 index 72bf40e..0000000 Binary files a/linden/indra/newview/res/uninstall_icon.ico and /dev/null differ diff --git a/linden/indra/newview/secondlife setup build uma.bat b/linden/indra/newview/secondlife setup build uma.bat new file mode 100644 index 0000000..72c27fb --- /dev/null +++ b/linden/indra/newview/secondlife setup build uma.bat @@ -0,0 +1,4 @@ +@rem Invoke the script which preps then runs the installer. +@rem This batch file is customized per grid. + +@"secondlife setup build.bat" --grid=uma diff --git a/linden/indra/newview/secondlife setup build vaak.bat b/linden/indra/newview/secondlife setup build vaak.bat new file mode 100644 index 0000000..2036c33 --- /dev/null +++ b/linden/indra/newview/secondlife setup build vaak.bat @@ -0,0 +1,4 @@ +@rem Invoke the script which preps then runs the installer. +@rem This batch file is customized per grid. + +@"secondlife setup build.bat" --grid=vaak diff --git a/linden/indra/newview/secondlife setup build yami.bat b/linden/indra/newview/secondlife setup build yami.bat new file mode 100644 index 0000000..ffc8568 --- /dev/null +++ b/linden/indra/newview/secondlife setup build yami.bat @@ -0,0 +1,4 @@ +@rem Invoke the script which preps then runs the installer. +@rem This batch file is customized per grid. + +@"secondlife setup build.bat" --grid=yami diff --git a/linden/indra/newview/skins/textures/textures.xml b/linden/indra/newview/skins/textures/textures.xml index 5bfb4d8..89e4f53 100644 --- a/linden/indra/newview/skins/textures/textures.xml +++ b/linden/indra/newview/skins/textures/textures.xml @@ -62,6 +62,8 @@ + + @@ -160,6 +162,7 @@ + diff --git a/linden/indra/newview/skins/xui/de/alerts.xml b/linden/indra/newview/skins/xui/de/alerts.xml index d56fbc1..6364ad9 100644 --- a/linden/indra/newview/skins/xui/de/alerts.xml +++ b/linden/indra/newview/skins/xui/de/alerts.xml @@ -1969,14 +1969,6 @@ Klicken Sie auf 'Beenden', um [SECOND_LIFE] sofort zu beenden. Beenden - - - Einzelnes Objekt zur Beurteilung auswählen - - - Landkauf für die Gruppe nicht möglich: @@ -3033,14 +3025,6 @@ im Menü 'Bearbeiten'. Ablehnen - - - Eigentümer dieses Objekts kann nicht beurteilt werden, Objekt ist Eigentum einer Gruppe. - - - Diesen Benutzer mit welcher Meldung verjagen? diff --git a/linden/indra/newview/skins/xui/de/menu_pie_avatar.xml b/linden/indra/newview/skins/xui/de/menu_pie_avatar.xml index af67d3a..899057e 100644 --- a/linden/indra/newview/skins/xui/de/menu_pie_avatar.xml +++ b/linden/indra/newview/skins/xui/de/menu_pie_avatar.xml @@ -3,7 +3,6 @@ - diff --git a/linden/indra/newview/skins/xui/de/menu_pie_object.xml b/linden/indra/newview/skins/xui/de/menu_pie_object.xml index 2fae015..d73ec54 100644 --- a/linden/indra/newview/skins/xui/de/menu_pie_object.xml +++ b/linden/indra/newview/skins/xui/de/menu_pie_object.xml @@ -14,9 +14,7 @@ - - diff --git a/linden/indra/newview/skins/xui/de/panel_avatar.xml b/linden/indra/newview/skins/xui/de/panel_avatar.xml index 8ab7725..334e464 100644 --- a/linden/indra/newview/skins/xui/de/panel_avatar.xml +++ b/linden/indra/newview/skins/xui/de/panel_avatar.xml @@ -83,7 +83,6 @@ name="Show on Map" />