aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--linden/indra/newview/English.lproj/InfoPlist.strings4
-rw-r--r--linden/indra/newview/Info-SecondLife.plist2
-rw-r--r--linden/indra/newview/app_settings/keys.ini22
-rw-r--r--linden/indra/newview/featuretable_linux.txt173
-rw-r--r--linden/indra/newview/files.lst1
-rw-r--r--linden/indra/newview/gpu_table.txt8
-rw-r--r--linden/indra/newview/linux_tools/client-readme.txt1
-rwxr-xr-xlinden/indra/newview/linux_tools/launch_url.sh2
-rwxr-xr-xlinden/indra/newview/linux_tools/wrapper.sh2
-rw-r--r--linden/indra/newview/llagent.cpp2
-rw-r--r--linden/indra/newview/llassetuploadresponders.cpp2
-rw-r--r--linden/indra/newview/llcallingcard.cpp31
-rw-r--r--linden/indra/newview/llchatbar.cpp3
-rw-r--r--linden/indra/newview/llcontroldef.cpp15
-rw-r--r--linden/indra/newview/lldebugmessagebox.cpp22
-rw-r--r--linden/indra/newview/lldrawpoolavatar.cpp11
-rw-r--r--linden/indra/newview/lldriverparam.cpp2
-rw-r--r--linden/indra/newview/lleventpoll.cpp2
-rw-r--r--linden/indra/newview/llfasttimerview.cpp9
-rw-r--r--linden/indra/newview/llfeaturemanager.cpp2
-rw-r--r--linden/indra/newview/llfilepicker.cpp15
-rw-r--r--linden/indra/newview/llfloateranimpreview.cpp8
-rw-r--r--linden/indra/newview/llfloateravatarinfo.cpp6
-rw-r--r--linden/indra/newview/llfloaterfriends.cpp4
-rw-r--r--linden/indra/newview/llfloatergroupinfo.cpp4
-rw-r--r--linden/indra/newview/llfloaterhtml.cpp22
-rw-r--r--linden/indra/newview/llfloaterhtml.h4
-rw-r--r--linden/indra/newview/llfloaterimport.cpp8
-rw-r--r--linden/indra/newview/llfloaterinspect.cpp80
-rw-r--r--linden/indra/newview/llfloaterland.cpp37
-rw-r--r--linden/indra/newview/llfloaternamedesc.cpp9
-rw-r--r--linden/indra/newview/llfloaternewim.cpp11
-rw-r--r--linden/indra/newview/llfloaterpreference.cpp60
-rw-r--r--linden/indra/newview/llfloaterpreference.h1
-rw-r--r--linden/indra/newview/llfloaterregioninfo.cpp19
-rw-r--r--linden/indra/newview/llfloaterreporter.cpp5
-rw-r--r--[-rwxr-xr-x]linden/indra/newview/llfloatersellland.cpp0
-rw-r--r--[-rwxr-xr-x]linden/indra/newview/llfloatersellland.h0
-rw-r--r--linden/indra/newview/llfloatersnapshot.cpp2
-rw-r--r--linden/indra/newview/llfloatertest.cpp3
-rw-r--r--linden/indra/newview/llfloatertools.cpp2
-rw-r--r--linden/indra/newview/llfloatertos.cpp1
-rw-r--r--linden/indra/newview/llfolderview.cpp668
-rw-r--r--linden/indra/newview/llfolderview.h49
-rw-r--r--linden/indra/newview/llgenepool.cpp8
-rw-r--r--linden/indra/newview/llgivemoney.cpp13
-rw-r--r--linden/indra/newview/llglsandbox.cpp2
-rw-r--r--linden/indra/newview/llglslshader.cpp4
-rw-r--r--linden/indra/newview/llgroupnotify.cpp12
-rw-r--r--linden/indra/newview/llhoverview.cpp1
-rw-r--r--linden/indra/newview/llhudeffecttrail.cpp8
-rw-r--r--linden/indra/newview/llimview.cpp67
-rw-r--r--linden/indra/newview/llimview.h4
-rw-r--r--linden/indra/newview/llinventoryactions.cpp17
-rw-r--r--linden/indra/newview/llinventorybridge.cpp85
-rw-r--r--[-rwxr-xr-x]linden/indra/newview/llinventorybridge.h0
-rw-r--r--linden/indra/newview/llinventorymodel.cpp134
-rw-r--r--linden/indra/newview/llinventorymodel.h29
-rw-r--r--linden/indra/newview/llinventoryview.cpp74
-rw-r--r--linden/indra/newview/llnetmap.cpp2
-rw-r--r--linden/indra/newview/llpanelavatar.cpp59
-rw-r--r--linden/indra/newview/llpanelcontents.cpp16
-rw-r--r--linden/indra/newview/llpaneldisplay.cpp14
-rw-r--r--linden/indra/newview/llpaneldisplay.h3
-rw-r--r--linden/indra/newview/llpanelface.cpp35
-rw-r--r--linden/indra/newview/llpanelgeneral.cpp13
-rw-r--r--linden/indra/newview/llpanelgeneral.h2
-rw-r--r--linden/indra/newview/llpanelgroup.cpp2
-rw-r--r--linden/indra/newview/llpanelgroupgeneral.cpp28
-rw-r--r--linden/indra/newview/llpanelgroupnotices.cpp8
-rw-r--r--linden/indra/newview/llpanelgrouproles.cpp23
-rw-r--r--linden/indra/newview/llpanelinventory.cpp113
-rw-r--r--linden/indra/newview/llpanelmsgs.cpp25
-rw-r--r--linden/indra/newview/llpanelpermissions.cpp17
-rw-r--r--linden/indra/newview/llpatchvertexarray.cpp10
-rw-r--r--linden/indra/newview/llpolymesh.cpp32
-rw-r--r--linden/indra/newview/llpolymorph.cpp12
-rw-r--r--linden/indra/newview/llpreview.cpp24
-rw-r--r--linden/indra/newview/llpreview.h6
-rw-r--r--linden/indra/newview/llpreviewgesture.cpp7
-rw-r--r--linden/indra/newview/llpreviewnotecard.cpp11
-rw-r--r--linden/indra/newview/llpreviewscript.cpp28
-rw-r--r--linden/indra/newview/llpreviewtexture.cpp63
-rw-r--r--linden/indra/newview/llresourcedata.h44
-rw-r--r--linden/indra/newview/llselectmgr.cpp110
-rw-r--r--linden/indra/newview/llselectmgr.h1
-rw-r--r--linden/indra/newview/llspatialpartition.cpp7
-rw-r--r--linden/indra/newview/llstartup.cpp4
-rw-r--r--linden/indra/newview/llstartup.h1
-rw-r--r--linden/indra/newview/llstatusbar.cpp5
-rw-r--r--linden/indra/newview/llstatusbar.h3
-rw-r--r--linden/indra/newview/lltexlayer.cpp2
-rw-r--r--linden/indra/newview/lltexturectrl.cpp43
-rw-r--r--linden/indra/newview/lltooldraganddrop.cpp18
-rw-r--r--linden/indra/newview/lltoolgrab.cpp8
-rw-r--r--linden/indra/newview/lltoolpie.cpp8
-rw-r--r--[-rwxr-xr-x]linden/indra/newview/lltoolpipette.cpp0
-rw-r--r--[-rwxr-xr-x]linden/indra/newview/lltoolpipette.h0
-rw-r--r--linden/indra/newview/llviewerassetstorage.cpp13
-rw-r--r--linden/indra/newview/llviewercontrol.cpp8
-rw-r--r--linden/indra/newview/llviewerdisplay.cpp6
-rw-r--r--linden/indra/newview/llviewergenericmessage.cpp154
-rw-r--r--linden/indra/newview/llviewergenericmessage.h52
-rw-r--r--linden/indra/newview/llviewerimagelist.cpp38
-rw-r--r--linden/indra/newview/llviewerinventory.cpp4
-rw-r--r--linden/indra/newview/llviewerjointmesh.cpp8
-rw-r--r--linden/indra/newview/llviewerkeyboard.cpp13
-rw-r--r--linden/indra/newview/llviewermenu.cpp993
-rw-r--r--linden/indra/newview/llviewermenu.h29
-rw-r--r--linden/indra/newview/llviewermenufile.cpp1022
-rw-r--r--linden/indra/newview/llviewermenufile.h59
-rw-r--r--linden/indra/newview/llviewermessage.cpp520
-rw-r--r--linden/indra/newview/llviewermessage.h9
-rw-r--r--linden/indra/newview/llviewerobject.cpp29
-rw-r--r--linden/indra/newview/llviewerparceloverlay.cpp15
-rw-r--r--linden/indra/newview/llviewerwindow.cpp23
-rw-r--r--linden/indra/newview/llvlcomposition.cpp7
-rw-r--r--linden/indra/newview/llvoavatar.cpp6
-rw-r--r--linden/indra/newview/llvoclouds.cpp12
-rw-r--r--linden/indra/newview/llvopartgroup.cpp13
-rw-r--r--linden/indra/newview/llwindebug.cpp2
-rw-r--r--linden/indra/newview/llworldmap.cpp2
-rw-r--r--linden/indra/newview/llworldmapview.cpp1
-rw-r--r--linden/indra/newview/macview.xcodeproj/project.pbxproj14
-rw-r--r--linden/indra/newview/newview.vcproj12
-rw-r--r--linden/indra/newview/newview_vc8.vcproj76
-rw-r--r--linden/indra/newview/pipeline.cpp12
-rw-r--r--linden/indra/newview/releasenotes.txt50
-rw-r--r--linden/indra/newview/res/newViewRes.rc8
-rw-r--r--linden/indra/newview/secondlife setup build uma.bat8
-rw-r--r--linden/indra/newview/secondlife setup build vaak.bat8
-rw-r--r--linden/indra/newview/secondlife setup build yami.bat8
-rw-r--r--linden/indra/newview/skins/xui/en-us/alerts.xml820
-rw-r--r--linden/indra/newview/skins/xui/en-us/floater_avatar_picker.xml4
-rw-r--r--[-rwxr-xr-x]linden/indra/newview/skins/xui/en-us/floater_inventory.xml5
-rw-r--r--linden/indra/newview/skins/xui/en-us/floater_lsl_guide.xml30
-rw-r--r--linden/indra/newview/skins/xui/en-us/floater_mute.xml4
-rw-r--r--[-rwxr-xr-x]linden/indra/newview/skins/xui/en-us/floater_sell_land.xml0
-rw-r--r--[-rwxr-xr-x]linden/indra/newview/skins/xui/en-us/menu_inventory.xml0
-rw-r--r--[-rwxr-xr-x]linden/indra/newview/skins/xui/en-us/menu_pie_attachment.xml0
-rw-r--r--[-rwxr-xr-x]linden/indra/newview/skins/xui/en-us/menu_pie_avatar.xml0
-rw-r--r--[-rwxr-xr-x]linden/indra/newview/skins/xui/en-us/menu_pie_land.xml0
-rw-r--r--[-rwxr-xr-x]linden/indra/newview/skins/xui/en-us/menu_pie_object.xml0
-rw-r--r--[-rwxr-xr-x]linden/indra/newview/skins/xui/en-us/menu_pie_self.xml0
-rw-r--r--[-rwxr-xr-x]linden/indra/newview/skins/xui/en-us/menu_viewer.xml45
-rw-r--r--linden/indra/newview/skins/xui/en-us/notify.xml4
-rw-r--r--linden/indra/newview/skins/xui/en-us/panel_preferences_general.xml7
-rw-r--r--linden/indra/newview/skins/xui/en-us/panel_preferences_graphics3.xml7
-rw-r--r--linden/indra/newview/skins/xui/en-us/panel_status_bar.xml2
-rw-r--r--linden/indra/newview/viewer.cpp36
-rw-r--r--linden/indra/newview/viewer.h34
-rwxr-xr-xlinden/indra/newview/viewer_manifest.py5
152 files changed, 4032 insertions, 2804 deletions
diff --git a/linden/indra/newview/English.lproj/InfoPlist.strings b/linden/indra/newview/English.lproj/InfoPlist.strings
index 54687b1..e9cd858 100644
--- a/linden/indra/newview/English.lproj/InfoPlist.strings
+++ b/linden/indra/newview/English.lproj/InfoPlist.strings
@@ -1,5 +1,5 @@
1/* Localized versions of Info.plist keys */ 1/* Localized versions of Info.plist keys */
2 2
3CFBundleName = "Second Life"; 3CFBundleName = "Second Life";
4CFBundleShortVersionString = "Second Life version 1.15.0.2"; 4CFBundleShortVersionString = "Second Life version 1.15.1.3";
5CFBundleGetInfoString = "Second Life version 1.15.0.2, Copyright 2004-2007 Linden Research, Inc."; 5CFBundleGetInfoString = "Second Life version 1.15.1.3, Copyright 2004-2007 Linden Research, Inc.";
diff --git a/linden/indra/newview/Info-SecondLife.plist b/linden/indra/newview/Info-SecondLife.plist
index 0908e18..108f716 100644
--- a/linden/indra/newview/Info-SecondLife.plist
+++ b/linden/indra/newview/Info-SecondLife.plist
@@ -32,7 +32,7 @@
32 </dict> 32 </dict>
33 </array> 33 </array>
34 <key>CFBundleVersion</key> 34 <key>CFBundleVersion</key>
35 <string>1.15.0.2</string> 35 <string>1.15.1.3</string>
36 <key>CSResourcesFileMapped</key> 36 <key>CSResourcesFileMapped</key>
37 <true/> 37 <true/>
38</dict> 38</dict>
diff --git a/linden/indra/newview/app_settings/keys.ini b/linden/indra/newview/app_settings/keys.ini
index b7fc6f9..3a1e9ea 100644
--- a/linden/indra/newview/app_settings/keys.ini
+++ b/linden/indra/newview/app_settings/keys.ini
@@ -235,6 +235,13 @@ EDIT PAD_PGUP ALT jump
235EDIT PAD_PGDN ALT push_down 235EDIT PAD_PGDN ALT push_down
236EDIT PAD_ENTER ALT start_chat 236EDIT PAD_ENTER ALT start_chat
237 237
238SITTING A ALT spin_around_cw
239SITTING D ALT spin_around_ccw
240SITTING W ALT move_forward
241SITTING S ALT move_backward
242SITTING E ALT spin_over_sitting
243SITTING C ALT spin_under_sitting
244
238SITTING LEFT ALT spin_around_cw 245SITTING LEFT ALT spin_around_cw
239SITTING RIGHT ALT spin_around_ccw 246SITTING RIGHT ALT spin_around_ccw
240SITTING UP ALT move_forward 247SITTING UP ALT move_forward
@@ -242,6 +249,21 @@ SITTING DOWN ALT move_backward
242SITTING PGUP ALT spin_over 249SITTING PGUP ALT spin_over
243SITTING PGDN ALT spin_under 250SITTING PGDN ALT spin_under
244 251
252SITTING A CTL_ALT spin_around_cw
253SITTING D CTL_ALT spin_around_ccw
254SITTING W CTL_ALT spin_over
255SITTING S CTL_ALT spin_under
256SITTING E CTL_ALT spin_over
257SITTING C CTL_ALT spin_under
258
259SITTING LEFT CTL_ALT spin_around_cw
260SITTING RIGHT CTL_ALT spin_around_ccw
261SITTING UP CTL_ALT spin_over
262SITTING DOWN CTL_ALT spin_under
263SITTING PGUP CTL_ALT spin_over
264SITTING PGDN CTL_ALT spin_under
265
266
245SITTING A NONE spin_around_cw_sitting 267SITTING A NONE spin_around_cw_sitting
246SITTING D NONE spin_around_ccw_sitting 268SITTING D NONE spin_around_ccw_sitting
247SITTING W NONE move_forward_sitting 269SITTING W NONE move_forward_sitting
diff --git a/linden/indra/newview/featuretable_linux.txt b/linden/indra/newview/featuretable_linux.txt
new file mode 100644
index 0000000..6c7acfa
--- /dev/null
+++ b/linden/indra/newview/featuretable_linux.txt
@@ -0,0 +1,173 @@
1version 10
2
3// NOTE: This is mostly identical to featuretable.txt with a few differences
4// Should be combined into one table
5
6//
7// Generates lists of feature mask that can be applied on top of each other.
8//
9// // Begin comments
10// list <name>
11// Starts a feature list named <name>
12// <name> <available> <recommended>
13// <name> is the name of a feature
14// <available> is 0 or 1, whether the feature is available
15// <recommended> is an S32 which is the recommended value
16//
17// For now, the first list read sets up all of the default values
18//
19
20
21//
22// All contains everything at their default settings for high end machines
23// NOTE: All settings are set to the MIN of applied values, including 'all'!
24//
25list all
26RenderVBO 1 1
27RenderAniso 1 0
28RenderAvatarMode 1 2
29RenderAvatarVP 1 1
30RenderDistance 1 128
31RenderLighting 1 1
32RenderObjectBump 1 1
33RenderParticleCount 1 4096
34RenderRippleWater 1 1
35RenderTerrainDetail 1 2
36VertexShaderEnable 1 1
37
38//
39// Class 0 Hardware (Unknown or just old)
40//
41list Class0
42VertexShaderEnable 1 0
43RenderVBO 1 0
44RenderDistance 1 64
45RenderAvatarVP 1 0
46RenderAvatarMode 1 0
47RenderLighting 1 0
48RenderObjectBump 1 0
49RenderRippleWater 1 0
50
51//
52// Class 1 Hardware
53//
54list Class1
55VertexShaderEnable 1 0
56RenderVBO 1 1
57RenderDistance 1 96
58RenderAvatarVP 1 1
59RenderAvatarMode 1 0
60RenderLighting 1 0
61RenderObjectBump 1 0
62RenderRippleWater 1 0
63
64//
65// Class 2 Hardware (make it purty)
66//
67list Class2
68VertexShaderEnable 1 1
69RenderAvatarVP 1 1
70RenderAvatarMode 1 1
71RenderLighting 1 1
72RenderObjectBump 1 1
73RenderRippleWater 1 1
74
75//
76// Class 3 Hardware (make it purty)
77//
78list Class3
79VertexShaderEnable 1 1
80RenderAvatarVP 1 1
81RenderAvatarMode 1 1
82RenderLighting 1 1
83RenderObjectBump 1 1
84RenderRippleWater 1 1
85
86//
87// No Pixel Shaders available
88//
89list NoPixelShaders
90VertexShaderEnable 0 0
91RenderAvatarVP 0 0
92
93//
94// No Vertex Shaders available
95//
96list NoVertexShaders
97VertexShaderEnable 0 0
98RenderAvatarVP 0 0
99
100//
101// "Default" setups for safe, low, medium, high
102//
103list safe
104RenderVBO 1 0
105RenderAniso 1 0
106RenderAvatarVP 0 0
107RenderLighting 1 0
108RenderParticleCount 1 1024
109RenderTerrainDetail 1 0
110
111
112list low
113RenderVBO 1 0
114RenderAniso 1 0
115RenderLighting 1 0
116
117list medium
118RenderLighting 1 0
119
120
121//
122// CPU based feature masks
123//
124
125// 1Ghz or less (equiv)
126list CPUSlow
127RenderParticleCount 1 1024
128
129
130//
131// RAM based feature masks
132//
133list RAM256MB
134RenderObjectBump 0 0
135
136
137//
138// Graphics card based feature masks
139//
140list OpenGLPre15
141RenderVBO 1 0
142
143list Intel
144RenderVBO 1 0
145RenderAniso 1 0
146RenderLighting 1 0
147RenderTerrainDetail 1 0
148
149list GeForce2
150RenderVBO 1 1
151RenderAniso 1 0
152RenderLighting 1 0
153RenderParticleCount 1 2048
154RenderTerrainDetail 1 0
155
156list GeForce3
157
158list ATI
159
160list Radeon8500
161RenderLighting 1 0
162RenderParticleCount 1 4096
163
164// Hacked to be paranoid "safe"
165list Radeon9700
166RenderParticleCount 1 4096
167
168// Hacked to be paranoid "safe"
169list MobilityRadeon9000
170RenderLighting 1 0
171RenderParticleCount 1 4096
172
173list GeForceFX
diff --git a/linden/indra/newview/files.lst b/linden/indra/newview/files.lst
index 8fdd239..2967bed 100644
--- a/linden/indra/newview/files.lst
+++ b/linden/indra/newview/files.lst
@@ -282,6 +282,7 @@ newview/llviewerjoystick.cpp
282newview/llviewerkeyboard.cpp 282newview/llviewerkeyboard.cpp
283newview/llviewerlayer.cpp 283newview/llviewerlayer.cpp
284newview/llviewermenu.cpp 284newview/llviewermenu.cpp
285newview/llviewermenufile.cpp
285newview/llviewermessage.cpp 286newview/llviewermessage.cpp
286newview/llviewernetwork.cpp 287newview/llviewernetwork.cpp
287newview/llviewerobject.cpp 288newview/llviewerobject.cpp
diff --git a/linden/indra/newview/gpu_table.txt b/linden/indra/newview/gpu_table.txt
index 4e6373d..a6d1dee 100644
--- a/linden/indra/newview/gpu_table.txt
+++ b/linden/indra/newview/gpu_table.txt
@@ -22,11 +22,9 @@ ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3
22ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3 22ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3
23ATI ASUS X1xxx .*ASUS X1.* 3 23ATI ASUS X1xxx .*ASUS X1.* 3
24ATI Mobility Radeon X1xxx .*ATI.*Mobility.*X1.* 2 24ATI Mobility Radeon X1xxx .*ATI.*Mobility.*X1.* 2
25// HACK: We crash on startup on some Mobility Radeon chips, with 1.15.0 25ATI Mobility Radeon X3xx .*ATI.*Mobility.*X3.* 1
26// in FMOD (!). Try defaulting them to class 0. JC 26ATI Mobility Radeon X6xx .*ATI.*Mobility.*X6.* 1
27ATI Mobility Radeon X3xx .*ATI.*Mobility.*X3.* 0 27ATI Mobility Radeon X7xx .*ATI.*Mobility.*X7.* 1
28ATI Mobility Radeon X6xx .*ATI.*Mobility.*X6.* 0
29ATI Mobility Radeon X7xx .*ATI.*Mobility.*X7.* 0
30ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 3 28ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 3
31ATI Diamond X1xxx .*ATI.*Diamond.*X1.* 3 29ATI Diamond X1xxx .*ATI.*Diamond.*X1.* 3
32ATI FireGL 5xxx .*ATI.*FireGL V5.* 3 30ATI FireGL 5xxx .*ATI.*FireGL V5.* 3
diff --git a/linden/indra/newview/linux_tools/client-readme.txt b/linden/indra/newview/linux_tools/client-readme.txt
index cabb034..63086c8 100644
--- a/linden/indra/newview/linux_tools/client-readme.txt
+++ b/linden/indra/newview/linux_tools/client-readme.txt
@@ -97,7 +97,6 @@ the Alpha release of the Linux client.
97 implemented on the Linux client and are therefore known not to work properly 97 implemented on the Linux client and are therefore known not to work properly
98 at this time: 98 at this time:
99 * QuickTime movie playback and movie recording 99 * QuickTime movie playback and movie recording
100 * Video memory detection
101 * Full Unicode font rendering 100 * Full Unicode font rendering
102 * Auto-updater 101 * Auto-updater
103 102
diff --git a/linden/indra/newview/linux_tools/launch_url.sh b/linden/indra/newview/linux_tools/launch_url.sh
index 564e834..a1c6f5d 100755
--- a/linden/indra/newview/linux_tools/launch_url.sh
+++ b/linden/indra/newview/linux_tools/launch_url.sh
@@ -1,5 +1,5 @@
1#!/bin/sh 1#!/bin/sh
2# bash v1.14+ expected 2# Script tested with: bash 1.14, bash 3.1.17, zsh 4.2.5, ksh 1993-12-28
3 3
4# This script loads a web page in the 'default' graphical web browser. 4# This script loads a web page in the 'default' graphical web browser.
5# It MUST return immediately (or soon), so the browser should be 5# It MUST return immediately (or soon), so the browser should be
diff --git a/linden/indra/newview/linux_tools/wrapper.sh b/linden/indra/newview/linux_tools/wrapper.sh
index cdc36a8..5f128e8 100755
--- a/linden/indra/newview/linux_tools/wrapper.sh
+++ b/linden/indra/newview/linux_tools/wrapper.sh
@@ -1,4 +1,6 @@
1#!/bin/sh 1#!/bin/sh
2# Script tested with: bash 1.14, bash 3.1.17, zsh 4.2.5, ksh 1993-12-28
3
2## Here are some configuration options for Linux Client Alpha Testers. 4## Here are some configuration options for Linux Client Alpha Testers.
3## These options are for self-assisted troubleshooting during this alpha 5## These options are for self-assisted troubleshooting during this alpha
4## testing phase; you should not usually need to touch them. 6## testing phase; you should not usually need to touch them.
diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp
index ff16682..85c268b 100644
--- a/linden/indra/newview/llagent.cpp
+++ b/linden/indra/newview/llagent.cpp
@@ -7081,7 +7081,7 @@ void LLAgent::queryWearableCache()
7081 // Look up affected baked textures. 7081 // Look up affected baked textures.
7082 // If they exist: 7082 // If they exist:
7083 // disallow updates for affected layersets (until dataserver responds with cache request.) 7083 // disallow updates for affected layersets (until dataserver responds with cache request.)
7084 // If cache missturn updates back on and invalidate composite. 7084 // If cache miss, turn updates back on and invalidate composite.
7085 // If cache hit, modify baked texture entries. 7085 // If cache hit, modify baked texture entries.
7086 // 7086 //
7087 // Cache requests contain list of hashes for each baked texture entry. 7087 // Cache requests contain list of hashes for each baked texture entry.
diff --git a/linden/indra/newview/llassetuploadresponders.cpp b/linden/indra/newview/llassetuploadresponders.cpp
index 821bb2a..26c606f 100644
--- a/linden/indra/newview/llassetuploadresponders.cpp
+++ b/linden/indra/newview/llassetuploadresponders.cpp
@@ -21,7 +21,7 @@
21#include "lluploaddialog.h" 21#include "lluploaddialog.h"
22#include "llviewerobject.h" 22#include "llviewerobject.h"
23#include "llviewerobjectlist.h" 23#include "llviewerobjectlist.h"
24#include "llviewermenu.h" 24#include "llviewermenufile.h"
25#include "llviewerwindow.h" 25#include "llviewerwindow.h"
26#include "viewer.h" 26#include "viewer.h"
27 27
diff --git a/linden/indra/newview/llcallingcard.cpp b/linden/indra/newview/llcallingcard.cpp
index 22e7f23..3e00f40 100644
--- a/linden/indra/newview/llcallingcard.cpp
+++ b/linden/indra/newview/llcallingcard.cpp
@@ -269,12 +269,28 @@ S32 LLAvatarTracker::addBuddyList(const LLAvatarTracker::buddy_map_t& buds)
269 for(buddy_map_t::const_iterator itr = buds.begin(); itr != buds.end(); ++itr) 269 for(buddy_map_t::const_iterator itr = buds.begin(); itr != buds.end(); ++itr)
270 { 270 {
271 agent_id = (*itr).first; 271 agent_id = (*itr).first;
272 if(mBuddyInfo.find(agent_id) == mBuddyInfo.end()) 272 buddy_map_t::const_iterator existing_buddy = mBuddyInfo.find(agent_id);
273 if(existing_buddy == mBuddyInfo.end())
273 { 274 {
274 ++new_buddy_count; 275 ++new_buddy_count;
275 mBuddyInfo[agent_id] = (*itr).second; 276 mBuddyInfo[agent_id] = (*itr).second;
276 gCacheName->getName(agent_id, first, last); 277 gCacheName->getName(agent_id, first, last);
277 mModifyMask |= LLFriendObserver::ADD; 278 mModifyMask |= LLFriendObserver::ADD;
279 lldebugs << "Added buddy " << agent_id
280 << ", " << (mBuddyInfo[agent_id]->isOnline() ? "Online" : "Offline")
281 << ", TO: " << mBuddyInfo[agent_id]->getRightsGrantedTo()
282 << ", FROM: " << mBuddyInfo[agent_id]->getRightsGrantedFrom()
283 << llendl;
284 }
285 else
286 {
287 LLRelationship* e_r = (*existing_buddy).second;
288 LLRelationship* n_r = (*itr).second;
289 llwarns << "!! Add buddy for existing buddy: " << agent_id
290 << " [" << (e_r->isOnline() ? "Online" : "Offline") << "->" << (n_r->isOnline() ? "Online" : "Offline")
291 << ", " << e_r->getRightsGrantedTo() << "->" << n_r->getRightsGrantedTo()
292 << ", " << e_r->getRightsGrantedTo() << "->" << n_r->getRightsGrantedTo()
293 << "]" << llendl;
278 } 294 }
279 } 295 }
280 296
@@ -325,6 +341,12 @@ void LLAvatarTracker::setBuddyOnline(const LLUUID& id, bool is_online)
325 { 341 {
326 info->online(is_online); 342 info->online(is_online);
327 mModifyMask |= LLFriendObserver::ONLINE; 343 mModifyMask |= LLFriendObserver::ONLINE;
344 lldebugs << "Set buddy " << id << (is_online ? " Online" : " Offline") << llendl;
345 }
346 else
347 {
348 llwarns << "!! No buddy info found for " << id
349 << ", setting to " << (is_online ? "Online" : "Offline") << llendl;
328 } 350 }
329} 351}
330 352
@@ -598,6 +620,7 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
598 S32 count = msg->getNumberOfBlocksFast(_PREHASH_AgentBlock); 620 S32 count = msg->getNumberOfBlocksFast(_PREHASH_AgentBlock);
599 BOOL chat_notify = gSavedSettings.getBOOL("ChatOnlineNotification"); 621 BOOL chat_notify = gSavedSettings.getBOOL("ChatOnlineNotification");
600 622
623 lldebugs << "Received " << count << " online notifications **** " << llendl;
601 if(count > 0) 624 if(count > 0)
602 { 625 {
603 LLUUID agent_id; 626 LLUUID agent_id;
@@ -628,6 +651,12 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
628 } 651 }
629 } 652 }
630 } 653 }
654 else
655 {
656 llwarns << "Received online notification for unknown buddy: "
657 << agent_id << " is " << (online ? "ONLINE" : "OFFLINE") << llendl;
658 }
659
631 if(tracking_id == agent_id) 660 if(tracking_id == agent_id)
632 { 661 {
633 // we were tracking someone who went offline 662 // we were tracking someone who went offline
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index 02bed33..a6feac7 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -118,9 +118,10 @@ LLChatBar::LLChatBar(const std::string& name, const LLRect& rect)
118 mInputEditor->setRevertOnEsc( FALSE ); 118 mInputEditor->setRevertOnEsc( FALSE );
119 mInputEditor->setIgnoreTab(TRUE); 119 mInputEditor->setIgnoreTab(TRUE);
120 mInputEditor->setPassDelete(TRUE); 120 mInputEditor->setPassDelete(TRUE);
121
122 mInputEditor->setMaxTextLength(1023);
121 } 123 }
122 124
123 mInputEditor->setMaxTextLength(1023);
124 // Build the list of gestures 125 // Build the list of gestures
125 refreshGestures(); 126 refreshGestures();
126 127
diff --git a/linden/indra/newview/llcontroldef.cpp b/linden/indra/newview/llcontroldef.cpp
index 7989791..11b97b4 100644
--- a/linden/indra/newview/llcontroldef.cpp
+++ b/linden/indra/newview/llcontroldef.cpp
@@ -573,7 +573,7 @@ void declare_settings()
573 573
574 gSavedSettings.declareBOOL("ShowAxes", FALSE, "Render coordinate frame at your position"); 574 gSavedSettings.declareBOOL("ShowAxes", FALSE, "Render coordinate frame at your position");
575 575
576 gSavedSettings.declareBOOL("ShowMiniMap", FALSE, "Display mini map on login"); 576 gSavedSettings.declareBOOL("ShowMiniMap", TRUE, "Display mini map on login");
577 gSavedSettings.declareBOOL("ShowWorldMap", FALSE, "Display world map on login"); 577 gSavedSettings.declareBOOL("ShowWorldMap", FALSE, "Display world map on login");
578 gSavedSettings.declareBOOL("ShowToolBar", TRUE, "Show toolbar at bottom of screen"); 578 gSavedSettings.declareBOOL("ShowToolBar", TRUE, "Show toolbar at bottom of screen");
579 gSavedSettings.declareBOOL("ShowCameraControls", FALSE, "Display camera controls on login"); 579 gSavedSettings.declareBOOL("ShowCameraControls", FALSE, "Display camera controls on login");
@@ -833,7 +833,7 @@ void declare_settings()
833 // Previews - only width and height are used 833 // Previews - only width and height are used
834 gSavedSettings.declareRect("PreviewTextureRect", LLRect(0, 400, 400, 0), "Rectangle for texture preview window" ); // Only width and height are used 834 gSavedSettings.declareRect("PreviewTextureRect", LLRect(0, 400, 400, 0), "Rectangle for texture preview window" ); // Only width and height are used
835 gSavedSettings.declareRect("PreviewScriptRect", LLRect(0, 550, 500, 0), "Rectangle for script preview window" ); // Only width and height are used 835 gSavedSettings.declareRect("PreviewScriptRect", LLRect(0, 550, 500, 0), "Rectangle for script preview window" ); // Only width and height are used
836 gSavedSettings.declareRect("LSLHelpRect", LLRect(0, 500, 600, 0), "Rectangle for LSL help window" ); // Only width and height are used 836 gSavedSettings.declareRect("LSLHelpRect", LLRect(0, 400, 400, 0), "Rectangle for LSL help window" ); // Only width and height are used
837 gSavedSettings.declareRect("PreviewLandmarkRect", LLRect(0, 90, 300, 0), "Rectangle for landmark preview window" ); // Only width and height are used 837 gSavedSettings.declareRect("PreviewLandmarkRect", LLRect(0, 90, 300, 0), "Rectangle for landmark preview window" ); // Only width and height are used
838 gSavedSettings.declareRect("PreviewSoundRect", LLRect(0, 85, 300, 0), "Rectangle for sound preview window" ); // Only width and height are used 838 gSavedSettings.declareRect("PreviewSoundRect", LLRect(0, 85, 300, 0), "Rectangle for sound preview window" ); // Only width and height are used
839 gSavedSettings.declareRect("PreviewObjectRect", LLRect(0, 85, 300, 0), "Rectangle for object preview window" ); // Only width and height are used 839 gSavedSettings.declareRect("PreviewObjectRect", LLRect(0, 85, 300, 0), "Rectangle for object preview window" ); // Only width and height are used
@@ -1145,15 +1145,18 @@ void declare_settings()
1145 1145
1146 1146
1147 gSavedSettings.declareBOOL("NotifyMoneyChange", TRUE, "Pop up notifications for all financial transactions"); 1147 gSavedSettings.declareBOOL("NotifyMoneyChange", TRUE, "Pop up notifications for all financial transactions");
1148 gSavedSettings.declareBOOL("ShowNewInventory", TRUE,
1149 "Automatic Previews of new notecards/textures/landmarks");
1148 1150
1149 // Bitfield 1151 // Bitfield
1150 // 1 = by date 1152 // 1 = by date
1151 // 2 = folders always by name 1153 // 2 = folders always by name
1154 // 4 = system folders to top
1152 // This where the default first time user gets his settings. 1155 // This where the default first time user gets his settings.
1153 gSavedSettings.declareU32("InventorySortOrder", 1 | 2, "Specifies sort key for inventory items (+0 = name, +1 = date, +2 = folders always by name)"); 1156 gSavedSettings.declareU32("InventorySortOrder", 1 | 2 | 4, "Specifies sort key for inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)");
1154 gSavedSettings.declareU32("RecentItemsSortOrder", 1, "Specifies sort key for recent inventory items (+0 = name, +1 = date, +2 = folders always by name)"); 1157 gSavedSettings.declareU32("RecentItemsSortOrder", 1, "Specifies sort key for recent inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)");
1155 gSavedSettings.declareU32("TexturePickerSortOrder", 2, "Specifies sort key for textures in texture picker (+0 = name, +1 = date, +2 = folders always by name)"); 1158 gSavedSettings.declareU32("TexturePickerSortOrder", 2, "Specifies sort key for textures in texture picker (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)");
1156 gSavedSettings.declareU32("AvatarPickerSortOrder", 2, "Specifies sort key for textures in avatar picker (+0 = name, +1 = date, +2 = folders always by name)"); 1159 gSavedSettings.declareU32("AvatarPickerSortOrder", 2, "Specifies sort key for textures in avatar picker (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)");
1157 1160
1158 // Pixels away from edge that windows snap. 1161 // Pixels away from edge that windows snap.
1159 gSavedSettings.declareS32("SnapMargin", 10, "Controls maximum distance between windows before they auto-snap together (pixels)"); 1162 gSavedSettings.declareS32("SnapMargin", 10, "Controls maximum distance between windows before they auto-snap together (pixels)");
diff --git a/linden/indra/newview/lldebugmessagebox.cpp b/linden/indra/newview/lldebugmessagebox.cpp
index af500da..e238800 100644
--- a/linden/indra/newview/lldebugmessagebox.cpp
+++ b/linden/indra/newview/lldebugmessagebox.cpp
@@ -225,21 +225,21 @@ void LLDebugVarMessageBox::draw()
225 225
226 if(mAnimate) 226 if(mAnimate)
227 { 227 {
228 F32 animated_val = clamp_rescale(fmodf((F32)LLFrameTimer::getElapsedSeconds() / 5.f, 1.f), 0.f, 1.f, 0.f, mSlider1->getMaxValue());
229 if (mSlider1) 228 if (mSlider1)
230 { 229 {
230 F32 animated_val = clamp_rescale(fmodf((F32)LLFrameTimer::getElapsedSeconds() / 5.f, 1.f), 0.f, 1.f, 0.f, mSlider1->getMaxValue());
231 mSlider1->setValue(animated_val); 231 mSlider1->setValue(animated_val);
232 slider_changed(mSlider1, this); 232 slider_changed(mSlider1, this);
233 } 233 if (mSlider2)
234 if (mSlider2) 234 {
235 { 235 mSlider2->setValue(animated_val);
236 mSlider2->setValue(animated_val); 236 slider_changed(mSlider2, this);
237 slider_changed(mSlider2, this); 237 }
238 } 238 if (mSlider3)
239 if (mSlider3) 239 {
240 { 240 mSlider3->setValue(animated_val);
241 mSlider3->setValue(animated_val); 241 slider_changed(mSlider3, this);
242 slider_changed(mSlider3, this); 242 }
243 } 243 }
244 } 244 }
245 LLFloater::draw(); 245 LLFloater::draw();
diff --git a/linden/indra/newview/lldrawpoolavatar.cpp b/linden/indra/newview/lldrawpoolavatar.cpp
index debcfe2..b864449 100644
--- a/linden/indra/newview/lldrawpoolavatar.cpp
+++ b/linden/indra/newview/lldrawpoolavatar.cpp
@@ -102,7 +102,8 @@ BOOL gRenderAvatar = TRUE;
102 102
103S32 LLDrawPoolAvatar::getVertexShaderLevel() const 103S32 LLDrawPoolAvatar::getVertexShaderLevel() const
104{ 104{
105 return (S32) LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR); 105 return sShaderLevel;
106 //return (S32) LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR);
106} 107}
107 108
108void LLDrawPoolAvatar::prerender() 109void LLDrawPoolAvatar::prerender()
@@ -197,20 +198,22 @@ void LLDrawPoolAvatar::endFootShadow()
197 198
198void LLDrawPoolAvatar::beginRigid() 199void LLDrawPoolAvatar::beginRigid()
199{ 200{
200 sVertexProgram = &gAvatarEyeballProgram; 201 sVertexProgram = NULL;
202 sShaderLevel = 0;
201 glEnableClientState(GL_NORMAL_ARRAY); 203 glEnableClientState(GL_NORMAL_ARRAY);
202 glEnableClientState(GL_TEXTURE_COORD_ARRAY); 204 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
203 205
204 if (sShaderLevel > 0) 206 /*if (sShaderLevel > 0)
205 { //eyeballs render with the specular shader 207 { //eyeballs render with the specular shader
206 gAvatarEyeballProgram.bind(); 208 gAvatarEyeballProgram.bind();
207 gMaterialIndex = gAvatarEyeballProgram.mAttribute[LLShaderMgr::MATERIAL_COLOR]; 209 gMaterialIndex = gAvatarEyeballProgram.mAttribute[LLShaderMgr::MATERIAL_COLOR];
208 gSpecularIndex = gAvatarEyeballProgram.mAttribute[LLShaderMgr::SPECULAR_COLOR]; 210 gSpecularIndex = gAvatarEyeballProgram.mAttribute[LLShaderMgr::SPECULAR_COLOR];
209 } 211 }*/
210} 212}
211 213
212void LLDrawPoolAvatar::endRigid() 214void LLDrawPoolAvatar::endRigid()
213{ 215{
216 sShaderLevel = mVertexShaderLevel;
214 glDisableClientState(GL_NORMAL_ARRAY); 217 glDisableClientState(GL_NORMAL_ARRAY);
215 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 218 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
216} 219}
diff --git a/linden/indra/newview/lldriverparam.cpp b/linden/indra/newview/lldriverparam.cpp
index ce42ad5..463888c 100644
--- a/linden/indra/newview/lldriverparam.cpp
+++ b/linden/indra/newview/lldriverparam.cpp
@@ -346,7 +346,7 @@ const LLVector3* LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_
346 346
347 // We're already in the middle of a param's distortions, so get the next one. 347 // We're already in the middle of a param's distortions, so get the next one.
348 const LLVector3* v = driven->mParam->getNextDistortion( index, poly_mesh ); 348 const LLVector3* v = driven->mParam->getNextDistortion( index, poly_mesh );
349 if( !v ) 349 if( (!v) && (iter != mDriven.end()) )
350 { 350 {
351 // This param is finished, so start the next param. It might not have any 351 // This param is finished, so start the next param. It might not have any
352 // distortions, though, so we have to loop to find the next param that does. 352 // distortions, though, so we have to loop to find the next param that does.
diff --git a/linden/indra/newview/lleventpoll.cpp b/linden/indra/newview/lleventpoll.cpp
index 9c5a19d..7430fc3 100644
--- a/linden/indra/newview/lleventpoll.cpp
+++ b/linden/indra/newview/lleventpoll.cpp
@@ -79,7 +79,7 @@ LLEventPoll::Impl& LLEventPoll::Impl::start(
79 79
80void LLEventPoll::Impl::stop() 80void LLEventPoll::Impl::stop()
81{ 81{
82 llinfos << "LLEventPoll::Impl::stop <" << mCount << "> " 82 lldebugs << "LLEventPoll::Impl::stop <" << mCount << "> "
83 << mPollURL << llendl; 83 << mPollURL << llendl;
84 // there should be a way to stop a LLHTTPClient request in progress 84 // there should be a way to stop a LLHTTPClient request in progress
85 mDone = true; 85 mDone = true;
diff --git a/linden/indra/newview/llfasttimerview.cpp b/linden/indra/newview/llfasttimerview.cpp
index c469d8c..c7be3aa 100644
--- a/linden/indra/newview/llfasttimerview.cpp
+++ b/linden/indra/newview/llfasttimerview.cpp
@@ -1108,6 +1108,15 @@ F64 LLFastTimerView::getTime(LLFastTimer::EFastTimerType tidx)
1108 break; 1108 break;
1109 } 1109 }
1110 } 1110 }
1111
1112 if (i == FTV_DISPLAY_NUM)
1113 {
1114 // walked off the end of ft_display_table without finding
1115 // the desired timer type
1116 llwarns << "Timer type " << tidx << " not known." << llendl;
1117 return F64(0.0);
1118 }
1119
1111 S32 table_idx = i; 1120 S32 table_idx = i;
1112 1121
1113 // Add child ticks to parent 1122 // Add child ticks to parent
diff --git a/linden/indra/newview/llfeaturemanager.cpp b/linden/indra/newview/llfeaturemanager.cpp
index 57fbc64..2a30680 100644
--- a/linden/indra/newview/llfeaturemanager.cpp
+++ b/linden/indra/newview/llfeaturemanager.cpp
@@ -60,6 +60,8 @@ extern void write_debug(const std::string& str);
60 60
61#if LL_DARWIN 61#if LL_DARWIN
62const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt"; 62const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt";
63#elif LL_LINUX
64const char FEATURE_TABLE_FILENAME[] = "featuretable_linux.txt";
63#else 65#else
64const char FEATURE_TABLE_FILENAME[] = "featuretable.txt"; 66const char FEATURE_TABLE_FILENAME[] = "featuretable.txt";
65#endif 67#endif
diff --git a/linden/indra/newview/llfilepicker.cpp b/linden/indra/newview/llfilepicker.cpp
index 971743b..24d3932 100644
--- a/linden/indra/newview/llfilepicker.cpp
+++ b/linden/indra/newview/llfilepicker.cpp
@@ -451,8 +451,9 @@ void LLFilePicker::reset()
451 451
452void LLFilePicker::buildFilename( void ) 452void LLFilePicker::buildFilename( void )
453{ 453{
454 strncpy( mFilename, mFiles, LL_MAX_PATH ); /*Flawfinder: ignore*/ 454 strncpy( mFilename, mFiles, LL_MAX_PATH );
455 S32 len = strlen( mFilename ); /*Flawfinder: ignore*/ 455 mFilename[LL_MAX_PATH-1] = '\0'; // stupid strncpy
456 S32 len = strlen( mFilename );
456 457
457 strncat(mFilename,gDirUtilp->getDirDelimiter().c_str(), sizeof(mFilename)-len+1); /*Flawfinder: ignore*/ 458 strncat(mFilename,gDirUtilp->getDirDelimiter().c_str(), sizeof(mFilename)-len+1); /*Flawfinder: ignore*/
458 len += strlen(gDirUtilp->getDirDelimiter().c_str()); /*Flawfinder: ignore*/ 459 len += strlen(gDirUtilp->getDirDelimiter().c_str()); /*Flawfinder: ignore*/
@@ -858,7 +859,10 @@ void LLFilePicker::getFilePath(SInt32 index)
858{ 859{
859 mFiles[0] = 0; 860 mFiles[0] = 0;
860 if (mFileVector.size()) 861 if (mFileVector.size())
861 strncpy(mFiles, mFileVector[index].c_str(), sizeof(mFiles)); /*Flawfinder: ignore*/ 862 {
863 strncpy(mFiles, mFileVector[index].c_str(), sizeof(mFiles));
864 mFiles[sizeof(mFiles)-1] = '\0'; // stupid strncpy
865 }
862} 866}
863 867
864void LLFilePicker::getFileName(SInt32 index) 868void LLFilePicker::getFileName(SInt32 index)
@@ -868,7 +872,10 @@ void LLFilePicker::getFileName(SInt32 index)
868 { 872 {
869 char *start = strrchr(mFileVector[index].c_str(), '/'); 873 char *start = strrchr(mFileVector[index].c_str(), '/');
870 if (start && ((start + 1 - mFileVector[index].c_str()) < (mFileVector[index].size()))) 874 if (start && ((start + 1 - mFileVector[index].c_str()) < (mFileVector[index].size())))
871 strncpy(mFilename, start + 1, sizeof(mFilename)); /*Flawfinder: ignore*/ 875 {
876 strncpy(mFilename, start + 1, sizeof(mFilename));
877 mFilename[sizeof(mFilename)-1] = '\0';// stupid strncpy
878 }
872 } 879 }
873} 880}
874 881
diff --git a/linden/indra/newview/llfloateranimpreview.cpp b/linden/indra/newview/llfloateranimpreview.cpp
index 6802fb2..b1f8a53 100644
--- a/linden/indra/newview/llfloateranimpreview.cpp
+++ b/linden/indra/newview/llfloateranimpreview.cpp
@@ -54,7 +54,7 @@
54#include "llviewercamera.h" 54#include "llviewercamera.h"
55#include "llviewerobjectlist.h" 55#include "llviewerobjectlist.h"
56#include "llviewerwindow.h" 56#include "llviewerwindow.h"
57#include "llviewermenu.h" 57#include "llviewermenufile.h" // upload_new_resource()
58#include "llvoavatar.h" 58#include "llvoavatar.h"
59#include "pipeline.h" 59#include "pipeline.h"
60#include "viewer.h" 60#include "viewer.h"
@@ -221,7 +221,7 @@ BOOL LLFloaterAnimPreview::postBuild()
221 } 221 }
222 222
223 apr_file_close(fp); 223 apr_file_close(fp);
224 delete file_buffer; 224 delete[] file_buffer;
225 } 225 }
226 } 226 }
227 227
@@ -247,11 +247,11 @@ BOOL LLFloaterAnimPreview::postBuild()
247 // pass animation data through memory buffer 247 // pass animation data through memory buffer
248 loaderp->serialize(dp); 248 loaderp->serialize(dp);
249 dp.reset(); 249 dp.reset();
250 BOOL success = motionp->deserialize(dp); 250 BOOL success = motionp && motionp->deserialize(dp);
251 251
252 delete []buffer; 252 delete []buffer;
253 253
254 if (motionp && success) 254 if (success)
255 { 255 {
256 const LLBBoxLocal &pelvis_bbox = motionp->getPelvisBBox(); 256 const LLBBoxLocal &pelvis_bbox = motionp->getPelvisBBox();
257 257
diff --git a/linden/indra/newview/llfloateravatarinfo.cpp b/linden/indra/newview/llfloateravatarinfo.cpp
index c0351ee..2245d31 100644
--- a/linden/indra/newview/llfloateravatarinfo.cpp
+++ b/linden/indra/newview/llfloateravatarinfo.cpp
@@ -195,7 +195,6 @@ void LLFloaterAvatarInfo::showFromDirectory(const LLUUID &avatar_id)
195 { 195 {
196 // ...bring that window to front 196 // ...bring that window to front
197 floater = gAvatarInfoInstances.getData(avatar_id); 197 floater = gAvatarInfoInstances.getData(avatar_id);
198 floater->open(); /*Flawfinder: ignore*/
199 } 198 }
200 else 199 else
201 { 200 {
@@ -203,7 +202,10 @@ void LLFloaterAvatarInfo::showFromDirectory(const LLUUID &avatar_id)
203 avatar_id); 202 avatar_id);
204 floater->center(); 203 floater->center();
205 floater->mPanelAvatarp->setAvatarID(avatar_id, "", ONLINE_STATUS_NO); 204 floater->mPanelAvatarp->setAvatarID(avatar_id, "", ONLINE_STATUS_NO);
206 floater->open(); /*Flawfinder: ignore*/ 205 }
206 if(floater)
207 {
208 floater->open();
207 } 209 }
208} 210}
209 211
diff --git a/linden/indra/newview/llfloaterfriends.cpp b/linden/indra/newview/llfloaterfriends.cpp
index 8d39890..d01a24b 100644
--- a/linden/indra/newview/llfloaterfriends.cpp
+++ b/linden/indra/newview/llfloaterfriends.cpp
@@ -287,6 +287,7 @@ void LLFloaterFriends::refreshRightsChangeList(U8 state)
287 bool can_change_online_multiple = true; 287 bool can_change_online_multiple = true;
288 bool can_change_map_multiple = true; 288 bool can_change_map_multiple = true;
289 LLTextBox* processing_label = LLUICtrlFactory::getTextBoxByName(this, "process_rights_label"); 289 LLTextBox* processing_label = LLUICtrlFactory::getTextBoxByName(this, "process_rights_label");
290
290 if(!mAllowRightsChange) 291 if(!mAllowRightsChange)
291 { 292 {
292 if(processing_label) 293 if(processing_label)
@@ -302,9 +303,10 @@ void LLFloaterFriends::refreshRightsChangeList(U8 state)
302 processing_label->setVisible(false); 303 processing_label->setVisible(false);
303 } 304 }
304 } 305 }
306
305 if(state == 1) 307 if(state == 1)
306 { 308 {
307 if(!friend_status->isOnline()) 309 if(friend_status && !friend_status->isOnline())
308 { 310 {
309 childSetEnabled("offer_teleport_btn", false); 311 childSetEnabled("offer_teleport_btn", false);
310 } 312 }
diff --git a/linden/indra/newview/llfloatergroupinfo.cpp b/linden/indra/newview/llfloatergroupinfo.cpp
index 348f31f..3e8eae5 100644
--- a/linden/indra/newview/llfloatergroupinfo.cpp
+++ b/linden/indra/newview/llfloatergroupinfo.cpp
@@ -191,7 +191,7 @@ void LLFloaterGroupInfo::showNotice(const char* subject,
191 // We need to clean up that inventory offer. 191 // We need to clean up that inventory offer.
192 if (inventory_offer) 192 if (inventory_offer)
193 { 193 {
194 inventory_offer_callback( 1 , inventory_offer); 194 inventory_offer_callback( IOR_DECLINE , inventory_offer);
195 } 195 }
196 return; 196 return;
197 } 197 }
@@ -203,7 +203,7 @@ void LLFloaterGroupInfo::showNotice(const char* subject,
203 // We need to clean up that inventory offer. 203 // We need to clean up that inventory offer.
204 if (inventory_offer) 204 if (inventory_offer)
205 { 205 {
206 inventory_offer_callback( 1 , inventory_offer); 206 inventory_offer_callback( IOR_DECLINE , inventory_offer);
207 } 207 }
208 return; 208 return;
209 } 209 }
diff --git a/linden/indra/newview/llfloaterhtml.cpp b/linden/indra/newview/llfloaterhtml.cpp
index 519a031..0c5bdcd 100644
--- a/linden/indra/newview/llfloaterhtml.cpp
+++ b/linden/indra/newview/llfloaterhtml.cpp
@@ -49,8 +49,12 @@ LLFloaterHtml* LLFloaterHtml::getInstance()
49//////////////////////////////////////////////////////////////////////////////// 49////////////////////////////////////////////////////////////////////////////////
50// 50//
51LLFloaterHtml::LLFloaterHtml() 51LLFloaterHtml::LLFloaterHtml()
52: LLFloater( "HTML Floater" ), 52: LLFloater( "HTML Floater" )
53
54#if LL_LIBXUL_ENABLED
55 ,
53 mWebBrowser( 0 ) 56 mWebBrowser( 0 )
57#endif // LL_LIBXUL_ENABLED
54{ 58{
55 // create floater from its XML definition 59 // create floater from its XML definition
56 gUICtrlFactory->buildFloater( this, "floater_html.xml" ); 60 gUICtrlFactory->buildFloater( this, "floater_html.xml" );
@@ -60,6 +64,7 @@ LLFloaterHtml::LLFloaterHtml()
60 reshape( rect.getWidth(), rect.getHeight(), FALSE ); 64 reshape( rect.getWidth(), rect.getHeight(), FALSE );
61 setRect( rect ); 65 setRect( rect );
62 66
67#if LL_LIBXUL_ENABLED
63 mWebBrowser = LLViewerUICtrlFactory::getWebBrowserByName(this, "html_floater_browser" ); 68 mWebBrowser = LLViewerUICtrlFactory::getWebBrowserByName(this, "html_floater_browser" );
64 if ( mWebBrowser ) 69 if ( mWebBrowser )
65 { 70 {
@@ -72,7 +77,8 @@ LLFloaterHtml::LLFloaterHtml()
72 // don't automatically open secondlife links since we want to catch 77 // don't automatically open secondlife links since we want to catch
73 // special ones that do other stuff (like open F1 Help) 78 // special ones that do other stuff (like open F1 Help)
74 mWebBrowser->setOpenSecondLifeLinksInMap( false ); 79 mWebBrowser->setOpenSecondLifeLinksInMap( false );
75 }; 80 }
81#endif // LL_LIBXUL_ENABLED
76 82
77 childSetAction("close_btn", onClickClose, this); 83 childSetAction("close_btn", onClickClose, this);
78 setDefaultBtn("close_btn"); 84 setDefaultBtn("close_btn");
@@ -82,9 +88,11 @@ LLFloaterHtml::LLFloaterHtml()
82// 88//
83LLFloaterHtml::~LLFloaterHtml() 89LLFloaterHtml::~LLFloaterHtml()
84{ 90{
91#if LL_LIBXUL_ENABLED
85 // stop observing browser events 92 // stop observing browser events
86 if ( mWebBrowser ) 93 if ( mWebBrowser )
87 mWebBrowser->remObserver( this ); 94 mWebBrowser->remObserver( this );
95#endif // LL_LIBXUL_ENABLED
88 96
89 // save position of floater 97 // save position of floater
90 gSavedSettings.setRect( "HtmlFloaterRect", mRect ); 98 gSavedSettings.setRect( "HtmlFloaterRect", mRect );
@@ -103,9 +111,11 @@ void LLFloaterHtml::show( LLString content_id )
103 // set the title 111 // set the title
104 setTitle( childGetValue( title_str ).asString() ); 112 setTitle( childGetValue( title_str ).asString() );
105 113
114#if LL_LIBXUL_ENABLED
106 // navigate to the URL 115 // navigate to the URL
107 if ( mWebBrowser ) 116 if ( mWebBrowser )
108 mWebBrowser->navigateTo( childGetValue( url_str ).asString() ); 117 mWebBrowser->navigateTo( childGetValue( url_str ).asString() );
118#endif // LL_LIBXUL_ENABLED
109 119
110 // make floater appear 120 // make floater appear
111 setVisibleAndFrontmost(); 121 setVisibleAndFrontmost();
@@ -131,6 +141,7 @@ void LLFloaterHtml::onClickClose( void* data )
131// 141//
132void LLFloaterHtml::onClickLinkSecondLife( const EventType& eventIn ) 142void LLFloaterHtml::onClickLinkSecondLife( const EventType& eventIn )
133{ 143{
144#if LL_LIBXUL_ENABLED
134 const std::string protocol( "secondlife://app." ); 145 const std::string protocol( "secondlife://app." );
135 146
136 // special 'app' secondlife link (using a different protocol - one that isn't registered in the browser) causes bad 147 // special 'app' secondlife link (using a different protocol - one that isn't registered in the browser) causes bad
@@ -144,11 +155,12 @@ void LLFloaterHtml::onClickLinkSecondLife( const EventType& eventIn )
144 if ( LLString::compareInsensitive( cmd.c_str() , "floater.html.help" ) == 0 ) 155 if ( LLString::compareInsensitive( cmd.c_str() , "floater.html.help" ) == 0 )
145 { 156 {
146 gViewerHtmlHelp.show(); 157 gViewerHtmlHelp.show();
147 }; 158 }
148 } 159 }
149 else 160 else
150 // regular secondlife link - just open the map as normal 161 // regular secondlife link - just open the map as normal
151 { 162 {
152 mWebBrowser->openMapAtlocation( eventIn.getStringValue() ); 163 mWebBrowser->openMapAtlocation( eventIn.getStringValue() );
153 }; 164 }
154}; \ No newline at end of file 165#endif // LL_LIBXUL_ENABLED
166};
diff --git a/linden/indra/newview/llfloaterhtml.h b/linden/indra/newview/llfloaterhtml.h
index 9a09baf..fef57d0 100644
--- a/linden/indra/newview/llfloaterhtml.h
+++ b/linden/indra/newview/llfloaterhtml.h
@@ -51,9 +51,11 @@ class LLFloaterHtml :
51 51
52 private: 52 private:
53 LLFloaterHtml(); 53 LLFloaterHtml();
54#if LL_LIBXUL_ENABLED
54 LLWebBrowserCtrl* mWebBrowser; 55 LLWebBrowserCtrl* mWebBrowser;
56#endif // LL_LIBXUL_ENABLED
55 static LLFloaterHtml* sInstance; 57 static LLFloaterHtml* sInstance;
56 LLButton* mCloseButton; 58 LLButton* mCloseButton;
57}; 59};
58 60
59#endif \ No newline at end of file 61#endif
diff --git a/linden/indra/newview/llfloaterimport.cpp b/linden/indra/newview/llfloaterimport.cpp
index 72cf2e0..ed71c1b 100644
--- a/linden/indra/newview/llfloaterimport.cpp
+++ b/linden/indra/newview/llfloaterimport.cpp
@@ -44,12 +44,13 @@
44#include "llface.h" 44#include "llface.h"
45#include "llinventorymodel.h" 45#include "llinventorymodel.h"
46#include "lllineeditor.h" 46#include "lllineeditor.h"
47#include "llresourcedata.h"
47#include "lltextbox.h" 48#include "lltextbox.h"
48#include "lltoolmgr.h" 49#include "lltoolmgr.h"
49#include "llui.h" 50#include "llui.h"
50#include "lluploaddialog.h" 51#include "lluploaddialog.h"
51#include "llviewercamera.h" 52#include "llviewercamera.h"
52#include "llviewermenu.h" 53#include "llviewermenufile.h" // upload_new_resource()
53#include "llviewerwindow.h" 54#include "llviewerwindow.h"
54#include "llvoavatar.h" 55#include "llvoavatar.h"
55#include "pipeline.h" 56#include "pipeline.h"
@@ -264,9 +265,8 @@ BOOL LLFloaterImport::postBuild()
264 FILE* fCheck = LLFile::fopen(image_path.c_str(), "rb"); /*Flawfinder: ignore*/ 265 FILE* fCheck = LLFile::fopen(image_path.c_str(), "rb"); /*Flawfinder: ignore*/
265 if (fCheck) 266 if (fCheck)
266 { 267 {
267 LLMD5 my_md5_hash(fCheck); 268 LLMD5 my_md5_hash(fCheck); // this fclose()s fCheck too
268 my_md5_hash.hex_digest(md5_hash_string); 269 my_md5_hash.hex_digest(md5_hash_string);
269 fclose(fCheck);
270 270
271 llinfos << "hash: " << md5_hash_string << llendl; 271 llinfos << "hash: " << md5_hash_string << llendl;
272 } 272 }
@@ -474,7 +474,7 @@ void LLFloaterImport::finishImport(ImportAssetInfo *info)
474 char *buffer = new char[length]; 474 char *buffer = new char[length];
475 ll_apr_file_read(fIn, buffer, length); 475 ll_apr_file_read(fIn, buffer, length);
476 ll_apr_file_write(fOut, buffer, length); 476 ll_apr_file_write(fOut, buffer, length);
477 delete buffer; 477 delete[] buffer;
478 generated_file = true; 478 generated_file = true;
479 apr_file_close(fOut); 479 apr_file_close(fOut);
480 } 480 }
diff --git a/linden/indra/newview/llfloaterinspect.cpp b/linden/indra/newview/llfloaterinspect.cpp
index 1548c0e..80da7b6 100644
--- a/linden/indra/newview/llfloaterinspect.cpp
+++ b/linden/indra/newview/llfloaterinspect.cpp
@@ -64,42 +64,54 @@ void LLFloaterInspect::show(void* ignored)
64void LLFloaterInspect::onClickCreatorProfile(void* ctrl) 64void LLFloaterInspect::onClickCreatorProfile(void* ctrl)
65{ 65{
66 if(sInstance->mObjectList->getAllSelected().size() == 0) return; 66 if(sInstance->mObjectList->getAllSelected().size() == 0) return;
67 LLSelectNode* obj = sInstance->mObjectSelection->getFirstNode(); 67 LLScrollListItem* first_selected =
68 LLUUID obj_id, creator_id; 68 sInstance->mObjectList->getFirstSelected();
69 obj_id = sInstance->mObjectList->getFirstSelected()->getUUID(); 69
70 while(obj) 70 if (first_selected)
71 { 71 {
72 if(obj_id == obj->getObject()->getID()) 72 LLSelectNode* obj= sInstance->mObjectSelection->getFirstNode();
73 LLUUID obj_id, creator_id;
74 obj_id = first_selected->getUUID();
75 while(obj)
73 { 76 {
74 creator_id = obj->mPermissions->getCreator(); 77 if(obj_id == obj->getObject()->getID())
75 break; 78 {
79 creator_id = obj->mPermissions->getCreator();
80 break;
81 }
82 obj = sInstance->mObjectSelection->getNextNode();
83 }
84 if(obj)
85 {
86 LLFloaterAvatarInfo::showFromDirectory(creator_id);
76 } 87 }
77 obj = sInstance->mObjectSelection->getNextNode();
78 }
79 if(obj)
80 {
81 LLFloaterAvatarInfo::showFromDirectory(creator_id);
82 } 88 }
83} 89}
84 90
85void LLFloaterInspect::onClickOwnerProfile(void* ctrl) 91void LLFloaterInspect::onClickOwnerProfile(void* ctrl)
86{ 92{
87 if(sInstance->mObjectList->getAllSelected().size() == 0) return; 93 if(sInstance->mObjectList->getAllSelected().size() == 0) return;
88 LLSelectNode* obj = sInstance->mObjectSelection->getFirstNode(); 94 LLScrollListItem* first_selected =
89 LLUUID obj_id, owner_id; 95 sInstance->mObjectList->getFirstSelected();
90 obj_id = sInstance->mObjectList->getFirstSelected()->getUUID(); 96
91 while(obj) 97 if (first_selected)
92 { 98 {
93 if(obj_id == obj->getObject()->getID()) 99 LLSelectNode* obj= sInstance->mObjectSelection->getFirstNode();
100 LLUUID obj_id, owner_id;
101 obj_id = first_selected->getUUID();
102 while(obj)
94 { 103 {
95 owner_id = obj->mPermissions->getOwner(); 104 if(obj_id == obj->getObject()->getID())
96 break; 105 {
106 owner_id = obj->mPermissions->getOwner();
107 break;
108 }
109 obj = sInstance->mObjectSelection->getNextNode();
110 }
111 if(obj)
112 {
113 LLFloaterAvatarInfo::showFromDirectory(owner_id);
97 } 114 }
98 obj = sInstance->mObjectSelection->getNextNode();
99 }
100 if(obj)
101 {
102 LLFloaterAvatarInfo::showFromDirectory(owner_id);
103 } 115 }
104} 116}
105 117
@@ -125,7 +137,15 @@ LLUUID LLFloaterInspect::getSelectedUUID()
125{ 137{
126 if(sInstance) 138 if(sInstance)
127 { 139 {
128 if(sInstance->mObjectList->getAllSelected().size() > 0) return sInstance->mObjectList->getFirstSelected()->getUUID(); 140 if(sInstance->mObjectList->getAllSelected().size() > 0)
141 {
142 LLScrollListItem* first_selected =
143 sInstance->mObjectList->getFirstSelected();
144 if (first_selected)
145 {
146 return first_selected->getUUID();
147 }
148 }
129 } 149 }
130 return LLUUID::null; 150 return LLUUID::null;
131} 151}
@@ -139,7 +159,15 @@ void LLFloaterInspect::refresh()
139 childSetEnabled("button creator", false); 159 childSetEnabled("button creator", false);
140 LLUUID selected_uuid; 160 LLUUID selected_uuid;
141 S32 selected_index = mObjectList->getFirstSelectedIndex(); 161 S32 selected_index = mObjectList->getFirstSelectedIndex();
142 if(selected_index > -1) selected_uuid = mObjectList->getFirstSelected()->getUUID(); 162 if(selected_index > -1)
163 {
164 LLScrollListItem* first_selected =
165 mObjectList->getFirstSelected();
166 if (first_selected)
167 {
168 selected_uuid = first_selected->getUUID();
169 }
170 }
143 mObjectList->operateOnAll(LLScrollListCtrl::OP_DELETE); 171 mObjectList->operateOnAll(LLScrollListCtrl::OP_DELETE);
144 //List all transient objects, then all linked objects 172 //List all transient objects, then all linked objects
145 LLSelectNode* obj = mObjectSelection->getFirstNode(); 173 LLSelectNode* obj = mObjectSelection->getFirstNode();
diff --git a/linden/indra/newview/llfloaterland.cpp b/linden/indra/newview/llfloaterland.cpp
index 9ff44f4..82b50ec 100644
--- a/linden/indra/newview/llfloaterland.cpp
+++ b/linden/indra/newview/llfloaterland.cpp
@@ -1996,12 +1996,18 @@ BOOL LLPanelLandOptions::postBuild()
1996 1996
1997 1997
1998 mSnapshotCtrl = LLUICtrlFactory::getTexturePickerByName(this, "snapshot_ctrl"); 1998 mSnapshotCtrl = LLUICtrlFactory::getTexturePickerByName(this, "snapshot_ctrl");
1999 mSnapshotCtrl->setCommitCallback( onCommitAny ); 1999 if (mSnapshotCtrl)
2000 mSnapshotCtrl->setCallbackUserData( this ); 2000 {
2001 mSnapshotCtrl->setAllowNoTexture ( TRUE ); 2001 mSnapshotCtrl->setCommitCallback( onCommitAny );
2002 mSnapshotCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); 2002 mSnapshotCtrl->setCallbackUserData( this );
2003 mSnapshotCtrl->setNonImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); 2003 mSnapshotCtrl->setAllowNoTexture ( TRUE );
2004 2004 mSnapshotCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
2005 mSnapshotCtrl->setNonImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
2006 }
2007 else
2008 {
2009 llwarns << "LLUICtrlFactory::getTexturePickerByName() returned NULL for 'snapshot_ctrl'" << llendl;
2010 }
2005 2011
2006 2012
2007 mLocationText = LLUICtrlFactory::getTextBoxByName(this, "Landing Point: (none)"); 2013 mLocationText = LLUICtrlFactory::getTextBoxByName(this, "Landing Point: (none)");
@@ -2333,12 +2339,19 @@ BOOL LLPanelLandMedia::postBuild()
2333 2339
2334 2340
2335 mMediaTextureCtrl = LLUICtrlFactory::getTexturePickerByName(this, "media texture"); 2341 mMediaTextureCtrl = LLUICtrlFactory::getTexturePickerByName(this, "media texture");
2336 mMediaTextureCtrl->setCommitCallback( onCommitAny ); 2342 if (mMediaTextureCtrl)
2337 mMediaTextureCtrl->setCallbackUserData( this ); 2343 {
2338 mMediaTextureCtrl->setAllowNoTexture ( TRUE ); 2344 mMediaTextureCtrl->setCommitCallback( onCommitAny );
2339 mMediaTextureCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); 2345 mMediaTextureCtrl->setCallbackUserData( this );
2340 mMediaTextureCtrl->setNonImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); 2346 mMediaTextureCtrl->setAllowNoTexture ( TRUE );
2341 2347 mMediaTextureCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
2348 mMediaTextureCtrl->setNonImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
2349 }
2350 else
2351 {
2352 llwarns << "LLUICtrlFactory::getTexturePickerByName() returned NULL for 'media texure'" << llendl;
2353 }
2354
2342 mMediaAutoScaleCheck = LLUICtrlFactory::getCheckBoxByName(this, "media_auto_scale"); 2355 mMediaAutoScaleCheck = LLUICtrlFactory::getCheckBoxByName(this, "media_auto_scale");
2343 childSetCommitCallback("media_auto_scale", onCommitAny, this); 2356 childSetCommitCallback("media_auto_scale", onCommitAny, this);
2344 2357
diff --git a/linden/indra/newview/llfloaternamedesc.cpp b/linden/indra/newview/llfloaternamedesc.cpp
index f5ef7dc..5f41b13 100644
--- a/linden/indra/newview/llfloaternamedesc.cpp
+++ b/linden/indra/newview/llfloaternamedesc.cpp
@@ -29,6 +29,8 @@
29#include "llviewerprecompiledheaders.h" 29#include "llviewerprecompiledheaders.h"
30 30
31#include "llfloaternamedesc.h" 31#include "llfloaternamedesc.h"
32
33// project includes
32#include "lllineeditor.h" 34#include "lllineeditor.h"
33#include "llresmgr.h" 35#include "llresmgr.h"
34#include "lltextbox.h" 36#include "lltextbox.h"
@@ -36,13 +38,16 @@
36#include "llviewerwindow.h" 38#include "llviewerwindow.h"
37#include "llfocusmgr.h" 39#include "llfocusmgr.h"
38#include "llradiogroup.h" 40#include "llradiogroup.h"
39#include "llassetstorage.h"
40#include "lldbstrings.h" 41#include "lldbstrings.h"
41#include "lldir.h" 42#include "lldir.h"
42#include "llviewercontrol.h" 43#include "llviewercontrol.h"
43#include "llviewermenu.h" 44#include "llviewermenufile.h" // upload_new_resource()
44#include "llvieweruictrlfactory.h" 45#include "llvieweruictrlfactory.h"
45 46
47// linden includes
48#include "llassetstorage.h"
49#include "llinventorytype.h"
50
46const S32 PREVIEW_LINE_HEIGHT = 19; 51const S32 PREVIEW_LINE_HEIGHT = 19;
47const S32 PREVIEW_CLOSE_BOX_SIZE = 16; 52const S32 PREVIEW_CLOSE_BOX_SIZE = 16;
48const S32 PREVIEW_BORDER_WIDTH = 2; 53const S32 PREVIEW_BORDER_WIDTH = 2;
diff --git a/linden/indra/newview/llfloaternewim.cpp b/linden/indra/newview/llfloaternewim.cpp
index 2fa2b51..1adb37c 100644
--- a/linden/indra/newview/llfloaternewim.cpp
+++ b/linden/indra/newview/llfloaternewim.cpp
@@ -74,8 +74,15 @@ BOOL LLFloaterNewIM::postBuild()
74 childSetAction("start_btn", &LLFloaterNewIM::onStart, this); 74 childSetAction("start_btn", &LLFloaterNewIM::onStart, this);
75 childSetAction("close_btn", &LLFloaterNewIM::onClickClose, this); 75 childSetAction("close_btn", &LLFloaterNewIM::onClickClose, this);
76 mSelectionList = LLViewerUICtrlFactory::getNameListByName(this, "user_list"); 76 mSelectionList = LLViewerUICtrlFactory::getNameListByName(this, "user_list");
77 mSelectionList->setDoubleClickCallback(&LLFloaterNewIM::onStart); 77 if (mSelectionList)
78 mSelectionList->setCallbackUserData(this); 78 {
79 mSelectionList->setDoubleClickCallback(&LLFloaterNewIM::onStart);
80 mSelectionList->setCallbackUserData(this);
81 }
82 else
83 {
84 llwarns << "LLViewerUICtrlFactory::getNameListByName() returned NULL for 'user_list'" << llendl;
85 }
79 sOnlineDescriptor = childGetValue("online_descriptor").asString(); 86 sOnlineDescriptor = childGetValue("online_descriptor").asString();
80 sNameFormat = childGetValue("name_format").asString(); 87 sNameFormat = childGetValue("name_format").asString();
81 setDefaultBtn("start_btn"); 88 setDefaultBtn("start_btn");
diff --git a/linden/indra/newview/llfloaterpreference.cpp b/linden/indra/newview/llfloaterpreference.cpp
index dceadf9..963c268 100644
--- a/linden/indra/newview/llfloaterpreference.cpp
+++ b/linden/indra/newview/llfloaterpreference.cpp
@@ -156,6 +156,66 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainerCommon* tab_container, LLButton
156// addTabPanel(mWebPanel, "Web", FALSE, onTabChanged, this); 156// addTabPanel(mWebPanel, "Web", FALSE, onTabChanged, this);
157} 157}
158 158
159LLPreferenceCore::~LLPreferenceCore()
160{
161 if (mGeneralPanel)
162 {
163 delete mGeneralPanel;
164 mGeneralPanel = NULL;
165 }
166 if (mInputPanel)
167 {
168 delete mInputPanel;
169 mInputPanel = NULL;
170 }
171 if (mNetworkPanel)
172 {
173 delete mNetworkPanel;
174 mNetworkPanel = NULL;
175 }
176 if (mDisplayPanel)
177 {
178 delete mDisplayPanel;
179 mDisplayPanel = NULL;
180 }
181 if (mDisplayPanel2)
182 {
183 delete mDisplayPanel2;
184 mDisplayPanel2 = NULL;
185 }
186 if (mDisplayPanel3)
187 {
188 delete mDisplayPanel3;
189 mDisplayPanel3 = NULL;
190 }
191 if (mAudioPanel)
192 {
193 delete mAudioPanel;
194 mAudioPanel = NULL;
195 }
196 if (mPrefsChat)
197 {
198 delete mPrefsChat;
199 mPrefsChat = NULL;
200 }
201 if (mPrefsIM)
202 {
203 delete mPrefsIM;
204 mPrefsIM = NULL;
205 }
206 if (mMsgPanel)
207 {
208 delete mMsgPanel;
209 mMsgPanel = NULL;
210 }
211 //if (mWebPanel)
212 //{
213 // delete mWebPanel;
214 // mWebPanel = NULL;
215 //}
216}
217
218
159void LLPreferenceCore::apply() 219void LLPreferenceCore::apply()
160{ 220{
161 mGeneralPanel->apply(); 221 mGeneralPanel->apply();
diff --git a/linden/indra/newview/llfloaterpreference.h b/linden/indra/newview/llfloaterpreference.h
index dcef6a0..7a6789f 100644
--- a/linden/indra/newview/llfloaterpreference.h
+++ b/linden/indra/newview/llfloaterpreference.h
@@ -58,6 +58,7 @@ class LLPreferenceCore
58 58
59public: 59public:
60 LLPreferenceCore(LLTabContainerCommon* tab_container, LLButton * default_btn); 60 LLPreferenceCore(LLTabContainerCommon* tab_container, LLButton * default_btn);
61 ~LLPreferenceCore();
61 62
62 void apply(); 63 void apply();
63 void cancel(); 64 void cancel();
diff --git a/linden/indra/newview/llfloaterregioninfo.cpp b/linden/indra/newview/llfloaterregioninfo.cpp
index 7fa5f6a..682fda8 100644
--- a/linden/indra/newview/llfloaterregioninfo.cpp
+++ b/linden/indra/newview/llfloaterregioninfo.cpp
@@ -74,7 +74,6 @@
74const S32 TERRAIN_TEXTURE_COUNT = 4; 74const S32 TERRAIN_TEXTURE_COUNT = 4;
75const S32 CORNER_COUNT = 4; 75const S32 CORNER_COUNT = 4;
76 76
77#define LL_ENABLE_MAINLAND_VISIBLE_CONTROL 0
78 77
79///---------------------------------------------------------------------------- 78///----------------------------------------------------------------------------
80/// Local class declaration 79/// Local class declaration
@@ -1920,9 +1919,6 @@ BOOL LLPanelEstateInfo::postBuild()
1920{ 1919{
1921 // set up the callbacks for the generic controls 1920 // set up the callbacks for the generic controls
1922 initCtrl("externally_visible_check"); 1921 initCtrl("externally_visible_check");
1923#if LL_ENABLE_MAINLAND_VISIBLE_CONTROL
1924 initCtrl("mainland_visible_check");
1925#endif
1926 initCtrl("use_global_time_check"); 1922 initCtrl("use_global_time_check");
1927 initCtrl("fixed_sun_check"); 1923 initCtrl("fixed_sun_check");
1928 initCtrl("allow_direct_teleport"); 1924 initCtrl("allow_direct_teleport");
@@ -1934,9 +1930,6 @@ BOOL LLPanelEstateInfo::postBuild()
1934 initHelpBtn("use_global_time_help", "HelpEstateUseGlobalTime"); 1930 initHelpBtn("use_global_time_help", "HelpEstateUseGlobalTime");
1935 initHelpBtn("fixed_sun_help", "HelpEstateFixedSun"); 1931 initHelpBtn("fixed_sun_help", "HelpEstateFixedSun");
1936 initHelpBtn("externally_visible_help", "HelpEstateExternallyVisible"); 1932 initHelpBtn("externally_visible_help", "HelpEstateExternallyVisible");
1937#if LL_ENABLE_MAINLAND_VISIBLE_CONTROL
1938 initHelpBtn("mainland_visible_help", "HelpEstateMainlandVisible");
1939#endif
1940 initHelpBtn("allow_direct_teleport_help", "HelpEstateAllowDirectTeleport"); 1933 initHelpBtn("allow_direct_teleport_help", "HelpEstateAllowDirectTeleport");
1941 initHelpBtn("allow_resident_help", "HelpEstateAllowResident"); 1934 initHelpBtn("allow_resident_help", "HelpEstateAllowResident");
1942 initHelpBtn("allow_group_help", "HelpEstateAllowGroup"); 1935 initHelpBtn("allow_group_help", "HelpEstateAllowGroup");
@@ -2105,9 +2098,6 @@ void LLPanelEstateInfo::commitEstateInfo()
2105void LLPanelEstateInfo::setEstateFlags(U32 flags) 2098void LLPanelEstateInfo::setEstateFlags(U32 flags)
2106{ 2099{
2107 childSetValue("externally_visible_check", LLSD(flags & REGION_FLAGS_EXTERNALLY_VISIBLE ? TRUE : FALSE) ); 2100 childSetValue("externally_visible_check", LLSD(flags & REGION_FLAGS_EXTERNALLY_VISIBLE ? TRUE : FALSE) );
2108#if LL_ENABLE_MAINLAND_VISIBLE_CONTROL
2109 childSetValue("mainland_visible_check", LLSD(flags & REGION_FLAGS_MAINLAND_VISIBLE ? TRUE : FALSE) );
2110#endif
2111 childSetValue("fixed_sun_check", LLSD(flags & REGION_FLAGS_SUN_FIXED ? TRUE : FALSE) ); 2101 childSetValue("fixed_sun_check", LLSD(flags & REGION_FLAGS_SUN_FIXED ? TRUE : FALSE) );
2112 childSetValue("allow_direct_teleport", LLSD(flags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT ? TRUE : FALSE) ); 2102 childSetValue("allow_direct_teleport", LLSD(flags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT ? TRUE : FALSE) );
2113 childSetValue("deny_anonymous", LLSD(flags & REGION_FLAGS_DENY_ANONYMOUS ? TRUE : FALSE) ); 2103 childSetValue("deny_anonymous", LLSD(flags & REGION_FLAGS_DENY_ANONYMOUS ? TRUE : FALSE) );
@@ -2124,15 +2114,6 @@ U32 LLPanelEstateInfo::computeEstateFlags()
2124 { 2114 {
2125 flags |= REGION_FLAGS_EXTERNALLY_VISIBLE; 2115 flags |= REGION_FLAGS_EXTERNALLY_VISIBLE;
2126 } 2116 }
2127#if LL_ENABLE_MAINLAND_VISIBLE_CONTROL
2128 // This flag is ignored by everything. 2006-11-17 Phoenix.
2129 if (childGetValue("mainland_visible_check").asBoolean())
2130 {
2131 flags |= REGION_FLAGS_MAINLAND_VISIBLE;
2132 }
2133#else
2134 flags |= REGION_FLAGS_MAINLAND_VISIBLE;
2135#endif
2136 2117
2137 if (childGetValue("allow_direct_teleport").asBoolean()) 2118 if (childGetValue("allow_direct_teleport").asBoolean())
2138 { 2119 {
diff --git a/linden/indra/newview/llfloaterreporter.cpp b/linden/indra/newview/llfloaterreporter.cpp
index 2e44191..bcbab5b 100644
--- a/linden/indra/newview/llfloaterreporter.cpp
+++ b/linden/indra/newview/llfloaterreporter.cpp
@@ -66,10 +66,9 @@
66#include "lluploaddialog.h" 66#include "lluploaddialog.h"
67#include "llcallingcard.h" 67#include "llcallingcard.h"
68#include "llviewerobjectlist.h" 68#include "llviewerobjectlist.h"
69#include "llagent.h"
70#include "lltoolobjpicker.h" 69#include "lltoolobjpicker.h"
71#include "lltoolmgr.h" 70#include "lltoolmgr.h"
72#include "llviewermenu.h" // for LLResourceData 71#include "llresourcedata.h" // for LLResourceData
73#include "llviewerwindow.h" 72#include "llviewerwindow.h"
74#include "llviewerimagelist.h" 73#include "llviewerimagelist.h"
75#include "llworldmap.h" 74#include "llworldmap.h"
@@ -965,8 +964,8 @@ void LLFloaterReporter::uploadDoneCallback(const LLUUID &uuid, void *user_data,
965 self->mScreenID = uuid; 964 self->mScreenID = uuid;
966 llinfos << "Got screen shot " << uuid << llendl; 965 llinfos << "Got screen shot " << uuid << llendl;
967 self->sendReportViaLegacy(self->gatherReport()); 966 self->sendReportViaLegacy(self->gatherReport());
967 self->close();
968 } 968 }
969 self->close();
970} 969}
971 970
972 971
diff --git a/linden/indra/newview/llfloatersellland.cpp b/linden/indra/newview/llfloatersellland.cpp
index 49cb14e..49cb14e 100755..100644
--- a/linden/indra/newview/llfloatersellland.cpp
+++ b/linden/indra/newview/llfloatersellland.cpp
diff --git a/linden/indra/newview/llfloatersellland.h b/linden/indra/newview/llfloatersellland.h
index 1f0af61..1f0af61 100755..100644
--- a/linden/indra/newview/llfloatersellland.h
+++ b/linden/indra/newview/llfloatersellland.h
diff --git a/linden/indra/newview/llfloatersnapshot.cpp b/linden/indra/newview/llfloatersnapshot.cpp
index af58cd9..5008509 100644
--- a/linden/indra/newview/llfloatersnapshot.cpp
+++ b/linden/indra/newview/llfloatersnapshot.cpp
@@ -53,7 +53,7 @@
53#include "llviewerstats.h" 53#include "llviewerstats.h"
54#include "llviewercamera.h" 54#include "llviewercamera.h"
55#include "llviewerwindow.h" 55#include "llviewerwindow.h"
56#include "llviewermenu.h" 56#include "llviewermenufile.h" // upload_new_resource()
57#include "llfloaterpostcard.h" 57#include "llfloaterpostcard.h"
58#include "llcheckboxctrl.h" 58#include "llcheckboxctrl.h"
59#include "llradiogroup.h" 59#include "llradiogroup.h"
diff --git a/linden/indra/newview/llfloatertest.cpp b/linden/indra/newview/llfloatertest.cpp
index 510072d..c5e353a 100644
--- a/linden/indra/newview/llfloatertest.cpp
+++ b/linden/indra/newview/llfloatertest.cpp
@@ -227,8 +227,7 @@ LLFloaterTestImpl::LLFloaterTestImpl()
227 combo = new LLComboBox("combo", 227 combo = new LLComboBox("combo",
228 LLRect(LEFT, y, LEFT+100, y-LLCOMBOBOX_HEIGHT), 228 LLRect(LEFT, y, LEFT+100, y-LLCOMBOBOX_HEIGHT),
229 "Combobox Label", 229 "Combobox Label",
230 onCommitCombo, this, 230 onCommitCombo, this);
231 150); // list_width
232 combo->add("first item"); 231 combo->add("first item");
233 combo->add("second item"); 232 combo->add("second item");
234 combo->add("should go to the top", ADD_TOP); 233 combo->add("should go to the top", ADD_TOP);
diff --git a/linden/indra/newview/llfloatertools.cpp b/linden/indra/newview/llfloatertools.cpp
index 0480628..3931acb 100644
--- a/linden/indra/newview/llfloatertools.cpp
+++ b/linden/indra/newview/llfloatertools.cpp
@@ -314,8 +314,8 @@ BOOL LLFloaterTools::postBuild()
314 mTab->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT); 314 mTab->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT);
315 mTab->setVisible( gSavedSettings.getBOOL("ToolboxShowMore") ); 315 mTab->setVisible( gSavedSettings.getBOOL("ToolboxShowMore") );
316 mTab->setBorderVisible(FALSE); 316 mTab->setBorderVisible(FALSE);
317 mTab->selectFirstTab();
317 } 318 }
318 mTab->selectFirstTab();
319 return TRUE; 319 return TRUE;
320} 320}
321 321
diff --git a/linden/indra/newview/llfloatertos.cpp b/linden/indra/newview/llfloatertos.cpp
index 6b38ca8..3ea8c49 100644
--- a/linden/indra/newview/llfloatertos.cpp
+++ b/linden/indra/newview/llfloatertos.cpp
@@ -182,7 +182,6 @@ BOOL LLFloaterTOS::postBuild()
182 childSetValue("tos_text", LLSD(mMessage)); 182 childSetValue("tos_text", LLSD(mMessage));
183#endif 183#endif
184 184
185
186 return TRUE; 185 return TRUE;
187} 186}
188 187
diff --git a/linden/indra/newview/llfolderview.cpp b/linden/indra/newview/llfolderview.cpp
index 7bc9cd8..ff0ad3f 100644
--- a/linden/indra/newview/llfolderview.cpp
+++ b/linden/indra/newview/llfolderview.cpp
@@ -229,6 +229,16 @@ LLFolderViewItem* LLFolderViewItem::getPreviousOpenNode(BOOL include_children)
229 return itemp; 229 return itemp;
230} 230}
231 231
232// is this item something we think we should be showing?
233// for example, if we haven't gotten around to filtering it yet, then the answer is yes
234// until we find out otherwise
235BOOL LLFolderViewItem::potentiallyVisible()
236{
237 // we haven't been checked against min required filter
238 // or we have and we passed
239 return getLastFilterGeneration() < getRoot()->getFilter()->getMinRequiredGeneration() || getFiltered();
240}
241
232BOOL LLFolderViewItem::getFiltered() 242BOOL LLFolderViewItem::getFiltered()
233{ 243{
234 return mFiltered && mLastFilterGeneration >= mRoot->getFilter()->getMinRequiredGeneration(); 244 return mFiltered && mLastFilterGeneration >= mRoot->getFilter()->getMinRequiredGeneration();
@@ -335,8 +345,7 @@ void LLFolderViewItem::setSelectionFromRoot(LLFolderViewItem* selection,
335} 345}
336 346
337// helper function to change the selection from the root. 347// helper function to change the selection from the root.
338void LLFolderViewItem::changeSelectionFromRoot(LLFolderViewItem* selection, 348void LLFolderViewItem::changeSelectionFromRoot(LLFolderViewItem* selection, BOOL selected)
339 BOOL selected)
340{ 349{
341 getRoot()->changeSelection(selection, selected); 350 getRoot()->changeSelection(selection, selected);
342} 351}
@@ -358,6 +367,11 @@ LLString LLFolderViewItem::getWidgetTag() const
358 return LL_FOLDER_VIEW_ITEM_TAG; 367 return LL_FOLDER_VIEW_ITEM_TAG;
359} 368}
360 369
370EInventorySortGroup LLFolderViewItem::getSortGroup()
371{
372 return SG_ITEM;
373}
374
361// addToFolder() returns TRUE if it succeeds. FALSE otherwise 375// addToFolder() returns TRUE if it succeeds. FALSE otherwise
362BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* root) 376BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* root)
363{ 377{
@@ -427,8 +441,7 @@ void LLFolderViewItem::dirtyFilter()
427// means 'deselect' for a leaf item. Do this optimization after 441// means 'deselect' for a leaf item. Do this optimization after
428// multiple selection is implemented to make sure it all plays nice 442// multiple selection is implemented to make sure it all plays nice
429// together. 443// together.
430BOOL LLFolderViewItem::setSelection(LLFolderViewItem* selection, BOOL open, 444BOOL LLFolderViewItem::setSelection(LLFolderViewItem* selection, BOOL open, BOOL take_keyboard_focus)
431 BOOL take_keyboard_focus)
432{ 445{
433 if( selection == this ) 446 if( selection == this )
434 { 447 {
@@ -445,8 +458,7 @@ BOOL LLFolderViewItem::setSelection(LLFolderViewItem* selection, BOOL open,
445 return mIsSelected; 458 return mIsSelected;
446} 459}
447 460
448BOOL LLFolderViewItem::changeSelection(LLFolderViewItem* selection, 461BOOL LLFolderViewItem::changeSelection(LLFolderViewItem* selection, BOOL selected)
449 BOOL selected)
450{ 462{
451 if(selection == this && mIsSelected != selected) 463 if(selection == this && mIsSelected != selected)
452 { 464 {
@@ -788,182 +800,174 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
788 800
789void LLFolderViewItem::draw() 801void LLFolderViewItem::draw()
790{ 802{
791 if( getVisible() ) 803 bool possibly_has_children = false;
804 bool up_to_date = mListener && mListener->isUpToDate();
805 if((up_to_date && hasVisibleChildren() ) || // we fetched our children and some of them have passed the filter...
806 (!up_to_date && mListener && mListener->hasChildren())) // ...or we know we have children but haven't fetched them (doesn't obey filter)
792 { 807 {
793 bool possibly_has_children = false; 808 possibly_has_children = true;
794 bool up_to_date = mListener && mListener->isUpToDate(); 809 }
795 if((up_to_date && hasVisibleChildren() ) || // we fetched our children and some of them have passed the filter... 810 if(/*mControlLabel[0] != '\0' && */possibly_has_children)
796 (!up_to_date && mListener && mListener->hasChildren())) // ...or we know we have children but haven't fetched them (doesn't obey filter) 811 {
797 { 812 LLGLSTexture gls_texture;
798 possibly_has_children = true; 813 if (mArrowImage)
799 }
800 if(/*mControlLabel[0] != '\0' && */possibly_has_children)
801 { 814 {
802 LLGLSTexture gls_texture; 815 gl_draw_scaled_rotated_image(mIndentation, mRect.getHeight() - ARROW_SIZE - TEXT_PAD,
803 if (mArrowImage) 816 ARROW_SIZE, ARROW_SIZE, mControlLabelRotation, mArrowImage, sFgColor);
804 {
805 gl_draw_scaled_rotated_image(mIndentation, mRect.getHeight() - ARROW_SIZE - TEXT_PAD,
806 ARROW_SIZE, ARROW_SIZE, mControlLabelRotation, mArrowImage, sFgColor);
807 }
808 } 817 }
818 }
809 819
810 F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation); 820 F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation);
811 821
812 // If we have keyboard focus, draw selection filled 822 // If we have keyboard focus, draw selection filled
813 BOOL show_context = getRoot()->getShowSelectionContext(); 823 BOOL show_context = getRoot()->getShowSelectionContext();
814 BOOL filled = show_context || (gFocusMgr.getKeyboardFocus() == getRoot()); 824 BOOL filled = show_context || (gFocusMgr.getKeyboardFocus() == getRoot());
815 825
816 // always render "current" item, only render other selected items if 826 // always render "current" item, only render other selected items if
817 // mShowSingleSelection is FALSE 827 // mShowSingleSelection is FALSE
818 if( mIsSelected ) 828 if( mIsSelected )
829 {
830 LLGLSNoTexture gls_no_texture;
831 LLColor4 bg_color = sHighlightBgColor;
832 //const S32 TRAILING_PAD = 5; // It just looks better with this.
833 if (!mIsCurSelection)
819 { 834 {
820 LLGLSNoTexture gls_no_texture; 835 // do time-based fade of extra objects
821 LLColor4 bg_color = sHighlightBgColor; 836 F32 fade_time = getRoot()->getSelectionFadeElapsedTime();
822 //const S32 TRAILING_PAD = 5; // It just looks better with this. 837 if (getRoot()->getShowSingleSelection())
823 if (!mIsCurSelection)
824 { 838 {
825 // do time-based fade of extra objects 839 // fading out
826 F32 fade_time = getRoot()->getSelectionFadeElapsedTime(); 840 bg_color.mV[VALPHA] = clamp_rescale(fade_time, 0.f, 0.4f, bg_color.mV[VALPHA], 0.f);
827 if (getRoot()->getShowSingleSelection())
828 {
829 // fading out
830 bg_color.mV[VALPHA] = clamp_rescale(fade_time, 0.f, 0.4f, bg_color.mV[VALPHA], 0.f);
831 }
832 else
833 {
834 // fading in
835 bg_color.mV[VALPHA] = clamp_rescale(fade_time, 0.f, 0.4f, 0.f, bg_color.mV[VALPHA]);
836 }
837 } 841 }
842 else
843 {
844 // fading in
845 bg_color.mV[VALPHA] = clamp_rescale(fade_time, 0.f, 0.4f, 0.f, bg_color.mV[VALPHA]);
846 }
847 }
838 848
849 gl_rect_2d(
850 0,
851 mRect.getHeight(),
852 mRect.getWidth() - 2,
853 llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD),
854 bg_color, filled);
855 if (mIsCurSelection)
856 {
839 gl_rect_2d( 857 gl_rect_2d(
840 0, 858 0,
841 mRect.getHeight(), 859 mRect.getHeight(),
842 mRect.getWidth() - 2, 860 mRect.getWidth() - 2,
843 llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD), 861 llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD),
844 bg_color, filled); 862 sHighlightFgColor, FALSE);
845 if (mIsCurSelection)
846 {
847 gl_rect_2d(
848 0,
849 mRect.getHeight(),
850 mRect.getWidth() - 2,
851 llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD),
852 sHighlightFgColor, FALSE);
853 }
854 if (mRect.getHeight() > llround(sFont->getLineHeight()) + ICON_PAD + 2)
855 {
856 gl_rect_2d(
857 0,
858 llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD) - 2,
859 mRect.getWidth() - 2,
860 2,
861 sHighlightFgColor, FALSE);
862 if (show_context)
863 {
864 gl_rect_2d(
865 0,
866 llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD) - 2,
867 mRect.getWidth() - 2,
868 2,
869 sHighlightBgColor, TRUE);
870 }
871 }
872 } 863 }
873 if (mDragAndDropTarget) 864 if (mRect.getHeight() > llround(sFont->getLineHeight()) + ICON_PAD + 2)
874 { 865 {
875 LLGLSNoTexture gls_no_texture;
876 gl_rect_2d( 866 gl_rect_2d(
877 0, 867 0,
878 mRect.getHeight(), 868 llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD) - 2,
879 mRect.getWidth() - 2, 869 mRect.getWidth() - 2,
880 llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD), 870 2,
881 sHighlightBgColor, FALSE); 871 sHighlightFgColor, FALSE);
882 872 if (show_context)
883 if (mRect.getHeight() > llround(sFont->getLineHeight()) + ICON_PAD + 2)
884 { 873 {
885 gl_rect_2d( 874 gl_rect_2d(
886 0, 875 0,
887 llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD) - 2, 876 llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD) - 2,
888 mRect.getWidth() - 2, 877 mRect.getWidth() - 2,
889 2, 878 2,
890 sHighlightBgColor, FALSE); 879 sHighlightBgColor, TRUE);
891 } 880 }
892 mDragAndDropTarget = FALSE;
893 } 881 }
882 }
883 if (mDragAndDropTarget)
884 {
885 LLGLSNoTexture gls_no_texture;
886 gl_rect_2d(
887 0,
888 mRect.getHeight(),
889 mRect.getWidth() - 2,
890 llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD),
891 sHighlightBgColor, FALSE);
894 892
895 893 if (mRect.getHeight() > llround(sFont->getLineHeight()) + ICON_PAD + 2)
896 if(mIcon)
897 { 894 {
898 gl_draw_image(mIndentation + ARROW_SIZE + TEXT_PAD, mRect.getHeight() - mIcon->getHeight(), mIcon); 895 gl_rect_2d(
899 mIcon->addTextureStats( (F32)(mIcon->getWidth() * mIcon->getHeight())); 896 0,
897 llfloor(mRect.getHeight() - sFont->getLineHeight() - ICON_PAD) - 2,
898 mRect.getWidth() - 2,
899 2,
900 sHighlightBgColor, FALSE);
900 } 901 }
902 mDragAndDropTarget = FALSE;
903 }
901 904
902 if (!mLabel.empty())
903 {
904 // highlight filtered text
905 BOOL debug_filters = getRoot()->getDebugFilters();
906 LLColor4 color = ( (mIsSelected && filled) ? sHighlightFgColor : sFgColor );
907 F32 right_x;
908 F32 y = (F32)mRect.getHeight() - sFont->getLineHeight() - (F32)TEXT_PAD;
909 905
910 if (debug_filters) 906 if(mIcon)
911 { 907 {
912 if (!getFiltered() && !possibly_has_children) 908 gl_draw_image(mIndentation + ARROW_SIZE + TEXT_PAD, mRect.getHeight() - mIcon->getHeight(), mIcon);
913 { 909 mIcon->addTextureStats( (F32)(mIcon->getWidth() * mIcon->getHeight()));
914 color.mV[VALPHA] *= 0.5f; 910 }
915 }
916
917 LLColor4 filter_color = mLastFilterGeneration >= getRoot()->getFilter()->getCurrentGeneration() ? LLColor4(0.5f, 0.8f, 0.5f, 1.f) : LLColor4(0.8f, 0.5f, 0.5f, 1.f);
918 sSmallFont->renderUTF8(mStatusText, 0, text_left, y, filter_color,
919 LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL,
920 S32_MAX, S32_MAX, &right_x, FALSE );
921 text_left = right_x;
922 }
923 911
924 sFont->renderUTF8( mLabel, 0, text_left, y, color, 912 if (!mLabel.empty())
925 LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle, 913 {
926 S32_MAX, S32_MAX, &right_x, FALSE ); 914 // highlight filtered text
927 if (!mLabelSuffix.empty()) 915 BOOL debug_filters = getRoot()->getDebugFilters();
928 { 916 LLColor4 color = ( (mIsSelected && filled) ? sHighlightFgColor : sFgColor );
929 sFont->renderUTF8( mLabelSuffix, 0, right_x, y, LLColor4(0.75f, 0.85f, 0.85f, 1.f), 917 F32 right_x;
930 LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle, 918 F32 y = (F32)mRect.getHeight() - sFont->getLineHeight() - (F32)TEXT_PAD;
931 S32_MAX, S32_MAX, &right_x, FALSE );
932 }
933 919
934 if (mBoxImage.notNull() && mStringMatchOffset != LLString::npos) 920 if (debug_filters)
921 {
922 if (!getFiltered() && !possibly_has_children)
935 { 923 {
936 // don't draw backgrounds for zero-length strings 924 color.mV[VALPHA] *= 0.5f;
937 S32 filter_string_length = mRoot->getFilterSubString().size();
938 if (filter_string_length > 0)
939 {
940 LLString combined_string = mLabel + mLabelSuffix;
941 S32 left = llround(text_left) + sFont->getWidth(combined_string, 0, mStringMatchOffset) - 1;
942 S32 right = left + sFont->getWidth(combined_string, mStringMatchOffset, filter_string_length) + 2;
943 S32 bottom = llfloor(mRect.getHeight() - sFont->getLineHeight() - 3);
944 S32 top = mRect.getHeight();
945
946 LLViewerImage::bindTexture(mBoxImage);
947 glColor4fv(sFilterBGColor.mV);
948 gl_segmented_rect_2d_tex(left, top, right, bottom, mBoxImage->getWidth(), mBoxImage->getHeight(), 16);
949 F32 match_string_left = text_left + sFont->getWidthF32(combined_string, 0, mStringMatchOffset);
950 F32 y = (F32)mRect.getHeight() - sFont->getLineHeight() - (F32)TEXT_PAD;
951 sFont->renderUTF8( combined_string, mStringMatchOffset, match_string_left, y,
952 sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle,
953 filter_string_length, S32_MAX, &right_x, FALSE );
954 }
955 } 925 }
926
927 LLColor4 filter_color = mLastFilterGeneration >= getRoot()->getFilter()->getCurrentGeneration() ? LLColor4(0.5f, 0.8f, 0.5f, 1.f) : LLColor4(0.8f, 0.5f, 0.5f, 1.f);
928 sSmallFont->renderUTF8(mStatusText, 0, text_left, y, filter_color,
929 LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL,
930 S32_MAX, S32_MAX, &right_x, FALSE );
931 text_left = right_x;
956 } 932 }
957 933
958 if( sDebugRects ) 934 sFont->renderUTF8( mLabel, 0, text_left, y, color,
935 LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle,
936 S32_MAX, S32_MAX, &right_x, FALSE );
937 if (!mLabelSuffix.empty())
959 { 938 {
960 drawDebugRect(); 939 sFont->renderUTF8( mLabelSuffix, 0, right_x, y, LLColor4(0.75f, 0.85f, 0.85f, 1.f),
940 LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle,
941 S32_MAX, S32_MAX, &right_x, FALSE );
942 }
943
944 if (mBoxImage.notNull() && mStringMatchOffset != LLString::npos)
945 {
946 // don't draw backgrounds for zero-length strings
947 S32 filter_string_length = mRoot->getFilterSubString().size();
948 if (filter_string_length > 0)
949 {
950 LLString combined_string = mLabel + mLabelSuffix;
951 S32 left = llround(text_left) + sFont->getWidth(combined_string, 0, mStringMatchOffset) - 1;
952 S32 right = left + sFont->getWidth(combined_string, mStringMatchOffset, filter_string_length) + 2;
953 S32 bottom = llfloor(mRect.getHeight() - sFont->getLineHeight() - 3);
954 S32 top = mRect.getHeight();
955
956 LLViewerImage::bindTexture(mBoxImage);
957 glColor4fv(sFilterBGColor.mV);
958 gl_segmented_rect_2d_tex(left, top, right, bottom, mBoxImage->getWidth(), mBoxImage->getHeight(), 16);
959 F32 match_string_left = text_left + sFont->getWidthF32(combined_string, 0, mStringMatchOffset);
960 F32 y = (F32)mRect.getHeight() - sFont->getLineHeight() - (F32)TEXT_PAD;
961 sFont->renderUTF8( combined_string, mStringMatchOffset, match_string_left, y,
962 sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle,
963 filter_string_length, S32_MAX, &right_x, FALSE );
964 }
961 } 965 }
962 } 966 }
963 else if (mStatusText.size()) 967
968 if( sDebugRects )
964 { 969 {
965 // just draw status text 970 drawDebugRect();
966 sFont->renderUTF8( mStatusText, 0, 0, 1, sFgColor, LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle, S32_MAX, S32_MAX, NULL, FALSE );
967 } 971 }
968} 972}
969 973
@@ -977,7 +981,6 @@ LLFolderViewFolder::LLFolderViewFolder( const LLString& name, LLViewerImage* ico
977 LLFolderView* root, 981 LLFolderView* root,
978 LLFolderViewEventListener* listener ): 982 LLFolderViewEventListener* listener ):
979 LLFolderViewItem( name, icon, 0, root, listener ), // 0 = no create time 983 LLFolderViewItem( name, icon, 0, root, listener ), // 0 = no create time
980 mSortFunction(sort_item_name),
981 mIsOpen(FALSE), 984 mIsOpen(FALSE),
982 mExpanderHighlighted(FALSE), 985 mExpanderHighlighted(FALSE),
983 mCurHeight(0.f), 986 mCurHeight(0.f),
@@ -1246,7 +1249,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
1246 } 1249 }
1247 1250
1248 // when applying a filter, matching folders get their contents downloaded first 1251 // when applying a filter, matching folders get their contents downloaded first
1249 if (filter.isNotDefault() && getFiltered(filter.getMinRequiredGeneration()) && !gInventory.isCategoryComplete(mListener->getUUID())) 1252 if (filter.isNotDefault() && getFiltered(filter.getMinRequiredGeneration()) && (mListener && !gInventory.isCategoryComplete(mListener->getUUID())))
1250 { 1253 {
1251 gInventory.startBackgroundFetch(mListener->getUUID()); 1254 gInventory.startBackgroundFetch(mListener->getUUID());
1252 } 1255 }
@@ -1667,7 +1670,8 @@ BOOL LLFolderViewFolder::removeItem(LLFolderViewItem* item)
1667{ 1670{
1668 if(item->remove()) 1671 if(item->remove())
1669 { 1672 {
1670 removeView(item); 1673 //RN: this seem unneccessary as remove() moves to trash
1674 //removeView(item);
1671 return TRUE; 1675 return TRUE;
1672 } 1676 }
1673 return FALSE; 1677 return FALSE;
@@ -1677,7 +1681,7 @@ BOOL LLFolderViewFolder::removeItem(LLFolderViewItem* item)
1677// listeners. 1681// listeners.
1678void LLFolderViewFolder::removeView(LLFolderViewItem* item) 1682void LLFolderViewFolder::removeView(LLFolderViewItem* item)
1679{ 1683{
1680 if (!item) 1684 if (!item || item->getParentFolder() != this)
1681 { 1685 {
1682 return; 1686 return;
1683 } 1687 }
@@ -1722,23 +1726,8 @@ void LLFolderViewFolder::extractItem( LLFolderViewItem* item )
1722// This is only called for renaming an object because it won't work for date 1726// This is only called for renaming an object because it won't work for date
1723void LLFolderViewFolder::resort(LLFolderViewItem* item) 1727void LLFolderViewFolder::resort(LLFolderViewItem* item)
1724{ 1728{
1725 std::sort(mItems.begin(), mItems.end(), *mSortFunction); 1729 std::sort(mItems.begin(), mItems.end(), mSortFunction);
1726 std::sort(mFolders.begin(), mFolders.end(), *mSortFunction); 1730 std::sort(mFolders.begin(), mFolders.end(), mSortFunction);
1727 //if(mItems.removeData(item))
1728 //{
1729 // mItems.addDataSorted(item);
1730 //}
1731 //else
1732 //{
1733 // // This is an evil downcast. However, it's only doing
1734 // // pointer comparison to find if (which it should be ) the
1735 // // item is in the container, so it's pretty safe.
1736 // LLFolderViewFolder* f = reinterpret_cast<LLFolderViewFolder*>(item);
1737 // if(mFolders.removeData(f))
1738 // {
1739 // mFolders.addDataSorted(f);
1740 // }
1741 //}
1742} 1731}
1743 1732
1744bool LLFolderViewFolder::isTrash() 1733bool LLFolderViewFolder::isTrash()
@@ -1752,65 +1741,22 @@ bool LLFolderViewFolder::isTrash()
1752 1741
1753void LLFolderViewFolder::sortBy(U32 order) 1742void LLFolderViewFolder::sortBy(U32 order)
1754{ 1743{
1755 BOOL sort_order_changed = FALSE; 1744 if (!mSortFunction.updateSort(order))
1756 if (!(order & LLInventoryFilter::SO_DATE))
1757 {
1758 if (mSortFunction != sort_item_name)
1759 {
1760 mSortFunction = sort_item_name;
1761 sort_order_changed = TRUE;
1762 }
1763 }
1764 else
1765 { 1745 {
1766 if (mSortFunction != sort_item_date) 1746 // No changes.
1767 { 1747 return;
1768 mSortFunction = sort_item_date;
1769 sort_order_changed = TRUE;
1770 }
1771 } 1748 }
1772 1749
1750 // Propegate this change to sub folders
1773 for (folders_t::iterator iter = mFolders.begin(); 1751 for (folders_t::iterator iter = mFolders.begin();
1774 iter != mFolders.end();) 1752 iter != mFolders.end();)
1775 { 1753 {
1776 folders_t::iterator fit = iter++; 1754 folders_t::iterator fit = iter++;
1777 (*fit)->sortBy(order); 1755 (*fit)->sortBy(order);
1778 } 1756 }
1779 if (order & LLInventoryFilter::SO_FOLDERS_BY_NAME)
1780 {
1781 // sort folders by name if always by name
1782 std::sort(mFolders.begin(), mFolders.end(), sort_item_name);
1783 }
1784 else
1785 {
1786 // sort folders by the default sort ordering
1787 std::sort(mFolders.begin(), mFolders.end(), *mSortFunction);
1788 1757
1789 // however, if we are at the root of the inventory and we are sorting by date 1758 std::sort(mFolders.begin(), mFolders.end(), mSortFunction);
1790 if (mListener->getUUID() == gAgent.getInventoryRootID() && order & LLInventoryFilter::SO_DATE) 1759 std::sort(mItems.begin(), mItems.end(), mSortFunction);
1791 {
1792 // pull the trash folder and stick it on the end of the list
1793 LLFolderViewFolder *t = NULL;
1794 for (folders_t::iterator fit = mFolders.begin();
1795 fit != mFolders.end(); ++fit)
1796 {
1797 if ((*fit)->isTrash())
1798 {
1799 t = *fit;
1800 mFolders.erase(fit);
1801 break;
1802 }
1803 }
1804 if (t)
1805 {
1806 mFolders.push_back(t);
1807 }
1808 }
1809 }
1810 if (sort_order_changed)
1811 {
1812 std::sort(mItems.begin(), mItems.end(), *mSortFunction);
1813 }
1814 1760
1815 if (order & LLInventoryFilter::SO_DATE) 1761 if (order & LLInventoryFilter::SO_DATE)
1816 { 1762 {
@@ -1834,19 +1780,39 @@ void LLFolderViewFolder::sortBy(U32 order)
1834 } 1780 }
1835} 1781}
1836 1782
1837void LLFolderViewFolder::setItemSortFunction(sort_order_f ordering) 1783void LLFolderViewFolder::setItemSortOrder(U32 ordering)
1838{ 1784{
1839 mSortFunction = ordering; 1785 if (mSortFunction.updateSort(ordering))
1786 {
1787 for (folders_t::iterator iter = mFolders.begin();
1788 iter != mFolders.end();)
1789 {
1790 folders_t::iterator fit = iter++;
1791 (*fit)->setItemSortOrder(ordering);
1792 }
1840 1793
1841 for (folders_t::iterator iter = mFolders.begin(); 1794 std::sort(mFolders.begin(), mFolders.end(), mSortFunction);
1842 iter != mFolders.end();) 1795 std::sort(mItems.begin(), mItems.end(), mSortFunction);
1796 }
1797}
1798
1799EInventorySortGroup LLFolderViewFolder::getSortGroup()
1800{
1801 if (isTrash())
1843 { 1802 {
1844 folders_t::iterator fit = iter++; 1803 return SG_TRASH_FOLDER;
1845 (*fit)->setItemSortFunction(ordering);
1846 } 1804 }
1847 1805
1848 std::sort(mFolders.begin(), mFolders.end(), *mSortFunction); 1806 // Folders that can't be moved are 'system' folders.
1849 std::sort(mItems.begin(), mItems.end(), *mSortFunction); 1807 if( mListener )
1808 {
1809 if( !(mListener->isItemMovable()) )
1810 {
1811 return SG_SYSTEM_FOLDER;
1812 }
1813 }
1814
1815 return SG_NORMAL_FOLDER;
1850} 1816}
1851 1817
1852BOOL LLFolderViewFolder::isMovable() 1818BOOL LLFolderViewFolder::isMovable()
@@ -1917,6 +1883,7 @@ BOOL LLFolderViewFolder::isRemovable()
1917// this is an internal method used for adding items to folders. 1883// this is an internal method used for adding items to folders.
1918BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item) 1884BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)
1919{ 1885{
1886
1920 items_t::iterator it = std::lower_bound( 1887 items_t::iterator it = std::lower_bound(
1921 mItems.begin(), 1888 mItems.begin(),
1922 mItems.end(), 1889 mItems.end(),
@@ -1945,18 +1912,29 @@ BOOL LLFolderViewFolder::addFolder(LLFolderViewFolder* folder)
1945 folder->setVisible(FALSE); 1912 folder->setVisible(FALSE);
1946 addChild( folder ); 1913 addChild( folder );
1947 folder->dirtyFilter(); 1914 folder->dirtyFilter();
1948 requestArrange(); 1915 // rearrange all descendants too, as our indentation level might have changed
1916 folder->requestArrange(TRUE);
1949 return TRUE; 1917 return TRUE;
1950} 1918}
1951 1919
1952void LLFolderViewFolder::requestArrange() 1920void LLFolderViewFolder::requestArrange(BOOL include_descendants)
1953{ 1921{
1954 mLastArrangeGeneration = -1; 1922 mLastArrangeGeneration = -1;
1955 // flag all items up to root 1923 // flag all items up to root
1956 if (mParentFolder) 1924 if (mParentFolder && !mParentFolder->needsArrange())
1957 { 1925 {
1958 mParentFolder->requestArrange(); 1926 mParentFolder->requestArrange();
1959 } 1927 }
1928
1929 if (include_descendants)
1930 {
1931 for (folders_t::iterator iter = mFolders.begin();
1932 iter != mFolders.end();
1933 ++iter)
1934 {
1935 (*iter)->requestArrange(TRUE);
1936 }
1937 }
1960} 1938}
1961 1939
1962void LLFolderViewFolder::toggleOpen() 1940void LLFolderViewFolder::toggleOpen()
@@ -2002,11 +1980,11 @@ void LLFolderViewFolder::setOpenArrangeRecursively(BOOL open, ERecurseType recur
2002} 1980}
2003 1981
2004BOOL LLFolderViewFolder::handleDragAndDropFromChild(MASK mask, 1982BOOL LLFolderViewFolder::handleDragAndDropFromChild(MASK mask,
2005 BOOL drop, 1983 BOOL drop,
2006 EDragAndDropType c_type, 1984 EDragAndDropType c_type,
2007 void* cargo_data, 1985 void* cargo_data,
2008 EAcceptance* accept, 1986 EAcceptance* accept,
2009 LLString& tooltip_msg) 1987 LLString& tooltip_msg)
2010{ 1988{
2011 BOOL accepted = mListener && mListener->dragOrDrop(mask,drop,c_type,cargo_data); 1989 BOOL accepted = mListener && mListener->dragOrDrop(mask,drop,c_type,cargo_data);
2012 if (accepted) 1990 if (accepted)
@@ -2218,16 +2196,13 @@ void LLFolderViewFolder::draw()
2218 } 2196 }
2219 2197
2220 LLFolderViewItem::draw(); 2198 LLFolderViewItem::draw();
2221 if( mIsOpen ) 2199
2200 // draw children if root folder, or any other folder that is open or animating to closed state
2201 if( getRoot() == this || (mIsOpen || mCurHeight != mTargetHeight ))
2222 { 2202 {
2223 LLView::draw(); 2203 LLView::draw();
2224 } 2204 }
2225 2205
2226// if (mExpanderHighlighted)
2227// {
2228// gl_rect_2d(mIndentation - TEXT_PAD, llfloor(mRect.getHeight() - TEXT_PAD), mIndentation + sFont->getWidth(mControlLabel) + TEXT_PAD, llfloor(mRect.getHeight() - sFont->getLineHeight() - TEXT_PAD), sFgColor, FALSE);
2229// //sFont->renderUTF8( mControlLabel, 0, mIndentation, llfloor(mRect.getHeight() - sFont->getLineHeight() - TEXT_PAD), sFgColor, LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle, S32_MAX, S32_MAX, NULL, FALSE );
2230// }
2231 mExpanderHighlighted = FALSE; 2206 mExpanderHighlighted = FALSE;
2232} 2207}
2233 2208
@@ -2237,6 +2212,16 @@ U32 LLFolderViewFolder::getCreationDate() const
2237} 2212}
2238 2213
2239 2214
2215BOOL LLFolderViewFolder::potentiallyVisible()
2216{
2217 // folder should be visible by it's own filter status
2218 return LLFolderViewItem::potentiallyVisible()
2219 // or one or more of its descendants have passed the minimum filter requirement
2220 || hasFilteredDescendants(mRoot->getFilter()->getMinRequiredGeneration())
2221 // or not all of its descendants have been checked against minimum filter requirement
2222 || getCompletedFilterGeneration() < getRoot()->getFilter()->getMinRequiredGeneration();
2223}
2224
2240// this does prefix traversal, as folders are listed above their contents 2225// this does prefix traversal, as folders are listed above their contents
2241LLFolderViewItem* LLFolderViewFolder::getNextFromChild( LLFolderViewItem* item, BOOL include_children ) 2226LLFolderViewItem* LLFolderViewFolder::getNextFromChild( LLFolderViewItem* item, BOOL include_children )
2242{ 2227{
@@ -2456,20 +2441,20 @@ LLFolderViewItem* LLFolderViewFolder::getPreviousFromChild( LLFolderViewItem* it
2456class LLSetItemSortFunction : public LLFolderViewFunctor 2441class LLSetItemSortFunction : public LLFolderViewFunctor
2457{ 2442{
2458public: 2443public:
2459 LLSetItemSortFunction(sort_order_f ordering) 2444 LLSetItemSortFunction(U32 ordering)
2460 : mSortFunction(ordering) {} 2445 : mSortOrder(ordering) {}
2461 virtual ~LLSetItemSortFunction() {} 2446 virtual ~LLSetItemSortFunction() {}
2462 virtual void doFolder(LLFolderViewFolder* folder); 2447 virtual void doFolder(LLFolderViewFolder* folder);
2463 virtual void doItem(LLFolderViewItem* item); 2448 virtual void doItem(LLFolderViewItem* item);
2464 2449
2465 sort_order_f mSortFunction; 2450 U32 mSortOrder;
2466}; 2451};
2467 2452
2468 2453
2469// Set the sort order. 2454// Set the sort order.
2470void LLSetItemSortFunction::doFolder(LLFolderViewFolder* folder) 2455void LLSetItemSortFunction::doFolder(LLFolderViewFolder* folder)
2471{ 2456{
2472 folder->setItemSortFunction(mSortFunction); 2457 folder->setItemSortOrder(mSortOrder);
2473} 2458}
2474 2459
2475// Do nothing. 2460// Do nothing.
@@ -2696,6 +2681,7 @@ BOOL LLFolderView::addFolder( LLFolderViewFolder* folder)
2696 folder->setVisible(FALSE); 2681 folder->setVisible(FALSE);
2697 addChild( folder ); 2682 addChild( folder );
2698 folder->dirtyFilter(); 2683 folder->dirtyFilter();
2684 folder->requestArrange();
2699 return TRUE; 2685 return TRUE;
2700} 2686}
2701 2687
@@ -2916,8 +2902,8 @@ BOOL LLFolderView::setSelection(LLFolderViewItem* selection, BOOL open, /* Flaw
2916 addToSelectionList(selection); 2902 addToSelectionList(selection);
2917 } 2903 }
2918 2904
2919 BOOL rv = LLFolderViewFolder::setSelection(selection, open, take_keyboard_focus); /* Flawfinder: ignore */ 2905 BOOL rv = LLFolderViewFolder::setSelection(selection, open, take_keyboard_focus);
2920 if(open) /* Flawfinder: ignore */ 2906 if(open && selection)
2921 { 2907 {
2922 selection->getParentFolder()->requestArrange(); 2908 selection->getParentFolder()->requestArrange();
2923 } 2909 }
@@ -2954,11 +2940,6 @@ BOOL LLFolderView::changeSelection(LLFolderViewItem* selection, BOOL selected)
2954 } 2940 }
2955 2941
2956 BOOL on_list = (item_iter != mSelectedItems.end()); 2942 BOOL on_list = (item_iter != mSelectedItems.end());
2957 if (on_list && mSelectedItems.size() == 1)
2958 {
2959 // we are trying to select/deselect the only selected item
2960 return FALSE;
2961 }
2962 2943
2963 if(selected && !on_list) 2944 if(selected && !on_list)
2964 { 2945 {
@@ -3005,48 +2986,46 @@ S32 LLFolderView::extendSelection(LLFolderViewItem* selection, LLFolderViewItem*
3005 2986
3006void LLFolderView::sanitizeSelection() 2987void LLFolderView::sanitizeSelection()
3007{ 2988{
2989 // store off current item in case it is automatically deselected
2990 // and we want to preserve context
2991 LLFolderViewItem* original_selected_item = getCurSelectedItem();
2992
3008 std::vector<LLFolderViewItem*> items_to_remove; 2993 std::vector<LLFolderViewItem*> items_to_remove;
3009 selected_items_t::iterator item_iter; 2994 selected_items_t::iterator item_iter;
3010 for (item_iter = mSelectedItems.begin(); item_iter != mSelectedItems.end(); ++item_iter) 2995 for (item_iter = mSelectedItems.begin(); item_iter != mSelectedItems.end(); ++item_iter)
3011 { 2996 {
3012 LLFolderViewItem* item = *item_iter; 2997 LLFolderViewItem* item = *item_iter;
3013 2998
3014 BOOL visible = item->getVisible(); 2999 // ensure that each ancestor is open and potentially passes filtering
3000 BOOL visible = item->potentiallyVisible(); // initialize from filter state for this item
3001 // modify with parent open and filters states
3015 LLFolderViewFolder* parent_folder = item->getParentFolder(); 3002 LLFolderViewFolder* parent_folder = item->getParentFolder();
3016 while(visible && parent_folder) 3003 while(parent_folder)
3017 { 3004 {
3018 visible = visible && parent_folder->isOpen() && parent_folder->getVisible(); 3005 visible = visible && parent_folder->isOpen() && parent_folder->potentiallyVisible();
3019 parent_folder = parent_folder->getParentFolder(); 3006 parent_folder = parent_folder->getParentFolder();
3020 } 3007 }
3021 if (!visible || item->getNumSelectedDescendants() > 0) 3008
3009 // deselect item if any ancestor is closed or didn't pass filter requirements.
3010 if (!visible)
3022 { 3011 {
3023 // only deselect self if not visible 3012 items_to_remove.push_back(item);
3024 // check to see if item failed the filter but was checked against most recent generation 3013 }
3025 if ((!item->getFiltered() && item->getLastFilterGeneration() >= getFilter()->getMinRequiredGeneration())
3026 || (item->getParentFolder() && !item->getParentFolder()->isOpen()))
3027 {
3028 item->recursiveDeselect(TRUE);
3029 items_to_remove.push_back(item);
3030 }
3031 else
3032 {
3033 item->recursiveDeselect(FALSE);
3034 }
3035 3014
3036 selected_items_t::iterator other_item_iter; 3015 // disallow nested selections (i.e. folder items plus one or more ancestors)
3037 for (other_item_iter = mSelectedItems.begin(); other_item_iter != mSelectedItems.end(); ++other_item_iter) 3016 // could check cached mum selections count and only iterate if there are any
3017 // but that may be a premature optimization.
3018 selected_items_t::iterator other_item_iter;
3019 for (other_item_iter = mSelectedItems.begin(); other_item_iter != mSelectedItems.end(); ++other_item_iter)
3020 {
3021 LLFolderViewItem* other_item = *other_item_iter;
3022 for(LLFolderViewFolder* parent_folder = other_item->getParentFolder(); parent_folder; parent_folder = parent_folder->getParentFolder())
3038 { 3023 {
3039 LLFolderViewItem* other_item = *other_item_iter; 3024 if (parent_folder == item)
3040 LLFolderViewFolder* parent_folder = other_item->getParentFolder();
3041 while (parent_folder)
3042 { 3025 {
3043 if (parent_folder == item) 3026 // this is a descendent of the current folder, remove from list
3044 { 3027 items_to_remove.push_back(other_item);
3045 // this is a descendent of the current folder, remove from list 3028 break;
3046 items_to_remove.push_back(other_item);
3047 break;
3048 }
3049 parent_folder = parent_folder->getParentFolder();
3050 } 3029 }
3051 } 3030 }
3052 } 3031 }
@@ -3055,7 +3034,47 @@ void LLFolderView::sanitizeSelection()
3055 std::vector<LLFolderViewItem*>::iterator item_it; 3034 std::vector<LLFolderViewItem*>::iterator item_it;
3056 for (item_it = items_to_remove.begin(); item_it != items_to_remove.end(); ++item_it ) 3035 for (item_it = items_to_remove.begin(); item_it != items_to_remove.end(); ++item_it )
3057 { 3036 {
3058 removeFromSelectionList(*item_it); 3037 changeSelection(*item_it, FALSE); // toggle selection (also removes from list)
3038 }
3039
3040 // if nothing selected after prior constraints...
3041 if (mSelectedItems.empty())
3042 {
3043 // ...select first available parent of original selection, or "My Inventory" otherwise
3044 LLFolderViewItem* new_selection = NULL;
3045 if (original_selected_item)
3046 {
3047 for(LLFolderViewFolder* parent_folder = original_selected_item->getParentFolder();
3048 parent_folder;
3049 parent_folder = parent_folder->getParentFolder())
3050 {
3051 if (parent_folder->potentiallyVisible())
3052 {
3053 // give initial selection to first ancestor folder that potentially passes the filter
3054 if (!new_selection)
3055 {
3056 new_selection = parent_folder;
3057 }
3058
3059 // if any ancestor folder of original item is closed, move the selection up
3060 // to the highest closed
3061 if (!parent_folder->isOpen())
3062 {
3063 new_selection = parent_folder;
3064 }
3065 }
3066 }
3067 }
3068 else
3069 {
3070 // nothing selected to start with, so pick "My Inventory" as best guess
3071 new_selection = getItemByID(gAgent.getInventoryRootID());
3072 }
3073
3074 if (new_selection)
3075 {
3076 setSelection(new_selection, FALSE, FALSE);
3077 }
3059 } 3078 }
3060} 3079}
3061 3080
@@ -3232,7 +3251,7 @@ void LLFolderView::removeSelectedItems( void )
3232 // create a temporary structure which we will use to remove 3251 // create a temporary structure which we will use to remove
3233 // items, since the removal will futz with internal data 3252 // items, since the removal will futz with internal data
3234 // structures. 3253 // structures.
3235 LLDynamicArray<LLFolderViewItem*> items; 3254 std::vector<LLFolderViewItem*> items;
3236 S32 count = mSelectedItems.size(); 3255 S32 count = mSelectedItems.size();
3237 if(count == 0) return; 3256 if(count == 0) return;
3238 LLFolderViewItem* item = NULL; 3257 LLFolderViewItem* item = NULL;
@@ -3242,7 +3261,7 @@ void LLFolderView::removeSelectedItems( void )
3242 item = *item_it; 3261 item = *item_it;
3243 if(item->isRemovable()) 3262 if(item->isRemovable())
3244 { 3263 {
3245 items.put(item); 3264 items.push_back(item);
3246 } 3265 }
3247 else 3266 else
3248 { 3267 {
@@ -3252,11 +3271,11 @@ void LLFolderView::removeSelectedItems( void )
3252 } 3271 }
3253 3272
3254 // iterate through the new container. 3273 // iterate through the new container.
3255 count = items.count(); 3274 count = items.size();
3256 LLUUID new_selection_id; 3275 LLUUID new_selection_id;
3257 if(count == 1) 3276 if(count == 1)
3258 { 3277 {
3259 LLFolderViewItem* item_to_delete = items.get(0); 3278 LLFolderViewItem* item_to_delete = items[0];
3260 LLFolderViewFolder* parent = item_to_delete->getParentFolder(); 3279 LLFolderViewFolder* parent = item_to_delete->getParentFolder();
3261 LLFolderViewItem* new_selection = item_to_delete->getNextOpenNode(FALSE); 3280 LLFolderViewItem* new_selection = item_to_delete->getNextOpenNode(FALSE);
3262 if (!new_selection) 3281 if (!new_selection)
@@ -3284,7 +3303,7 @@ void LLFolderView::removeSelectedItems( void )
3284 { 3303 {
3285 LLDynamicArray<LLFolderViewEventListener*> listeners; 3304 LLDynamicArray<LLFolderViewEventListener*> listeners;
3286 LLFolderViewEventListener* listener; 3305 LLFolderViewEventListener* listener;
3287 LLFolderViewItem* last_item = items.get(count - 1); 3306 LLFolderViewItem* last_item = items[count - 1];
3288 LLFolderViewItem* new_selection = last_item->getNextOpenNode(FALSE); 3307 LLFolderViewItem* new_selection = last_item->getNextOpenNode(FALSE);
3289 while(new_selection && new_selection->isSelected()) 3308 while(new_selection && new_selection->isSelected())
3290 { 3309 {
@@ -3309,7 +3328,7 @@ void LLFolderView::removeSelectedItems( void )
3309 3328
3310 for(S32 i = 0; i < count; ++i) 3329 for(S32 i = 0; i < count; ++i)
3311 { 3330 {
3312 listener = items.get(i)->getListener(); 3331 listener = items[i]->getListener();
3313 if(listener && (listeners.find(listener) == LLDynamicArray<LLFolderViewEventListener*>::FAIL)) 3332 if(listener && (listeners.find(listener) == LLDynamicArray<LLFolderViewEventListener*>::FAIL))
3314 { 3333 {
3315 listeners.put(listener); 3334 listeners.put(listener);
@@ -3620,21 +3639,6 @@ void LLFolderView::setFocus(BOOL focus)
3620{ 3639{
3621 if (focus) 3640 if (focus)
3622 { 3641 {
3623 // select "My Inventory" if nothing selected
3624 if (!getCurSelectedItem())
3625 {
3626 LLFolderViewItem* itemp = getItemByID(gAgent.getInventoryRootID());
3627 if (itemp)
3628 {
3629 setSelection(itemp, FALSE, FALSE);
3630 }
3631 }
3632
3633 if (mRenamer->getVisible())
3634 {
3635 //RN: commit rename changes when focus is moved, only revert on ESC
3636 finishRenamingItem();
3637 }
3638 if(!hasFocus()) 3642 if(!hasFocus())
3639 { 3643 {
3640 gEditMenuHandler = this; 3644 gEditMenuHandler = this;
@@ -3954,10 +3958,10 @@ BOOL LLFolderView::search(LLFolderViewItem* first_item, const LLString &search_s
3954 LLString::toUpper(upper_case_string); 3958 LLString::toUpper(upper_case_string);
3955 3959
3956 // if nothing selected, select first item in folder 3960 // if nothing selected, select first item in folder
3957 if (!first_item) 3961 if (!search_item)
3958 { 3962 {
3959 // start from first item 3963 // start from first item
3960 first_item = getNextFromChild(NULL); 3964 search_item = getNextFromChild(NULL);
3961 } 3965 }
3962 3966
3963 // search over all open nodes for first substring match (with wrapping) 3967 // search over all open nodes for first substring match (with wrapping)
@@ -4248,8 +4252,6 @@ void LLFolderView::idle(void* user_data)
4248 // filter to determine visiblity before arranging 4252 // filter to determine visiblity before arranging
4249 self->filterFromRoot(); 4253 self->filterFromRoot();
4250 4254
4251 self->sanitizeSelection();
4252
4253 // automatically show matching items, and select first one 4255 // automatically show matching items, and select first one
4254 // do this every frame until user puts keyboard focus into the inventory window 4256 // do this every frame until user puts keyboard focus into the inventory window
4255 // signaling the end of the automatic update 4257 // signaling the end of the automatic update
@@ -4269,6 +4271,8 @@ void LLFolderView::idle(void* user_data)
4269 self->scrollToShowSelection(); 4271 self->scrollToShowSelection();
4270 } 4272 }
4271 4273
4274 self->sanitizeSelection();
4275
4272 if( self->needsArrange() && self->isInVisibleChain()) 4276 if( self->needsArrange() && self->isInVisibleChain())
4273 { 4277 {
4274 self->arrangeFromRoot(); 4278 self->arrangeFromRoot();
@@ -4307,33 +4311,71 @@ void LLFolderView::dumpSelectionInformation()
4307///---------------------------------------------------------------------------- 4311///----------------------------------------------------------------------------
4308/// Local function definitions 4312/// Local function definitions
4309///---------------------------------------------------------------------------- 4313///----------------------------------------------------------------------------
4310 4314bool LLInventorySort::updateSort(U32 order)
4311bool sort_item_name(LLFolderViewItem* a, LLFolderViewItem* b)
4312{ 4315{
4313 S32 compare = LLString::compareDict(a->getLabel(), b->getLabel()); 4316 if (order != mSortOrder)
4314 if (0 == compare)
4315 {
4316 return (a->getCreationDate() > b->getCreationDate());
4317 }
4318 else
4319 { 4317 {
4320 return (compare < 0); 4318 mSortOrder = order;
4319 mByDate = (order & LLInventoryFilter::SO_DATE);
4320 mSystemToTop = (order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP);
4321 mFoldersByName = (order & LLInventoryFilter::SO_FOLDERS_BY_NAME);
4322 return true;
4321 } 4323 }
4324 return false;
4322} 4325}
4323 4326
4324// BUG: This is very very slow. The getCreationDate() is log n in number 4327bool LLInventorySort::operator()(LLFolderViewItem* a, LLFolderViewItem* b)
4325// of inventory items.
4326bool sort_item_date(LLFolderViewItem* a, LLFolderViewItem* b)
4327{ 4328{
4328 U32 first_create = a->getCreationDate(); 4329 // We sort by name if we aren't sorting by date
4329 U32 second_create = b->getCreationDate(); 4330 // OR if these are folders and we are sorting folders by name.
4330 if (first_create == second_create) 4331 bool by_name = (!mByDate
4332 || (mFoldersByName
4333 && (a->getSortGroup() != SG_ITEM)));
4334
4335 if (a->getSortGroup() != b->getSortGroup())
4336 {
4337 if (mSystemToTop)
4338 {
4339 // Group order is System Folders, Trash, Normal Folders, Items
4340 return (a->getSortGroup() < b->getSortGroup());
4341 }
4342 else if (mByDate)
4343 {
4344 // Trash needs to go to the bottom if we are sorting by date
4345 if ( (a->getSortGroup() == SG_TRASH_FOLDER)
4346 || (b->getSortGroup() == SG_TRASH_FOLDER))
4347 {
4348 return (b->getSortGroup() == SG_TRASH_FOLDER);
4349 }
4350 }
4351 }
4352
4353 if (by_name)
4331 { 4354 {
4332 return (LLString::compareDict(a->getLabel(), b->getLabel()) < 0); 4355 S32 compare = LLString::compareDict(a->getLabel(), b->getLabel());
4356 if (0 == compare)
4357 {
4358 return (a->getCreationDate() > b->getCreationDate());
4359 }
4360 else
4361 {
4362 return (compare < 0);
4363 }
4333 } 4364 }
4334 else 4365 else
4335 { 4366 {
4336 return (first_create > second_create); 4367 // BUG: This is very very slow. The getCreationDate() is log n in number
4368 // of inventory items.
4369 U32 first_create = a->getCreationDate();
4370 U32 second_create = b->getCreationDate();
4371 if (first_create == second_create)
4372 {
4373 return (LLString::compareDict(a->getLabel(), b->getLabel()) < 0);
4374 }
4375 else
4376 {
4377 return (first_create > second_create);
4378 }
4337 } 4379 }
4338} 4380}
4339 4381
diff --git a/linden/indra/newview/llfolderview.h b/linden/indra/newview/llfolderview.h
index 8acbc8f..ec70b90 100644
--- a/linden/indra/newview/llfolderview.h
+++ b/linden/indra/newview/llfolderview.h
@@ -181,6 +181,7 @@ public:
181 181
182 static const U32 SO_DATE = 1; 182 static const U32 SO_DATE = 1;
183 static const U32 SO_FOLDERS_BY_NAME = 2; 183 static const U32 SO_FOLDERS_BY_NAME = 2;
184 static const U32 SO_SYSTEM_FOLDERS_TO_TOP = 4;
184 185
185 LLInventoryFilter(const LLString& name); 186 LLInventoryFilter(const LLString& name);
186 virtual ~LLInventoryFilter(); 187 virtual ~LLInventoryFilter();
@@ -265,6 +266,34 @@ private:
265 LLString mFilterText; 266 LLString mFilterText;
266}; 267};
267 268
269// These are grouping of inventory types.
270// Order matters when sorting system folders to the top.
271enum EInventorySortGroup
272{
273 SG_SYSTEM_FOLDER,
274 SG_TRASH_FOLDER,
275 SG_NORMAL_FOLDER,
276 SG_ITEM
277};
278
279class LLInventorySort
280{
281public:
282 LLInventorySort()
283 : mSortOrder(0) { }
284
285 // Returns true if order has changed
286 bool updateSort(U32 order);
287 U32 getSort() { return mSortOrder; }
288
289 bool operator()(LLFolderViewItem* a, LLFolderViewItem* b);
290private:
291 U32 mSortOrder;
292 bool mByDate;
293 bool mSystemToTop;
294 bool mFoldersByName;
295};
296
268//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 297//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
269// Class LLFolderViewItem 298// Class LLFolderViewItem
270// 299//
@@ -351,6 +380,8 @@ public:
351 enum { ARRANGE = TRUE, DO_NOT_ARRANGE = FALSE }; 380 enum { ARRANGE = TRUE, DO_NOT_ARRANGE = FALSE };
352 virtual BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root); 381 virtual BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root);
353 382
383 virtual EInventorySortGroup getSortGroup();
384
354 // Finds width and height of this object and it's children. Also 385 // Finds width and height of this object and it's children. Also
355 // makes sure that this view and it's children are the right size. 386 // makes sure that this view and it's children are the right size.
356 virtual S32 arrange( S32* width, S32* height, S32 filter_generation ); 387 virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
@@ -449,8 +480,10 @@ public:
449 480
450 virtual void setStatusText(const LLString& text) { mStatusText = text; } 481 virtual void setStatusText(const LLString& text) { mStatusText = text; }
451 482
452 BOOL getFiltered(); 483 virtual BOOL potentiallyVisible(); // do we know for a fact that this item has been filtered out?
453 BOOL getFiltered(S32 filter_generation); 484
485 virtual BOOL getFiltered();
486 virtual BOOL getFiltered(S32 filter_generation);
454 virtual void setFiltered(BOOL filtered, S32 filter_generation); 487 virtual void setFiltered(BOOL filtered, S32 filter_generation);
455 488
456 // change the icon 489 // change the icon
@@ -504,7 +537,7 @@ protected:
504 typedef std::vector<LLFolderViewFolder*> folders_t; 537 typedef std::vector<LLFolderViewFolder*> folders_t;
505 items_t mItems; 538 items_t mItems;
506 folders_t mFolders; 539 folders_t mFolders;
507 sort_order_f mSortFunction; 540 LLInventorySort mSortFunction;
508 541
509 BOOL mIsOpen; 542 BOOL mIsOpen;
510 BOOL mExpanderHighlighted; 543 BOOL mExpanderHighlighted;
@@ -534,6 +567,8 @@ public:
534 virtual EWidgetType getWidgetType() const; 567 virtual EWidgetType getWidgetType() const;
535 virtual LLString getWidgetTag() const; 568 virtual LLString getWidgetTag() const;
536 569
570 virtual BOOL potentiallyVisible();
571
537 LLFolderViewItem* getNextFromChild( LLFolderViewItem*, BOOL include_children = TRUE ); 572 LLFolderViewItem* getNextFromChild( LLFolderViewItem*, BOOL include_children = TRUE );
538 LLFolderViewItem* getPreviousFromChild( LLFolderViewItem*, BOOL include_children = TRUE ); 573 LLFolderViewItem* getPreviousFromChild( LLFolderViewItem*, BOOL include_children = TRUE );
539 574
@@ -546,6 +581,9 @@ public:
546 581
547 BOOL needsArrange(); 582 BOOL needsArrange();
548 583
584 // Returns the sort group (system, trash, folder) for this folder.
585 virtual EInventorySortGroup getSortGroup();
586
549 virtual void setCompletedFilterGeneration(S32 generation, BOOL recurse_up); 587 virtual void setCompletedFilterGeneration(S32 generation, BOOL recurse_up);
550 virtual S32 getCompletedFilterGeneration() { return mCompletedFilterGeneration; } 588 virtual S32 getCompletedFilterGeneration() { return mCompletedFilterGeneration; }
551 589
@@ -603,7 +641,7 @@ public:
603 // This function is called by a child that needs to be resorted. 641 // This function is called by a child that needs to be resorted.
604 void resort(LLFolderViewItem* item); 642 void resort(LLFolderViewItem* item);
605 643
606 void setItemSortFunction(sort_order_f ordering); 644 void setItemSortOrder(U32 ordering);
607 void sortBy(U32); 645 void sortBy(U32);
608 //BOOL (*func)(LLFolderViewItem* a, LLFolderViewItem* b)); 646 //BOOL (*func)(LLFolderViewItem* a, LLFolderViewItem* b));
609 647
@@ -617,7 +655,8 @@ public:
617 virtual void setOpen(BOOL open = TRUE); /* Flawfinder: ignore */ 655 virtual void setOpen(BOOL open = TRUE); /* Flawfinder: ignore */
618 656
619 // Called when a child is refreshed. 657 // Called when a child is refreshed.
620 virtual void requestArrange(); 658 // don't rearrange child folder contents unless explicitly requested
659 virtual void requestArrange(BOOL include_descendants = FALSE);
621 660
622 // internal method which doesn't update the entire view. This 661 // internal method which doesn't update the entire view. This
623 // method was written because the list iterators destroy the state 662 // method was written because the list iterators destroy the state
diff --git a/linden/indra/newview/llgenepool.cpp b/linden/indra/newview/llgenepool.cpp
index 95b15f3..3cc57e9 100644
--- a/linden/indra/newview/llgenepool.cpp
+++ b/linden/indra/newview/llgenepool.cpp
@@ -223,6 +223,14 @@ void LLGenePool::spawn( EWearableType type )
223 223
224 // Only consider archetypes that have the same sex as you have already. 224 // Only consider archetypes that have the same sex as you have already.
225 LLVisualParam* male_param = avatar->getVisualParam( "male" ); 225 LLVisualParam* male_param = avatar->getVisualParam( "male" );
226
227 if (!male_param)
228 {
229 llwarns << "The hard coded \'male\' parameter passed to avatar->getVisualParam() in LLGenePool::spawn() is no longer valid."
230 << llendl;
231 return;
232 }
233
226 S32 male_param_id = male_param->getID(); 234 S32 male_param_id = male_param->getID();
227 F32 sex_weight = male_param->getWeight(); 235 F32 sex_weight = male_param->getWeight();
228 236
diff --git a/linden/indra/newview/llgivemoney.cpp b/linden/indra/newview/llgivemoney.cpp
index 3722682..e89ab3d 100644
--- a/linden/indra/newview/llgivemoney.cpp
+++ b/linden/indra/newview/llgivemoney.cpp
@@ -155,7 +155,7 @@ LLFloaterPay::LLFloaterPay(const std::string& name,
155 155
156 childSetKeystrokeCallback("amount", &LLFloaterPay::onKeystroke, this); 156 childSetKeystrokeCallback("amount", &LLFloaterPay::onKeystroke, this);
157 childSetText("amount", last_amount); 157 childSetText("amount", last_amount);
158 childSetPrevalidate("amount", LLLineEditor::prevalidatePositiveS32); 158 childSetPrevalidate("amount", LLLineEditor::prevalidateNonNegativeS32);
159 159
160 info = new LLGiveMoneyInfo(this, 0); 160 info = new LLGiveMoneyInfo(this, 0);
161 mCallbackData.push_back(info); 161 mCallbackData.push_back(info);
@@ -422,14 +422,9 @@ void LLFloaterPay::onKeystroke(LLLineEditor*, void* data)
422 LLFloaterPay* self = reinterpret_cast<LLFloaterPay*>(data); 422 LLFloaterPay* self = reinterpret_cast<LLFloaterPay*>(data);
423 if(self) 423 if(self)
424 { 424 {
425 if (!self->childGetText("amount").empty()) 425 // enable the Pay button when amount is non-empty and positive, disable otherwise
426 { 426 LLString amtstr = self->childGetText("amount");
427 self->childSetEnabled("pay btn", TRUE); 427 self->childSetEnabled("pay btn", !amtstr.empty() && atoi(amtstr.c_str()) > 0);
428 }
429 else
430 {
431 self->childSetEnabled("pay btn", FALSE);
432 }
433 } 428 }
434} 429}
435 430
diff --git a/linden/indra/newview/llglsandbox.cpp b/linden/indra/newview/llglsandbox.cpp
index e14cebe..81806dc 100644
--- a/linden/indra/newview/llglsandbox.cpp
+++ b/linden/indra/newview/llglsandbox.cpp
@@ -1134,5 +1134,5 @@ void post_show_depth_buffer()
1134 } 1134 }
1135 glDrawPixels(xsize,ysize,GL_RED,GL_UNSIGNED_BYTE,buf); 1135 glDrawPixels(xsize,ysize,GL_RED,GL_UNSIGNED_BYTE,buf);
1136 1136
1137 delete buf; 1137 delete [] buf;
1138} 1138}
diff --git a/linden/indra/newview/llglslshader.cpp b/linden/indra/newview/llglslshader.cpp
index 3f23a66..9c3d707 100644
--- a/linden/indra/newview/llglslshader.cpp
+++ b/linden/indra/newview/llglslshader.cpp
@@ -847,7 +847,7 @@ BOOL LLShaderMgr::loadShadersAvatar()
847 return FALSE; 847 return FALSE;
848 } 848 }
849 849
850 if (success) 850 /*if (success)
851 { 851 {
852 //load specular (eyeball) vertex program 852 //load specular (eyeball) vertex program
853 std::string eyeballvertex = "avatar/eyeballV.glsl"; 853 std::string eyeballvertex = "avatar/eyeballV.glsl";
@@ -865,7 +865,7 @@ BOOL LLShaderMgr::loadShadersAvatar()
865 { 865 {
866 llwarns << "Failed to load " << eyeballvertex << llendl; 866 llwarns << "Failed to load " << eyeballvertex << llendl;
867 } 867 }
868 } 868 }*/
869 869
870 if (success) 870 if (success)
871 { 871 {
diff --git a/linden/indra/newview/llgroupnotify.cpp b/linden/indra/newview/llgroupnotify.cpp
index de9b571..ef20138 100644
--- a/linden/indra/newview/llgroupnotify.cpp
+++ b/linden/indra/newview/llgroupnotify.cpp
@@ -162,7 +162,7 @@ LLGroupNotifyBox::LLGroupNotifyBox(const char* subject,
162 162
163 line = new LLTextBox("title",LLRect(x,y,RIGHT - HPAD,y - LINE_HEIGHT),"Group Notice",LLFontGL::sSansSerifHuge); 163 line = new LLTextBox("title",LLRect(x,y,RIGHT - HPAD,y - LINE_HEIGHT),"Group Notice",LLFontGL::sSansSerifHuge);
164 line->setHAlign(LLFontGL::RIGHT); 164 line->setHAlign(LLFontGL::RIGHT);
165 line->setDropshadowVisible(true); 165 line->setFontStyle(LLFontGL::DROP_SHADOW_SOFT);
166 line->setBorderVisible(FALSE); 166 line->setBorderVisible(FALSE);
167 line->setColor(LLColor4::white); 167 line->setColor(LLColor4::white);
168 line->setBackgroundColor( gColors.getColor("GroupNotifyBoxColor") ); 168 line->setBackgroundColor( gColors.getColor("GroupNotifyBoxColor") );
@@ -177,7 +177,7 @@ LLGroupNotifyBox::LLGroupNotifyBox(const char* subject,
177 from << "Sent by " << from_name << ", " << group_name; 177 from << "Sent by " << from_name << ", " << group_name;
178 178
179 line = new LLTextBox("group",LLRect(x,y,RIGHT - HPAD,y - LINE_HEIGHT),from.str().c_str(),LLFontGL::sSansSerif); 179 line = new LLTextBox("group",LLRect(x,y,RIGHT - HPAD,y - LINE_HEIGHT),from.str().c_str(),LLFontGL::sSansSerif);
180 line->setDropshadowVisible(true); 180 line->setFontStyle(LLFontGL::DROP_SHADOW_SOFT);
181 line->setHAlign(LLFontGL::RIGHT); 181 line->setHAlign(LLFontGL::RIGHT);
182 line->setBorderVisible(FALSE); 182 line->setBorderVisible(FALSE);
183 line->setColor(LLColor4::white); 183 line->setColor(LLColor4::white);
@@ -244,7 +244,7 @@ LLGroupNotifyBox::LLGroupNotifyBox(const char* subject,
244 line = new LLTextBox("subjecttitle",LLRect(x,y,x + LABEL_WIDTH,y - LINE_HEIGHT),"Attached: ",LLFontGL::sSansSerif); 244 line = new LLTextBox("subjecttitle",LLRect(x,y,x + LABEL_WIDTH,y - LINE_HEIGHT),"Attached: ",LLFontGL::sSansSerif);
245 line->setBorderVisible(FALSE); 245 line->setBorderVisible(FALSE);
246 line->setColor(LLColor4::white); 246 line->setColor(LLColor4::white);
247 line->setDropshadowVisible(TRUE); 247 line->setFontStyle(LLFontGL::DROP_SHADOW_SOFT);
248 line->setBackgroundColor( gColors.getColor("GroupNotifyBoxColor") ); 248 line->setBackgroundColor( gColors.getColor("GroupNotifyBoxColor") );
249 addChild(line); 249 addChild(line);
250 250
@@ -261,7 +261,7 @@ LLGroupNotifyBox::LLGroupNotifyBox(const char* subject,
261 line->setEnabled(FALSE); 261 line->setEnabled(FALSE);
262 line->setBorderVisible(TRUE); 262 line->setBorderVisible(TRUE);
263 line->setDisabledColor(LLColor4::blue4); 263 line->setDisabledColor(LLColor4::blue4);
264 line->setDropshadowVisible(FALSE); 264 line->setFontStyle(LLFontGL::NORMAL);
265 line->setBackgroundVisible(true); 265 line->setBackgroundVisible(true);
266 line->setBackgroundColor( semi_transparent ); 266 line->setBackgroundColor( semi_transparent );
267 addChild(line); 267 addChild(line);
@@ -399,7 +399,7 @@ void LLGroupNotifyBox::close()
399 // Then we need to send the inventory declined message 399 // Then we need to send the inventory declined message
400 if(mHasInventory) 400 if(mHasInventory)
401 { 401 {
402 inventory_offer_callback( 1 , mInventoryOffer); 402 inventory_offer_callback(IOR_DECLINE , mInventoryOffer);
403 } 403 }
404 gNotifyBoxView->removeChild(this); 404 gNotifyBoxView->removeChild(this);
405 405
@@ -461,7 +461,7 @@ void LLGroupNotifyBox::onClickSaveInventory(void* data)
461{ 461{
462 LLGroupNotifyBox* self = (LLGroupNotifyBox*)data; 462 LLGroupNotifyBox* self = (LLGroupNotifyBox*)data;
463 463
464 inventory_offer_callback( 0 , self->mInventoryOffer); 464 inventory_offer_callback( IOR_ACCEPT , self->mInventoryOffer);
465 465
466 // inventory_offer_callback will delete the offer, so make sure we aren't still pointing to it. 466 // inventory_offer_callback will delete the offer, so make sure we aren't still pointing to it.
467 self->mInventoryOffer = NULL; 467 self->mInventoryOffer = NULL;
diff --git a/linden/indra/newview/llhoverview.cpp b/linden/indra/newview/llhoverview.cpp
index 6807b42..8296e14 100644
--- a/linden/indra/newview/llhoverview.cpp
+++ b/linden/indra/newview/llhoverview.cpp
@@ -539,7 +539,6 @@ void LLHoverView::updateText()
539 // on the land info panel 539 // on the land info panel
540 if ( !hover_parcel->getAllowModify() ) 540 if ( !hover_parcel->getAllowModify() )
541 { 541 {
542 if (words) line->append(", ");
543 if ( hover_parcel->getAllowGroupModify() ) 542 if ( hover_parcel->getAllowGroupModify() )
544 { 543 {
545 line->append("Group Build"); 544 line->append("Group Build");
diff --git a/linden/indra/newview/llhudeffecttrail.cpp b/linden/indra/newview/llhudeffecttrail.cpp
index fed3a9e..79c05d7 100644
--- a/linden/indra/newview/llhudeffecttrail.cpp
+++ b/linden/indra/newview/llhudeffecttrail.cpp
@@ -112,17 +112,19 @@ void LLHUDEffectSpiral::packData(LLMessageSystem *mesgsys)
112 112
113void LLHUDEffectSpiral::unpackData(LLMessageSystem *mesgsys, S32 blocknum) 113void LLHUDEffectSpiral::unpackData(LLMessageSystem *mesgsys, S32 blocknum)
114{ 114{
115 U8 packed_data[56]; 115 const size_t EFFECT_SIZE = 56;
116 U8 packed_data[EFFECT_SIZE];
116 117
117 LLHUDEffect::unpackData(mesgsys, blocknum); 118 LLHUDEffect::unpackData(mesgsys, blocknum);
118 LLUUID object_id, target_object_id; 119 LLUUID object_id, target_object_id;
119 S32 size = mesgsys->getSizeFast(_PREHASH_Effect, blocknum, _PREHASH_TypeData); 120 S32 size = mesgsys->getSizeFast(_PREHASH_Effect, blocknum, _PREHASH_TypeData);
120 if (size != 56) 121 if (size != EFFECT_SIZE)
121 { 122 {
122 llwarns << "Spiral effect with bad size " << size << llendl; 123 llwarns << "Spiral effect with bad size " << size << llendl;
123 return; 124 return;
124 } 125 }
125 mesgsys->getBinaryDataFast(_PREHASH_Effect, _PREHASH_TypeData, packed_data, 56, blocknum); 126 mesgsys->getBinaryDataFast(_PREHASH_Effect, _PREHASH_TypeData,
127 packed_data, EFFECT_SIZE, blocknum, EFFECT_SIZE);
126 128
127 htonmemcpy(object_id.mData, packed_data, MVT_LLUUID, 16); 129 htonmemcpy(object_id.mData, packed_data, MVT_LLUUID, 16);
128 htonmemcpy(target_object_id.mData, packed_data + 16, MVT_LLUUID, 16); 130 htonmemcpy(target_object_id.mData, packed_data + 16, MVT_LLUUID, 16);
diff --git a/linden/indra/newview/llimview.cpp b/linden/indra/newview/llimview.cpp
index 38471ad..02578d2 100644
--- a/linden/indra/newview/llimview.cpp
+++ b/linden/indra/newview/llimview.cpp
@@ -374,11 +374,21 @@ void LLIMView::addMessage(
374 } 374 }
375 else 375 else
376 { 376 {
377 //if we have recently requsted to be dropped from a session
378 //but are still receiving messages from the session, don't make
379 //a new floater
380// if ( mSessionsDropRequested.has(session_id.asString()) )
381// {
382// return ;
383// }
384
377 const char* name = from; 385 const char* name = from;
378 if(session_name && (strlen(session_name)>1)) 386 if(session_name && (strlen(session_name)>1))
379 { 387 {
380 name = session_name; 388 name = session_name;
381 } 389 }
390
391
382 floater = createFloater(new_session_id, other_participant_id, name, dialog, FALSE); 392 floater = createFloater(new_session_id, other_participant_id, name, dialog, FALSE);
383 393
384 // When we get a new IM, and if you are a god, display a bit 394 // When we get a new IM, and if you are a god, display a bit
@@ -502,13 +512,17 @@ LLUUID LLIMView::addSession(const std::string& name,
502 LLFloaterIMPanel* floater = findFloaterBySession(session_id); 512 LLFloaterIMPanel* floater = findFloaterBySession(session_id);
503 if(!floater) 513 if(!floater)
504 { 514 {
505 // On creation, use the first element of ids as the "other_participant_id" 515 // On creation, use the first element of ids as the
516 // "other_participant_id"
506 floater = createFloater(session_id, 517 floater = createFloater(session_id,
507 other_participant_id, 518 other_participant_id,
508 name, 519 name,
509 ids, 520 ids,
510 dialog, 521 dialog,
511 TRUE); 522 TRUE);
523
524 if ( !floater ) return LLUUID::null;
525
512 noteOfflineUsers(floater, ids); 526 noteOfflineUsers(floater, ids);
513 } 527 }
514 mTalkFloater->showFloater(floater); 528 mTalkFloater->showFloater(floater);
@@ -528,6 +542,11 @@ void LLIMView::removeSession(const LLUUID& session_id)
528 mTalkFloater->removeFloater(floater); 542 mTalkFloater->removeFloater(floater);
529 //mTabContainer->removeTabPanel(floater); 543 //mTabContainer->removeTabPanel(floater);
530 } 544 }
545
546// if ( session_id.notNull() )
547// {
548// mSessionsDropRequested[session_id.asString()] = LLSD();
549// }
531} 550}
532 551
533void LLIMView::refresh() 552void LLIMView::refresh()
@@ -705,6 +724,7 @@ LLFloaterIMPanel* LLIMView::createFloater(
705 { 724 {
706 llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl; 725 llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl;
707 } 726 }
727
708 llinfos << "LLIMView::createFloater: from " << other_participant_id 728 llinfos << "LLIMView::createFloater: from " << other_participant_id
709 << " in session " << session_id << llendl; 729 << " in session " << session_id << llendl;
710 LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label, 730 LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label,
@@ -731,6 +751,7 @@ LLFloaterIMPanel* LLIMView::createFloater(
731 { 751 {
732 llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl; 752 llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl;
733 } 753 }
754
734 llinfos << "LLIMView::createFloater: from " << other_participant_id 755 llinfos << "LLIMView::createFloater: from " << other_participant_id
735 << " in session " << session_id << llendl; 756 << " in session " << session_id << llendl;
736 LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label, 757 LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label,
@@ -805,6 +826,11 @@ void LLIMView::updateFloaterSessionID(const LLUUID& old_session_id,
805 } 826 }
806} 827}
807 828
829void LLIMView::onDropRequestReplyReceived(const LLUUID& session_id)
830{
831 mSessionsDropRequested.erase(session_id.asString());
832}
833
808void onConfirmForceCloseError(S32 option, void* data) 834void onConfirmForceCloseError(S32 option, void* data)
809{ 835{
810 //only 1 option really 836 //only 1 option really
@@ -869,7 +895,7 @@ public:
869 895
870class LLViewerIMSessionEventReply : public LLHTTPNode 896class LLViewerIMSessionEventReply : public LLHTTPNode
871{ 897{
872 public: 898public:
873 virtual void describe(Description& desc) const 899 virtual void describe(Description& desc) const
874 { 900 {
875 desc.shortInfo("Used for receiving a reply to a IM session event"); 901 desc.shortInfo("Used for receiving a reply to a IM session event");
@@ -913,7 +939,7 @@ class LLViewerIMSessionEventReply : public LLHTTPNode
913 939
914class LLViewerForceCloseIMSession: public LLHTTPNode 940class LLViewerForceCloseIMSession: public LLHTTPNode
915{ 941{
916 942public:
917 virtual void post(ResponsePtr response, 943 virtual void post(ResponsePtr response,
918 const LLSD& context, 944 const LLSD& context,
919 const LLSD& input) const 945 const LLSD& input) const
@@ -942,11 +968,40 @@ class LLViewerForceCloseIMSession: public LLHTTPNode
942 } 968 }
943}; 969};
944 970
971class LLViewerIMSessionDropReply : public LLHTTPNode
972{
973public:
974 virtual void post(ResponsePtr response,
975 const LLSD& context,
976 const LLSD& input) const
977 {
978 LLUUID session_id;
979 bool success;
980
981 success = input["body"]["success"].asBoolean();
982 session_id = input["body"]["session_id"].asUUID();
983
984 if ( !success )
985 {
986 //throw an error alert?
987 }
988
989 gIMView->onDropRequestReplyReceived(session_id);
990 }
991};
992
945LLHTTPRegistration<LLViewerIMSessionStartReply> 993LLHTTPRegistration<LLViewerIMSessionStartReply>
946 gHTTPRegistrationMessageImsessionstartreply("/message/IMSessionStartReply"); 994 gHTTPRegistrationMessageImsessionstartreply(
995 "/message/IMSessionStartReply");
947 996
948LLHTTPRegistration<LLViewerIMSessionEventReply> 997LLHTTPRegistration<LLViewerIMSessionEventReply>
949 gHTTPRegistrationMessageImsessioneventreply("/message/IMSessionEventReply"); 998 gHTTPRegistrationMessageImsessioneventreply(
999 "/message/IMSessionEventReply");
950 1000
951LLHTTPRegistration<LLViewerForceCloseIMSession> 1001LLHTTPRegistration<LLViewerForceCloseIMSession>
952 gHTTPRegistrationMessageForceCloseImSession("/message/ForceCloseIMSession"); 1002 gHTTPRegistrationMessageForceCloseImSession(
1003 "/message/ForceCloseIMSession");
1004
1005LLHTTPRegistration<LLViewerIMSessionDropReply>
1006 gHTTPRegistrationMessageImSessionDropReply(
1007 "/message/IMSessionDropReply");
diff --git a/linden/indra/newview/llimview.h b/linden/indra/newview/llimview.h
index 74ea880..c0b0f79 100644
--- a/linden/indra/newview/llimview.h
+++ b/linden/indra/newview/llimview.h
@@ -131,6 +131,8 @@ public:
131 // is no matching panel. 131 // is no matching panel.
132 LLFloaterIMPanel* findFloaterBySession(const LLUUID& session_id); 132 LLFloaterIMPanel* findFloaterBySession(const LLUUID& session_id);
133 133
134 void onDropRequestReplyReceived(const LLUUID& session_id);
135
134private: 136private:
135 // create a panel and update internal representation for 137 // create a panel and update internal representation for
136 // consistency. Returns the pointer, caller (the class instance 138 // consistency. Returns the pointer, caller (the class instance
@@ -167,6 +169,8 @@ private:
167 169
168 // An IM has been received that you haven't seen yet. 170 // An IM has been received that you haven't seen yet.
169 BOOL mIMReceived; 171 BOOL mIMReceived;
172
173 LLSD mSessionsDropRequested;
170}; 174};
171 175
172 176
diff --git a/linden/indra/newview/llinventoryactions.cpp b/linden/indra/newview/llinventoryactions.cpp
index 6452c87..900a729 100644
--- a/linden/indra/newview/llinventoryactions.cpp
+++ b/linden/indra/newview/llinventoryactions.cpp
@@ -491,6 +491,23 @@ class LLSetSortBy : public inventory_listener_t
491 } 491 }
492 mPtr->getActivePanel()->setSortOrder( order ); 492 mPtr->getActivePanel()->setSortOrder( order );
493 } 493 }
494 else if (sort_field == "systemfolderstotop")
495 {
496 U32 order = mPtr->getActivePanel()->getSortOrder();
497 if ( order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP )
498 {
499 order &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
500
501 mPtr->getControl("Inventory.SystemFoldersToTop")->setValue( FALSE );
502 }
503 else
504 {
505 order |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
506
507 mPtr->getControl("Inventory.SystemFoldersToTop")->setValue( TRUE );
508 }
509 mPtr->getActivePanel()->setSortOrder( order );
510 }
494 511
495 return true; 512 return true;
496 } 513 }
diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp
index 05334d7..a7b80ae 100644
--- a/linden/indra/newview/llinventorybridge.cpp
+++ b/linden/indra/newview/llinventorybridge.cpp
@@ -569,10 +569,10 @@ const char* safe_inv_type_lookup(LLInventoryType::EType inv_type)
569} 569}
570 570
571LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, 571LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
572 LLInventoryType::EType inv_type, 572 LLInventoryType::EType inv_type,
573 LLInventoryPanel* inventory, 573 LLInventoryPanel* inventory,
574 const LLUUID& uuid, 574 const LLUUID& uuid,
575 U32 flags) 575 U32 flags)
576{ 576{
577 LLInvFVBridge* new_listener = NULL; 577 LLInvFVBridge* new_listener = NULL;
578 switch(asset_type) 578 switch(asset_type)
@@ -677,7 +677,11 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
677 break; 677 break;
678 } 678 }
679 679
680 new_listener->mInvType = inv_type; 680 if (new_listener)
681 {
682 new_listener->mInvType = inv_type;
683 }
684
681 return new_listener; 685 return new_listener;
682} 686}
683 687
@@ -907,16 +911,20 @@ BOOL LLItemBridge::removeItem()
907 if(!model) return FALSE; 911 if(!model) return FALSE;
908 LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); 912 LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
909 LLViewerInventoryItem* item = getItem(); 913 LLViewerInventoryItem* item = getItem();
910 if(item) 914
915 // if item is not already in trash
916 if(item && !model->isObjectDescendentOf(mUUID, trash_id))
911 { 917 {
912 // restamp on move to trash. 918 // move to trash, and restamp
913 LLInvFVBridge::changeItemParent(model, item, trash_id, TRUE); 919 LLInvFVBridge::changeItemParent(model, item, trash_id, TRUE);
920 // delete was successful
921 return TRUE;
922 }
923 else
924 {
925 // tried to delete already item in trash (should purge?)
926 return FALSE;
914 } 927 }
915
916 // return false anyway, so that if it's called from the folder
917 // view, it doesn't remove the view - it's just being moved to the
918 // trash.
919 return FALSE;
920} 928}
921 929
922BOOL LLItemBridge::isItemCopyable() const 930BOOL LLItemBridge::isItemCopyable() const
@@ -1462,11 +1470,20 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask)
1462 { 1470 {
1463 LLViewerInventoryCategory* category = gInventory.getCategory(mCatID); 1471 LLViewerInventoryCategory* category = gInventory.getCategory(mCatID);
1464 1472
1465 if (category->getDescendentCount() == mContentsCount) 1473 if (NULL == category)
1466 { 1474 {
1467 gInventory.removeObserver(this); 1475 llwarns << "gInventory.getCategory(" << mCatID
1468 wear_inventory_category(category, FALSE, TRUE); 1476 << ") was NULL" << llendl;
1469 delete this; 1477 }
1478 else
1479 {
1480 if (category->getDescendentCount() ==
1481 mContentsCount)
1482 {
1483 gInventory.removeObserver(this);
1484 wear_inventory_category(category, FALSE, TRUE);
1485 delete this;
1486 }
1470 } 1487 }
1471 } 1488 }
1472 1489
@@ -1682,11 +1699,7 @@ BOOL LLFolderBridge::removeItem()
1682 LLInvFVBridge::changeCategoryParent(model, cat, trash_id, TRUE); 1699 LLInvFVBridge::changeCategoryParent(model, cat, trash_id, TRUE);
1683 } 1700 }
1684 1701
1685 // return false anyway, so that if it's called from the folder 1702 return TRUE;
1686 // view, it doesn't remove the view - it's just being moved to the
1687 // trash.
1688 return FALSE;
1689
1690} 1703}
1691 1704
1692BOOL LLFolderBridge::isClipboardPasteable() const 1705BOOL LLFolderBridge::isClipboardPasteable() const
@@ -2178,10 +2191,13 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
2178 // everything in the active window so that we don't follow 2191 // everything in the active window so that we don't follow
2179 // the selection to its new location (which is very 2192 // the selection to its new location (which is very
2180 // annoying). 2193 // annoying).
2181 LLInventoryPanel* active_panel = LLInventoryView::getActiveInventory()->getPanel(); 2194 if (LLInventoryView::getActiveInventory())
2182 if (mInventoryPanel != active_panel)
2183 { 2195 {
2184 active_panel->unSelectAll(); 2196 LLInventoryPanel* active_panel = LLInventoryView::getActiveInventory()->getPanel();
2197 if (active_panel && (mInventoryPanel != active_panel))
2198 {
2199 active_panel->unSelectAll();
2200 }
2185 } 2201 }
2186 2202
2187 // restamp if the move is into the trash. 2203 // restamp if the move is into the trash.
@@ -3117,7 +3133,16 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model
3117 gMessageSystem->sendReliable( gAgent.getRegion()->getHost() ); 3133 gMessageSystem->sendReliable( gAgent.getRegion()->getHost() );
3118 } 3134 }
3119 // this object might have been selected, so let the selection manager know it's gone now 3135 // this object might have been selected, so let the selection manager know it's gone now
3120 gSelectMgr->remove(gObjectList.findObject(item->getUUID())); 3136 LLViewerObject *found_obj =
3137 gObjectList.findObject(item->getUUID());
3138 if (found_obj)
3139 {
3140 gSelectMgr->remove(found_obj);
3141 }
3142 else
3143 {
3144 llwarns << "object not found - ignoring" << llendl;
3145 }
3121 } 3146 }
3122 else LLItemBridge::performAction(folder, model, action); 3147 else LLItemBridge::performAction(folder, model, action);
3123} 3148}
@@ -4027,7 +4052,15 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, void* userdata)
4027 gMessageSystem->sendReliable( gAgent.getRegion()->getHost() ); 4052 gMessageSystem->sendReliable( gAgent.getRegion()->getHost() );
4028 4053
4029 // this object might have been selected, so let the selection manager know it's gone now 4054 // this object might have been selected, so let the selection manager know it's gone now
4030 gSelectMgr->remove(gObjectList.findObject( obj_item_array.get(i)->getUUID()) ); 4055 LLViewerObject *found_obj = gObjectList.findObject( obj_item_array.get(i)->getUUID());
4056 if (found_obj)
4057 {
4058 gSelectMgr->remove(found_obj);
4059 }
4060 else
4061 {
4062 llwarns << "object not found, ignoring" << llendl;
4063 }
4031 } 4064 }
4032 } 4065 }
4033 4066
diff --git a/linden/indra/newview/llinventorybridge.h b/linden/indra/newview/llinventorybridge.h
index 1269fa2..1269fa2 100755..100644
--- a/linden/indra/newview/llinventorybridge.h
+++ b/linden/indra/newview/llinventorybridge.h
diff --git a/linden/indra/newview/llinventorymodel.cpp b/linden/indra/newview/llinventorymodel.cpp
index ddd229b..8e95156 100644
--- a/linden/indra/newview/llinventorymodel.cpp
+++ b/linden/indra/newview/llinventorymodel.cpp
@@ -27,6 +27,7 @@
27 */ 27 */
28 28
29#include "llviewerprecompiledheaders.h" 29#include "llviewerprecompiledheaders.h"
30
30#include "llinventorymodel.h" 31#include "llinventorymodel.h"
31 32
32#include "llassetstorage.h" 33#include "llassetstorage.h"
@@ -41,6 +42,7 @@
41#include "llfocusmgr.h" 42#include "llfocusmgr.h"
42#include "llinventoryview.h" 43#include "llinventoryview.h"
43#include "llviewerinventory.h" 44#include "llviewerinventory.h"
45#include "llviewermessage.h"
44#include "llviewerwindow.h" 46#include "llviewerwindow.h"
45#include "viewer.h" 47#include "viewer.h"
46#include "lldbstrings.h" 48#include "lldbstrings.h"
@@ -2282,7 +2284,7 @@ void LLInventoryModel::processUseCachedInventory(LLMessageSystem* msg, void**)
2282void LLInventoryModel::processUpdateCreateInventoryItem(LLMessageSystem* msg, void**) 2284void LLInventoryModel::processUpdateCreateInventoryItem(LLMessageSystem* msg, void**)
2283{ 2285{
2284 // do accounting and highlight new items if they arrive 2286 // do accounting and highlight new items if they arrive
2285 if (gInventory.messageUpdateCore(msg, true, true)) 2287 if (gInventory.messageUpdateCore(msg, true))
2286 { 2288 {
2287 U32 callback_id; 2289 U32 callback_id;
2288 LLUUID item_id; 2290 LLUUID item_id;
@@ -2298,12 +2300,15 @@ void LLInventoryModel::processUpdateCreateInventoryItem(LLMessageSystem* msg, vo
2298void LLInventoryModel::processFetchInventoryReply(LLMessageSystem* msg, void**) 2300void LLInventoryModel::processFetchInventoryReply(LLMessageSystem* msg, void**)
2299{ 2301{
2300 // no accounting 2302 // no accounting
2301 gInventory.messageUpdateCore(msg, false, false); 2303 gInventory.messageUpdateCore(msg, false);
2302} 2304}
2303 2305
2304 2306
2305bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account, bool highlight_new) 2307bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account)
2306{ 2308{
2309 //make sure our added inventory observer is active -Gigs
2310 start_new_inventory_observer();
2311
2307 LLUUID agent_id; 2312 LLUUID agent_id;
2308 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); 2313 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
2309 if(agent_id != gAgent.getID()) 2314 if(agent_id != gAgent.getID())
@@ -2312,16 +2317,15 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account, boo
2312 << llendl; 2317 << llendl;
2313 return false; 2318 return false;
2314 } 2319 }
2315 LLPointer<LLViewerInventoryItem> lastitem; // hack
2316 item_array_t items; 2320 item_array_t items;
2317 update_map_t update; 2321 update_map_t update;
2318 S32 count = msg->getNumberOfBlocksFast(_PREHASH_InventoryData); 2322 S32 count = msg->getNumberOfBlocksFast(_PREHASH_InventoryData);
2319 bool all_one_folder = true; 2323 bool all_one_folder = true;
2320 LLUUID folder_id; 2324 LLUUID folder_id;
2325 // Does this loop ever execute more than once? -Gigs
2321 for(S32 i = 0; i < count; ++i) 2326 for(S32 i = 0; i < count; ++i)
2322 { 2327 {
2323 LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; 2328 LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
2324 lastitem = titem;
2325 titem->unpackMessage(msg, _PREHASH_InventoryData, i); 2329 titem->unpackMessage(msg, _PREHASH_InventoryData, i);
2326 lldebugs << "LLInventoryModel::messageUpdateCore() item id:" 2330 lldebugs << "LLInventoryModel::messageUpdateCore() item id:"
2327 << titem->getUUID() << llendl; 2331 << titem->getUUID() << llendl;
@@ -2359,6 +2363,7 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account, boo
2359 } 2363 }
2360 2364
2361 U32 changes = 0x0; 2365 U32 changes = 0x0;
2366 //as above, this loop never seems to loop more than once per call
2362 for (item_array_t::iterator it = items.begin(); it != items.end(); ++it) 2367 for (item_array_t::iterator it = items.begin(); it != items.end(); ++it)
2363 { 2368 {
2364 changes |= gInventory.updateItem(*it); 2369 changes |= gInventory.updateItem(*it);
@@ -2366,88 +2371,6 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account, boo
2366 gInventory.notifyObservers(); 2371 gInventory.notifyObservers();
2367 gViewerWindow->getWindow()->decBusyCount(); 2372 gViewerWindow->getWindow()->decBusyCount();
2368 2373
2369 // *HACK: Do the 'show' logic for a new item in the inventory if
2370 // it is a newly created item.
2371 if (highlight_new
2372 && (changes & LLInventoryObserver::ADD) == LLInventoryObserver::ADD)
2373 {
2374 LLUUID trash_id;
2375 trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
2376 if(!gInventory.isObjectDescendentOf(lastitem->getUUID(), trash_id))
2377 {
2378 LLMultiPreview* multi_previewp = LLMultiPreview::getAutoOpenInstance(folder_id);
2379 if (!multi_previewp && all_one_folder && count > 1)
2380 {
2381 S32 left, top;
2382 gFloaterView->getNewFloaterPosition(&left, &top);
2383
2384 multi_previewp = new LLMultiPreview(LLRect(left, top, left + 300, top - 100));
2385 LLMultiPreview::setAutoOpenInstance(multi_previewp, folder_id);
2386 }
2387
2388 LLFloater::setFloaterHost(multi_previewp);
2389
2390 bool show_keep_discard = lastitem->getPermissions().getCreator() != gAgent.getID();
2391 switch(lastitem->getType())
2392 {
2393 case LLAssetType::AT_NOTECARD:
2394 open_notecard(
2395 lastitem->getUUID(),
2396 LLString("Note: ") + lastitem->getName(),
2397 show_keep_discard,
2398 LLUUID::null,
2399 FALSE);
2400 break;
2401 case LLAssetType::AT_LANDMARK:
2402 open_landmark(
2403 lastitem->getUUID(),
2404 LLString(" ") + lastitem->getName(),
2405 show_keep_discard,
2406 LLUUID::null,
2407 FALSE);
2408 break;
2409 case LLAssetType::AT_TEXTURE:
2410 open_texture(
2411 lastitem->getUUID(),
2412 LLString("Texture: ") + lastitem->getName(),
2413 show_keep_discard,
2414 LLUUID::null,
2415 FALSE);
2416 break;
2417 default:
2418 break;
2419 }
2420
2421 LLFloater::setFloaterHost(NULL);
2422 if (multi_previewp)
2423 {
2424 multi_previewp->open();
2425 }
2426
2427 LLInventoryView* view = LLInventoryView::getActiveInventory();
2428 if(view)
2429 {
2430 LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
2431 BOOL inventory_has_focus = gFocusMgr.childHasKeyboardFocus(view);
2432 BOOL user_is_away = gAwayTimer.getStarted();
2433
2434 // don't select lost and found items if an active user is working in the inventory
2435 if (!gInventory.isObjectDescendentOf(lastitem->getUUID(), lost_and_found_id) ||
2436 !inventory_has_focus ||
2437 user_is_away)
2438 {
2439 LLUICtrl* focus_ctrl = gFocusMgr.getKeyboardFocus();
2440 LLFocusMgr::FocusLostCallback callback = gFocusMgr.getFocusCallback();
2441 view->getPanel()->setSelection(lastitem->getUUID(), TAKE_FOCUS_NO);
2442 // HACK to open inventory offers that are
2443 // accepted. This information really needs to
2444 // flow through the instant messages and
2445 // inventory restore keyboard focus
2446 gFocusMgr.setKeyboardFocus(focus_ctrl, callback);
2447 }
2448 }
2449 }
2450 }
2451 return true; 2374 return true;
2452} 2375}
2453 2376
@@ -3452,6 +3375,43 @@ void LLInventoryExistenceObserver::changed(U32 mask)
3452 } 3375 }
3453} 3376}
3454 3377
3378void LLInventoryAddedObserver::changed(U32 mask)
3379{
3380 if(!(mask & LLInventoryObserver::ADD))
3381 {
3382 return;
3383 }
3384
3385 // *HACK: If this was in response to a packet off
3386 // the network, figure out which item was updated.
3387 // Code from Gigs Taggert, sin allowed by JC.
3388 LLMessageSystem* msg = gMessageSystem;
3389 const char* msg_name = msg->getMessageName();
3390 if (!msg_name) return;
3391
3392 // We only want newly created inventory items. JC
3393 if ( strcmp(msg_name, "UpdateCreateInventoryItem") )
3394 {
3395 return;
3396 }
3397
3398 LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
3399 S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_InventoryData);
3400 for(S32 i = 0; i < num_blocks; ++i)
3401 {
3402 titem->unpackMessage(msg, _PREHASH_InventoryData, i);
3403 if (!(titem->getUUID().isNull()))
3404 {
3405 //we don't do anything with null keys
3406 mAdded.push_back(titem->getUUID());
3407 }
3408 }
3409 if (!mAdded.empty())
3410 {
3411 done();
3412 }
3413}
3414
3455LLInventoryTransactionObserver::LLInventoryTransactionObserver( 3415LLInventoryTransactionObserver::LLInventoryTransactionObserver(
3456 const LLTransactionID& transaction_id) : 3416 const LLTransactionID& transaction_id) :
3457 mTransactionID(transaction_id) 3417 mTransactionID(transaction_id)
diff --git a/linden/indra/newview/llinventorymodel.h b/linden/indra/newview/llinventorymodel.h
index 9867842..78ab0e3 100644
--- a/linden/indra/newview/llinventorymodel.h
+++ b/linden/indra/newview/llinventorymodel.h
@@ -29,10 +29,8 @@
29#ifndef LL_LLINVENTORYMODEL_H 29#ifndef LL_LLINVENTORYMODEL_H
30#define LL_LLINVENTORYMODEL_H 30#define LL_LLINVENTORYMODEL_H
31 31
32#include "llassetstorage.h" 32#include "llassettype.h"
33#include "lldarray.h" 33#include "lldarray.h"
34//#include "llskiplist.h"
35//#include "llptrskipmap.h"
36#include "lluuid.h" 34#include "lluuid.h"
37#include "llpermissionsflags.h" 35#include "llpermissionsflags.h"
38#include "llstring.h" 36#include "llstring.h"
@@ -387,7 +385,7 @@ protected:
387 static void processMoveInventoryItem(LLMessageSystem* msg, void**); 385 static void processMoveInventoryItem(LLMessageSystem* msg, void**);
388 static void processFetchInventoryReply(LLMessageSystem* msg, void**); 386 static void processFetchInventoryReply(LLMessageSystem* msg, void**);
389 387
390 bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting, bool highlight_new); 388 bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting);
391 389
392protected: 390protected:
393 // Varaibles used to track what has changed since the last notify. 391 // Varaibles used to track what has changed since the last notify.
@@ -751,6 +749,29 @@ protected:
751}; 749};
752 750
753//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 751//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
752// Class LLInventoryAddedObserver
753//
754// This class is used as a base class for doing something when
755// a new item arrives in inventory.
756// It does not watch for a certain UUID, rather it acts when anything is added
757// Derive a class from this class and implement the done() method to do
758// something useful.
759//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
760
761class LLInventoryAddedObserver : public LLInventoryObserver
762{
763public:
764 LLInventoryAddedObserver() : mAdded() {}
765 virtual void changed(U32 mask);
766
767protected:
768 virtual void done() = 0;
769
770 typedef std::vector<LLUUID> item_ref_t;
771 item_ref_t mAdded;
772};
773
774//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
754// Class LLInventoryTransactionObserver 775// Class LLInventoryTransactionObserver
755// 776//
756// Class which can be used as a base class for doing something when an 777// Class which can be used as a base class for doing something when an
diff --git a/linden/indra/newview/llinventoryview.cpp b/linden/indra/newview/llinventoryview.cpp
index 900b145..bb70ea4 100644
--- a/linden/indra/newview/llinventoryview.cpp
+++ b/linden/indra/newview/llinventoryview.cpp
@@ -451,11 +451,13 @@ void LLInventoryView::init(LLInventoryModel* inventory)
451 U32 sort_order = gSavedSettings.getU32("InventorySortOrder"); 451 U32 sort_order = gSavedSettings.getU32("InventorySortOrder");
452 BOOL sort_by_name = ! ( sort_order & LLInventoryFilter::SO_DATE ); 452 BOOL sort_by_name = ! ( sort_order & LLInventoryFilter::SO_DATE );
453 BOOL sort_folders_by_name = ( sort_order & LLInventoryFilter::SO_FOLDERS_BY_NAME ); 453 BOOL sort_folders_by_name = ( sort_order & LLInventoryFilter::SO_FOLDERS_BY_NAME );
454 BOOL sort_system_folders_to_top = ( sort_order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP );
454 455
455 addBoolControl("Inventory.ShowFilters", FALSE); 456 addBoolControl("Inventory.ShowFilters", FALSE);
456 addBoolControl("Inventory.SortByName", sort_by_name ); 457 addBoolControl("Inventory.SortByName", sort_by_name );
457 addBoolControl("Inventory.SortByDate", ! sort_by_name ); 458 addBoolControl("Inventory.SortByDate", ! sort_by_name );
458 addBoolControl("Inventory.FoldersAlwaysByName", sort_folders_by_name ); 459 addBoolControl("Inventory.FoldersAlwaysByName", sort_folders_by_name );
460 addBoolControl("Inventory.SystemFoldersToTop", sort_system_folders_to_top );
459 461
460 mSavedFolderState = new LLSaveFolderState(); 462 mSavedFolderState = new LLSaveFolderState();
461 mSavedFolderState->setApply(FALSE); 463 mSavedFolderState->setApply(FALSE);
@@ -637,20 +639,24 @@ void LLInventoryView::onClose(bool app_quitting)
637BOOL LLInventoryView::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent) 639BOOL LLInventoryView::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent)
638{ 640{
639 LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL; 641 LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL;
640 // first check for user accepting current search results 642 if (root_folder)
641 if (!called_from_parent && root_folder&&
642 mSearchEditor && mSearchEditor->hasFocus() &&
643 (key == KEY_RETURN || key == KEY_DOWN) && mask == MASK_NONE)
644 {
645 // move focus to inventory proper
646 root_folder->setFocus(TRUE);
647 root_folder->scrollToShowSelection();
648 return TRUE;
649 }
650
651 if (root_folder->hasFocus() && key == KEY_UP)
652 { 643 {
653 startSearch(); 644 // first check for user accepting current search results
645 if (!called_from_parent
646 && mSearchEditor && mSearchEditor->hasFocus()
647 && (key == KEY_RETURN || key == KEY_DOWN)
648 && mask == MASK_NONE)
649 {
650 // move focus to inventory proper
651 root_folder->setFocus(TRUE);
652 root_folder->scrollToShowSelection();
653 return TRUE;
654 }
655
656 if (root_folder->hasFocus() && key == KEY_UP)
657 {
658 startSearch();
659 }
654 } 660 }
655 661
656 return LLFloater::handleKeyHere(key, mask, called_from_parent); 662 return LLFloater::handleKeyHere(key, mask, called_from_parent);
@@ -1364,11 +1370,13 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
1364 S32 count; 1370 S32 count;
1365 1371
1366 if (objectp) 1372 if (objectp)
1367 { 1373 {
1368 if (objectp->getType() == LLAssetType::AT_NONE) 1374 if (objectp->getType() <= LLAssetType::AT_NONE ||
1375 objectp->getType() >= LLAssetType::AT_COUNT)
1369 { 1376 {
1370 llwarns << "LLInventoryPanel::buildNewViews called with objectp->mType == AT_NONE (shouldn't happen)" << llendl; 1377 llwarns << "LLInventoryPanel::buildNewViews called with objectp->mType == "
1371 itemp = NULL; 1378 << ((S32) objectp->getType())
1379 << " (shouldn't happen)" << llendl;
1372 } 1380 }
1373 else if (objectp->getType() == LLAssetType::AT_CATEGORY) // build new view for category 1381 else if (objectp->getType() == LLAssetType::AT_CATEGORY) // build new view for category
1374 { 1382 {
@@ -1377,19 +1385,16 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
1377 this, 1385 this,
1378 objectp->getUUID()); 1386 objectp->getUUID());
1379 1387
1380 LLFolderViewFolder* folderp = new LLFolderViewFolder(new_listener->getDisplayName(), 1388 if (new_listener)
1381 new_listener->getIcon(),
1382 mFolders,
1383 new_listener);
1384 if (!(mFolders->getSortOrder() & LLInventoryFilter::SO_DATE))
1385 {
1386 folderp->setItemSortFunction(sort_item_name);
1387 }
1388 else
1389 { 1389 {
1390 folderp->setItemSortFunction(sort_item_date); 1390 LLFolderViewFolder* folderp = new LLFolderViewFolder(new_listener->getDisplayName(),
1391 new_listener->getIcon(),
1392 mFolders,
1393 new_listener);
1394
1395 folderp->setItemSortOrder(mFolders->getSortOrder());
1396 itemp = folderp;
1391 } 1397 }
1392 itemp = folderp;
1393 } 1398 }
1394 else // build new view for item 1399 else // build new view for item
1395 { 1400 {
@@ -1400,11 +1405,14 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
1400 this, 1405 this,
1401 item->getUUID(), 1406 item->getUUID(),
1402 item->getFlags()); 1407 item->getFlags());
1403 itemp = new LLFolderViewItem(new_listener->getDisplayName(), 1408 if (new_listener)
1404 new_listener->getIcon(), 1409 {
1405 new_listener->getCreationDate(), 1410 itemp = new LLFolderViewItem(new_listener->getDisplayName(),
1406 mFolders, 1411 new_listener->getIcon(),
1407 new_listener); 1412 new_listener->getCreationDate(),
1413 mFolders,
1414 new_listener);
1415 }
1408 } 1416 }
1409 1417
1410 LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)mFolders->getItemByID(objectp->getParentUUID()); 1418 LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)mFolders->getItemByID(objectp->getParentUUID());
diff --git a/linden/indra/newview/llnetmap.cpp b/linden/indra/newview/llnetmap.cpp
index 35774cb..2105521 100644
--- a/linden/indra/newview/llnetmap.cpp
+++ b/linden/indra/newview/llnetmap.cpp
@@ -103,7 +103,7 @@ LLNetMap::LLNetMap(
103 LLRect major_dir_rect( 0, DIR_HEIGHT, DIR_WIDTH, 0 ); 103 LLRect major_dir_rect( 0, DIR_HEIGHT, DIR_WIDTH, 0 );
104 104
105 mTextBoxNorth = new LLTextBox( "N", major_dir_rect ); 105 mTextBoxNorth = new LLTextBox( "N", major_dir_rect );
106 mTextBoxNorth->setDropshadowVisible( TRUE ); 106 mTextBoxNorth->setFontStyle(LLFontGL::DROP_SHADOW_SOFT);
107 addChild( mTextBoxNorth ); 107 addChild( mTextBoxNorth );
108 108
109 LLColor4 minor_color( 1.f, 1.f, 1.f, .7f ); 109 LLColor4 minor_color( 1.f, 1.f, 1.f, .7f );
diff --git a/linden/indra/newview/llpanelavatar.cpp b/linden/indra/newview/llpanelavatar.cpp
index fd25775..9c73dad 100644
--- a/linden/indra/newview/llpanelavatar.cpp
+++ b/linden/indra/newview/llpanelavatar.cpp
@@ -1522,40 +1522,43 @@ void LLPanelAvatar::resetGroupList()
1522 { 1522 {
1523 return; 1523 return;
1524 } 1524 }
1525 LLScrollListCtrl* group_list = LLUICtrlFactory::getScrollListByName(mPanelSecondLife,"groups");
1526 1525
1527 if (mPanelSecondLife && group_list) 1526 if (mPanelSecondLife)
1528 { 1527 {
1529 group_list->deleteAllItems(); 1528 LLScrollListCtrl* group_list = LLUICtrlFactory::getScrollListByName(mPanelSecondLife,"groups");
1530 1529 if (group_list)
1531 S32 count = gAgent.mGroups.count();
1532 LLUUID id;
1533
1534 for(S32 i = 0; i < count; ++i)
1535 { 1530 {
1536 LLGroupData group_data = gAgent.mGroups.get(i); 1531 group_list->deleteAllItems();
1537 id = group_data.mID; 1532
1538 std::string group_string; 1533 S32 count = gAgent.mGroups.count();
1539 /* Show group title? DUMMY_POWER for Don Grep 1534 LLUUID id;
1540 if(group_data.mOfficer) 1535
1541 { 1536 for(S32 i = 0; i < count; ++i)
1542 group_string = "Officer of ";
1543 }
1544 else
1545 { 1537 {
1546 group_string = "Member of "; 1538 LLGroupData group_data = gAgent.mGroups.get(i);
1547 } 1539 id = group_data.mID;
1548 */ 1540 std::string group_string;
1541 /* Show group title? DUMMY_POWER for Don Grep
1542 if(group_data.mOfficer)
1543 {
1544 group_string = "Officer of ";
1545 }
1546 else
1547 {
1548 group_string = "Member of ";
1549 }
1550 */
1551
1552 group_string += group_data.mName;
1549 1553
1550 group_string += group_data.mName; 1554 LLSD row;
1551 1555 row["columns"][0]["value"] = group_string;
1552 LLSD row; 1556 row["columns"][0]["font"] = "SANSSERIF_SMALL";
1553 row["columns"][0]["value"] = group_string; 1557 row["columns"][0]["width"] = 0;
1554 row["columns"][0]["font"] = "SANSSERIF_SMALL"; 1558 group_list->addElement(row);
1555 row["columns"][0]["width"] = 0; 1559 }
1556 group_list->addElement(row); 1560 group_list->sortByColumn(0, TRUE);
1557 } 1561 }
1558 group_list->sortByColumn(0, TRUE);
1559 } 1562 }
1560} 1563}
1561 1564
diff --git a/linden/indra/newview/llpanelcontents.cpp b/linden/indra/newview/llpanelcontents.cpp
index 2265ed5..4d138d4 100644
--- a/linden/indra/newview/llpanelcontents.cpp
+++ b/linden/indra/newview/llpanelcontents.cpp
@@ -1,4 +1,4 @@
1/** 1/**
2 * @file llpanelcontents.cpp 2 * @file llpanelcontents.cpp
3 * @brief Object contents panel in the tools floater. 3 * @brief Object contents panel in the tools floater.
4 * 4 *
@@ -101,21 +101,25 @@ LLPanelContents::~LLPanelContents()
101void LLPanelContents::getState(LLViewerObject *objectp ) 101void LLPanelContents::getState(LLViewerObject *objectp )
102{ 102{
103 if( !objectp ) 103 if( !objectp )
104 { 104 {
105 childSetEnabled("button new script",FALSE); 105 childSetEnabled("button new script",FALSE);
106 //mBtnNewScript->setEnabled( FALSE ); 106 //mBtnNewScript->setEnabled( FALSE );
107 return; 107 return;
108 } 108 }
109 109
110 LLUUID group_id; // used for SL-23488
111 gSelectMgr->selectGetGroup(group_id); // sets group_id as a side effect SL-23488
112
110 // BUG? Check for all objects being editable? 113 // BUG? Check for all objects being editable?
111 BOOL editable = gAgent.isGodlike() 114 BOOL editable = gAgent.isGodlike()
112 || (objectp->permModify() && objectp->permYouOwner()); 115 || (objectp->permModify()
116 && ( objectp->permYouOwner() || ( !group_id.isNull() && gAgent.isInGroup(group_id) ))); // solves SL-23488
113 BOOL all_volume = gSelectMgr->selectionAllPCode( LL_PCODE_VOLUME ); 117 BOOL all_volume = gSelectMgr->selectionAllPCode( LL_PCODE_VOLUME );
114 118
115 // Edit script button - ok if object is editable and there's an 119 // Edit script button - ok if object is editable and there's an
116 // unambiguous destination for the object. 120 // unambiguous destination for the object.
117 if( editable && 121 if( editable &&
118 all_volume && 122 all_volume &&
119 ((gSelectMgr->getSelection()->getRootObjectCount() == 1) 123 ((gSelectMgr->getSelection()->getRootObjectCount() == 1)
120 || (gSelectMgr->getSelection()->getObjectCount() == 1))) 124 || (gSelectMgr->getSelection()->getObjectCount() == 1)))
121 { 125 {
diff --git a/linden/indra/newview/llpaneldisplay.cpp b/linden/indra/newview/llpaneldisplay.cpp
index d22d1c2..d79dcb4 100644
--- a/linden/indra/newview/llpaneldisplay.cpp
+++ b/linden/indra/newview/llpaneldisplay.cpp
@@ -448,7 +448,6 @@ LLPanelDisplay2::LLPanelDisplay2()
448 448
449BOOL LLPanelDisplay2::postBuild() 449BOOL LLPanelDisplay2::postBuild()
450{ 450{
451
452 requires("ani", WIDGET_TYPE_CHECKBOX); 451 requires("ani", WIDGET_TYPE_CHECKBOX);
453 requires("gamma", WIDGET_TYPE_SPINNER); 452 requires("gamma", WIDGET_TYPE_SPINNER);
454 requires("vbo", WIDGET_TYPE_CHECKBOX); 453 requires("vbo", WIDGET_TYPE_CHECKBOX);
@@ -466,6 +465,14 @@ BOOL LLPanelDisplay2::postBuild()
466 // Graphics Card Memory 465 // Graphics Card Memory
467 mRadioVideoCardMem = LLUICtrlFactory::getRadioGroupByName(this, "video card memory radio"); 466 mRadioVideoCardMem = LLUICtrlFactory::getRadioGroupByName(this, "video card memory radio");
468 467
468#if !LL_WINDOWS
469 // The probe_hardware_checkbox setting is only used in the Windows build
470 // (It apparently controls a time-consuming DX9 hardware probe.)
471 // Disable the checkbox everywhere else
472 gSavedSettings.setBOOL("ProbeHardwareOnStartup", FALSE );
473 childSetEnabled("probe_hardware_checkbox", false);
474#endif // !LL_WINDOWS
475
469 refresh(); 476 refresh();
470 477
471 return TRUE; 478 return TRUE;
@@ -490,7 +497,8 @@ void LLPanelDisplay2::refresh()
490 mParticleCount = gSavedSettings.getS32("RenderMaxPartCount"); 497 mParticleCount = gSavedSettings.getS32("RenderMaxPartCount");
491 mCompositeLimit = gSavedSettings.getS32("AvatarCompositeLimit"); 498 mCompositeLimit = gSavedSettings.getS32("AvatarCompositeLimit");
492 mDebugBeaconLineWidth = gSavedSettings.getS32("DebugBeaconLineWidth"); 499 mDebugBeaconLineWidth = gSavedSettings.getS32("DebugBeaconLineWidth");
493 500 mProbeHardwareOnStartup = gSavedSettings.getBOOL("ProbeHardwareOnStartup");
501
494 refreshEnabledState(); 502 refreshEnabledState();
495} 503}
496 504
@@ -521,7 +529,6 @@ void LLPanelDisplay2::apply()
521 gViewerWindow->restartDisplay(logged_in); 529 gViewerWindow->restartDisplay(logged_in);
522 } 530 }
523 531
524
525 refresh(); 532 refresh();
526} 533}
527 534
@@ -537,6 +544,7 @@ void LLPanelDisplay2::cancel()
537 gSavedSettings.setS32("RenderMaxPartCount", mParticleCount); 544 gSavedSettings.setS32("RenderMaxPartCount", mParticleCount);
538 gSavedSettings.setS32("AvatarCompositeLimit", mCompositeLimit); 545 gSavedSettings.setS32("AvatarCompositeLimit", mCompositeLimit);
539 gSavedSettings.setS32("DebugBeaconLineWidth", mDebugBeaconLineWidth); 546 gSavedSettings.setS32("DebugBeaconLineWidth", mDebugBeaconLineWidth);
547 gSavedSettings.setBOOL("ProbeHardwareOnStartup", mProbeHardwareOnStartup );
540} 548}
541 549
542//============================================================================ 550//============================================================================
diff --git a/linden/indra/newview/llpaneldisplay.h b/linden/indra/newview/llpaneldisplay.h
index b4db723..80aae66 100644
--- a/linden/indra/newview/llpaneldisplay.h
+++ b/linden/indra/newview/llpaneldisplay.h
@@ -102,7 +102,7 @@ protected:
102 S32 mParticleCount; 102 S32 mParticleCount;
103 S32 mCompositeLimit; 103 S32 mCompositeLimit;
104 S32 mDebugBeaconLineWidth; 104 S32 mDebugBeaconLineWidth;
105 105 BOOL mProbeHardwareOnStartup;
106}; 106};
107 107
108class LLPanelDisplay3 : public LLPanel 108class LLPanelDisplay3 : public LLPanel
@@ -147,7 +147,6 @@ protected:
147 F32 mFlexLOD; 147 F32 mFlexLOD;
148 F32 mTreeLOD; 148 F32 mTreeLOD;
149 F32 mAvatarLOD; 149 F32 mAvatarLOD;
150
151}; 150};
152 151
153const S32 LL_MAX_VRAM_INDEX = 6; 152const S32 LL_MAX_VRAM_INDEX = 6;
diff --git a/linden/indra/newview/llpanelface.cpp b/linden/indra/newview/llpanelface.cpp
index 8f24c55..9cbfdc2 100644
--- a/linden/indra/newview/llpanelface.cpp
+++ b/linden/indra/newview/llpanelface.cpp
@@ -505,7 +505,16 @@ void LLPanelFace::getState()
505 { 505 {
506 F32 shinyf = 0.f; 506 F32 shinyf = 0.f;
507 identical = allFacesSameValue( &LLPanelFace::valueShiny, &shinyf ); 507 identical = allFacesSameValue( &LLPanelFace::valueShiny, &shinyf );
508 childGetSelectionInterface("combobox shininess")->selectNthItem((S32)shinyf); 508 LLCtrlSelectionInterface* combobox_shininess =
509 childGetSelectionInterface("combobox shininess");
510 if (combobox_shininess)
511 {
512 combobox_shininess->selectNthItem((S32)shinyf);
513 }
514 else
515 {
516 llwarns << "failed childGetSelectionInterface for 'combobox shininess'" << llendl;
517 }
509 childSetEnabled("combobox shininess",editable); 518 childSetEnabled("combobox shininess",editable);
510 childSetTentative("combobox shininess",!identical); 519 childSetTentative("combobox shininess",!identical);
511 childSetEnabled("label shininess",editable); 520 childSetEnabled("label shininess",editable);
@@ -514,7 +523,16 @@ void LLPanelFace::getState()
514 { 523 {
515 F32 bumpf = 0.f; 524 F32 bumpf = 0.f;
516 identical = allFacesSameValue( &LLPanelFace::valueBump, &bumpf ); 525 identical = allFacesSameValue( &LLPanelFace::valueBump, &bumpf );
517 childGetSelectionInterface("combobox bumpiness")->selectNthItem((S32)bumpf); 526 LLCtrlSelectionInterface* combobox_bumpiness =
527 childGetSelectionInterface("combobox bumpiness");
528 if (combobox_bumpiness)
529 {
530 combobox_bumpiness->selectNthItem((S32)bumpf);
531 }
532 else
533 {
534 llwarns << "failed childGetSelectionInterface for 'combobox bumpiness'" << llendl;
535 }
518 childSetEnabled("combobox bumpiness",editable); 536 childSetEnabled("combobox bumpiness",editable);
519 childSetTentative("combobox bumpiness",!identical); 537 childSetTentative("combobox bumpiness",!identical);
520 childSetEnabled("label bumpiness",editable); 538 childSetEnabled("label bumpiness",editable);
@@ -523,8 +541,17 @@ void LLPanelFace::getState()
523 { 541 {
524 F32 genf = 0.f; 542 F32 genf = 0.f;
525 identical = allFacesSameValue( &LLPanelFace::valueTexGen, &genf); 543 identical = allFacesSameValue( &LLPanelFace::valueTexGen, &genf);
526 S32 selected_texgen = ((S32) genf) >> TEM_TEX_GEN_SHIFT; 544 S32 selected_texgen = ((S32) genf) >> TEM_TEX_GEN_SHIFT;
527 childGetSelectionInterface("combobox texgen")->selectNthItem(selected_texgen); 545 LLCtrlSelectionInterface* combobox_texgen =
546 childGetSelectionInterface("combobox texgen");
547 if (combobox_texgen)
548 {
549 combobox_texgen->selectNthItem(selected_texgen);
550 }
551 else
552 {
553 llwarns << "failed childGetSelectionInterface for 'combobox texgen'" << llendl;
554 }
528 childSetEnabled("combobox texgen",editable); 555 childSetEnabled("combobox texgen",editable);
529 childSetTentative("combobox texgen",!identical); 556 childSetTentative("combobox texgen",!identical);
530 childSetEnabled("tex gen",editable); 557 childSetEnabled("tex gen",editable);
diff --git a/linden/indra/newview/llpanelgeneral.cpp b/linden/indra/newview/llpanelgeneral.cpp
index 900598a..d60471d 100644
--- a/linden/indra/newview/llpanelgeneral.cpp
+++ b/linden/indra/newview/llpanelgeneral.cpp
@@ -105,7 +105,6 @@ BOOL LLPanelGeneral::postBuild()
105 requires("rotate_mini_map_checkbox", WIDGET_TYPE_CHECKBOX); 105 requires("rotate_mini_map_checkbox", WIDGET_TYPE_CHECKBOX);
106 requires("friends_online_notify_checkbox", WIDGET_TYPE_CHECKBOX); 106 requires("friends_online_notify_checkbox", WIDGET_TYPE_CHECKBOX);
107 requires("notify_money_change_checkbox", WIDGET_TYPE_CHECKBOX); 107 requires("notify_money_change_checkbox", WIDGET_TYPE_CHECKBOX);
108 requires("probe_hardware_checkbox", WIDGET_TYPE_CHECKBOX);
109 requires("use_system_color_picker_checkbox", WIDGET_TYPE_CHECKBOX); 108 requires("use_system_color_picker_checkbox", WIDGET_TYPE_CHECKBOX);
110 requires("crash_behavior_combobox", WIDGET_TYPE_COMBO_BOX); 109 requires("crash_behavior_combobox", WIDGET_TYPE_COMBO_BOX);
111 110
@@ -152,14 +151,6 @@ BOOL LLPanelGeneral::postBuild()
152 151
153 childSetCommitCallback("language_combobox", set_language ); 152 childSetCommitCallback("language_combobox", set_language );
154 childSetValue("language_combobox", gSavedSettings.getString("Language")); 153 childSetValue("language_combobox", gSavedSettings.getString("Language"));
155
156#if !LL_WINDOWS
157 // The probe_hardware_checkbox setting is only used in the Windows build
158 // (It apparently controls a time-consuming DX9 hardware probe.)
159 // Disable the checkbox everywhere else
160 gSavedSettings.setBOOL("ProbeHardwareOnStartup", FALSE );
161 childSetEnabled("probe_hardware_checkbox", false);
162#endif // !LL_WINDOWS
163 154
164 refresh(); 155 refresh();
165 156
@@ -205,7 +196,7 @@ void LLPanelGeneral::refresh()
205 mAFKTimeout = gSavedSettings.getF32("AFKTimeout"); 196 mAFKTimeout = gSavedSettings.getF32("AFKTimeout");
206 mMiniMapRotate = gSavedSettings.getBOOL("MiniMapRotate"); 197 mMiniMapRotate = gSavedSettings.getBOOL("MiniMapRotate");
207 mNotifyMoney = gSavedSettings.getBOOL("NotifyMoneyChange"); 198 mNotifyMoney = gSavedSettings.getBOOL("NotifyMoneyChange");
208 mProbeHardwareOnStartup = gSavedSettings.getBOOL("ProbeHardwareOnStartup"); 199 mShowNewInventory = gSavedSettings.getBOOL("ShowNewInventory");
209 mUseDefaultColor = gSavedSettings.getBOOL("UseDefaultColorPicker"); 200 mUseDefaultColor = gSavedSettings.getBOOL("UseDefaultColorPicker");
210 mEffectColor = gSavedSettings.getColor4("EffectColor"); 201 mEffectColor = gSavedSettings.getColor4("EffectColor");
211 202
@@ -226,7 +217,7 @@ void LLPanelGeneral::cancel()
226 gSavedSettings.setF32("AFKTimeout", mAFKTimeout ); 217 gSavedSettings.setF32("AFKTimeout", mAFKTimeout );
227 gSavedSettings.setBOOL("MiniMapRotate", mMiniMapRotate ); 218 gSavedSettings.setBOOL("MiniMapRotate", mMiniMapRotate );
228 gSavedSettings.setBOOL("NotifyMoneyChange", mNotifyMoney ); 219 gSavedSettings.setBOOL("NotifyMoneyChange", mNotifyMoney );
229 gSavedSettings.setBOOL("ProbeHardwareOnStartup", mProbeHardwareOnStartup ); 220 gSavedSettings.setBOOL("ShowNewInventory", mShowNewInventory);
230 gSavedSettings.setBOOL("UseDefaultColorPicker", mUseDefaultColor ); 221 gSavedSettings.setBOOL("UseDefaultColorPicker", mUseDefaultColor );
231 gSavedSettings.setColor4("EffectColor", mEffectColor ); 222 gSavedSettings.setColor4("EffectColor", mEffectColor );
232 gSavedSettings.setString("Language", mLanguage); 223 gSavedSettings.setString("Language", mLanguage);
diff --git a/linden/indra/newview/llpanelgeneral.h b/linden/indra/newview/llpanelgeneral.h
index 9f70560..fe4ff4e 100644
--- a/linden/indra/newview/llpanelgeneral.h
+++ b/linden/indra/newview/llpanelgeneral.h
@@ -61,7 +61,7 @@ protected:
61 BOOL mChatOnlineNotification; 61 BOOL mChatOnlineNotification;
62 F32 mAFKTimeout; 62 F32 mAFKTimeout;
63 BOOL mNotifyMoney; 63 BOOL mNotifyMoney;
64 BOOL mProbeHardwareOnStartup; 64 BOOL mShowNewInventory;
65 BOOL mUseDefaultColor; 65 BOOL mUseDefaultColor;
66 LLColor4 mEffectColor; 66 LLColor4 mEffectColor;
67 BOOL mMiniMapRotate; 67 BOOL mMiniMapRotate;
diff --git a/linden/indra/newview/llpanelgroup.cpp b/linden/indra/newview/llpanelgroup.cpp
index 6710c43..47dacf3 100644
--- a/linden/indra/newview/llpanelgroup.cpp
+++ b/linden/indra/newview/llpanelgroup.cpp
@@ -660,7 +660,7 @@ void LLPanelGroup::showNotice(const char* subject,
660 // We need to clean up that inventory offer. 660 // We need to clean up that inventory offer.
661 if (inventory_offer) 661 if (inventory_offer)
662 { 662 {
663 inventory_offer_callback( 1 , inventory_offer); 663 inventory_offer_callback( IOR_DECLINE , inventory_offer);
664 } 664 }
665 return; 665 return;
666 } 666 }
diff --git a/linden/indra/newview/llpanelgroupgeneral.cpp b/linden/indra/newview/llpanelgroupgeneral.cpp
index 67a0c31..5ec9651 100644
--- a/linden/indra/newview/llpanelgroupgeneral.cpp
+++ b/linden/indra/newview/llpanelgroupgeneral.cpp
@@ -45,10 +45,10 @@
45#include "llnamebox.h" 45#include "llnamebox.h"
46#include "llnamelistctrl.h" 46#include "llnamelistctrl.h"
47#include "llspinctrl.h" 47#include "llspinctrl.h"
48#include "llstatusbar.h" // can_afford_transaction()
48#include "lltextbox.h" 49#include "lltextbox.h"
49#include "lltexteditor.h" 50#include "lltexteditor.h"
50#include "lltexturectrl.h" 51#include "lltexturectrl.h"
51#include "llviewermessage.h"
52#include "llviewerwindow.h" 52#include "llviewerwindow.h"
53 53
54// static 54// static
@@ -322,19 +322,27 @@ void LLPanelGroupGeneral::onClickJoin(void *userdata)
322 322
323 LLGroupMgrGroupData* gdatap = gGroupMgr->getGroupData(self->mGroupID); 323 LLGroupMgrGroupData* gdatap = gGroupMgr->getGroupData(self->mGroupID);
324 324
325 S32 cost = gdatap->mMembershipFee; 325 if (gdatap)
326 LLString::format_map_t args;
327 args["[COST]"] = llformat("%d", cost);
328
329 if (can_afford_transaction(cost))
330 { 326 {
331 gViewerWindow->alertXml("JoinGroupCanAfford", args, 327 S32 cost = gdatap->mMembershipFee;
332 LLPanelGroupGeneral::joinDlgCB, 328 LLString::format_map_t args;
333 self); 329 args["[COST]"] = llformat("%d", cost);
330
331 if (can_afford_transaction(cost))
332 {
333 gViewerWindow->alertXml("JoinGroupCanAfford", args,
334 LLPanelGroupGeneral::joinDlgCB,
335 self);
336 }
337 else
338 {
339 gViewerWindow->alertXml("JoinGroupCannotAfford", args);
340 }
334 } 341 }
335 else 342 else
336 { 343 {
337 gViewerWindow->alertXml("JoinGroupCannotAfford", args); 344 llwarns << "gGroupMgr->getGroupData(" << self->mGroupID
345 << ") was NULL" << llendl;
338 } 346 }
339} 347}
340 348
diff --git a/linden/indra/newview/llpanelgroupnotices.cpp b/linden/indra/newview/llpanelgroupnotices.cpp
index 373f3f2..a001455 100644
--- a/linden/indra/newview/llpanelgroupnotices.cpp
+++ b/linden/indra/newview/llpanelgroupnotices.cpp
@@ -204,7 +204,7 @@ LLPanelGroupNotices::~LLPanelGroupNotices()
204 if (mInventoryOffer) 204 if (mInventoryOffer)
205 { 205 {
206 // Cancel the inventory offer. 206 // Cancel the inventory offer.
207 inventory_offer_callback( 1 , mInventoryOffer); 207 inventory_offer_callback( IOR_DECLINE , mInventoryOffer);
208 mInventoryOffer = NULL; 208 mInventoryOffer = NULL;
209 } 209 }
210} 210}
@@ -359,7 +359,7 @@ void LLPanelGroupNotices::onClickOpenAttachment(void* data)
359{ 359{
360 LLPanelGroupNotices* self = (LLPanelGroupNotices*)data; 360 LLPanelGroupNotices* self = (LLPanelGroupNotices*)data;
361 361
362 inventory_offer_callback( 0 , self->mInventoryOffer); 362 inventory_offer_callback( IOR_ACCEPT , self->mInventoryOffer);
363 self->mInventoryOffer = NULL; 363 self->mInventoryOffer = NULL;
364 self->mBtnOpenAttachment->setEnabled(FALSE); 364 self->mBtnOpenAttachment->setEnabled(FALSE);
365} 365}
@@ -398,7 +398,7 @@ void LLPanelGroupNotices::onClickNewMessage(void* data)
398 398
399 if (self->mInventoryOffer) 399 if (self->mInventoryOffer)
400 { 400 {
401 inventory_offer_callback( 1 , self->mInventoryOffer); 401 inventory_offer_callback( IOR_DECLINE , self->mInventoryOffer);
402 self->mInventoryOffer = NULL; 402 self->mInventoryOffer = NULL;
403 } 403 }
404 404
@@ -548,7 +548,7 @@ void LLPanelGroupNotices::showNotice(const char* subject,
548 if (mInventoryOffer) 548 if (mInventoryOffer)
549 { 549 {
550 // Cancel the inventory offer for the previously viewed notice 550 // Cancel the inventory offer for the previously viewed notice
551 inventory_offer_callback( 1 , mInventoryOffer); 551 inventory_offer_callback( IOR_DECLINE , mInventoryOffer);
552 mInventoryOffer = NULL; 552 mInventoryOffer = NULL;
553 } 553 }
554 554
diff --git a/linden/indra/newview/llpanelgrouproles.cpp b/linden/indra/newview/llpanelgrouproles.cpp
index 266ff12..5765a12 100644
--- a/linden/indra/newview/llpanelgrouproles.cpp
+++ b/linden/indra/newview/llpanelgrouproles.cpp
@@ -1323,13 +1323,17 @@ void LLPanelGroupMembersSubTab::onRoleCheck(LLUICtrl* ctrl, void* user_data)
1323 LLCheckBoxCtrl* check_box = static_cast<LLCheckBoxCtrl*>(ctrl); 1323 LLCheckBoxCtrl* check_box = static_cast<LLCheckBoxCtrl*>(ctrl);
1324 if (!check_box || !self) return; 1324 if (!check_box || !self) return;
1325 1325
1326 1326 LLScrollListItem* first_selected =
1327 LLUUID role_id = self->mAssignedRolesList->getFirstSelected()->getUUID(); 1327 self->mAssignedRolesList->getFirstSelected();
1328 LLRoleMemberChangeType change_type = (check_box->get() ? 1328 if (first_selected)
1329 RMC_ADD : 1329 {
1330 RMC_REMOVE); 1330 LLUUID role_id = first_selected->getUUID();
1331 1331 LLRoleMemberChangeType change_type = (check_box->get() ?
1332 self->handleRoleCheck(role_id, change_type); 1332 RMC_ADD :
1333 RMC_REMOVE);
1334
1335 self->handleRoleCheck(role_id, change_type);
1336 }
1333} 1337}
1334 1338
1335void LLPanelGroupMembersSubTab::handleMemberDoubleClick() 1339void LLPanelGroupMembersSubTab::handleMemberDoubleClick()
@@ -2056,8 +2060,9 @@ void LLPanelGroupRolesSubTab::update(LLGroupChange gc)
2056 } 2060 }
2057 2061
2058 if ((GC_ROLE_MEMBER_DATA == gc || GC_MEMBER_DATA == gc) 2062 if ((GC_ROLE_MEMBER_DATA == gc || GC_MEMBER_DATA == gc)
2059 && gdatap->isMemberDataComplete() 2063 && gdatap
2060 && gdatap->isRoleMemberDataComplete()) 2064 && gdatap->isMemberDataComplete()
2065 && gdatap->isRoleMemberDataComplete())
2061 { 2066 {
2062 buildMembersList(); 2067 buildMembersList();
2063 } 2068 }
diff --git a/linden/indra/newview/llpanelinventory.cpp b/linden/indra/newview/llpanelinventory.cpp
index 2089a6c..13cee05 100644
--- a/linden/indra/newview/llpanelinventory.cpp
+++ b/linden/indra/newview/llpanelinventory.cpp
@@ -1,4 +1,4 @@
1/** 1/**
2 * @file llpanelinventory.cpp 2 * @file llpanelinventory.cpp
3 * @brief LLPanelInventory class implementation 3 * @brief LLPanelInventory class implementation
4 * 4 *
@@ -72,7 +72,7 @@
72#include "llviewerregion.h" 72#include "llviewerregion.h"
73#include "llviewerimagelist.h" 73#include "llviewerimagelist.h"
74#include "llviewerinventory.h" 74#include "llviewerinventory.h"
75#include "llviewermessage.h" 75#include "llviewermessage.h"
76#include "llviewerobject.h" 76#include "llviewerobject.h"
77#include "llviewerobjectlist.h" 77#include "llviewerobjectlist.h"
78#include "llviewerwindow.h" 78#include "llviewerwindow.h"
@@ -197,7 +197,7 @@ struct LLBuyInvItemData
197 LLUUID mTaskID; 197 LLUUID mTaskID;
198 LLUUID mItemID; 198 LLUUID mItemID;
199 LLAssetType::EType mType; 199 LLAssetType::EType mType;
200 200
201 LLBuyInvItemData(const LLUUID& task, 201 LLBuyInvItemData(const LLUUID& task,
202 const LLUUID& item, 202 const LLUUID& item,
203 LLAssetType::EType type) : 203 LLAssetType::EType type) :
@@ -217,34 +217,45 @@ void LLTaskInvFVBridge::buyItem()
217 const LLSaleInfo& sale_info = item->getSaleInfo(); 217 const LLSaleInfo& sale_info = item->getSaleInfo();
218 const LLPermissions& perm = item->getPermissions(); 218 const LLPermissions& perm = item->getPermissions();
219 const LLString owner_name; // no owner name currently... FIXME? 219 const LLString owner_name; // no owner name currently... FIXME?
220
221 LLString::format_map_t args;
222 args["[PRICE]"] = llformat("%d",sale_info.getSalePrice());
223 args["[OWNER]"] = owner_name;
224 if (sale_info.getSaleType() != LLSaleInfo::FS_CONTENTS)
225 {
226 U32 next_owner_mask = perm.getMaskNextOwner();
227 args["[MODIFYPERM]"] = LLAlertDialog::getTemplateMessage((next_owner_mask & PERM_MODIFY) ? "PermYes" : "PermNo");
228 args["[COPYPERM]"] = LLAlertDialog::getTemplateMessage((next_owner_mask & PERM_COPY) ? "PermYes" : "PermNo");
229 args["[RESELLPERM]"] = LLAlertDialog::getTemplateMessage((next_owner_mask & PERM_TRANSFER) ? "PermYes" : "PermNo");
230 }
231 220
232 LLString alertdesc; 221 LLViewerObject* obj;
233 switch(sale_info.getSaleType()) 222 if( ( obj = gObjectList.findObject( mPanel->getTaskUUID() ) ) && obj->isAttachment() )
234 { 223 {
235 case LLSaleInfo::FS_ORIGINAL: 224 gViewerWindow->alertXml("Cannot_Purchase_an_Attachment");
236 alertdesc = owner_name.empty() ? "BuyOriginalNoOwner" : "BuyOriginal"; 225 llinfos << "Attempt to purchase an attachment" << llendl;
237 break;
238 case LLSaleInfo::FS_COPY:
239 default:
240 alertdesc = owner_name.empty() ? "BuyCopyNoOwner" : "BuyCopy";
241 break;
242 case LLSaleInfo::FS_CONTENTS:
243 alertdesc = owner_name.empty() ? "BuyContentsNoOwner" : "BuyContents";
244 break;
245 } 226 }
246 227 else
247 gViewerWindow->alertXml(alertdesc, args, LLTaskInvFVBridge::commitBuyItem, (void*)inv); 228 {
229
230
231 LLString::format_map_t args;
232 args["[PRICE]"] = llformat("%d",sale_info.getSalePrice());
233 args["[OWNER]"] = owner_name;
234 if (sale_info.getSaleType() != LLSaleInfo::FS_CONTENTS)
235 {
236 U32 next_owner_mask = perm.getMaskNextOwner();
237 args["[MODIFYPERM]"] = LLAlertDialog::getTemplateMessage((next_owner_mask & PERM_MODIFY) ? "PermYes" : "PermNo");
238 args["[COPYPERM]"] = LLAlertDialog::getTemplateMessage((next_owner_mask & PERM_COPY) ? "PermYes" : "PermNo");
239 args["[RESELLPERM]"] = LLAlertDialog::getTemplateMessage((next_owner_mask & PERM_TRANSFER) ? "PermYes" : "PermNo");
240 }
241
242 LLString alertdesc;
243 switch(sale_info.getSaleType())
244 {
245 case LLSaleInfo::FS_ORIGINAL:
246 alertdesc = owner_name.empty() ? "BuyOriginalNoOwner" : "BuyOriginal";
247 break;
248 case LLSaleInfo::FS_COPY:
249 default:
250 alertdesc = owner_name.empty() ? "BuyCopyNoOwner" : "BuyCopy";
251 break;
252 case LLSaleInfo::FS_CONTENTS:
253 alertdesc = owner_name.empty() ? "BuyContentsNoOwner" : "BuyContents";
254 break;
255 }
256
257 gViewerWindow->alertXml(alertdesc, args, LLTaskInvFVBridge::commitBuyItem, (void*)inv);
258 }
248} 259}
249 260
250S32 LLTaskInvFVBridge::getPrice() 261S32 LLTaskInvFVBridge::getPrice()
@@ -269,7 +280,7 @@ void LLTaskInvFVBridge::commitBuyItem(S32 option, void* data)
269 { 280 {
270 LLViewerObject* object = gObjectList.findObject(inv->mTaskID); 281 LLViewerObject* object = gObjectList.findObject(inv->mTaskID);
271 if(!object || !object->getRegion()) return; 282 if(!object || !object->getRegion()) return;
272 283
273 284
274 LLMessageSystem* msg = gMessageSystem; 285 LLMessageSystem* msg = gMessageSystem;
275 msg->newMessageFast(_PREHASH_BuyObjectInventory); 286 msg->newMessageFast(_PREHASH_BuyObjectInventory);
@@ -289,12 +300,12 @@ void LLTaskInvFVBridge::commitBuyItem(S32 option, void* data)
289const LLString& LLTaskInvFVBridge::getName() const 300const LLString& LLTaskInvFVBridge::getName() const
290{ 301{
291 return mName; 302 return mName;
292} 303}
293 304
294const LLString& LLTaskInvFVBridge::getDisplayName() const 305const LLString& LLTaskInvFVBridge::getDisplayName() const
295{ 306{
296 LLInventoryItem* item = findItem(); 307 LLInventoryItem* item = findItem();
297 if(item) 308 if(item)
298 { 309 {
299 mDisplayName.assign(item->getName()); 310 mDisplayName.assign(item->getName());
300 311
@@ -316,9 +327,9 @@ const LLString& LLTaskInvFVBridge::getDisplayName() const
316 mDisplayName.append(" (no transfer)"); 327 mDisplayName.append(" (no transfer)");
317 } 328 }
318 } 329 }
319 330
320 return mDisplayName; 331 return mDisplayName;
321} 332}
322 333
323// BUG: No creation dates for task inventory 334// BUG: No creation dates for task inventory
324U32 LLTaskInvFVBridge::getCreationDate() const 335U32 LLTaskInvFVBridge::getCreationDate() const
@@ -444,7 +455,7 @@ BOOL LLTaskInvFVBridge::removeItem()
444 { 455 {
445 // just do it. 456 // just do it.
446 object->removeInventory(mUUID); 457 object->removeInventory(mUUID);
447 return TRUE; 458 return TRUE;
448 } 459 }
449 else 460 else
450 { 461 {
@@ -542,20 +553,20 @@ BOOL LLTaskInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id)
542 if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID))) 553 if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID)))
543 { 554 {
544 const LLPermissions& perm = inv->getPermissions(); 555 const LLPermissions& perm = inv->getPermissions();
545 bool can_copy = gAgent.allowOperation(PERM_COPY, perm, 556 bool can_copy = gAgent.allowOperation(PERM_COPY, perm,
546 GP_OBJECT_MANIPULATE); 557 GP_OBJECT_MANIPULATE);
547 if (object->isAttachment() && !can_copy) 558 if (object->isAttachment() && !can_copy)
548 { 559 {
549 //RN: no copy contents of attachments cannot be dragged out 560 //RN: no copy contents of attachments cannot be dragged out
550 // due to a race condition and possible exploit where 561 // due to a race condition and possible exploit where
551 // attached objects do not update their inventory items 562 // attached objects do not update their inventory items
552 // when their contents are manipulated 563 // when their contents are manipulated
553 return FALSE; 564 return FALSE;
554 } 565 }
555 if((can_copy && perm.allowTransferTo(gAgent.getID())) 566 if((can_copy && perm.allowTransferTo(gAgent.getID()))
556 || object->permYouOwner()) 567 || object->permYouOwner())
557// || gAgent.isGodlike()) 568// || gAgent.isGodlike())
558 569
559 { 570 {
560 *type = LLAssetType::lookupDragAndDropType(inv->getType()); 571 *type = LLAssetType::lookupDragAndDropType(inv->getType());
561 572
@@ -621,7 +632,7 @@ void LLTaskInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
621 std::vector<LLString> items; 632 std::vector<LLString> items;
622 std::vector<LLString> disabled_items; 633 std::vector<LLString> disabled_items;
623 634
624 if(gAgent.allowOperation(PERM_OWNER, item->getPermissions(), 635 if(gAgent.allowOperation(PERM_OWNER, item->getPermissions(),
625 GP_OBJECT_MANIPULATE) 636 GP_OBJECT_MANIPULATE)
626 && item->getSaleInfo().isForSale()) 637 && item->getSaleInfo().isForSale())
627 { 638 {
@@ -755,12 +766,12 @@ BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id)
755 if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID))) 766 if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID)))
756 { 767 {
757 const LLPermissions& perm = inv->getPermissions(); 768 const LLPermissions& perm = inv->getPermissions();
758 bool can_copy = gAgent.allowOperation(PERM_COPY, perm, 769 bool can_copy = gAgent.allowOperation(PERM_COPY, perm,
759 GP_OBJECT_MANIPULATE); 770 GP_OBJECT_MANIPULATE);
760 if((can_copy && perm.allowTransferTo(gAgent.getID())) 771 if((can_copy && perm.allowTransferTo(gAgent.getID()))
761 || object->permYouOwner()) 772 || object->permYouOwner())
762// || gAgent.isGodlike()) 773// || gAgent.isGodlike())
763 774
764 { 775 {
765 *type = LLAssetType::lookupDragAndDropType(inv->getType()); 776 *type = LLAssetType::lookupDragAndDropType(inv->getType());
766 777
@@ -776,7 +787,7 @@ BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id)
776BOOL LLTaskCategoryBridge::dragOrDrop(MASK mask, BOOL drop, 787BOOL LLTaskCategoryBridge::dragOrDrop(MASK mask, BOOL drop,
777 EDragAndDropType cargo_type, 788 EDragAndDropType cargo_type,
778 void* cargo_data) 789 void* cargo_data)
779{ 790{
780 //llinfos << "LLTaskCategoryBridge::dragOrDrop()" << llendl; 791 //llinfos << "LLTaskCategoryBridge::dragOrDrop()" << llendl;
781 BOOL accept = FALSE; 792 BOOL accept = FALSE;
782 LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); 793 LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
@@ -1060,7 +1071,7 @@ LLTaskLandmarkBridge::LLTaskLandmarkBridge(
1060 LLTaskInvFVBridge(panel, uuid, name) 1071 LLTaskInvFVBridge(panel, uuid, name)
1061{ 1072{
1062} 1073}
1063 1074
1064LLViewerImage* LLTaskLandmarkBridge::getIcon() const 1075LLViewerImage* LLTaskLandmarkBridge::getIcon() const
1065{ 1076{
1066 return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, 0, FALSE); 1077 return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, 0, FALSE);
@@ -1091,7 +1102,7 @@ LLTaskCallingCardBridge::LLTaskCallingCardBridge(
1091 LLTaskInvFVBridge(panel, uuid, name) 1102 LLTaskInvFVBridge(panel, uuid, name)
1092{ 1103{
1093} 1104}
1094 1105
1095LLViewerImage* LLTaskCallingCardBridge::getIcon() const 1106LLViewerImage* LLTaskCallingCardBridge::getIcon() const
1096{ 1107{
1097 return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, 0, FALSE); 1108 return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, 0, FALSE);
@@ -1476,7 +1487,7 @@ LLTaskWearableBridge::LLTaskWearableBridge(
1476 mAssetType( asset_type ) 1487 mAssetType( asset_type )
1477{ 1488{
1478} 1489}
1479 1490
1480LLViewerImage* LLTaskWearableBridge::getIcon() const 1491LLViewerImage* LLTaskWearableBridge::getIcon() const
1481{ 1492{
1482 return get_item_icon(mAssetType, LLInventoryType::IT_WEARABLE, mFlags, FALSE ); 1493 return get_item_icon(mAssetType, LLInventoryType::IT_WEARABLE, mFlags, FALSE );
@@ -1648,7 +1659,7 @@ void LLPanelInventory::inventoryChanged(LLViewerObject* object,
1648{ 1659{
1649 if(!object) return; 1660 if(!object) return;
1650 1661
1651 //llinfos << "invetnory arrived: \n" 1662 //llinfos << "invetnory arrived: \n"
1652 // << " panel UUID: " << panel->mTaskUUID << "\n" 1663 // << " panel UUID: " << panel->mTaskUUID << "\n"
1653 // << " task UUID: " << object->mID << llendl; 1664 // << " task UUID: " << object->mID << llendl;
1654 if(mTaskUUID == object->mID) 1665 if(mTaskUUID == object->mID)
@@ -1686,7 +1697,7 @@ void LLPanelInventory::inventoryChanged(LLViewerObject* object,
1686 1697
1687void LLPanelInventory::updateInventory() 1698void LLPanelInventory::updateInventory()
1688{ 1699{
1689 //llinfos << "inventory arrived: \n" 1700 //llinfos << "inventory arrived: \n"
1690 // << " panel UUID: " << panel->mTaskUUID << "\n" 1701 // << " panel UUID: " << panel->mTaskUUID << "\n"
1691 // << " task UUID: " << object->mID << llendl; 1702 // << " task UUID: " << object->mID << llendl;
1692 // We're still interested in this task's inventory. 1703 // We're still interested in this task's inventory.
@@ -1865,7 +1876,7 @@ void LLPanelInventory::refresh()
1865 // Otherwise we show the old stuff until the update comes in 1876 // Otherwise we show the old stuff until the update comes in
1866 clearContents(); 1877 clearContents();
1867 1878
1868 // Register for updates from this object, 1879 // Register for updates from this object,
1869 registerVOInventoryListener(object,NULL); 1880 registerVOInventoryListener(object,NULL);
1870 } 1881 }
1871 1882
@@ -1978,7 +1989,7 @@ BOOL LLPanelInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDr
1978 } 1989 }
1979} 1990}
1980 1991
1981//static 1992//static
1982void LLPanelInventory::idle(void* user_data) 1993void LLPanelInventory::idle(void* user_data)
1983{ 1994{
1984 LLPanelInventory* self = (LLPanelInventory*)user_data; 1995 LLPanelInventory* self = (LLPanelInventory*)user_data;
diff --git a/linden/indra/newview/llpanelmsgs.cpp b/linden/indra/newview/llpanelmsgs.cpp
index f25d477..3f5314c 100644
--- a/linden/indra/newview/llpanelmsgs.cpp
+++ b/linden/indra/newview/llpanelmsgs.cpp
@@ -88,14 +88,33 @@ void LLPanelMsgs::buildLists()
88 row["columns"][1]["font"] = "SANSSERIF_SMALL"; 88 row["columns"][1]["font"] = "SANSSERIF_SMALL";
89 row["columns"][1]["width"] = 160; 89 row["columns"][1]["width"] = 160;
90 } 90 }
91 item = mDisabledPopups->addElement(row, ADD_SORTED); 91 if (mDisabledPopups)
92 {
93 item = mDisabledPopups->addElement(row,
94 ADD_SORTED);
95 }
96 else
97 {
98 llwarns << "(ignore) but also (!mDisabledPopups)" << llendl;
99 }
92 } 100 }
93 else 101 else
94 { 102 {
95 item = mEnabledPopups->addElement(row, ADD_SORTED); 103 if (mEnabledPopups)
104 {
105 item = mEnabledPopups->addElement(row,
106 ADD_SORTED);
107 }
108 else
109 {
110 llwarns << "(!ignore) but also (!mEnabledPopups)" << llendl;
111 }
96 } 112 }
97 113
98 item->setUserdata((void*)&iter->first); 114 if (item)
115 {
116 item->setUserdata((void*)&iter->first);
117 }
99 } 118 }
100} 119}
101 120
diff --git a/linden/indra/newview/llpanelpermissions.cpp b/linden/indra/newview/llpanelpermissions.cpp
index 18ec28e..6e8a4ff 100644
--- a/linden/indra/newview/llpanelpermissions.cpp
+++ b/linden/indra/newview/llpanelpermissions.cpp
@@ -726,14 +726,17 @@ void LLPanelPermissions::refresh()
726 LLSaleInfo::EForSale sale_type = sale_info.getSaleType(); 726 LLSaleInfo::EForSale sale_type = sale_info.getSaleType();
727 727
728 LLRadioGroup* RadioSaleType = gUICtrlFactory->getRadioGroupByName(this,"sale type"); 728 LLRadioGroup* RadioSaleType = gUICtrlFactory->getRadioGroupByName(this,"sale type");
729 if(RadioSaleType && valid_sale_info) 729 if(RadioSaleType)
730 { 730 {
731 RadioSaleType->setSelectedIndex((S32)sale_type - 1); 731 if (valid_sale_info)
732 } 732 {
733 else 733 RadioSaleType->setSelectedIndex((S32)sale_type - 1);
734 { 734 }
735 // default option is sell copy, determined to be safest 735 else
736 RadioSaleType->setSelectedIndex((S32)LLSaleInfo::FS_COPY - 1); 736 {
737 // default option is sell copy, determined to be safest
738 RadioSaleType->setSelectedIndex((S32)LLSaleInfo::FS_COPY - 1);
739 }
737 } 740 }
738 741
739 if (is_for_sale) 742 if (is_for_sale)
diff --git a/linden/indra/newview/llpatchvertexarray.cpp b/linden/indra/newview/llpatchvertexarray.cpp
index bfd4ff4..611ff97 100644
--- a/linden/indra/newview/llpatchvertexarray.cpp
+++ b/linden/indra/newview/llpatchvertexarray.cpp
@@ -126,8 +126,16 @@ void LLPatchVertexArray::create(U32 surface_width, U32 patch_width, F32 meters_p
126 mRenderStridep = new U32 [mPatchOrder + 1]; 126 mRenderStridep = new U32 [mPatchOrder + 1];
127 } 127 }
128 128
129 if (NULL == mRenderLevelp || NULL == mRenderStridep)
130 {
131 // init() and some other things all want to deref these
132 // pointers, so this is serious.
133 llerrs << "mRenderLevelp or mRenderStridep was NULL; we'd crash soon." << llendl;
134 return;
135 }
129 136
130 // Now that we've allocated memory, we can initialize the arrays... 137 // Now that we've allocated memory, we can initialize
138 // the arrays...
131 init(); 139 init();
132} 140}
133 141
diff --git a/linden/indra/newview/llpolymesh.cpp b/linden/indra/newview/llpolymesh.cpp
index cf94142..1edb8f5 100644
--- a/linden/indra/newview/llpolymesh.cpp
+++ b/linden/indra/newview/llpolymesh.cpp
@@ -301,6 +301,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
301 if (numRead != 1) 301 if (numRead != 1)
302 { 302 {
303 llerrs << "can't read HasWeights flag from " << fileName << llendl; 303 llerrs << "can't read HasWeights flag from " << fileName << llendl;
304 return FALSE;
304 } 305 }
305 if (!isLOD()) 306 if (!isLOD())
306 { 307 {
@@ -315,6 +316,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
315 if (numRead != 1) 316 if (numRead != 1)
316 { 317 {
317 llerrs << "can't read HasDetailTexCoords flag from " << fileName << llendl; 318 llerrs << "can't read HasDetailTexCoords flag from " << fileName << llendl;
319 return FALSE;
318 } 320 }
319 321
320 //---------------------------------------------------------------- 322 //----------------------------------------------------------------
@@ -326,6 +328,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
326 if (numRead != 3) 328 if (numRead != 3)
327 { 329 {
328 llerrs << "can't read Position from " << fileName << llendl; 330 llerrs << "can't read Position from " << fileName << llendl;
331 return FALSE;
329 } 332 }
330 setPosition( position ); 333 setPosition( position );
331 334
@@ -338,6 +341,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
338 if (numRead != 3) 341 if (numRead != 3)
339 { 342 {
340 llerrs << "can't read RotationAngles from " << fileName << llendl; 343 llerrs << "can't read RotationAngles from " << fileName << llendl;
344 return FALSE;
341 } 345 }
342 346
343 U8 rotationOrder; 347 U8 rotationOrder;
@@ -346,6 +350,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
346 if (numRead != 1) 350 if (numRead != 1)
347 { 351 {
348 llerrs << "can't read RotationOrder from " << fileName << llendl; 352 llerrs << "can't read RotationOrder from " << fileName << llendl;
353 return FALSE;
349 } 354 }
350 355
351 rotationOrder = 0; 356 rotationOrder = 0;
@@ -364,6 +369,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
364 if (numRead != 3) 369 if (numRead != 3)
365 { 370 {
366 llerrs << "can't read Scale from " << fileName << llendl; 371 llerrs << "can't read Scale from " << fileName << llendl;
372 return FALSE;
367 } 373 }
368 setScale( scale ); 374 setScale( scale );
369 375
@@ -384,6 +390,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
384 if (numRead != 1) 390 if (numRead != 1)
385 { 391 {
386 llerrs << "can't read NumVertices from " << fileName << llendl; 392 llerrs << "can't read NumVertices from " << fileName << llendl;
393 return FALSE;
387 } 394 }
388 395
389 allocateVertexData( numVertices ); 396 allocateVertexData( numVertices );
@@ -396,6 +403,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
396 if (numRead != numVertices) 403 if (numRead != numVertices)
397 { 404 {
398 llerrs << "can't read Coordinates from " << fileName << llendl; 405 llerrs << "can't read Coordinates from " << fileName << llendl;
406 return FALSE;
399 } 407 }
400 408
401 //---------------------------------------------------------------- 409 //----------------------------------------------------------------
@@ -406,6 +414,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
406 if (numRead != numVertices) 414 if (numRead != numVertices)
407 { 415 {
408 llerrs << " can't read Normals from " << fileName << llendl; 416 llerrs << " can't read Normals from " << fileName << llendl;
417 return FALSE;
409 } 418 }
410 419
411 //---------------------------------------------------------------- 420 //----------------------------------------------------------------
@@ -416,6 +425,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
416 if (numRead != numVertices) 425 if (numRead != numVertices)
417 { 426 {
418 llerrs << " can't read Binormals from " << fileName << llendl; 427 llerrs << " can't read Binormals from " << fileName << llendl;
428 return FALSE;
419 } 429 }
420 430
421 431
@@ -427,6 +437,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
427 if (numRead != numVertices) 437 if (numRead != numVertices)
428 { 438 {
429 llerrs << "can't read TexCoords from " << fileName << llendl; 439 llerrs << "can't read TexCoords from " << fileName << llendl;
440 return FALSE;
430 } 441 }
431 442
432 //---------------------------------------------------------------- 443 //----------------------------------------------------------------
@@ -439,6 +450,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
439 if (numRead != numVertices) 450 if (numRead != numVertices)
440 { 451 {
441 llerrs << "can't read DetailTexCoords from " << fileName << llendl; 452 llerrs << "can't read DetailTexCoords from " << fileName << llendl;
453 return FALSE;
442 } 454 }
443 } 455 }
444 456
@@ -452,6 +464,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
452 if (numRead != numVertices) 464 if (numRead != numVertices)
453 { 465 {
454 llerrs << "can't read Weights from " << fileName << llendl; 466 llerrs << "can't read Weights from " << fileName << llendl;
467 return FALSE;
455 } 468 }
456 } 469 }
457 } 470 }
@@ -465,6 +478,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
465 if (numRead != 1) 478 if (numRead != 1)
466 { 479 {
467 llerrs << "can't read NumFaces from " << fileName << llendl; 480 llerrs << "can't read NumFaces from " << fileName << llendl;
481 return FALSE;
468 } 482 }
469 allocateFaceData( numFaces ); 483 allocateFaceData( numFaces );
470 484
@@ -482,6 +496,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
482 if (numRead != 3) 496 if (numRead != 3)
483 { 497 {
484 llerrs << "can't read Face[" << i << "] from " << fileName << llendl; 498 llerrs << "can't read Face[" << i << "] from " << fileName << llendl;
499 return FALSE;
485 } 500 }
486 if (mReferenceData) 501 if (mReferenceData)
487 { 502 {
@@ -538,6 +553,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
538 if (numRead != 1) 553 if (numRead != 1)
539 { 554 {
540 llerrs << "can't read NumSkinJoints from " << fileName << llendl; 555 llerrs << "can't read NumSkinJoints from " << fileName << llendl;
556 return FALSE;
541 } 557 }
542 allocateJointNames( numSkinJoints ); 558 allocateJointNames( numSkinJoints );
543 } 559 }
@@ -547,11 +563,13 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
547 //---------------------------------------------------------------- 563 //----------------------------------------------------------------
548 for (i=0; i < numSkinJoints; i++) 564 for (i=0; i < numSkinJoints; i++)
549 { 565 {
550 char jointName[64]; /*Flawfinder: ignore*/ 566 char jointName[64+1];
551 numRead = fread(jointName, sizeof(jointName), 1, fp); 567 numRead = fread(jointName, sizeof(jointName)-1, 1, fp);
568 jointName[sizeof(jointName)-1] = '\0'; // ensure nul-termination
552 if (numRead != 1) 569 if (numRead != 1)
553 { 570 {
554 llerrs << "can't read Skin[" << i << "].Name from " << fileName << llendl; 571 llerrs << "can't read Skin[" << i << "].Name from " << fileName << llendl;
572 return FALSE;
555 } 573 }
556 574
557 std::string *jn = &mJointNames[i]; 575 std::string *jn = &mJointNames[i];
@@ -561,7 +579,8 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
561 //------------------------------------------------------------------------- 579 //-------------------------------------------------------------------------
562 // look for morph section 580 // look for morph section
563 //------------------------------------------------------------------------- 581 //-------------------------------------------------------------------------
564 char morphName[64]; /*Flawfinder: ignore*/ 582 char morphName[64+1];
583 morphName[sizeof(morphName)-1] = '\0'; // ensure nul-termination
565 while(fread(&morphName, sizeof(char), 64, fp) == 64) 584 while(fread(&morphName, sizeof(char), 64, fp) == 64)
566 { 585 {
567 if (!strcmp(morphName, "End Morphs")) 586 if (!strcmp(morphName, "End Morphs"))
@@ -991,6 +1010,13 @@ BOOL LLPolySkeletalDistortionInfo::parseXml(LLXmlTreeNode* node)
991 1010
992 LLXmlTreeNode* skeletalParam = node->getChildByName("param_skeleton"); 1011 LLXmlTreeNode* skeletalParam = node->getChildByName("param_skeleton");
993 1012
1013 if (NULL == skeletalParam)
1014 {
1015 llwarns << "Failed to getChildByName(\"param_skeleton\")"
1016 << llendl;
1017 return FALSE;
1018 }
1019
994 for( LLXmlTreeNode* bone = skeletalParam->getFirstChild(); bone; bone = skeletalParam->getNextChild() ) 1020 for( LLXmlTreeNode* bone = skeletalParam->getFirstChild(); bone; bone = skeletalParam->getNextChild() )
995 { 1021 {
996 if (bone->hasName("bone")) 1022 if (bone->hasName("bone"))
diff --git a/linden/indra/newview/llpolymorph.cpp b/linden/indra/newview/llpolymorph.cpp
index 2d1375d..b36f0e2 100644
--- a/linden/indra/newview/llpolymorph.cpp
+++ b/linden/indra/newview/llpolymorph.cpp
@@ -214,6 +214,13 @@ BOOL LLPolyMorphTargetInfo::parseXml(LLXmlTreeNode* node)
214 214
215 LLXmlTreeNode *paramNode = node->getChildByName("param_morph"); 215 LLXmlTreeNode *paramNode = node->getChildByName("param_morph");
216 216
217 if (NULL == paramNode)
218 {
219 llwarns << "Failed to getChildByName(\"param_morph\")"
220 << llendl;
221 return FALSE;
222 }
223
217 for (LLXmlTreeNode* child_node = paramNode->getFirstChild(); 224 for (LLXmlTreeNode* child_node = paramNode->getFirstChild();
218 child_node; 225 child_node;
219 child_node = paramNode->getNextChild()) 226 child_node = paramNode->getNextChild())
@@ -256,7 +263,10 @@ LLPolyMorphTarget::LLPolyMorphTarget(LLPolyMesh *poly_mesh)
256//----------------------------------------------------------------------------- 263//-----------------------------------------------------------------------------
257LLPolyMorphTarget::~LLPolyMorphTarget() 264LLPolyMorphTarget::~LLPolyMorphTarget()
258{ 265{
259 delete mVertMask; 266 if (mVertMask)
267 {
268 delete mVertMask;
269 }
260} 270}
261 271
262//----------------------------------------------------------------------------- 272//-----------------------------------------------------------------------------
diff --git a/linden/indra/newview/llpreview.cpp b/linden/indra/newview/llpreview.cpp
index 347c6d5..23f31aa 100644
--- a/linden/indra/newview/llpreview.cpp
+++ b/linden/indra/newview/llpreview.cpp
@@ -60,6 +60,7 @@ LLPreview::LLPreview(const std::string& name) :
60 LLFloater(name), 60 LLFloater(name),
61 mCopyToInvBtn(NULL), 61 mCopyToInvBtn(NULL),
62 mForceClose(FALSE), 62 mForceClose(FALSE),
63 mUserResized(FALSE),
63 mCloseAfterSave(FALSE), 64 mCloseAfterSave(FALSE),
64 mAssetStatus(PREVIEW_ASSET_UNLOADED) 65 mAssetStatus(PREVIEW_ASSET_UNLOADED)
65{ 66{
@@ -76,6 +77,7 @@ LLPreview::LLPreview(const std::string& name, const LLRect& rect, const std::str
76 mObjectUUID(object_uuid), 77 mObjectUUID(object_uuid),
77 mCopyToInvBtn( NULL ), 78 mCopyToInvBtn( NULL ),
78 mForceClose( FALSE ), 79 mForceClose( FALSE ),
80 mUserResized(FALSE),
79 mCloseAfterSave(FALSE), 81 mCloseAfterSave(FALSE),
80 mAssetStatus(PREVIEW_ASSET_UNLOADED) 82 mAssetStatus(PREVIEW_ASSET_UNLOADED)
81{ 83{
@@ -189,8 +191,6 @@ void LLPreview::onCommit()
189 } 191 }
190 192
191 LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); 193 LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
192 BOOL has_sale_info = FALSE;
193 LLSaleInfo sale_info;
194 new_item->setDescription(childGetText("desc")); 194 new_item->setDescription(childGetText("desc"));
195 if(mObjectUUID.notNull()) 195 if(mObjectUUID.notNull())
196 { 196 {
@@ -222,11 +222,6 @@ void LLPreview::onCommit()
222 gSelectMgr->deselectAll(); 222 gSelectMgr->deselectAll();
223 gSelectMgr->addAsIndividual( obj, SELECT_ALL_TES, FALSE ); 223 gSelectMgr->addAsIndividual( obj, SELECT_ALL_TES, FALSE );
224 gSelectMgr->selectionSetObjectDescription( childGetText("desc") ); 224 gSelectMgr->selectionSetObjectDescription( childGetText("desc") );
225
226 if( has_sale_info )
227 {
228 gSelectMgr->selectionSetObjectSaleInfo( sale_info );
229 }
230 225
231 gSelectMgr->deselectAll(); 226 gSelectMgr->deselectAll();
232 } 227 }
@@ -487,6 +482,12 @@ LLPreview* LLPreview::getFirstPreviewForSource(const LLUUID& source_id)
487 return NULL; 482 return NULL;
488} 483}
489 484
485void LLPreview::userSetShape(const LLRect& new_rect)
486{
487 userResized();
488 LLView::userSetShape(new_rect);
489}
490
490// 491//
491// LLMultiPreview 492// LLMultiPreview
492// 493//
@@ -506,6 +507,15 @@ void LLMultiPreview::open() /*Flawfinder: ignore*/
506 } 507 }
507} 508}
508 509
510
511void LLMultiPreview::userSetShape(const LLRect& new_rect)
512{
513 LLPreview* frontmost_preview = (LLPreview*)mTabContainer->getCurrentPanel();
514 if (frontmost_preview) frontmost_preview->userResized();
515 LLView::userSetShape(new_rect);
516}
517
518
509void LLMultiPreview::tabOpen(LLFloater* opened_floater, bool from_click) 519void LLMultiPreview::tabOpen(LLFloater* opened_floater, bool from_click)
510{ 520{
511 LLPreview* opened_preview = (LLPreview*)opened_floater; 521 LLPreview* opened_preview = (LLPreview*)opened_floater;
diff --git a/linden/indra/newview/llpreview.h b/linden/indra/newview/llpreview.h
index 266bdd1..c8c0355 100644
--- a/linden/indra/newview/llpreview.h
+++ b/linden/indra/newview/llpreview.h
@@ -48,6 +48,7 @@ public:
48 48
49 /*virtual*/void open(); /*Flawfinder: ignore*/ 49 /*virtual*/void open(); /*Flawfinder: ignore*/
50 /*virtual*/void tabOpen(LLFloater* opened_floater, bool from_click); 50 /*virtual*/void tabOpen(LLFloater* opened_floater, bool from_click);
51 /*virtual*/ void userSetShape(const LLRect& new_rect);
51 52
52 static LLMultiPreview* getAutoOpenInstance(const LLUUID& id); 53 static LLMultiPreview* getAutoOpenInstance(const LLUUID& id);
53 static void setAutoOpenInstance(LLMultiPreview* previewp, const LLUUID& id); 54 static void setAutoOpenInstance(LLMultiPreview* previewp, const LLUUID& id);
@@ -101,6 +102,9 @@ public:
101 void addKeepDiscardButtons(); 102 void addKeepDiscardButtons();
102 static void onKeepBtn(void* data); 103 static void onKeepBtn(void* data);
103 static void onDiscardBtn(void* data); 104 static void onDiscardBtn(void* data);
105 /*virtual*/ void userSetShape(const LLRect& new_rect);
106
107 void userResized() { mUserResized = TRUE; };
104 108
105 virtual void loadAsset() { mAssetStatus = PREVIEW_ASSET_LOADED; } 109 virtual void loadAsset() { mAssetStatus = PREVIEW_ASSET_LOADED; }
106 virtual EAssetStatus getAssetStatus() { return mAssetStatus;} 110 virtual EAssetStatus getAssetStatus() { return mAssetStatus;}
@@ -135,6 +139,8 @@ protected:
135 // Close without saving changes 139 // Close without saving changes
136 BOOL mForceClose; 140 BOOL mForceClose;
137 141
142 BOOL mUserResized;
143
138 // When closing springs a "Want to save?" dialog, we want 144 // When closing springs a "Want to save?" dialog, we want
139 // to keep the preview open until the save completes. 145 // to keep the preview open until the save completes.
140 BOOL mCloseAfterSave; 146 BOOL mCloseAfterSave;
diff --git a/linden/indra/newview/llpreviewgesture.cpp b/linden/indra/newview/llpreviewgesture.cpp
index 5f657d3..2bb0108 100644
--- a/linden/indra/newview/llpreviewgesture.cpp
+++ b/linden/indra/newview/llpreviewgesture.cpp
@@ -1590,6 +1590,11 @@ LLScrollListItem* LLPreviewGesture::addStep(const std::string& library_text)
1590 { 1590 {
1591 step = new LLGestureStepWait(); 1591 step = new LLGestureStepWait();
1592 } 1592 }
1593 else
1594 {
1595 llerrs << "Unknown step type: " << library_text << llendl;;
1596 return NULL;
1597 }
1593 1598
1594 // Create an enabled item with this step 1599 // Create an enabled item with this step
1595 LLSD row; 1600 LLSD row;
@@ -1645,7 +1650,7 @@ void LLPreviewGesture::onClickDelete(void* data)
1645 1650
1646 LLScrollListItem* item = self->mStepList->getFirstSelected(); 1651 LLScrollListItem* item = self->mStepList->getFirstSelected();
1647 S32 selected_index = self->mStepList->getFirstSelectedIndex(); 1652 S32 selected_index = self->mStepList->getFirstSelectedIndex();
1648 if (selected_index >= 0) 1653 if (item && selected_index >= 0)
1649 { 1654 {
1650 LLGestureStep* step = (LLGestureStep*)item->getUserdata(); 1655 LLGestureStep* step = (LLGestureStep*)item->getUserdata();
1651 delete step; 1656 delete step;
diff --git a/linden/indra/newview/llpreviewnotecard.cpp b/linden/indra/newview/llpreviewnotecard.cpp
index 1c59bb4..471fe8a 100644
--- a/linden/indra/newview/llpreviewnotecard.cpp
+++ b/linden/indra/newview/llpreviewnotecard.cpp
@@ -296,11 +296,12 @@ void LLPreviewNotecard::loadAsset()
296 { 296 {
297 // The object that we're trying to look at disappeared, bail. 297 // The object that we're trying to look at disappeared, bail.
298 llwarns << "Can't find object " << mObjectUUID << " associated with notecard." << llendl; 298 llwarns << "Can't find object " << mObjectUUID << " associated with notecard." << llendl;
299 mAssetID.setNull(); 299 mAssetID.setNull();
300 editor->setText("Unable to find object containing this note."); 300 editor->setText("Unable to find object containing this note.");
301 editor->makePristine(); 301 editor->makePristine();
302 editor->setEnabled(FALSE); 302 editor->setEnabled(FALSE);
303 mAssetStatus = PREVIEW_ASSET_LOADED; 303 mAssetStatus = PREVIEW_ASSET_LOADED;
304 delete new_uuid;
304 return; 305 return;
305 } 306 }
306 } 307 }
diff --git a/linden/indra/newview/llpreviewscript.cpp b/linden/indra/newview/llpreviewscript.cpp
index 39938d4..86c78a5 100644
--- a/linden/indra/newview/llpreviewscript.cpp
+++ b/linden/indra/newview/llpreviewscript.cpp
@@ -470,12 +470,14 @@ void LLScriptEdCore::updateDynamicHelp(BOOL immediate)
470 LLFloater* help_floater = LLFloater::getFloaterByHandle(mLiveHelpHandle); 470 LLFloater* help_floater = LLFloater::getFloaterByHandle(mLiveHelpHandle);
471 if (!help_floater) return; 471 if (!help_floater) return;
472 472
473#if LL_LIBXUL_ENABLED
473 // update back and forward buttons 474 // update back and forward buttons
474 LLButton* fwd_button = LLUICtrlFactory::getButtonByName(help_floater, "fwd_btn"); 475 LLButton* fwd_button = LLUICtrlFactory::getButtonByName(help_floater, "fwd_btn");
475 LLButton* back_button = LLUICtrlFactory::getButtonByName(help_floater, "back_btn"); 476 LLButton* back_button = LLUICtrlFactory::getButtonByName(help_floater, "back_btn");
476 LLWebBrowserCtrl* browser = LLUICtrlFactory::getWebBrowserCtrlByName(help_floater, "lsl_guide_html"); 477 LLWebBrowserCtrl* browser = LLUICtrlFactory::getWebBrowserCtrlByName(help_floater, "lsl_guide_html");
477 back_button->setEnabled(browser->canNavigateBack()); 478 back_button->setEnabled(browser->canNavigateBack());
478 fwd_button->setEnabled(browser->canNavigateForward()); 479 fwd_button->setEnabled(browser->canNavigateForward());
480#endif // LL_LIBXUL_ENABLED
479 481
480 if (!immediate && !gSavedSettings.getBOOL("ScriptHelpFollowsCursor")) 482 if (!immediate && !gSavedSettings.getBOOL("ScriptHelpFollowsCursor"))
481 { 483 {
@@ -521,7 +523,7 @@ void LLScriptEdCore::updateDynamicHelp(BOOL immediate)
521 mLiveHelpTimer.stop(); 523 mLiveHelpTimer.stop();
522 } 524 }
523 } 525 }
524 else 526 else if (immediate)
525 { 527 {
526 setHelpPage(""); 528 setHelpPage("");
527 } 529 }
@@ -543,7 +545,9 @@ void LLScriptEdCore::setHelpPage(const LLString& help_string)
543 url_string.setArg("[LSL_STRING]", help_string); 545 url_string.setArg("[LSL_STRING]", help_string);
544 546
545 addHelpItemToHistory(help_string); 547 addHelpItemToHistory(help_string);
548#if LL_LIBXUL_ENABLED
546 web_browser->navigateTo(url_string); 549 web_browser->navigateTo(url_string);
550#endif // LL_LIBXUL_ENABLED
547} 551}
548 552
549void LLScriptEdCore::addHelpItemToHistory(const LLString& help_string) 553void LLScriptEdCore::addHelpItemToHistory(const LLString& help_string)
@@ -675,8 +679,10 @@ void LLScriptEdCore::onBtnDynamicHelp(void* userdata)
675 live_help_floater->childSetAction("back_btn", onClickBack, userdata); 679 live_help_floater->childSetAction("back_btn", onClickBack, userdata);
676 live_help_floater->childSetAction("fwd_btn", onClickForward, userdata); 680 live_help_floater->childSetAction("fwd_btn", onClickForward, userdata);
677 681
682#if LL_LIBXUL_ENABLED
678 LLWebBrowserCtrl* browser = LLUICtrlFactory::getWebBrowserCtrlByName(live_help_floater, "lsl_guide_html"); 683 LLWebBrowserCtrl* browser = LLUICtrlFactory::getWebBrowserCtrlByName(live_help_floater, "lsl_guide_html");
679 browser->setAlwaysRefresh(TRUE); 684 browser->setAlwaysRefresh(TRUE);
685#endif // LL_LIBXUL_ENABLED
680 686
681 LLComboBox* help_combo = LLUICtrlFactory::getComboBoxByName(live_help_floater, "history_combo"); 687 LLComboBox* help_combo = LLUICtrlFactory::getComboBoxByName(live_help_floater, "history_combo");
682 LLKeywordToken *token; 688 LLKeywordToken *token;
@@ -700,6 +706,7 @@ void LLScriptEdCore::onBtnDynamicHelp(void* userdata)
700//static 706//static
701void LLScriptEdCore::onClickBack(void* userdata) 707void LLScriptEdCore::onClickBack(void* userdata)
702{ 708{
709#if LL_LIBXUL_ENABLED
703 LLScriptEdCore* corep = (LLScriptEdCore*)userdata; 710 LLScriptEdCore* corep = (LLScriptEdCore*)userdata;
704 LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle); 711 LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle);
705 if (live_help_floater) 712 if (live_help_floater)
@@ -710,11 +717,13 @@ void LLScriptEdCore::onClickBack(void* userdata)
710 browserp->navigateBack(); 717 browserp->navigateBack();
711 } 718 }
712 } 719 }
720#endif // LL_LIBXUL_ENABLED
713} 721}
714 722
715//static 723//static
716void LLScriptEdCore::onClickForward(void* userdata) 724void LLScriptEdCore::onClickForward(void* userdata)
717{ 725{
726#if LL_LIBXUL_ENABLED
718 LLScriptEdCore* corep = (LLScriptEdCore*)userdata; 727 LLScriptEdCore* corep = (LLScriptEdCore*)userdata;
719 LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle); 728 LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle);
720 if (live_help_floater) 729 if (live_help_floater)
@@ -725,6 +734,7 @@ void LLScriptEdCore::onClickForward(void* userdata)
725 browserp->navigateForward(); 734 browserp->navigateForward();
726 } 735 }
727 } 736 }
737#endif // LL_LIBXUL_ENABLED
728} 738}
729 739
730// static 740// static
@@ -757,16 +767,17 @@ void LLScriptEdCore::onHelpComboCommit(LLUICtrl* ctrl, void* userdata)
757 LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle); 767 LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle);
758 if (live_help_floater) 768 if (live_help_floater)
759 { 769 {
760 LLWebBrowserCtrl* web_browser = gUICtrlFactory->getWebBrowserCtrlByName(live_help_floater, "lsl_guide_html");
761
762 LLString help_string = ctrl->getValue().asString(); 770 LLString help_string = ctrl->getValue().asString();
763 771
764 corep->addHelpItemToHistory(help_string); 772 corep->addHelpItemToHistory(help_string);
765 773
774#if LL_LIBXUL_ENABLED
775 LLWebBrowserCtrl* web_browser = gUICtrlFactory->getWebBrowserCtrlByName(live_help_floater, "lsl_guide_html");
766 LLUIString url_string = gSavedSettings.getString("LSLHelpURL"); 776 LLUIString url_string = gSavedSettings.getString("LSLHelpURL");
767 url_string.setArg("[APP_DIRECTORY]", gDirUtilp->getWorkingDir()); 777 url_string.setArg("[APP_DIRECTORY]", gDirUtilp->getWorkingDir());
768 url_string.setArg("[LSL_STRING]", help_string); 778 url_string.setArg("[LSL_STRING]", help_string);
769 web_browser->navigateTo(url_string); 779 web_browser->navigateTo(url_string);
780#endif // LL_LIBXUL_ENABLED
770 } 781 }
771} 782}
772 783
@@ -1336,10 +1347,6 @@ void LLPreviewLSL::uploadAssetLegacy(const std::string& filename,
1336 { 1347 {
1337 break; 1348 break;
1338 } 1349 }
1339 else if(!buffer)
1340 {
1341 continue;
1342 }
1343 else 1350 else
1344 { 1351 {
1345 line.assign(buffer); 1352 line.assign(buffer);
@@ -1709,7 +1716,7 @@ void LLLiveLSLEditor::loadAsset(BOOL is_new)
1709 mScriptEd->mEditor->setEnabled(FALSE); 1716 mScriptEd->mEditor->setEnabled(FALSE);
1710 mAssetStatus = PREVIEW_ASSET_LOADED; 1717 mAssetStatus = PREVIEW_ASSET_LOADED;
1711 } 1718 }
1712 else if(mItem.notNull()) 1719 else if(item && mItem.notNull())
1713 { 1720 {
1714 // request the text from the object 1721 // request the text from the object
1715 LLUUID* user_data = new LLUUID(mItemID ^ mObjectID); 1722 LLUUID* user_data = new LLUUID(mItemID ^ mObjectID);
@@ -1835,6 +1842,7 @@ void LLLiveLSLEditor::loadScriptText(const char* filename)
1835 if(!filename) 1842 if(!filename)
1836 { 1843 {
1837 llerrs << "Filename is Empty!" << llendl; 1844 llerrs << "Filename is Empty!" << llendl;
1845 return;
1838 } 1846 }
1839 FILE* file = LLFile::fopen(filename, "rb"); /*Flawfinder: ignore*/ 1847 FILE* file = LLFile::fopen(filename, "rb"); /*Flawfinder: ignore*/
1840 if(file) 1848 if(file)
@@ -2115,10 +2123,6 @@ void LLLiveLSLEditor::uploadAssetLegacy(const std::string& filename,
2115 { 2123 {
2116 break; 2124 break;
2117 } 2125 }
2118 else if(!buffer)
2119 {
2120 continue;
2121 }
2122 else 2126 else
2123 { 2127 {
2124 line.assign(buffer); 2128 line.assign(buffer);
diff --git a/linden/indra/newview/llpreviewtexture.cpp b/linden/indra/newview/llpreviewtexture.cpp
index 27a9b52..b59846d 100644
--- a/linden/indra/newview/llpreviewtexture.cpp
+++ b/linden/indra/newview/llpreviewtexture.cpp
@@ -388,29 +388,23 @@ void LLPreviewTexture::updateAspectRatio()
388 // If that fails, cut width by half. 388 // If that fails, cut width by half.
389 S32 client_width = image_width; 389 S32 client_width = image_width;
390 S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE; 390 S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE;
391 S32 vert_pad = PREVIEW_HEADER_SIZE + 2 * CLIENT_RECT_VPAD + LLPANEL_BORDER_WIDTH;
391 S32 screen_width = gViewerWindow->getWindowWidth(); 392 S32 screen_width = gViewerWindow->getWindowWidth();
392 S32 max_client_width = screen_width - horiz_pad; 393 S32 max_client_width = screen_width - horiz_pad;
394 S32 max_client_height = gViewerWindow->getWindowHeight() - vert_pad;
395 F32 inv_aspect_ratio = (F32) image_height / (F32) image_width;
393 396
394 while (client_width > max_client_width) 397 while ((client_width > max_client_width) || ( llround(client_width * inv_aspect_ratio) > max_client_height ) )
395 { 398 {
396 client_width /= 2; 399 client_width /= 2;
397 } 400 }
398 401
399 // Demand width at least 128
400 if (client_width < 128)
401 {
402 client_width = 128;
403 }
404
405 S32 view_width = client_width + horiz_pad; 402 S32 view_width = client_width + horiz_pad;
406 403
407 // Adjust the height based on the width computed above. 404 // Adjust the height based on the width computed above.
408 F32 inv_aspect_ratio = (F32) image_height / (F32) image_width;
409 S32 client_height = llround(client_width * inv_aspect_ratio); 405 S32 client_height = llround(client_width * inv_aspect_ratio);
410 S32 view_height = 406 S32 view_height = client_height + vert_pad;
411 PREVIEW_HEADER_SIZE + // header (includes top border) 407
412 client_height + 2 * CLIENT_RECT_VPAD + // texture plus uniform spacing (which leaves room for resize handle)
413 LLPANEL_BORDER_WIDTH; // bottom border
414 408
415 // set text on dimensions display (should be moved out of here and into a callback of some sort) 409 // set text on dimensions display (should be moved out of here and into a callback of some sort)
416 childSetTextArg("dimensions", "[WIDTH]", llformat("%d", mImage->mFullWidth)); 410 childSetTextArg("dimensions", "[WIDTH]", llformat("%d", mImage->mFullWidth));
@@ -453,28 +447,43 @@ void LLPreviewTexture::updateAspectRatio()
453 } 447 }
454 } 448 }
455 449
456 // clamp texture size to fit within actual size of floater after attempting resize 450
457 client_width = llmin(client_width, mRect.getWidth() - horiz_pad); 451 if (!mUserResized)
458 client_height = llmin(client_height, mRect.getHeight() - PREVIEW_HEADER_SIZE - (2 * CLIENT_RECT_VPAD) - LLPANEL_BORDER_WIDTH - info_height);
459
460 LLRect window_rect(0, mRect.getHeight(), mRect.getWidth(), 0);
461 window_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD);
462 window_rect.mBottom += PREVIEW_BORDER + button_height + CLIENT_RECT_VPAD + info_height + CLIENT_RECT_VPAD;
463
464 if (getHost())
465 { 452 {
466 // try to keep aspect ratio when hosted, as hosting view can resize without user input 453 // clamp texture size to fit within actual size of floater after attempting resize
467 mClientRect.setLeftTopAndSize(window_rect.getCenterX() - (client_width / 2), window_rect.mTop, client_width, client_height); 454 client_width = llmin(client_width, mRect.getWidth() - horiz_pad);
455 client_height = llmin(client_height, mRect.getHeight() - PREVIEW_HEADER_SIZE
456 - (2 * CLIENT_RECT_VPAD) - LLPANEL_BORDER_WIDTH - info_height);
457
458
468 } 459 }
469 else 460 else
470 { 461 {
471 mClientRect.setLeftTopAndSize(LLPANEL_BORDER_WIDTH + PREVIEW_PAD + 6, 462 client_width = mRect.getWidth() - horiz_pad;
472 mRect.getHeight() - (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD), 463 client_height = llround(client_width * inv_aspect_ratio);
473 mRect.getWidth() - horiz_pad, 464 }
474 client_height); 465
466
467 S32 max_height = mRect.getHeight() - PREVIEW_BORDER - button_height
468 - CLIENT_RECT_VPAD - info_height - CLIENT_RECT_VPAD - PREVIEW_HEADER_SIZE;
469 max_height = llmax(max_height, 1);
470
471 if (client_height > max_height)
472 {
473 F32 aspect_ratio = (F32) image_width / (F32) image_height;
474 client_height = max_height;
475 client_width = llround(client_height * aspect_ratio);
475 } 476 }
477
478 LLRect window_rect(0, mRect.getHeight(), mRect.getWidth(), 0);
479 window_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD);
480 window_rect.mBottom += PREVIEW_BORDER + button_height + CLIENT_RECT_VPAD + info_height + CLIENT_RECT_VPAD;
481
482 // try to keep aspect ratio when hosted, as hosting view can resize without user input
483 mClientRect.setLeftTopAndSize(window_rect.getCenterX() - (client_width / 2), window_rect.mTop, client_width, client_height);
476} 484}
477 485
486
478void LLPreviewTexture::loadAsset() 487void LLPreviewTexture::loadAsset()
479{ 488{
480 mImage = gImageList.getImage(mImageID, MIPMAP_TRUE, FALSE); 489 mImage = gImageList.getImage(mImageID, MIPMAP_TRUE, FALSE);
diff --git a/linden/indra/newview/llresourcedata.h b/linden/indra/newview/llresourcedata.h
new file mode 100644
index 0000000..9f5d329
--- /dev/null
+++ b/linden/indra/newview/llresourcedata.h
@@ -0,0 +1,44 @@
1/**
2 * @file llresourcedata.h
3 * @brief Tracking object for uploads.
4 *
5 * Copyright (c) 2006-2007, Linden Research, Inc.
6 *
7 * Second Life Viewer Source Code
8 * The source code in this file ("Source Code") is provided by Linden Lab
9 * to you under the terms of the GNU General Public License, version 2.0
10 * ("GPL"), unless you have obtained a separate licensing agreement
11 * ("Other License"), formally executed by you and Linden Lab. Terms of
12 * the GPL can be found in doc/GPL-license.txt in this distribution, or
13 * online at http://secondlife.com/developers/opensource/gplv2
14 *
15 * There are special exceptions to the terms and conditions of the GPL as
16 * it is applied to this Source Code. View the full text of the exception
17 * in the file doc/FLOSS-exception.txt in this software distribution, or
18 * online at http://secondlife.com/developers/opensource/flossexception
19 *
20 * By copying, modifying or distributing this software, you acknowledge
21 * that you have read and understood your obligations described above,
22 * and agree to abide by those obligations.
23 *
24 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
25 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
26 * COMPLETENESS OR PERFORMANCE.
27 */
28
29#ifndef LLRESOURCEDATA_H
30#define LLRESOURCEDATA_H
31
32#include "llassetstorage.h"
33#include "llinventorytype.h"
34
35struct LLResourceData
36{
37 LLAssetInfo mAssetInfo;
38 LLAssetType::EType mPreferredLocation;
39 LLInventoryType::EType mInventoryType;
40 U32 mNextOwnerPerm;
41 void *mUserData;
42};
43
44#endif
diff --git a/linden/indra/newview/llselectmgr.cpp b/linden/indra/newview/llselectmgr.cpp
index 598ded9..ec7ba78 100644
--- a/linden/indra/newview/llselectmgr.cpp
+++ b/linden/indra/newview/llselectmgr.cpp
@@ -91,7 +91,6 @@ const S32 MAX_ACTION_QUEUE_SIZE = 20;
91const S32 MAX_SILS_PER_FRAME = 50; 91const S32 MAX_SILS_PER_FRAME = 50;
92const S32 MAX_OBJECTS_PER_PACKET = 254; 92const S32 MAX_OBJECTS_PER_PACKET = 254;
93 93
94extern LLGlobalEconomy *gGlobalEconomy;
95extern LLUUID gLastHitObjectID; 94extern LLUUID gLastHitObjectID;
96extern LLVector3d gLastHitObjectOffset; 95extern LLVector3d gLastHitObjectOffset;
97 96
@@ -208,6 +207,20 @@ LLSelectMgr::~LLSelectMgr()
208 207
209void LLSelectMgr::updateEffects() 208void LLSelectMgr::updateEffects()
210{ 209{
210
211 //keep reference grid objects active
212 for (LLSelectNode* grid_nodep = mGridObjects.getFirstNode();
213 grid_nodep;
214 grid_nodep = mGridObjects.getNextNode())
215 {
216 LLViewerObject* grid_object = grid_nodep->getObject();
217 LLDrawable* drawable = grid_object->mDrawable;
218 if (drawable)
219 {
220 gPipeline.markMoved(drawable);
221 }
222 }
223
211 if (mEffectsTimer.getElapsedTimeF32() > 1.f) 224 if (mEffectsTimer.getElapsedTimeF32() > 1.f)
212 { 225 {
213 mSelectedObjects->updateEffects(); 226 mSelectedObjects->updateEffects();
@@ -993,7 +1006,7 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &
993 LLVector3 first_grid_obj_pos = grid_object->getRenderPosition(); 1006 LLVector3 first_grid_obj_pos = grid_object->getRenderPosition();
994 1007
995 LLVector3 min_extents(F32_MAX, F32_MAX, F32_MAX); 1008 LLVector3 min_extents(F32_MAX, F32_MAX, F32_MAX);
996 LLVector3 max_extents(F32_MIN, F32_MIN, F32_MIN); 1009 LLVector3 max_extents(-min_extents);
997 BOOL grid_changed = FALSE; 1010 BOOL grid_changed = FALSE;
998 LLSelectNode* grid_nodep; 1011 LLSelectNode* grid_nodep;
999 for (grid_nodep = mGridObjects.getFirstNode(); 1012 for (grid_nodep = mGridObjects.getFirstNode();
@@ -1001,34 +1014,23 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &
1001 grid_nodep = mGridObjects.getNextNode()) 1014 grid_nodep = mGridObjects.getNextNode())
1002 { 1015 {
1003 grid_object = grid_nodep->getObject(); 1016 grid_object = grid_nodep->getObject();
1004 1017 LLDrawable* drawable = grid_object->mDrawable;
1005 LLVector3 local_min_extents(F32_MAX, F32_MAX, F32_MAX); 1018 if (drawable)
1006 LLVector3 local_max_extents(F32_MIN, F32_MIN, F32_MIN);
1007
1008 // *FIX: silhouette flag is insufficient as it gets
1009 // cleared by view update.
1010 if (!mGridValid ||
1011 grid_object->isChanged(LLXform::SILHOUETTE)
1012 || (grid_object->getParent() && grid_object->getParent()->isChanged(LLXform::SILHOUETTE)))
1013 { 1019 {
1014 getSilhouetteExtents(grid_nodep, mGridRotation, local_min_extents, local_max_extents); 1020 const LLVector3* ext = drawable->getSpatialExtents();
1021 update_min_max(min_extents, max_extents, ext[0]);
1022 update_min_max(min_extents, max_extents, ext[1]);
1015 grid_changed = TRUE; 1023 grid_changed = TRUE;
1016 LLVector3 object_offset = (grid_object->getRenderPosition() - first_grid_obj_pos) * ~mGridRotation;
1017 local_min_extents += object_offset;
1018 local_max_extents += object_offset;
1019 } 1024 }
1020 min_extents.mV[VX] = llmin(min_extents.mV[VX], local_min_extents.mV[VX]);
1021 min_extents.mV[VY] = llmin(min_extents.mV[VY], local_min_extents.mV[VY]);
1022 min_extents.mV[VZ] = llmin(min_extents.mV[VZ], local_min_extents.mV[VZ]);
1023 max_extents.mV[VX] = llmax(max_extents.mV[VX], local_max_extents.mV[VX]);
1024 max_extents.mV[VY] = llmax(max_extents.mV[VY], local_max_extents.mV[VY]);
1025 max_extents.mV[VZ] = llmax(max_extents.mV[VZ], local_max_extents.mV[VZ]);
1026 } 1025 }
1027 if (grid_changed) 1026 if (grid_changed)
1028 { 1027 {
1029 mGridOrigin = lerp(min_extents, max_extents, 0.5f); 1028 mGridOrigin = lerp(min_extents, max_extents, 0.5f);
1030 mGridOrigin = mGridOrigin * ~mGridRotation; 1029 LLDrawable* drawable = grid_object->mDrawable;
1031 mGridOrigin += first_grid_obj_pos; 1030 if (drawable && drawable->isActive())
1031 {
1032 mGridOrigin = mGridOrigin * grid_object->getRenderMatrix();
1033 }
1032 mGridScale = (max_extents - min_extents) * 0.5f; 1034 mGridScale = (max_extents - min_extents) * 0.5f;
1033 } 1035 }
1034 } 1036 }
@@ -4939,66 +4941,6 @@ void LLSelectMgr::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_
4939 } 4941 }
4940} 4942}
4941 4943
4942void LLSelectMgr::getSilhouetteExtents(LLSelectNode* nodep, const LLQuaternion& orientation, LLVector3& min_extents, LLVector3& max_extents)
4943{
4944 LLViewerObject* objectp = nodep->getObject();
4945
4946 if (objectp->mDrawable.isNull())
4947 {
4948 return;
4949 }
4950
4951 LLQuaternion test_rot = orientation * ~objectp->getRenderRotation();
4952 LLVector3 x_axis_rot = LLVector3::x_axis * test_rot;
4953 LLVector3 y_axis_rot = LLVector3::y_axis * test_rot;
4954 LLVector3 z_axis_rot = LLVector3::z_axis * test_rot;
4955
4956 x_axis_rot.scaleVec(objectp->mDrawable->getScale());
4957 y_axis_rot.scaleVec(objectp->mDrawable->getScale());
4958 z_axis_rot.scaleVec(objectp->mDrawable->getScale());
4959
4960 generateSilhouette(nodep, objectp->mDrawable->getPositionAgent() + x_axis_rot * 100.f);
4961
4962 S32 num_vertices = nodep->mSilhouetteVertices.size();
4963 if (num_vertices)
4964 {
4965 min_extents.mV[VY] = llmin(min_extents.mV[VY], nodep->mSilhouetteVertices[0] * y_axis_rot);
4966 max_extents.mV[VY] = llmax(max_extents.mV[VY], nodep->mSilhouetteVertices[0] * y_axis_rot);
4967
4968 min_extents.mV[VZ] = llmin(min_extents.mV[VZ], nodep->mSilhouetteVertices[0] * z_axis_rot);
4969 max_extents.mV[VZ] = llmax(min_extents.mV[VZ], nodep->mSilhouetteVertices[0] * z_axis_rot);
4970
4971 for (S32 vert = 1; vert < num_vertices; vert++)
4972 {
4973 F32 y_pos = nodep->mSilhouetteVertices[vert] * y_axis_rot;
4974 F32 z_pos = nodep->mSilhouetteVertices[vert] * z_axis_rot;
4975 min_extents.mV[VY] = llmin(y_pos, min_extents.mV[VY]);
4976 max_extents.mV[VY] = llmax(y_pos, max_extents.mV[VY]);
4977 min_extents.mV[VZ] = llmin(z_pos, min_extents.mV[VZ]);
4978 max_extents.mV[VZ] = llmax(z_pos, max_extents.mV[VZ]);
4979 }
4980 }
4981
4982 generateSilhouette(nodep, objectp->mDrawable->getPositionAgent() + y_axis_rot * 100.f);
4983
4984 num_vertices = nodep->mSilhouetteVertices.size();
4985 if (num_vertices)
4986 {
4987 min_extents.mV[VX] = llmin(min_extents.mV[VX], nodep->mSilhouetteVertices[0] * x_axis_rot);
4988 max_extents.mV[VX] = llmax(max_extents.mV[VX], nodep->mSilhouetteVertices[0] * x_axis_rot);
4989
4990 for (S32 vert = 1; vert < num_vertices; vert++)
4991 {
4992 F32 x_pos = nodep->mSilhouetteVertices[vert] * x_axis_rot;
4993 min_extents.mV[VX] = llmin(x_pos, min_extents.mV[VX]);
4994 max_extents.mV[VX] = llmax(x_pos, max_extents.mV[VX]);
4995 }
4996 }
4997
4998 generateSilhouette(nodep, gCamera->getOrigin());
4999}
5000
5001
5002// 4944//
5003// Utility classes 4945// Utility classes
5004// 4946//
@@ -6479,6 +6421,8 @@ LLViewerObject* LLObjectSelection::getFirstDeleteableObject(BOOL get_root)
6479 } 6421 }
6480 else 6422 else
6481 { 6423 {
6424 // We've avoided this path for a while. It may not work.
6425 llwarns << "!get_root code path may have bitrotted." << llendl;
6482 for(LLViewerObject* current = getFirstObject(); 6426 for(LLViewerObject* current = getFirstObject();
6483 current != NULL; 6427 current != NULL;
6484 current = getNextObject()) 6428 current = getNextObject())
diff --git a/linden/indra/newview/llselectmgr.h b/linden/indra/newview/llselectmgr.h
index 98c0a7b..96db8e5 100644
--- a/linden/indra/newview/llselectmgr.h
+++ b/linden/indra/newview/llselectmgr.h
@@ -492,7 +492,6 @@ private:
492 ESelectType getSelectTypeForObject(LLViewerObject* object); 492 ESelectType getSelectTypeForObject(LLViewerObject* object);
493 void addAsFamily(LLDynamicArray<LLViewerObject*>& objects, BOOL add_to_end = FALSE); 493 void addAsFamily(LLDynamicArray<LLViewerObject*>& objects, BOOL add_to_end = FALSE);
494 void generateSilhouette(LLSelectNode *nodep, const LLVector3& view_point); 494 void generateSilhouette(LLSelectNode *nodep, const LLVector3& view_point);
495 void getSilhouetteExtents(LLSelectNode* nodep, const LLQuaternion& orientation, LLVector3& min_extents, LLVector3& max_extents);
496 // Send one message to each region containing an object on selection list. 495 // Send one message to each region containing an object on selection list.
497 void sendListToRegions( const LLString& message_name, 496 void sendListToRegions( const LLString& message_name,
498 void (*pack_header)(void *user_data), 497 void (*pack_header)(void *user_data),
diff --git a/linden/indra/newview/llspatialpartition.cpp b/linden/indra/newview/llspatialpartition.cpp
index 46b9df9..d62a93e 100644
--- a/linden/indra/newview/llspatialpartition.cpp
+++ b/linden/indra/newview/llspatialpartition.cpp
@@ -1180,6 +1180,13 @@ void LLSpatialPartition::move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL
1180{ 1180{
1181 LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION); 1181 LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
1182 LLFastTimer t(LLFastTimer::FTM_UPDATE_MOVE); 1182 LLFastTimer t(LLFastTimer::FTM_UPDATE_MOVE);
1183
1184 // sanity check submitted by open source user bushing Spatula
1185 // who was seeing crashing here. (See VWR-424 reported by Bunny Mayne)
1186 if (!drawablep) {
1187 OCT_ERRS << "LLSpatialPartition::move was passed a bad drawable." << llendl;
1188 return;
1189 }
1183 1190
1184 BOOL was_visible = curp ? curp->isVisible() : FALSE; 1191 BOOL was_visible = curp ? curp->isVisible() : FALSE;
1185 1192
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp
index 585f769..e83aa0d 100644
--- a/linden/indra/newview/llstartup.cpp
+++ b/linden/indra/newview/llstartup.cpp
@@ -203,6 +203,7 @@ LLPointer<LLImageGL> gStartImageGL;
203static LLHost gAgentSimHost; 203static LLHost gAgentSimHost;
204static BOOL gSkipOptionalUpdate = FALSE; 204static BOOL gSkipOptionalUpdate = FALSE;
205 205
206bool gUseQuickTime = true;
206bool gQuickTimeInitialized = false; 207bool gQuickTimeInitialized = false;
207static bool gGotUseCircuitCodeAck = false; 208static bool gGotUseCircuitCodeAck = false;
208LLString gInitialOutfit; 209LLString gInitialOutfit;
@@ -1867,7 +1868,8 @@ BOOL idle_startup()
1867 } 1868 }
1868 1869
1869 #if LL_QUICKTIME_ENABLED // windows only right now but will be ported to mac 1870 #if LL_QUICKTIME_ENABLED // windows only right now but will be ported to mac
1870 if (!gQuickTimeInitialized) 1871 if (gUseQuickTime
1872 && !gQuickTimeInitialized)
1871 { 1873 {
1872 // initialize quicktime libraries (fails gracefully if quicktime not installed ($QUICKTIME) 1874 // initialize quicktime libraries (fails gracefully if quicktime not installed ($QUICKTIME)
1873 llinfos << "Initializing QuickTime...." << llendl; 1875 llinfos << "Initializing QuickTime...." << llendl;
diff --git a/linden/indra/newview/llstartup.h b/linden/indra/newview/llstartup.h
index 59a433e..7c54b8c 100644
--- a/linden/indra/newview/llstartup.h
+++ b/linden/indra/newview/llstartup.h
@@ -82,6 +82,7 @@ enum EStartupState{
82// exorted symbol 82// exorted symbol
83extern S32 gStartupState; 83extern S32 gStartupState;
84extern BOOL gAgentMovementCompleted; 84extern BOOL gAgentMovementCompleted;
85extern bool gUseQuickTime;
85extern bool gQuickTimeInitialized; 86extern bool gQuickTimeInitialized;
86extern LLPointer<LLImageGL> gStartImageGL; 87extern LLPointer<LLImageGL> gStartImageGL;
87 88
diff --git a/linden/indra/newview/llstatusbar.cpp b/linden/indra/newview/llstatusbar.cpp
index 58ac8c2..784765b 100644
--- a/linden/indra/newview/llstatusbar.cpp
+++ b/linden/indra/newview/llstatusbar.cpp
@@ -643,3 +643,8 @@ void LLStatusBar::onClickBuyLand(void*)
643 gParcelMgr->selectParcelAt(gAgent.getPositionGlobal()); 643 gParcelMgr->selectParcelAt(gAgent.getPositionGlobal());
644 gParcelMgr->startBuyLand(); 644 gParcelMgr->startBuyLand();
645} 645}
646
647BOOL can_afford_transaction(S32 cost)
648{
649 return((cost <= 0)||((gStatusBar) && (gStatusBar->getBalance() >=cost)));
650}
diff --git a/linden/indra/newview/llstatusbar.h b/linden/indra/newview/llstatusbar.h
index 52cc236..a072cd9 100644
--- a/linden/indra/newview/llstatusbar.h
+++ b/linden/indra/newview/llstatusbar.h
@@ -123,6 +123,9 @@ protected:
123 LLFrameTimer* mHealthTimer; 123 LLFrameTimer* mHealthTimer;
124}; 124};
125 125
126// *HACK: Status bar owns your cached money balance. JC
127BOOL can_afford_transaction(S32 cost);
128
126extern LLStatusBar *gStatusBar; 129extern LLStatusBar *gStatusBar;
127 130
128#endif 131#endif
diff --git a/linden/indra/newview/lltexlayer.cpp b/linden/indra/newview/lltexlayer.cpp
index 237d563..2005e39 100644
--- a/linden/indra/newview/lltexlayer.cpp
+++ b/linden/indra/newview/lltexlayer.cpp
@@ -277,7 +277,7 @@ BOOL LLTexLayerSetBuffer::render()
277 { 277 {
278 if (!success) 278 if (!success)
279 { 279 {
280 delete baked_bump_data; 280 delete [] baked_bump_data;
281 llinfos << "Failed attempt to bake " << mTexLayerSet->getBodyRegion() << llendl; 281 llinfos << "Failed attempt to bake " << mTexLayerSet->getBodyRegion() << llendl;
282 mUploadPending = FALSE; 282 mUploadPending = FALSE;
283 } 283 }
diff --git a/linden/indra/newview/lltexturectrl.cpp b/linden/indra/newview/lltexturectrl.cpp
index 1436b62..b5c1ace 100644
--- a/linden/indra/newview/lltexturectrl.cpp
+++ b/linden/indra/newview/lltexturectrl.cpp
@@ -410,32 +410,35 @@ BOOL LLFloaterTexturePicker::handleKeyHere(KEY key, MASK mask, BOOL called_from_
410{ 410{
411 LLFolderView* root_folder = mInventoryPanel->getRootFolder(); 411 LLFolderView* root_folder = mInventoryPanel->getRootFolder();
412 412
413 if (!called_from_parent && root_folder && 413 if (root_folder && mSearchEdit)
414 mSearchEdit && mSearchEdit->hasFocus() &&
415 (key == KEY_RETURN || key == KEY_DOWN) && mask == MASK_NONE)
416 { 414 {
417 if (!root_folder->getCurSelectedItem()) 415 if (!called_from_parent && mSearchEdit->hasFocus() &&
416 (key == KEY_RETURN || key == KEY_DOWN) &&
417 mask == MASK_NONE)
418 { 418 {
419 LLFolderViewItem* itemp = root_folder->getItemByID(gAgent.getInventoryRootID()); 419 if (!root_folder->getCurSelectedItem())
420 if (itemp)
421 { 420 {
422 root_folder->setSelection(itemp, FALSE, FALSE); 421 LLFolderViewItem* itemp = root_folder->getItemByID(gAgent.getInventoryRootID());
422 if (itemp)
423 {
424 root_folder->setSelection(itemp, FALSE, FALSE);
425 }
423 } 426 }
427 root_folder->scrollToShowSelection();
428
429 // move focus to inventory proper
430 root_folder->setFocus(TRUE);
431
432 // treat this as a user selection of the first filtered result
433 commitIfImmediateSet();
434
435 return TRUE;
424 } 436 }
425 root_folder->scrollToShowSelection();
426
427 // move focus to inventory proper
428 root_folder->setFocus(TRUE);
429 437
430 // treat this as a user selection of the first filtered result 438 if (root_folder->hasFocus() && key == KEY_UP)
431 commitIfImmediateSet(); 439 {
432 440 mSearchEdit->focusFirstItem(TRUE);
433 return TRUE; 441 }
434 }
435
436 if (root_folder->hasFocus() && key == KEY_UP)
437 {
438 mSearchEdit->focusFirstItem(TRUE);
439 } 442 }
440 443
441 return LLFloater::handleKeyHere(key, mask, called_from_parent); 444 return LLFloater::handleKeyHere(key, mask, called_from_parent);
diff --git a/linden/indra/newview/lltooldraganddrop.cpp b/linden/indra/newview/lltooldraganddrop.cpp
index 3956402..6196927 100644
--- a/linden/indra/newview/lltooldraganddrop.cpp
+++ b/linden/indra/newview/lltooldraganddrop.cpp
@@ -2575,7 +2575,13 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
2575 LLViewerObject* obj, S32 face, MASK mask, BOOL drop) 2575 LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
2576{ 2576{
2577 lldebugs << "LLToolDragAndDrop::dad3dUpdateInventoryCategory()" << llendl; 2577 lldebugs << "LLToolDragAndDrop::dad3dUpdateInventoryCategory()" << llendl;
2578 if(mSource != SOURCE_AGENT && mSource != SOURCE_LIBRARY) 2578 if (NULL==obj)
2579 {
2580 llwarns << "obj is NULL; aborting func with ACCEPT_NO" << llendl;
2581 return ACCEPT_NO;
2582 }
2583
2584 if (mSource != SOURCE_AGENT && mSource != SOURCE_LIBRARY)
2579 { 2585 {
2580 return ACCEPT_NO; 2586 return ACCEPT_NO;
2581 } 2587 }
@@ -2591,17 +2597,17 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
2591 LLInventoryModel::cat_array_t cats; 2597 LLInventoryModel::cat_array_t cats;
2592 LLInventoryModel::item_array_t items; 2598 LLInventoryModel::item_array_t items;
2593 gInventory.collectDescendentsIf(cat->getUUID(), 2599 gInventory.collectDescendentsIf(cat->getUUID(),
2594 cats, 2600 cats,
2595 items, 2601 items,
2596 LLInventoryModel::EXCLUDE_TRASH, 2602 LLInventoryModel::EXCLUDE_TRASH,
2597 droppable); 2603 droppable);
2598 cats.put(cat); 2604 cats.put(cat);
2599 if(droppable.countNoCopy() > 0) 2605 if(droppable.countNoCopy() > 0)
2600 { 2606 {
2601 llwarns << "*** Need to confirm this step" << llendl; 2607 llwarns << "*** Need to confirm this step" << llendl;
2602 } 2608 }
2603 LLViewerObject* root_object = obj; 2609 LLViewerObject* root_object = obj;
2604 if (obj && obj->getParent()) 2610 if (obj->getParent())
2605 { 2611 {
2606 LLViewerObject* parent_obj = (LLViewerObject*)obj->getParent(); 2612 LLViewerObject* parent_obj = (LLViewerObject*)obj->getParent();
2607 if (!parent_obj->isAvatar()) 2613 if (!parent_obj->isAvatar())
diff --git a/linden/indra/newview/lltoolgrab.cpp b/linden/indra/newview/lltoolgrab.cpp
index 502e2be..b56e762 100644
--- a/linden/indra/newview/lltoolgrab.cpp
+++ b/linden/indra/newview/lltoolgrab.cpp
@@ -180,6 +180,12 @@ BOOL LLToolGrab::handleObjectHit(LLViewerObject *objectp, S32 x, S32 y, MASK mas
180 llinfos << "LLToolGrab handleObjectHit " << mMouseDownX << "," << mMouseDownY << llendl; 180 llinfos << "LLToolGrab handleObjectHit " << mMouseDownX << "," << mMouseDownY << llendl;
181 } 181 }
182 182
183 if (NULL == objectp) // unexpected
184 {
185 llwarns << "objectp was NULL; returning FALSE" << llendl;
186 return FALSE;
187 }
188
183 if (objectp->isAvatar()) 189 if (objectp->isAvatar())
184 { 190 {
185 if (gGrabTransientTool) 191 if (gGrabTransientTool)
@@ -198,7 +204,7 @@ BOOL LLToolGrab::handleObjectHit(LLViewerObject *objectp, S32 x, S32 y, MASK mas
198 // objectp = (LLViewerObject *)objectp->getRoot(); 204 // objectp = (LLViewerObject *)objectp->getRoot();
199 205
200 LLViewerObject* parent = objectp->getRootEdit(); 206 LLViewerObject* parent = objectp->getRootEdit();
201 BOOL script_touch = (objectp && objectp->flagHandleTouch()) || (parent && parent->flagHandleTouch()); 207 BOOL script_touch = (objectp->flagHandleTouch()) || (parent && parent->flagHandleTouch());
202 208
203 // Clicks on scripted or physical objects are temporary grabs, so 209 // Clicks on scripted or physical objects are temporary grabs, so
204 // not "Build mode" 210 // not "Build mode"
diff --git a/linden/indra/newview/lltoolpie.cpp b/linden/indra/newview/lltoolpie.cpp
index adc46e2..7231286 100644
--- a/linden/indra/newview/lltoolpie.cpp
+++ b/linden/indra/newview/lltoolpie.cpp
@@ -390,11 +390,11 @@ U8 final_click_action(LLViewerObject* obj)
390 if (obj->isAttachment()) return CLICK_ACTION_NONE; 390 if (obj->isAttachment()) return CLICK_ACTION_NONE;
391 391
392 U8 click_action = CLICK_ACTION_TOUCH; 392 U8 click_action = CLICK_ACTION_TOUCH;
393 LLViewerObject* parent = (obj ? obj->getRootEdit() : NULL); 393 LLViewerObject* parent = obj->getRootEdit();
394 if ((obj && obj->getClickAction()) 394 if (obj->getClickAction()
395 || (parent && parent->getClickAction())) 395 || (parent && parent->getClickAction()))
396 { 396 {
397 if (obj && obj->getClickAction()) 397 if (obj->getClickAction())
398 { 398 {
399 click_action = obj->getClickAction(); 399 click_action = obj->getClickAction();
400 } 400 }
diff --git a/linden/indra/newview/lltoolpipette.cpp b/linden/indra/newview/lltoolpipette.cpp
index 139afc2..139afc2 100755..100644
--- a/linden/indra/newview/lltoolpipette.cpp
+++ b/linden/indra/newview/lltoolpipette.cpp
diff --git a/linden/indra/newview/lltoolpipette.h b/linden/indra/newview/lltoolpipette.h
index 1351084..1351084 100755..100644
--- a/linden/indra/newview/lltoolpipette.h
+++ b/linden/indra/newview/lltoolpipette.h
diff --git a/linden/indra/newview/llviewerassetstorage.cpp b/linden/indra/newview/llviewerassetstorage.cpp
index c7e9c97..95ef983 100644
--- a/linden/indra/newview/llviewerassetstorage.cpp
+++ b/linden/indra/newview/llviewerassetstorage.cpp
@@ -166,21 +166,22 @@ void LLViewerAssetStorage::storeAssetData(
166 if(!filename) 166 if(!filename)
167 { 167 {
168 llerrs << "No filename specified" << llendl; 168 llerrs << "No filename specified" << llendl;
169 return;
169 } 170 }
170 171
171 LLAssetID asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); 172 LLAssetID asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
172 llinfos << "LLViewerAssetStorage::storeAssetData (legacy)" << asset_id << ":" << LLAssetType::lookup(asset_type) << llendl; 173 llinfos << "LLViewerAssetStorage::storeAssetData (legacy)" << asset_id << ":" << LLAssetType::lookup(asset_type) << llendl;
173 174
174 LLLegacyAssetRequest *legacy = new LLLegacyAssetRequest;
175
176 llinfos << "ASSET_ID: " << asset_id << llendl; 175 llinfos << "ASSET_ID: " << asset_id << llendl;
177 176
178 legacy->mUpCallback = callback; 177 FILE* fp = LLFile::fopen(filename, "rb");
179 legacy->mUserData = user_data;
180
181 FILE* fp = LLFile::fopen(filename, "rb"); /* Flawfinder: ignore */
182 if (fp) 178 if (fp)
183 { 179 {
180 LLLegacyAssetRequest *legacy = new LLLegacyAssetRequest;
181
182 legacy->mUpCallback = callback;
183 legacy->mUserData = user_data;
184
184 LLVFile file(mVFS, asset_id, asset_type, LLVFile::WRITE); 185 LLVFile file(mVFS, asset_id, asset_type, LLVFile::WRITE);
185 186
186 fseek(fp, 0, SEEK_END); 187 fseek(fp, 0, SEEK_END);
diff --git a/linden/indra/newview/llviewercontrol.cpp b/linden/indra/newview/llviewercontrol.cpp
index 61285d5..08abd2d 100644
--- a/linden/indra/newview/llviewercontrol.cpp
+++ b/linden/indra/newview/llviewercontrol.cpp
@@ -240,6 +240,14 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
240 LLSpinCtrl* spinner3 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_3"); 240 LLSpinCtrl* spinner3 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_3");
241 LLSpinCtrl* spinner4 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_4"); 241 LLSpinCtrl* spinner4 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_4");
242 LLColorSwatchCtrl* color_swatch = LLUICtrlFactory::getColorSwatchByName(this, "color_swatch"); 242 LLColorSwatchCtrl* color_swatch = LLUICtrlFactory::getColorSwatchByName(this, "color_swatch");
243
244 if (!spinner1 || !spinner2 || !spinner3 || !spinner4 || !color_swatch)
245 {
246 llwarns << "Could not find all desired controls by name"
247 << llendl;
248 return;
249 }
250
243 spinner1->setVisible(FALSE); 251 spinner1->setVisible(FALSE);
244 spinner2->setVisible(FALSE); 252 spinner2->setVisible(FALSE);
245 spinner3->setVisible(FALSE); 253 spinner3->setVisible(FALSE);
diff --git a/linden/indra/newview/llviewerdisplay.cpp b/linden/indra/newview/llviewerdisplay.cpp
index c2ef30a..fc288c0 100644
--- a/linden/indra/newview/llviewerdisplay.cpp
+++ b/linden/indra/newview/llviewerdisplay.cpp
@@ -564,6 +564,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield)
564 glPushMatrix(); 564 glPushMatrix();
565 glMatrixMode(GL_MODELVIEW); 565 glMatrixMode(GL_MODELVIEW);
566 glPushMatrix(); 566 glPushMatrix();
567
567 if (LLPipeline::sShowHUDAttachments && !gDisconnected && setup_hud_matrices(FALSE)) 568 if (LLPipeline::sShowHUDAttachments && !gDisconnected && setup_hud_matrices(FALSE))
568 { 569 {
569 LLCamera hud_cam = *gCamera; 570 LLCamera hud_cam = *gCamera;
@@ -598,7 +599,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield)
598 LLFastTimer ftm(LLFastTimer::FTM_REBUILD); 599 LLFastTimer ftm(LLFastTimer::FTM_REBUILD);
599 gPipeline.stateSort(hud_cam); 600 gPipeline.stateSort(hud_cam);
600 } 601 }
601 602
602 gPipeline.renderGeom(hud_cam); 603 gPipeline.renderGeom(hud_cam);
603 604
604 //restore type mask 605 //restore type mask
@@ -657,6 +658,7 @@ BOOL setup_hud_matrices(BOOL for_select)
657 } 658 }
658 LLBBox hud_bbox = my_avatarp->getHUDBBox(); 659 LLBBox hud_bbox = my_avatarp->getHUDBBox();
659 660
661
660 // set up transform to encompass bounding box of HUD 662 // set up transform to encompass bounding box of HUD
661 glMatrixMode(GL_PROJECTION); 663 glMatrixMode(GL_PROJECTION);
662 glLoadIdentity(); 664 glLoadIdentity();
@@ -685,7 +687,7 @@ BOOL setup_hud_matrices(BOOL for_select)
685 glLoadMatrixf(OGL_TO_CFR_ROTATION); // Load Cory's favorite reference frame 687 glLoadMatrixf(OGL_TO_CFR_ROTATION); // Load Cory's favorite reference frame
686 glTranslatef(-hud_bbox.getCenterLocal().mV[VX] + (hud_depth * 0.5f), 0.f, 0.f); 688 glTranslatef(-hud_bbox.getCenterLocal().mV[VX] + (hud_depth * 0.5f), 0.f, 0.f);
687 glScalef(zoom_level, zoom_level, zoom_level); 689 glScalef(zoom_level, zoom_level, zoom_level);
688 690
689 return TRUE; 691 return TRUE;
690 } 692 }
691 else 693 else
diff --git a/linden/indra/newview/llviewergenericmessage.cpp b/linden/indra/newview/llviewergenericmessage.cpp
index 56b168b..0e1ce49 100644
--- a/linden/indra/newview/llviewergenericmessage.cpp
+++ b/linden/indra/newview/llviewergenericmessage.cpp
@@ -1,9 +1,9 @@
1/** 1/**
2 * @file llviewergenericmessage.cpp 2 * @file llviewergenericmessage.cpp
3 * @brief Handle processing of "generic messages" which contain short lists of strings. 3 * @brief Handle processing of "generic messages" which contain short lists of strings.
4 * @author James Cook 4 * @author James Cook
5 * 5 *
6 * Copyright (c) 2007-2007, Linden Research, Inc. 6 * Copyright (c) 2007-2007, Linden Research, Inc.
7 * 7 *
8 * Second Life Viewer Source Code 8 * Second Life Viewer Source Code
9 * The source code in this file ("Source Code") is provided by Linden Lab 9 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -24,74 +24,74 @@
24 * 24 *
25 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO 25 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
26 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 26 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
27 * COMPLETENESS OR PERFORMANCE. 27 * COMPLETENESS OR PERFORMANCE.
28 */ 28 */
29 29
30#include "llviewerprecompiledheaders.h" 30#include "llviewerprecompiledheaders.h"
31 31
32#include "llviewergenericmessage.h" 32#include "llviewergenericmessage.h"
33 33
34#include "lldispatcher.h" 34#include "lldispatcher.h"
35#include "lluuid.h" 35#include "lluuid.h"
36#include "message.h" 36#include "message.h"
37 37
38#include "llagent.h" 38#include "llagent.h"
39 39
40 40
41LLDispatcher gGenericDispatcher; 41LLDispatcher gGenericDispatcher;
42 42
43 43
44void send_generic_message(const char* method, 44void send_generic_message(const char* method,
45 const std::vector<std::string>& strings, 45 const std::vector<std::string>& strings,
46 const LLUUID& invoice) 46 const LLUUID& invoice)
47{ 47{
48 LLMessageSystem* msg = gMessageSystem; 48 LLMessageSystem* msg = gMessageSystem;
49 msg->newMessage("GenericMessage"); 49 msg->newMessage("GenericMessage");
50 msg->nextBlockFast(_PREHASH_AgentData); 50 msg->nextBlockFast(_PREHASH_AgentData);
51 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); 51 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
52 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); 52 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
53 msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used 53 msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
54 msg->nextBlock("MethodData"); 54 msg->nextBlock("MethodData");
55 msg->addString("Method", method); 55 msg->addString("Method", method);
56 msg->addUUID("Invoice", invoice); 56 msg->addUUID("Invoice", invoice);
57 if(strings.empty()) 57 if(strings.empty())
58 { 58 {
59 msg->nextBlock("ParamList"); 59 msg->nextBlock("ParamList");
60 msg->addString("Parameter", NULL); 60 msg->addString("Parameter", NULL);
61 } 61 }
62 else 62 else
63 { 63 {
64 std::vector<std::string>::const_iterator it = strings.begin(); 64 std::vector<std::string>::const_iterator it = strings.begin();
65 std::vector<std::string>::const_iterator end = strings.end(); 65 std::vector<std::string>::const_iterator end = strings.end();
66 for(; it != end; ++it) 66 for(; it != end; ++it)
67 { 67 {
68 msg->nextBlock("ParamList"); 68 msg->nextBlock("ParamList");
69 msg->addString("Parameter", (*it).c_str()); 69 msg->addString("Parameter", (*it).c_str());
70 } 70 }
71 } 71 }
72 gAgent.sendReliableMessage(); 72 gAgent.sendReliableMessage();
73} 73}
74 74
75 75
76 76
77void process_generic_message(LLMessageSystem* msg, void**) 77void process_generic_message(LLMessageSystem* msg, void**)
78{ 78{
79 LLUUID agent_id; 79 LLUUID agent_id;
80 msg->getUUID("AgentData", "AgentID", agent_id); 80 msg->getUUID("AgentData", "AgentID", agent_id);
81 if (agent_id != gAgent.getID()) 81 if (agent_id != gAgent.getID())
82 { 82 {
83 llwarns << "GenericMessage for wrong agent" << llendl; 83 llwarns << "GenericMessage for wrong agent" << llendl;
84 return; 84 return;
85 } 85 }
86 86
87 std::string request; 87 std::string request;
88 LLUUID invoice; 88 LLUUID invoice;
89 LLDispatcher::sparam_t strings; 89 LLDispatcher::sparam_t strings;
90 LLDispatcher::unpackMessage(msg, request, invoice, strings); 90 LLDispatcher::unpackMessage(msg, request, invoice, strings);
91 91
92 if(!gGenericDispatcher.dispatch(request, invoice, strings)) 92 if(!gGenericDispatcher.dispatch(request, invoice, strings))
93 { 93 {
94 llwarns << "GenericMessage " << request << " failed to dispatch" 94 llwarns << "GenericMessage " << request << " failed to dispatch"
95 << llendl; 95 << llendl;
96 } 96 }
97} 97}
diff --git a/linden/indra/newview/llviewergenericmessage.h b/linden/indra/newview/llviewergenericmessage.h
index cf94d86..b0d02a2 100644
--- a/linden/indra/newview/llviewergenericmessage.h
+++ b/linden/indra/newview/llviewergenericmessage.h
@@ -1,9 +1,9 @@
1/** 1/**
2 * @file llviewergenericmessage.h 2 * @file llviewergenericmessage.h
3 * @brief Handle processing of "generic messages" which contain short lists of strings. 3 * @brief Handle processing of "generic messages" which contain short lists of strings.
4 * @author James Cook 4 * @author James Cook
5 * 5 *
6 * Copyright (c) 2007-2007, Linden Research, Inc. 6 * Copyright (c) 2007-2007, Linden Research, Inc.
7 * 7 *
8 * Second Life Viewer Source Code 8 * Second Life Viewer Source Code
9 * The source code in this file ("Source Code") is provided by Linden Lab 9 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -24,23 +24,23 @@
24 * 24 *
25 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO 25 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
26 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 26 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
27 * COMPLETENESS OR PERFORMANCE. 27 * COMPLETENESS OR PERFORMANCE.
28 */ 28 */
29 29
30#ifndef LLVIEWERGENERICMESSAGE_H 30#ifndef LLVIEWERGENERICMESSAGE_H
31#define LLVIEWERGENERICMESSAGE_H 31#define LLVIEWERGENERICMESSAGE_H
32 32
33class LLUUID; 33class LLUUID;
34class LLDispatcher; 34class LLDispatcher;
35 35
36 36
37void send_generic_message(const char* method, 37void send_generic_message(const char* method,
38 const std::vector<std::string>& strings, 38 const std::vector<std::string>& strings,
39 const LLUUID& invoice = LLUUID::null); 39 const LLUUID& invoice = LLUUID::null);
40 40
41void process_generic_message(LLMessageSystem* msg, void**); 41void process_generic_message(LLMessageSystem* msg, void**);
42 42
43 43
44extern LLDispatcher gGenericDispatcher; 44extern LLDispatcher gGenericDispatcher;
45 45
46#endif 46#endif
diff --git a/linden/indra/newview/llviewerimagelist.cpp b/linden/indra/newview/llviewerimagelist.cpp
index 9da84fa..4e87905 100644
--- a/linden/indra/newview/llviewerimagelist.cpp
+++ b/linden/indra/newview/llviewerimagelist.cpp
@@ -125,6 +125,9 @@ void LLViewerImageList::doPreloadImages()
125 // Set the "white" image 125 // Set the "white" image
126 LLViewerImage::sWhiteImagep = preloadImage("white.tga", LLUUID::null, TRUE);; 126 LLViewerImage::sWhiteImagep = preloadImage("white.tga", LLUUID::null, TRUE);;
127 127
128 // Speeds up startup by 4-5 seconds. JC
129 if (!gPreloadImages) return;
130
128 // Preload some images 131 // Preload some images
129 preloadImage("button_anim_pause.tga", LLUUID::null, FALSE); 132 preloadImage("button_anim_pause.tga", LLUUID::null, FALSE);
130 preloadImage("button_anim_pause_selected.tga", LLUUID::null, FALSE); 133 preloadImage("button_anim_pause_selected.tga", LLUUID::null, FALSE);
@@ -1116,6 +1119,7 @@ LLPointer<LLImageJ2C> LLViewerImageList::convertToUploadFile(LLPointer<LLImageRa
1116S32 LLViewerImageList::getMaxVideoRamSetting(S32 max) 1119S32 LLViewerImageList::getMaxVideoRamSetting(S32 max)
1117{ 1120{
1118 const U32 vram_settings[] = { 16, 32, 64, 128, 256, 512 }; 1121 const U32 vram_settings[] = { 16, 32, 64, 128, 256, 512 };
1122 const S32 num_vram_settings = sizeof(vram_settings) / sizeof(vram_settings[0]);
1119 1123
1120 U32 max_vram; 1124 U32 max_vram;
1121 if (gGLManager.mVRAM != 0) 1125 if (gGLManager.mVRAM != 0)
@@ -1144,8 +1148,9 @@ S32 LLViewerImageList::getMaxVideoRamSetting(S32 max)
1144 { 1148 {
1145 max_vram = llmin(max_vram, (U32)((F32)system_ram/1.5f)); 1149 max_vram = llmin(max_vram, (U32)((F32)system_ram/1.5f));
1146 } 1150 }
1151
1147 S32 idx; 1152 S32 idx;
1148 for (idx=0; idx<=5; idx++) 1153 for (idx=0; idx < num_vram_settings; idx++)
1149 { 1154 {
1150 if (idx == max) 1155 if (idx == max)
1151 break; 1156 break;
@@ -1155,6 +1160,12 @@ S32 LLViewerImageList::getMaxVideoRamSetting(S32 max)
1155 break; 1160 break;
1156 } 1161 }
1157 } 1162 }
1163
1164 if( idx == num_vram_settings )
1165 {
1166 idx = num_vram_settings - 1;
1167 }
1168
1158 return idx; 1169 return idx;
1159} 1170}
1160 1171
@@ -1233,12 +1244,20 @@ void LLViewerImageList::receiveImageHeader(LLMessageSystem *msg, void **user_dat
1233 msg->getU16Fast(_PREHASH_ImageID, _PREHASH_Packets, packets); 1244 msg->getU16Fast(_PREHASH_ImageID, _PREHASH_Packets, packets);
1234 msg->getU32Fast(_PREHASH_ImageID, _PREHASH_Size, totalbytes); 1245 msg->getU32Fast(_PREHASH_ImageID, _PREHASH_Size, totalbytes);
1235 1246
1236 U16 data_size = msg->getSizeFast(_PREHASH_ImageData, _PREHASH_Data); 1247 S32 data_size = msg->getSizeFast(_PREHASH_ImageData, _PREHASH_Data);
1237 if (!data_size) 1248 if (!data_size)
1238 { 1249 {
1239 return; 1250 return;
1240 } 1251 }
1241 1252 if (data_size < 0)
1253 {
1254 // msg->getSizeFast() is probably trying to tell us there
1255 // was an error.
1256 llerrs << "image header chunk size was negative: "
1257 << data_size << llendl;
1258 return;
1259 }
1260
1242 // this buffer gets saved off in the packet list 1261 // this buffer gets saved off in the packet list
1243 U8 *data = new U8[data_size]; 1262 U8 *data = new U8[data_size];
1244 msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size); 1263 msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size);
@@ -1246,6 +1265,7 @@ void LLViewerImageList::receiveImageHeader(LLMessageSystem *msg, void **user_dat
1246 LLViewerImage *image = gImageList.getImage(id); 1265 LLViewerImage *image = gImageList.getImage(id);
1247 if (!image) 1266 if (!image)
1248 { 1267 {
1268 delete [] data;
1249 return; 1269 return;
1250 } 1270 }
1251 image->mLastPacketTimer.reset(); 1271 image->mLastPacketTimer.reset();
@@ -1284,15 +1304,24 @@ void LLViewerImageList::receiveImagePacket(LLMessageSystem *msg, void **user_dat
1284 //llprintline("Start decode, image header..."); 1304 //llprintline("Start decode, image header...");
1285 msg->getUUIDFast(_PREHASH_ImageID, _PREHASH_ID, id); 1305 msg->getUUIDFast(_PREHASH_ImageID, _PREHASH_ID, id);
1286 msg->getU16Fast(_PREHASH_ImageID, _PREHASH_Packet, packet_num); 1306 msg->getU16Fast(_PREHASH_ImageID, _PREHASH_Packet, packet_num);
1287 U16 data_size = msg->getSizeFast(_PREHASH_ImageData, _PREHASH_Data); 1307 S32 data_size = msg->getSizeFast(_PREHASH_ImageData, _PREHASH_Data);
1288 1308
1289 if (!data_size) 1309 if (!data_size)
1290 { 1310 {
1291 return; 1311 return;
1292 } 1312 }
1313 if (data_size < 0)
1314 {
1315 // msg->getSizeFast() is probably trying to tell us there
1316 // was an error.
1317 llerrs << "image data chunk size was negative: "
1318 << data_size << llendl;
1319 return;
1320 }
1293 if (data_size > MTUBYTES) 1321 if (data_size > MTUBYTES)
1294 { 1322 {
1295 llerrs << "image data chunk too large: " << data_size << " bytes" << llendl; 1323 llerrs << "image data chunk too large: " << data_size << " bytes" << llendl;
1324 return;
1296 } 1325 }
1297 U8 *data = new U8[data_size]; 1326 U8 *data = new U8[data_size];
1298 msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size); 1327 msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size);
@@ -1300,6 +1329,7 @@ void LLViewerImageList::receiveImagePacket(LLMessageSystem *msg, void **user_dat
1300 LLViewerImage *image = gImageList.getImage(id); 1329 LLViewerImage *image = gImageList.getImage(id);
1301 if (!image) 1330 if (!image)
1302 { 1331 {
1332 delete [] data;
1303 return; 1333 return;
1304 } 1334 }
1305 image->mLastPacketTimer.reset(); 1335 image->mLastPacketTimer.reset();
diff --git a/linden/indra/newview/llviewerinventory.cpp b/linden/indra/newview/llviewerinventory.cpp
index 8f23346..d271af5 100644
--- a/linden/indra/newview/llviewerinventory.cpp
+++ b/linden/indra/newview/llviewerinventory.cpp
@@ -462,10 +462,6 @@ bool LLViewerInventoryCategory::importFileLocal(FILE* fp)
462 fgets(buffer, MAX_STRING, fp); 462 fgets(buffer, MAX_STRING, fp);
463 sscanf( /* Flawfinder: ignore */ 463 sscanf( /* Flawfinder: ignore */
464 buffer, " %254s %254s", keyword, valuestr); 464 buffer, " %254s %254s", keyword, valuestr);
465 if(!keyword)
466 {
467 continue;
468 }
469 if(0 == strcmp("{",keyword)) 465 if(0 == strcmp("{",keyword))
470 { 466 {
471 continue; 467 continue;
diff --git a/linden/indra/newview/llviewerjointmesh.cpp b/linden/indra/newview/llviewerjointmesh.cpp
index 216e29f..c76990c 100644
--- a/linden/indra/newview/llviewerjointmesh.cpp
+++ b/linden/indra/newview/llviewerjointmesh.cpp
@@ -216,11 +216,11 @@ S32 LLViewerJointMesh::getBoundJointsByIndex(S32 index, S32 &joint_a, S32& joint
216 if (render_datap->mSkinJoint) 216 if (render_datap->mSkinJoint)
217 { 217 {
218 joint_b = render_datap->mSkinJoint->mJoint->mJointNum; 218 joint_b = render_datap->mSkinJoint->mJoint->mJointNum;
219 }
220 219
221 if (joint_a == -1) 220 if (joint_a == -1)
222 { 221 {
223 joint_a = render_datap->mSkinJoint->mJoint->getParent()->mJointNum; 222 joint_a = render_datap->mSkinJoint->mJoint->getParent()->mJointNum;
223 }
224 } 224 }
225 num_joints++; 225 num_joints++;
226 } 226 }
diff --git a/linden/indra/newview/llviewerkeyboard.cpp b/linden/indra/newview/llviewerkeyboard.cpp
index f514b2e..fcb1550 100644
--- a/linden/indra/newview/llviewerkeyboard.cpp
+++ b/linden/indra/newview/llviewerkeyboard.cpp
@@ -717,15 +717,16 @@ S32 LLViewerKeyboard::loadBindings(const char *filename)
717 S32 binding_count = 0; 717 S32 binding_count = 0;
718 S32 line_count = 0; 718 S32 line_count = 0;
719 719
720 fp = LLFile::fopen(filename, "r"); /* Flawfinder: ignore */ 720 if(!filename)
721 {
722 llerrs << " No filename specified" << llendl;
723 return 0;
724 }
725
726 fp = LLFile::fopen(filename, "r");
721 727
722 if (!fp) 728 if (!fp)
723 { 729 {
724 if(!filename)
725 {
726 llerrs << " No filename specified" << llendl;
727 return 0;
728 }
729 return 0; 730 return 0;
730 } 731 }
731 732
diff --git a/linden/indra/newview/llviewermenu.cpp b/linden/indra/newview/llviewermenu.cpp
index 64f1af8..1ff995e 100644
--- a/linden/indra/newview/llviewermenu.cpp
+++ b/linden/indra/newview/llviewermenu.cpp
@@ -34,15 +34,12 @@
34#include <iostream> 34#include <iostream>
35#include <fstream> 35#include <fstream>
36#include <sstream> 36#include <sstream>
37#include <boost/tokenizer.hpp>
38 37
39// linden library includes 38// linden library includes
40#include "audioengine.h" 39#include "audioengine.h"
41#include "indra_constants.h" 40#include "indra_constants.h"
42#include "llassetuploadresponders.h"
43#include "llassetstorage.h" 41#include "llassetstorage.h"
44#include "llchat.h" 42#include "llchat.h"
45#include "lleconomy.h"
46#include "llfocusmgr.h" 43#include "llfocusmgr.h"
47#include "llfontgl.h" 44#include "llfontgl.h"
48#include "llinstantmessage.h" 45#include "llinstantmessage.h"
@@ -57,7 +54,6 @@
57#include "raytrace.h" 54#include "raytrace.h"
58#include "llsdserialize.h" 55#include "llsdserialize.h"
59#include "lltimer.h" 56#include "lltimer.h"
60#include "vorbisencode.h"
61#include "llvfile.h" 57#include "llvfile.h"
62#include "llvolumemgr.h" 58#include "llvolumemgr.h"
63#include "llwindow.h" // for shell_open() 59#include "llwindow.h" // for shell_open()
@@ -83,7 +79,6 @@
83#include "llfloater.h" 79#include "llfloater.h"
84#include "llfloaterabout.h" 80#include "llfloaterabout.h"
85#include "llfloaterbuycurrency.h" 81#include "llfloaterbuycurrency.h"
86#include "llfloateranimpreview.h"
87#include "llfloateravatarinfo.h" 82#include "llfloateravatarinfo.h"
88#include "llfloateravatartextures.h" 83#include "llfloateravatartextures.h"
89#include "llfloaterbuildoptions.h" 84#include "llfloaterbuildoptions.h"
@@ -104,21 +99,17 @@
104#include "llfloaterhtml.h" 99#include "llfloaterhtml.h"
105#include "llfloaterhtmlhelp.h" 100#include "llfloaterhtmlhelp.h"
106#include "llfloaterhtmlfind.h" 101#include "llfloaterhtmlfind.h"
107#include "llfloaterimport.h"
108#include "llfloaterinspect.h" 102#include "llfloaterinspect.h"
109#include "llfloaterland.h" 103#include "llfloaterland.h"
110#include "llfloaterlandholdings.h" 104#include "llfloaterlandholdings.h"
111#include "llfloatermap.h" 105#include "llfloatermap.h"
112#include "llfloaterimagepreview.h"
113#include "llfloatermute.h" 106#include "llfloatermute.h"
114#include "llfloaternamedesc.h"
115#include "llfloateropenobject.h" 107#include "llfloateropenobject.h"
116#include "llfloaterpermissionsmgr.h" 108#include "llfloaterpermissionsmgr.h"
117#include "llfloaterpreference.h" 109#include "llfloaterpreference.h"
118#include "llfloaterregioninfo.h" 110#include "llfloaterregioninfo.h"
119#include "llfloaterreporter.h" 111#include "llfloaterreporter.h"
120#include "llfloaterscriptdebug.h" 112#include "llfloaterscriptdebug.h"
121#include "llfloatersnapshot.h"
122#include "llfloatertest.h" 113#include "llfloatertest.h"
123#include "llfloatertools.h" 114#include "llfloatertools.h"
124#include "llfloaterworldmap.h" 115#include "llfloaterworldmap.h"
@@ -147,8 +138,6 @@
147#include "llnotify.h" 138#include "llnotify.h"
148#include "llpanelobject.h" 139#include "llpanelobject.h"
149#include "llparcel.h" 140#include "llparcel.h"
150#include "llpreviewscript.h"
151#include "llpreviewtexture.h"
152#include "llprimitive.h" 141#include "llprimitive.h"
153#include "llresmgr.h" 142#include "llresmgr.h"
154#include "llselectmgr.h" 143#include "llselectmgr.h"
@@ -176,8 +165,8 @@
176#include "llviewercamera.h" 165#include "llviewercamera.h"
177#include "llviewergenericmessage.h" 166#include "llviewergenericmessage.h"
178#include "llviewergesture.h" 167#include "llviewergesture.h"
179#include "llviewerimagelist.h"
180#include "llviewerinventory.h" 168#include "llviewerinventory.h"
169#include "llviewermenufile.h" // init_menu_file()
181#include "llviewermessage.h" 170#include "llviewermessage.h"
182#include "llviewernetwork.h" 171#include "llviewernetwork.h"
183#include "llviewerobjectlist.h" 172#include "llviewerobjectlist.h"
@@ -402,7 +391,6 @@ void handle_god_request_avatar_geometry(void *); // Hack for easy testing of new
402void reload_personal_settings_overrides(void *); 391void reload_personal_settings_overrides(void *);
403void force_breakpoint(void *); 392void force_breakpoint(void *);
404void reload_vertex_shader(void *); 393void reload_vertex_shader(void *);
405void flush_animations(void *);
406void slow_mo_animations(void *); 394void slow_mo_animations(void *);
407void handle_disconnect_viewer(void *); 395void handle_disconnect_viewer(void *);
408 396
@@ -467,6 +455,7 @@ void handle_dump_avatar_local_textures(void*);
467void handle_debug_avatar_textures(void*); 455void handle_debug_avatar_textures(void*);
468void handle_grab_texture(void*); 456void handle_grab_texture(void*);
469BOOL enable_grab_texture(void*); 457BOOL enable_grab_texture(void*);
458void handle_dump_region_object_cache(void*);
470 459
471BOOL menu_ui_enabled(void *user_data); 460BOOL menu_ui_enabled(void *user_data);
472void check_toggle_control( LLUICtrl *, void* user_data ); 461void check_toggle_control( LLUICtrl *, void* user_data );
@@ -537,7 +526,7 @@ void pre_init_menus()
537 LLMenuItemGL::setHighlightFGColor( color ); 526 LLMenuItemGL::setHighlightFGColor( color );
538} 527}
539 528
540void initialize_menu_actions(); 529void initialize_menus();
541 530
542//----------------------------------------------------------------------------- 531//-----------------------------------------------------------------------------
543// Initialize main menus 532// Initialize main menus
@@ -565,7 +554,7 @@ void init_menus()
565 LLMenuGL::sMenuContainer = gMenuHolder; 554 LLMenuGL::sMenuContainer = gMenuHolder;
566 555
567 // Initialize actions 556 // Initialize actions
568 initialize_menu_actions(); 557 initialize_menus();
569 558
570 /// 559 ///
571 /// Popup menu 560 /// Popup menu
@@ -965,6 +954,8 @@ void init_debug_world_menu(LLMenuGL* menu)
965 NULL, 954 NULL,
966 &menu_check_control, 955 &menu_check_control,
967 (void*)"FixedWeather")); 956 (void*)"FixedWeather"));
957 menu->append(new LLMenuItemCallGL("Dump Region Object Cache",
958 &handle_dump_region_object_cache, NULL, NULL));
968 menu->createJumpKeys(); 959 menu->createJumpKeys();
969} 960}
970 961
@@ -1293,7 +1284,6 @@ void init_debug_avatar_menu(LLMenuGL* menu)
1293 menu->append(new LLMenuItemCallGL("Force Params to Default", &LLAgent::clearVisualParams, NULL)); 1284 menu->append(new LLMenuItemCallGL("Force Params to Default", &LLAgent::clearVisualParams, NULL));
1294 menu->append(new LLMenuItemCallGL("Reload Vertex Shader", &reload_vertex_shader, NULL)); 1285 menu->append(new LLMenuItemCallGL("Reload Vertex Shader", &reload_vertex_shader, NULL));
1295 menu->append(new LLMenuItemToggleGL("Animation Info", &LLVOAvatar::sShowAnimationDebug)); 1286 menu->append(new LLMenuItemToggleGL("Animation Info", &LLVOAvatar::sShowAnimationDebug));
1296 menu->append(new LLMenuItemCallGL("Flush Animations", &flush_animations, NULL));
1297 menu->append(new LLMenuItemCallGL("Slow Motion Animations", &slow_mo_animations, NULL)); 1287 menu->append(new LLMenuItemCallGL("Slow Motion Animations", &slow_mo_animations, NULL));
1298 menu->append(new LLMenuItemToggleGL("Show Look At", &LLHUDEffectLookAt::sDebugLookAt)); 1288 menu->append(new LLMenuItemToggleGL("Show Look At", &LLHUDEffectLookAt::sDebugLookAt));
1299 menu->append(new LLMenuItemToggleGL("Show Point At", &LLHUDEffectPointAt::sDebugPointAt)); 1289 menu->append(new LLMenuItemToggleGL("Show Point At", &LLHUDEffectPointAt::sDebugPointAt));
@@ -2041,13 +2031,13 @@ class LLAvatarDebug : public view_listener_t
2041 if( avatar ) 2031 if( avatar )
2042 { 2032 {
2043 avatar->dumpLocalTextures(); 2033 avatar->dumpLocalTextures();
2034 llinfos << "Dumping temporary asset data to simulator logs for avatar " << avatar->getID() << llendl;
2035 std::vector<std::string> strings;
2036 strings.push_back(avatar->getID().asString());
2037 LLUUID invoice;
2038 send_generic_message("dumptempassetdata", strings, invoice);
2039 LLFloaterAvatarTextures::show( avatar->getID() );
2044 } 2040 }
2045 llinfos << "Dumping temporary asset data to simulator logs for avatar " << avatar->getID() << llendl;
2046 std::vector<std::string> strings;
2047 strings.push_back(avatar->getID().asString());
2048 LLUUID invoice;
2049 send_generic_message("dumptempassetdata", strings, invoice);
2050 LLFloaterAvatarTextures::show( avatar->getID() );
2051 return true; 2041 return true;
2052 } 2042 }
2053}; 2043};
@@ -2337,16 +2327,6 @@ void handle_buy_contents(LLSaleInfo sale_info)
2337 LLFloaterBuyContents::show(sale_info); 2327 LLFloaterBuyContents::show(sale_info);
2338} 2328}
2339 2329
2340class LLFileEnableSaveAs : public view_listener_t
2341{
2342 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
2343 {
2344 bool new_value = gFloaterView->getFrontmost() && gFloaterView->getFrontmost()->canSaveAs();
2345 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
2346 return true;
2347 }
2348};
2349
2350void handle_region_dump_temp_asset_data(void*) 2330void handle_region_dump_temp_asset_data(void*)
2351{ 2331{
2352 llinfos << "Dumping temporary asset data to simulator logs" << llendl; 2332 llinfos << "Dumping temporary asset data to simulator logs" << llendl;
@@ -2397,6 +2377,15 @@ void handle_dump_capabilities_info(void *)
2397 } 2377 }
2398} 2378}
2399 2379
2380void handle_dump_region_object_cache(void*)
2381{
2382 LLViewerRegion* regionp = gAgent.getRegion();
2383 if (regionp)
2384 {
2385 regionp->dumpCache();
2386 }
2387}
2388
2400void handle_dump_focus(void *) 2389void handle_dump_focus(void *)
2401{ 2390{
2402 LLView *view = gFocusMgr.getKeyboardFocus(); 2391 LLView *view = gFocusMgr.getKeyboardFocus();
@@ -4279,7 +4268,10 @@ void show_buy_currency(const char* extra)
4279 mesg << "Go to " << BUY_CURRENCY_URL << "\nfor information on purchasing currency?"; 4268 mesg << "Go to " << BUY_CURRENCY_URL << "\nfor information on purchasing currency?";
4280 4269
4281 LLString::format_map_t args; 4270 LLString::format_map_t args;
4282 args["[EXTRA]"] = extra; 4271 if (extra != NULL)
4272 {
4273 args["[EXTRA]"] = extra;
4274 }
4283 args["[URL]"] = BUY_CURRENCY_URL; 4275 args["[URL]"] = BUY_CURRENCY_URL;
4284 gViewerWindow->alertXml("PromptGoToCurrencyPage", args, 4276 gViewerWindow->alertXml("PromptGoToCurrencyPage", args,
4285 callback_show_buy_currency); 4277 callback_show_buy_currency);
@@ -4876,906 +4868,6 @@ void toggle_map( void* user_data )
4876 } 4868 }
4877} 4869}
4878 4870
4879/**
4880 char* upload_pick(void* data)
4881
4882 If applicable, brings up a file chooser in which the user selects a file
4883 to upload for a particular task. If the file is valid for the given action,
4884 returns the string to the full path filename, else returns NULL.
4885 Data is the load filter for the type of file as defined in LLFilePicker.
4886**/
4887const char* upload_pick(void* data)
4888{
4889 if( gAgent.cameraMouselook() )
4890 {
4891 gAgent.changeCameraToDefault();
4892 // This doesn't seem necessary. JC
4893 // display();
4894 }
4895
4896 LLFilePicker::ELoadFilter type;
4897 if(data)
4898 {
4899 type = (LLFilePicker::ELoadFilter)((intptr_t)data);
4900 }
4901 else
4902 {
4903 type = LLFilePicker::FFLOAD_ALL;
4904 }
4905
4906 LLFilePicker& picker = LLFilePicker::instance();
4907 if (!picker.getOpenFile(type))
4908 {
4909 llinfos << "Couldn't import objects from file" << llendl;
4910 return NULL;
4911 }
4912
4913 const char* filename = picker.getFirstFile();
4914 const char* ext = strrchr(filename, '.');
4915
4916 //strincmp doesn't like NULL pointers
4917 if (ext == NULL)
4918 {
4919 const char* short_name = strrchr(filename,
4920 *gDirUtilp->getDirDelimiter().c_str());
4921
4922 // No extension
4923 LLStringBase<char>::format_map_t args;
4924 args["[FILE]"] = LLString(short_name + 1);
4925 gViewerWindow->alertXml("NoFileExtension", args);
4926 return NULL;
4927 }
4928 else
4929 {
4930 //so there is an extension
4931 //loop over the valid extensions and compare to see
4932 //if the extension is valid
4933
4934 //now grab the set of valid file extensions
4935 const char* valids = build_extensions_string(type);
4936 std::string valid_extensions = std::string(valids);
4937
4938 BOOL ext_valid = FALSE;
4939
4940 typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
4941 boost::char_separator<char> sep(" ");
4942 tokenizer tokens(valid_extensions, sep);
4943 tokenizer::iterator token_iter;
4944
4945 //now loop over all valid file extensions
4946 //and compare them to the extension of the file
4947 //to be uploaded
4948 for( token_iter = tokens.begin();
4949 token_iter != tokens.end() && ext_valid != TRUE;
4950 ++token_iter)
4951 {
4952 const char* cur_token = token_iter->c_str();
4953
4954 if (0 == strnicmp(cur_token, ext, strlen(cur_token)) || /* Flawfinder: ignore */
4955 0 == strnicmp(cur_token, "*.*", strlen(cur_token))) /* Flawfinder: ignore */
4956 {
4957 //valid extension
4958 //or the acceptable extension is any
4959 ext_valid = TRUE;
4960 }
4961 }//end for (loop over all tokens)
4962
4963 if (ext_valid == FALSE)
4964 {
4965 //should only get here if the extension exists
4966 //but is invalid
4967 LLStringBase<char>::format_map_t args;
4968 args["[EXTENSION]"] = ext;
4969 args["[VALIDS]"] = valids;
4970 gViewerWindow->alertXml("InvalidFileExtension", args);
4971 return NULL;
4972 }
4973 }//end else (non-null extension)
4974
4975 //valid file extension
4976
4977 //now we check to see
4978 //if the file is actually a valid image/sound/etc.
4979 if (type == LLFilePicker::FFLOAD_WAV)
4980 {
4981 // pre-qualify wavs to make sure the format is acceptable
4982 char error_msg[MAX_STRING]; /* Flawfinder: ignore */
4983 if (check_for_invalid_wav_formats(filename,error_msg))
4984 {
4985 llinfos << error_msg << ": " << filename << llendl;
4986 LLStringBase<char>::format_map_t args;
4987 args["[FILE]"] = filename;
4988 gViewerWindow->alertXml( error_msg, args );
4989 return NULL;
4990 }
4991 }//end if a wave/sound file
4992
4993
4994 return filename;
4995}
4996
4997void handle_upload_object(void* data)
4998{
4999 const char* filename = upload_pick(data);
5000 if (filename)
5001 {
5002 // start the import
5003 LLFloaterImport* floaterp = new LLFloaterImport(filename);
5004 gUICtrlFactory->buildFloater(floaterp, "floater_import.xml");
5005 }
5006}
5007
5008class LLFileUploadImage : public view_listener_t
5009{
5010 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
5011 {
5012 const char* filename = upload_pick((void *)(S32)LLFilePicker::FFLOAD_IMAGE);
5013 if (filename)
5014 {
5015 LLFloaterImagePreview* floaterp = new LLFloaterImagePreview(filename);
5016 gUICtrlFactory->buildFloater(floaterp, "floater_image_preview.xml");
5017 }
5018 return TRUE;
5019 }
5020};
5021
5022class LLFileUploadSound : public view_listener_t
5023{
5024 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
5025 {
5026 const char* filename = upload_pick((void*)((S32)LLFilePicker::FFLOAD_WAV));
5027 if (filename)
5028 {
5029 LLFloaterNameDesc* floaterp = new LLFloaterNameDesc(filename);
5030 gUICtrlFactory->buildFloater(floaterp, "floater_sound_preview.xml");
5031 }
5032 return true;
5033 }
5034};
5035
5036class LLFileUploadAnim : public view_listener_t
5037{
5038 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
5039 {
5040 const char* filename = upload_pick((void*)((S32)LLFilePicker::FFLOAD_ANIM));
5041 if (filename)
5042 {
5043 LLFloaterAnimPreview* floaterp = new LLFloaterAnimPreview(filename);
5044 gUICtrlFactory->buildFloater(floaterp, "floater_animation_preview.xml");
5045 }
5046 return true;
5047 }
5048};
5049
5050class LLFileUploadBulk : public view_listener_t
5051{
5052 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
5053 {
5054 if( gAgent.cameraMouselook() )
5055 {
5056 gAgent.changeCameraToDefault();
5057 }
5058
5059 // TODO:
5060 // Iterate over all files
5061 // Check extensions for uploadability, cost
5062 // Check user balance for entire cost
5063 // Charge user entire cost
5064 // Loop, uploading
5065 // If an upload fails, refund the user for that one
5066 //
5067 // Also fix single upload to charge first, then refund
5068
5069 LLFilePicker& picker = LLFilePicker::instance();
5070 if (picker.getMultipleOpenFiles())
5071 {
5072 const char* filename = picker.getFirstFile();
5073 const char* name = picker.getDirname();
5074
5075 LLString asset_name = name;
5076 LLString::replaceNonstandardASCII( asset_name, '?' );
5077 LLString::replaceChar(asset_name, '|', '?');
5078 LLString::stripNonprintable(asset_name);
5079 LLString::trim(asset_name);
5080
5081 char* asset_name_str = (char*)asset_name.c_str();
5082 char* end_p = strrchr(asset_name_str, '.'); // strip extension if exists
5083 if( !end_p )
5084 {
5085 end_p = asset_name_str + strlen( asset_name_str ); /* Flawfinder: ignore */
5086 }
5087
5088 S32 len = llmin( (S32) (DB_INV_ITEM_NAME_STR_LEN), (S32) (end_p - asset_name_str) );
5089
5090 asset_name = asset_name.substr( 0, len );
5091
5092 upload_new_resource(filename, asset_name, asset_name, 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE); // file
5093 }
5094 else
5095 {
5096 llinfos << "Couldn't import objects from file" << llendl;
5097 }
5098 return true;
5099 }
5100};
5101
5102void upload_error(const char* error_message, const char* label, const std::string filename, const LLStringBase<char>::format_map_t args)
5103{
5104 llwarns << error_message << llendl;
5105 gViewerWindow->alertXml(label, args);
5106 if(remove(filename.c_str()) == -1)
5107 {
5108 lldebugs << "unable to remove temp file" << llendl;
5109 }
5110 LLFilePicker::instance().reset();
5111}
5112
5113class LLFileEnableCloseWindow : public view_listener_t
5114{
5115 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
5116 {
5117 bool new_value = gFloaterView->getFocusedFloater() != NULL || gSnapshotFloaterView->getFocusedFloater() != NULL;
5118 // horrendously opaque, this code
5119 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
5120 return true;
5121 }
5122};
5123
5124class LLFileCloseWindow : public view_listener_t
5125{
5126 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
5127 {
5128 LLFloater::closeFocusedFloater();
5129
5130 return true;
5131 }
5132};
5133
5134class LLFileSaveTexture : public view_listener_t
5135{
5136 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
5137 {
5138 LLFloater* top = gFloaterView->getFrontmost();
5139 if (top)
5140 {
5141 top->saveAs();
5142 }
5143 return true;
5144 }
5145};
5146
5147class LLFileTakeSnapshot : public view_listener_t
5148{
5149 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
5150 {
5151 LLFloaterSnapshot::show(NULL);
5152 return true;
5153 }
5154};
5155
5156class LLFileTakeSnapshotToDisk : public view_listener_t
5157{
5158 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
5159 {
5160 LLPointer<LLImageRaw> raw = new LLImageRaw;
5161
5162 S32 width = gViewerWindow->getWindowDisplayWidth();
5163 S32 height = gViewerWindow->getWindowDisplayHeight();
5164
5165 if (gSavedSettings.getBOOL("HighResSnapshot"))
5166 {
5167 width *= 2;
5168 height *= 2;
5169 }
5170
5171 if (gViewerWindow->rawSnapshot(raw,
5172 width,
5173 height,
5174 TRUE,
5175 gSavedSettings.getBOOL("RenderUIInSnapshot"),
5176 FALSE))
5177 {
5178 if (!gQuietSnapshot)
5179 {
5180 gViewerWindow->playSnapshotAnimAndSound();
5181 }
5182 LLImageBase::setSizeOverride(TRUE);
5183 gViewerWindow->saveImageNumbered(raw);
5184 LLImageBase::setSizeOverride(FALSE);
5185 }
5186 return true;
5187 }
5188};
5189
5190class LLFileSaveMovie : public view_listener_t
5191{
5192 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
5193 {
5194 LLViewerWindow::saveMovieNumbered(NULL);
5195 return true;
5196 }
5197};
5198
5199class LLFileSetWindowSize : public view_listener_t
5200{
5201 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
5202 {
5203 LLString size = userdata.asString();
5204 S32 width, height;
5205 sscanf(size.c_str(), "%d,%d", &width, &height);
5206 LLViewerWindow::movieSize(width, height);
5207 return true;
5208 }
5209};
5210
5211class LLFileQuit : public view_listener_t
5212{
5213 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
5214 {
5215 app_request_quit();
5216 return true;
5217 }
5218};
5219
5220void handle_upload(void* data)
5221{
5222 const char* filename = upload_pick(data);
5223 if (filename)
5224 {
5225 LLFloaterNameDesc* floaterp = new LLFloaterNameDesc(filename);
5226 gUICtrlFactory->buildFloater(floaterp, "floater_name_description.xml");
5227 }
5228}
5229
5230void handle_compress_image(void*)
5231{
5232 LLFilePicker& picker = LLFilePicker::instance();
5233 if (picker.getOpenFile(LLFilePicker::FFLOAD_IMAGE))
5234 {
5235 std::string infile(picker.getFirstFile());
5236 std::string outfile = infile + ".j2c";
5237
5238 llinfos << "Input: " << infile << llendl;
5239 llinfos << "Output: " << outfile << llendl;
5240
5241 BOOL success;
5242
5243 success = LLViewerImageList::createUploadFile(infile, outfile, IMG_CODEC_TGA);
5244
5245 if (success)
5246 {
5247 llinfos << "Compression complete" << llendl;
5248 }
5249 else
5250 {
5251 llinfos << "Compression failed: " << LLImageBase::getLastError() << llendl;
5252 }
5253 }
5254}
5255
5256void upload_new_resource(const LLString& src_filename, std::string name,
5257 std::string desc, S32 compression_info,
5258 LLAssetType::EType destination_folder_type,
5259 LLInventoryType::EType inv_type,
5260 U32 next_owner_perm,
5261 const LLString& display_name,
5262 LLAssetStorage::LLStoreAssetCallback callback,
5263 void *userdata)
5264{
5265 // Generate the temporary UUID.
5266 LLString filename = gDirUtilp->getTempFilename();
5267 LLTransactionID tid;
5268 LLAssetID uuid;
5269
5270 LLStringBase<char>::format_map_t args;
5271
5272 LLString ext = src_filename.substr(src_filename.find_last_of('.'));
5273 LLAssetType::EType asset_type = LLAssetType::AT_NONE;
5274 char error_message[MAX_STRING]; /* Flawfinder: ignore */
5275 error_message[0] = '\0';
5276 LLString temp_str;
5277
5278 BOOL error = FALSE;
5279
5280 if (ext.empty())
5281 {
5282 LLString::size_type offset = filename.find_last_of(gDirUtilp->getDirDelimiter());
5283 if (offset != LLString::npos)
5284 offset++;
5285 LLString short_name = filename.substr(offset);
5286
5287 // No extension
5288 snprintf(error_message, /* Flawfinder: ignore */
5289 MAX_STRING,
5290 "No file extension for the file: '%s'\nPlease make sure the file has a correct file extension",
5291 short_name.c_str());
5292 args["[FILE]"] = short_name;
5293 upload_error(error_message, "NofileExtension", filename, args);
5294 return;
5295 }
5296 else if( LLString::compareInsensitive(ext.c_str(),".bmp") == 0 )
5297 {
5298 asset_type = LLAssetType::AT_TEXTURE;
5299 if (!LLViewerImageList::createUploadFile(src_filename,
5300 filename,
5301 IMG_CODEC_BMP ))
5302 {
5303 snprintf(error_message, MAX_STRING, "Problem with file %s:\n\n%s\n", /* Flawfinder: ignore */
5304 src_filename.c_str(), LLImageBase::getLastError().c_str());
5305 args["[FILE]"] = src_filename;
5306 args["[ERROR]"] = LLImageBase::getLastError();
5307 upload_error(error_message, "ProblemWithFile", filename, args);
5308 return;
5309 }
5310 }
5311 else if( LLString::compareInsensitive(ext.c_str(),".tga") == 0 )
5312 {
5313 asset_type = LLAssetType::AT_TEXTURE;
5314 if (!LLViewerImageList::createUploadFile(src_filename,
5315 filename,
5316 IMG_CODEC_TGA ))
5317 {
5318 snprintf(error_message, MAX_STRING, "Problem with file %s:\n\n%s\n", /* Flawfinder: ignore */
5319 src_filename.c_str(), LLImageBase::getLastError().c_str());
5320 args["[FILE]"] = src_filename;
5321 args["[ERROR]"] = LLImageBase::getLastError();
5322 upload_error(error_message, "ProblemWithFile", filename, args);
5323 return;
5324 }
5325 }
5326 else if( LLString::compareInsensitive(ext.c_str(),".jpg") == 0 || LLString::compareInsensitive(ext.c_str(),".jpeg") == 0)
5327 {
5328 asset_type = LLAssetType::AT_TEXTURE;
5329 if (!LLViewerImageList::createUploadFile(src_filename,
5330 filename,
5331 IMG_CODEC_JPEG ))
5332 {
5333 snprintf(error_message, MAX_STRING, "Problem with file %s:\n\n%s\n", /* Flawfinder: ignore */
5334 src_filename.c_str(), LLImageBase::getLastError().c_str());
5335 args["[FILE]"] = src_filename;
5336 args["[ERROR]"] = LLImageBase::getLastError();
5337 upload_error(error_message, "ProblemWithFile", filename, args);
5338 return;
5339 }
5340 }
5341 else if(LLString::compareInsensitive(ext.c_str(),".wav") == 0)
5342 {
5343 asset_type = LLAssetType::AT_SOUND; // tag it as audio
5344 S32 encode_result = 0;
5345
5346 S32 bitrate = 128;
5347
5348 if (compression_info)
5349 {
5350 bitrate = compression_info;
5351 }
5352 llinfos << "Attempting to encode wav as an ogg file at " << bitrate << "kbps" << llendl;
5353
5354 encode_result = encode_vorbis_file_at(src_filename.c_str(), filename.c_str(), bitrate*1000);
5355
5356 if (LLVORBISENC_NOERR != encode_result)
5357 {
5358 switch(encode_result)
5359 {
5360 case LLVORBISENC_DEST_OPEN_ERR:
5361 snprintf(error_message, MAX_STRING, "Couldn't open temporary compressed sound file for writing: %s\n", filename.c_str()); /* Flawfinder: ignore */
5362 args["[FILE]"] = filename;
5363 upload_error(error_message, "CannotOpenTemporarySoundFile", filename, args);
5364 break;
5365
5366 default:
5367 snprintf(error_message, MAX_STRING, "Unknown vorbis encode failure on: %s\n", src_filename.c_str()); /* Flawfinder: ignore */
5368 args["[FILE]"] = src_filename;
5369 upload_error(error_message, "UnknownVorbisEncodeFailure", filename, args);
5370 break;
5371 }
5372 return;
5373 }
5374 }
5375 else if(LLString::compareInsensitive(ext.c_str(),".tmp") == 0)
5376 {
5377 // This is a generic .lin resource file
5378 asset_type = LLAssetType::AT_OBJECT;
5379 FILE* in = LLFile::fopen(src_filename.c_str(), "rb"); /* Flawfinder: ignore */
5380 if (in)
5381 {
5382 // read in the file header
5383 char buf[16384]; /* Flawfinder: ignore */
5384 S32 read; /* Flawfinder: ignore */
5385 S32 version;
5386 if (fscanf(in, "LindenResource\nversion %d\n", &version))
5387 {
5388 if (2 == version)
5389 {
5390 // *NOTE: This buffer size is hard coded into scanf() below.
5391 char label[MAX_STRING]; /* Flawfinder: ignore */
5392 char value[MAX_STRING]; /* Flawfinder: ignore */
5393 S32 tokens_read;
5394 while (fgets(buf, 1024, in))
5395 {
5396 label[0] = '\0';
5397 value[0] = '\0';
5398 tokens_read = sscanf( /* Flawfinder: ignore */
5399 buf,
5400 "%254s %254s\n",
5401 label, value);
5402
5403 llinfos << "got: " << label << " = " << value
5404 << llendl;
5405
5406 if (EOF == tokens_read)
5407 {
5408 fclose(in);
5409 snprintf(error_message, MAX_STRING, "corrupt resource file: %s", src_filename.c_str()); /* Flawfinder: ignore */
5410 args["[FILE]"] = src_filename;
5411 upload_error(error_message, "CorruptResourceFile", filename, args);
5412 return;
5413 }
5414
5415 if (2 == tokens_read)
5416 {
5417 if (! strcmp("type", label))
5418 {
5419 asset_type = (LLAssetType::EType)(atoi(value));
5420 }
5421 }
5422 else
5423 {
5424 if (! strcmp("_DATA_", label))
5425 {
5426 // below is the data section
5427 break;
5428 }
5429 }
5430 // other values are currently discarded
5431 }
5432
5433 }
5434 else
5435 {
5436 fclose(in);
5437 snprintf(error_message, MAX_STRING, "unknown linden resource file version in file: %s", src_filename.c_str()); /* Flawfinder: ignore */
5438 args["[FILE]"] = src_filename;
5439 upload_error(error_message, "UnknownResourceFileVersion", filename, args);
5440 return;
5441 }
5442 }
5443 else
5444 {
5445 // this is an original binary formatted .lin file
5446 // start over at the beginning of the file
5447 fseek(in, 0, SEEK_SET);
5448
5449 const S32 MAX_ASSET_DESCRIPTION_LENGTH = 256;
5450 const S32 MAX_ASSET_NAME_LENGTH = 64;
5451 S32 header_size = 34 + MAX_ASSET_DESCRIPTION_LENGTH + MAX_ASSET_NAME_LENGTH;
5452 S16 type_num;
5453
5454 // read in and throw out most of the header except for the type
5455 fread(buf, header_size, 1, in);
5456 memcpy(&type_num, buf + 16, sizeof(S16)); /* Flawfinder: ignore */
5457 asset_type = (LLAssetType::EType)type_num;
5458 }
5459
5460 // copy the file's data segment into another file for uploading
5461 FILE* out = LLFile::fopen(filename.c_str(), "wb"); /* Flawfinder: ignore */
5462 if (out)
5463 {
5464 while((read = fread(buf, 1, 16384, in))) /* Flawfinder: ignore */
5465 {
5466 fwrite(buf, 1, read, out); /* Flawfinder: ignore */
5467 }
5468 fclose(out);
5469 }
5470 else
5471 {
5472 fclose(in);
5473 snprintf(error_message, MAX_STRING, "Unable to create output file: %s", filename.c_str()); /* Flawfinder: ignore */
5474 args["[FILE]"] = filename;
5475 upload_error(error_message, "UnableToCreateOutputFile", filename, args);
5476 return;
5477 }
5478
5479 fclose(in);
5480 }
5481 else
5482 {
5483 llinfos << "Couldn't open .lin file " << src_filename << llendl;
5484 }
5485 }
5486 else if (LLString::compareInsensitive(ext.c_str(),".bvh") == 0)
5487 {
5488 snprintf(error_message, MAX_STRING, "We do not currently support bulk upload of animation files\n"); /* Flawfinder: ignore */
5489 upload_error(error_message, "DoNotSupportBulkAnimationUpload", filename, args);
5490 return;
5491 }
5492 else
5493 {
5494 // Unknown extension
5495 snprintf(error_message, MAX_STRING, "Unknown file extension %s\nExpected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh", ext.c_str()); /* Flawfinder: ignore */
5496 error = TRUE;;
5497 }
5498
5499 // gen a new transaction ID for this asset
5500 tid.generate();
5501
5502 if (!error)
5503 {
5504 uuid = tid.makeAssetID(gAgent.getSecureSessionID());
5505 // copy this file into the vfs for upload
5506 S32 file_size;
5507 apr_file_t* fp = ll_apr_file_open(filename, LL_APR_RB, &file_size);
5508 if (fp)
5509 {
5510 LLVFile file(gVFS, uuid, asset_type, LLVFile::WRITE);
5511
5512 file.setMaxSize(file_size);
5513
5514 const S32 buf_size = 65536;
5515 U8 copy_buf[buf_size];
5516 while ((file_size = ll_apr_file_read(fp, copy_buf, buf_size)))
5517 {
5518 file.write(copy_buf, file_size);
5519 }
5520 apr_file_close(fp);
5521 }
5522 else
5523 {
5524 snprintf(error_message, MAX_STRING, "Unable to access output file: %s", filename.c_str()); /* Flawfinder: ignore */
5525 error = TRUE;
5526 }
5527 }
5528
5529 if (!error)
5530 {
5531 LLString t_disp_name = display_name;
5532 if (t_disp_name.empty())
5533 {
5534 t_disp_name = src_filename;
5535 }
5536 upload_new_resource(tid, asset_type, name, desc, compression_info, // tid
5537 destination_folder_type, inv_type, next_owner_perm,
5538 display_name, callback, userdata);
5539 }
5540 else
5541 {
5542 llwarns << error_message << llendl;
5543 LLStringBase<char>::format_map_t args;
5544 args["[ERROR_MESSAGE]"] = error_message;
5545 gViewerWindow->alertXml("ErrorMessage", args);
5546 if(LLFile::remove(filename.c_str()) == -1)
5547 {
5548 lldebugs << "unable to remove temp file" << llendl;
5549 }
5550 LLFilePicker::instance().reset();
5551 }
5552}
5553
5554void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type,
5555 std::string name,
5556 std::string desc, S32 compression_info,
5557 LLAssetType::EType destination_folder_type,
5558 LLInventoryType::EType inv_type,
5559 U32 next_owner_perm,
5560 const LLString& display_name,
5561 LLAssetStorage::LLStoreAssetCallback callback,
5562 void *userdata)
5563{
5564 LLAssetID uuid = tid.makeAssetID(gAgent.getSecureSessionID());
5565
5566 if( LLAssetType::AT_SOUND == asset_type )
5567 {
5568 gViewerStats->incStat(LLViewerStats::ST_UPLOAD_SOUND_COUNT );
5569 }
5570 else
5571 if( LLAssetType::AT_TEXTURE == asset_type )
5572 {
5573 gViewerStats->incStat(LLViewerStats::ST_UPLOAD_TEXTURE_COUNT );
5574 }
5575 else
5576 if( LLAssetType::AT_ANIMATION == asset_type)
5577 {
5578 gViewerStats->incStat(LLViewerStats::ST_UPLOAD_ANIM_COUNT );
5579 }
5580
5581 if(LLInventoryType::IT_NONE == inv_type)
5582 {
5583 inv_type = LLInventoryType::defaultForAssetType(asset_type);
5584 }
5585 LLString::stripNonprintable(name);
5586 LLString::stripNonprintable(desc);
5587 if(name.empty())
5588 {
5589 name = "(No Name)";
5590 }
5591 if(desc.empty())
5592 {
5593 desc = "(No Description)";
5594 }
5595
5596 // At this point, we're ready for the upload.
5597 LLString upload_message = "Uploading...\n\n";
5598 upload_message.append(display_name);
5599 LLUploadDialog::modalUploadDialog(upload_message);
5600
5601 llinfos << "*** Uploading: " << llendl;
5602 llinfos << "Type: " << LLAssetType::lookup(asset_type) << llendl;
5603 llinfos << "UUID: " << uuid << llendl;
5604 llinfos << "Name: " << name << llendl;
5605 llinfos << "Desc: " << desc << llendl;
5606 lldebugs << "Folder: " << gInventory.findCategoryUUIDForType(destination_folder_type) << llendl;
5607 lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl;
5608 std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory");
5609 if (!url.empty())
5610 {
5611 llinfos << "New Agent Inventory via capability" << llendl;
5612 LLSD body;
5613 body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type);
5614 body["asset_type"] = LLAssetType::lookup(asset_type);
5615 body["inventory_type"] = LLInventoryType::lookup(inv_type);
5616 body["name"] = name;
5617 body["description"] = desc;
5618
5619 std::ostringstream llsdxml;
5620 LLSDSerialize::toXML(body, llsdxml);
5621 lldebugs << "posting body to capability: " << llsdxml.str() << llendl;
5622 LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, uuid, asset_type));
5623 }
5624 else
5625 {
5626 llinfos << "NewAgentInventory capability not found, new agent inventory via asset system." << llendl;
5627 // check for adequate funds
5628 // TODO: do this check on the sim
5629 if (LLAssetType::AT_SOUND == asset_type ||
5630 LLAssetType::AT_TEXTURE == asset_type ||
5631 LLAssetType::AT_ANIMATION == asset_type)
5632 {
5633 S32 upload_cost = gGlobalEconomy->getPriceUpload();
5634 S32 balance = gStatusBar->getBalance();
5635 if (balance < upload_cost)
5636 {
5637 // insufficient funds, bail on this upload
5638 LLFloaterBuyCurrency::buyCurrency("Uploading costs", upload_cost);
5639 return;
5640 }
5641 }
5642
5643 LLResourceData* data = new LLResourceData;
5644 data->mAssetInfo.mTransactionID = tid;
5645 data->mAssetInfo.mUuid = uuid;
5646 data->mAssetInfo.mType = asset_type;
5647 data->mAssetInfo.mCreatorID = gAgentID;
5648 data->mInventoryType = inv_type;
5649 data->mNextOwnerPerm = next_owner_perm;
5650 data->mUserData = userdata;
5651 data->mAssetInfo.setName(name);
5652 data->mAssetInfo.setDescription(desc);
5653 data->mPreferredLocation = destination_folder_type;
5654
5655 LLAssetStorage::LLStoreAssetCallback asset_callback = &upload_done_callback;
5656 if (callback)
5657 {
5658 asset_callback = callback;
5659 }
5660 gAssetStorage->storeAssetData(data->mAssetInfo.mTransactionID, data->mAssetInfo.mType,
5661 asset_callback,
5662 (void*)data,
5663 FALSE);
5664 }
5665}
5666
5667void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result) // StoreAssetData callback (fixed)
5668{
5669 LLResourceData* data = (LLResourceData*)user_data;
5670 //LLAssetType::EType pref_loc = data->mPreferredLocation;
5671 BOOL is_balance_sufficient = TRUE;
5672 if(result >= 0)
5673 {
5674 LLAssetType::EType dest_loc = (data->mPreferredLocation == LLAssetType::AT_NONE) ? data->mAssetInfo.mType : data->mPreferredLocation;
5675
5676 if (LLAssetType::AT_SOUND == data->mAssetInfo.mType ||
5677 LLAssetType::AT_TEXTURE == data->mAssetInfo.mType ||
5678 LLAssetType::AT_ANIMATION == data->mAssetInfo.mType)
5679 {
5680 // Charge the user for the upload.
5681 LLViewerRegion* region = gAgent.getRegion();
5682 S32 upload_cost = gGlobalEconomy->getPriceUpload();
5683
5684 if(!(can_afford_transaction(upload_cost)))
5685 {
5686 LLFloaterBuyCurrency::buyCurrency(
5687 llformat("Uploading %s costs",
5688 data->mAssetInfo.getName().c_str()),
5689 upload_cost);
5690 is_balance_sufficient = FALSE;
5691 }
5692 else if(region)
5693 {
5694 // Charge user for upload
5695 gStatusBar->debitBalance(upload_cost);
5696
5697 LLMessageSystem* msg = gMessageSystem;
5698 msg->newMessageFast(_PREHASH_MoneyTransferRequest);
5699 msg->nextBlockFast(_PREHASH_AgentData);
5700 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
5701 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
5702 msg->nextBlockFast(_PREHASH_MoneyData);
5703 msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID());
5704 msg->addUUIDFast(_PREHASH_DestID, LLUUID::null);
5705 msg->addU8("Flags", 0);
5706 msg->addS32Fast(_PREHASH_Amount, upload_cost);
5707 msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY);
5708 msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY);
5709 msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE);
5710 msg->addStringFast(_PREHASH_Description, NULL);
5711 msg->sendReliable(region->getHost());
5712 }
5713 }
5714
5715 if(is_balance_sufficient)
5716 {
5717 // Actually add the upload to inventory
5718 llinfos << "Adding " << uuid << " to inventory." << llendl;
5719 LLUUID folder_id(gInventory.findCategoryUUIDForType(dest_loc));
5720 if(folder_id.notNull())
5721 {
5722 U32 next_owner_perm = data->mNextOwnerPerm;
5723 if(PERM_NONE == next_owner_perm)
5724 {
5725 next_owner_perm = PERM_MOVE | PERM_TRANSFER;
5726 }
5727 create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
5728 folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(),
5729 data->mAssetInfo.getDescription(), data->mAssetInfo.mType,
5730 data->mInventoryType, NOT_WEARABLE, next_owner_perm,
5731 LLPointer<LLInventoryCallback>(NULL));
5732 }
5733 else
5734 {
5735 llwarns << "Can't find a folder to put it in" << llendl;
5736 }
5737 }
5738 }
5739 else // if(result >= 0)
5740 {
5741 LLStringBase<char>::format_map_t args;
5742 args["[FILE]"] = LLInventoryType::lookupHumanReadable(data->mInventoryType);
5743 args["[REASON]"] = LLString(LLAssetStorage::getErrorString(result));
5744 gViewerWindow->alertXml("CannotUploadReason", args);
5745 }
5746
5747 LLUploadDialog::modalUploadFinished();
5748 delete data;
5749
5750 // *NOTE: This is a pretty big hack. What this does is check the
5751 // file picker if there are any more pending uploads. If so,
5752 // upload that file.
5753 const char* next_file = LLFilePicker::instance().getNextFile();
5754 if(is_balance_sufficient && next_file)
5755 {
5756 const char* name = LLFilePicker::instance().getDirname();
5757
5758 LLString asset_name = name;
5759 LLString::replaceNonstandardASCII( asset_name, '?' );
5760 LLString::replaceChar(asset_name, '|', '?');
5761 LLString::stripNonprintable(asset_name);
5762 LLString::trim(asset_name);
5763
5764 char* asset_name_str = (char*)asset_name.c_str();
5765 char* end_p = strrchr(asset_name_str, '.'); // strip extension if exists
5766 if( !end_p )
5767 {
5768 end_p = asset_name_str + strlen( asset_name_str ); /* Flawfinder: ignore */
5769 }
5770
5771 S32 len = llmin( (S32) (DB_INV_ITEM_NAME_STR_LEN), (S32) (end_p - asset_name_str) );
5772
5773 asset_name = asset_name.substr( 0, len );
5774
5775 upload_new_resource(next_file, asset_name, asset_name, // file
5776 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE);
5777 }
5778}
5779 4871
5780LLUUID gExporterRequestID; 4872LLUUID gExporterRequestID;
5781LLString gExportDirectory; 4873LLString gExportDirectory;
@@ -7634,15 +6726,6 @@ BOOL enable_not_thirdperson(void*)
7634 return !gAgent.cameraThirdPerson(); 6726 return !gAgent.cameraThirdPerson();
7635} 6727}
7636 6728
7637class LLFileEnableUpload : public view_listener_t
7638{
7639 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
7640 {
7641 bool new_value = gStatusBar && gGlobalEconomy && (gStatusBar->getBalance() >= gGlobalEconomy->getPriceUpload());
7642 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
7643 return true;
7644 }
7645};
7646 6729
7647BOOL enable_export_selected(void *) 6730BOOL enable_export_selected(void *)
7648{ 6731{
@@ -7857,14 +6940,6 @@ void reload_vertex_shader(void *)
7857 //THIS WOULD BE AN AWESOME PLACE TO RELOAD SHADERS... just a thought - DaveP 6940 //THIS WOULD BE AN AWESOME PLACE TO RELOAD SHADERS... just a thought - DaveP
7858} 6941}
7859 6942
7860void flush_animations(void *)
7861{
7862 if (gAgent.getAvatarObject())
7863 {
7864 gAgent.getAvatarObject()->resetAnimations();
7865 }
7866}
7867
7868void slow_mo_animations(void*) 6943void slow_mo_animations(void*)
7869{ 6944{
7870 static BOOL slow_mo = FALSE; 6945 static BOOL slow_mo = FALSE;
@@ -8450,24 +7525,10 @@ class LLToolsSelectTool : public view_listener_t
8450 } 7525 }
8451}; 7526};
8452 7527
8453void initialize_menu_actions() 7528void initialize_menus()
8454{ 7529{
8455 // File menu 7530 // File menu
8456 (new LLFileUploadImage())->registerListener(gMenuHolder, "File.UploadImage"); 7531 init_menu_file();
8457 (new LLFileUploadSound())->registerListener(gMenuHolder, "File.UploadSound");
8458 (new LLFileUploadAnim())->registerListener(gMenuHolder, "File.UploadAnim");
8459 (new LLFileUploadBulk())->registerListener(gMenuHolder, "File.UploadBulk");
8460 (new LLFileCloseWindow())->registerListener(gMenuHolder, "File.CloseWindow");
8461 (new LLFileEnableCloseWindow())->registerListener(gMenuHolder, "File.EnableCloseWindow");
8462 (new LLFileSaveTexture())->registerListener(gMenuHolder, "File.SaveTexture");
8463 (new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot");
8464 (new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk");
8465 (new LLFileSaveMovie())->registerListener(gMenuHolder, "File.SaveMovie");
8466 (new LLFileSetWindowSize())->registerListener(gMenuHolder, "File.SetWindowSize");
8467 (new LLFileQuit())->registerListener(gMenuHolder, "File.Quit");
8468
8469 (new LLFileEnableUpload())->registerListener(gMenuHolder, "File.EnableUpload");
8470 (new LLFileEnableSaveAs())->registerListener(gMenuHolder, "File.EnableSaveAs");
8471 7532
8472 // Edit menu 7533 // Edit menu
8473 (new LLEditUndo())->registerListener(gMenuHolder, "Edit.Undo"); 7534 (new LLEditUndo())->registerListener(gMenuHolder, "Edit.Undo");
diff --git a/linden/indra/newview/llviewermenu.h b/linden/indra/newview/llviewermenu.h
index ac2a57a..c223a3a 100644
--- a/linden/indra/newview/llviewermenu.h
+++ b/linden/indra/newview/llviewermenu.h
@@ -29,8 +29,6 @@
29#ifndef LL_LLVIEWERMENU_H 29#ifndef LL_LLVIEWERMENU_H
30#define LL_LLVIEWERMENU_H 30#define LL_LLVIEWERMENU_H
31 31
32#include "llassetstorage.h"
33#include "llinventory.h"
34#include "llmenugl.h" 32#include "llmenugl.h"
35 33
36//newview includes 34//newview includes
@@ -41,14 +39,6 @@ class LLView;
41class LLParcelSelection; 39class LLParcelSelection;
42class LLObjectSelection; 40class LLObjectSelection;
43 41
44struct LLResourceData
45{
46 LLAssetInfo mAssetInfo;
47 LLAssetType::EType mPreferredLocation;
48 LLInventoryType::EType mInventoryType;
49 U32 mNextOwnerPerm;
50 void *mUserData;
51};
52 42
53void pre_init_menus(); 43void pre_init_menus();
54void init_menus(); 44void init_menus();
@@ -114,25 +104,6 @@ bool handle_give_money_dialog();
114bool handle_object_open(); 104bool handle_object_open();
115bool handle_go_to(); 105bool handle_go_to();
116 106
117void upload_new_resource(const LLString& src_filename, std::string name,
118 std::string desc, S32 compression_info,
119 LLAssetType::EType destination_folder_type,
120 LLInventoryType::EType inv_type,
121 U32 next_owner_perm = PERM_NONE,
122 const LLString& display_name = LLString::null,
123 LLAssetStorage::LLStoreAssetCallback callback = NULL,
124 void *userdata = NULL);
125
126void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType type,
127 std::string name,
128 std::string desc, S32 compression_info,
129 LLAssetType::EType destination_folder_type,
130 LLInventoryType::EType inv_type,
131 U32 next_owner_perm = PERM_NONE,
132 const LLString& display_name = LLString::null,
133 LLAssetStorage::LLStoreAssetCallback callback = NULL,
134 void *userdata = NULL);
135
136// Export to XML or Collada 107// Export to XML or Collada
137void handle_export_selected( void * ); 108void handle_export_selected( void * );
138 109
diff --git a/linden/indra/newview/llviewermenufile.cpp b/linden/indra/newview/llviewermenufile.cpp
new file mode 100644
index 0000000..6954b1c
--- /dev/null
+++ b/linden/indra/newview/llviewermenufile.cpp
@@ -0,0 +1,1022 @@
1/**
2 * @file llviewermenufile.cpp
3 * @brief "File" menu in the main menu bar.
4 *
5 * Copyright (c) 2002-2007, Linden Research, Inc.
6 *
7 * Second Life Viewer Source Code
8 * The source code in this file ("Source Code") is provided by Linden Lab
9 * to you under the terms of the GNU General Public License, version 2.0
10 * ("GPL"), unless you have obtained a separate licensing agreement
11 * ("Other License"), formally executed by you and Linden Lab. Terms of
12 * the GPL can be found in doc/GPL-license.txt in this distribution, or
13 * online at http://secondlife.com/developers/opensource/gplv2
14 *
15 * There are special exceptions to the terms and conditions of the GPL as
16 * it is applied to this Source Code. View the full text of the exception
17 * in the file doc/FLOSS-exception.txt in this software distribution, or
18 * online at http://secondlife.com/developers/opensource/flossexception
19 *
20 * By copying, modifying or distributing this software, you acknowledge
21 * that you have read and understood your obligations described above,
22 * and agree to abide by those obligations.
23 *
24 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
25 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
26 * COMPLETENESS OR PERFORMANCE.
27 */
28
29#include "llviewerprecompiledheaders.h"
30
31#include "llviewermenufile.h"
32
33// project includes
34#include "llagent.h"
35#include "llfilepicker.h"
36#include "llfloateranimpreview.h"
37#include "llfloaterbuycurrency.h"
38#include "llfloaterimagepreview.h"
39#include "llfloaterimport.h"
40#include "llfloaternamedesc.h"
41#include "llfloatersnapshot.h"
42#include "llinventorymodel.h" // gInventory
43#include "llresourcedata.h"
44#include "llstatusbar.h"
45#include "llviewercontrol.h" // gSavedSettings
46#include "llviewerimagelist.h"
47#include "llvieweruictrlfactory.h"
48#include "llviewermenu.h" // gMenuHolder
49#include "llviewerregion.h"
50#include "llviewerstats.h"
51#include "llviewerwindow.h"
52#include "viewer.h" // app_request_quit()
53
54// linden libraries
55#include "llassetuploadresponders.h"
56#include "lleconomy.h"
57#include "llhttpclient.h"
58#include "llmemberlistener.h"
59#include "llsdserialize.h"
60#include "llstring.h"
61#include "lltransactiontypes.h"
62#include "lluuid.h"
63#include "vorbisencode.h"
64
65// system libraries
66#include <boost/tokenizer.hpp>
67
68typedef LLMemberListener<LLView> view_listener_t;
69
70
71class LLFileEnableSaveAs : public view_listener_t
72{
73 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
74 {
75 bool new_value = gFloaterView->getFrontmost() && gFloaterView->getFrontmost()->canSaveAs();
76 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
77 return true;
78 }
79};
80
81class LLFileEnableUpload : public view_listener_t
82{
83 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
84 {
85 bool new_value = gStatusBar && gGlobalEconomy && (gStatusBar->getBalance() >= gGlobalEconomy->getPriceUpload());
86 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
87 return true;
88 }
89};
90
91/**
92 char* upload_pick(void* data)
93
94 If applicable, brings up a file chooser in which the user selects a file
95 to upload for a particular task. If the file is valid for the given action,
96 returns the string to the full path filename, else returns NULL.
97 Data is the load filter for the type of file as defined in LLFilePicker.
98**/
99const char* upload_pick(void* data)
100{
101 if( gAgent.cameraMouselook() )
102 {
103 gAgent.changeCameraToDefault();
104 // This doesn't seem necessary. JC
105 // display();
106 }
107
108 LLFilePicker::ELoadFilter type;
109 if(data)
110 {
111 type = (LLFilePicker::ELoadFilter)((intptr_t)data);
112 }
113 else
114 {
115 type = LLFilePicker::FFLOAD_ALL;
116 }
117
118 LLFilePicker& picker = LLFilePicker::instance();
119 if (!picker.getOpenFile(type))
120 {
121 llinfos << "Couldn't import objects from file" << llendl;
122 return NULL;
123 }
124
125 const char* filename = picker.getFirstFile();
126 const char* ext = strrchr(filename, '.');
127
128 //strincmp doesn't like NULL pointers
129 if (ext == NULL)
130 {
131 const char* short_name = strrchr(filename,
132 *gDirUtilp->getDirDelimiter().c_str());
133
134 // No extension
135 LLStringBase<char>::format_map_t args;
136 args["[FILE]"] = LLString(short_name + 1);
137 gViewerWindow->alertXml("NoFileExtension", args);
138 return NULL;
139 }
140 else
141 {
142 //so there is an extension
143 //loop over the valid extensions and compare to see
144 //if the extension is valid
145
146 //now grab the set of valid file extensions
147 const char* valids = build_extensions_string(type);
148 std::string valid_extensions = std::string(valids);
149
150 BOOL ext_valid = FALSE;
151
152 typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
153 boost::char_separator<char> sep(" ");
154 tokenizer tokens(valid_extensions, sep);
155 tokenizer::iterator token_iter;
156
157 //now loop over all valid file extensions
158 //and compare them to the extension of the file
159 //to be uploaded
160 for( token_iter = tokens.begin();
161 token_iter != tokens.end() && ext_valid != TRUE;
162 ++token_iter)
163 {
164 const char* cur_token = token_iter->c_str();
165
166 if (0 == strnicmp(cur_token, ext, strlen(cur_token)) || /* Flawfinder: ignore */
167 0 == strnicmp(cur_token, "*.*", strlen(cur_token))) /* Flawfinder: ignore */
168 {
169 //valid extension
170 //or the acceptable extension is any
171 ext_valid = TRUE;
172 }
173 }//end for (loop over all tokens)
174
175 if (ext_valid == FALSE)
176 {
177 //should only get here if the extension exists
178 //but is invalid
179 LLStringBase<char>::format_map_t args;
180 args["[EXTENSION]"] = ext;
181 args["[VALIDS]"] = valids;
182 gViewerWindow->alertXml("InvalidFileExtension", args);
183 return NULL;
184 }
185 }//end else (non-null extension)
186
187 //valid file extension
188
189 //now we check to see
190 //if the file is actually a valid image/sound/etc.
191 if (type == LLFilePicker::FFLOAD_WAV)
192 {
193 // pre-qualify wavs to make sure the format is acceptable
194 char error_msg[MAX_STRING]; /* Flawfinder: ignore */
195 if (check_for_invalid_wav_formats(filename,error_msg))
196 {
197 llinfos << error_msg << ": " << filename << llendl;
198 LLStringBase<char>::format_map_t args;
199 args["[FILE]"] = filename;
200 gViewerWindow->alertXml( error_msg, args );
201 return NULL;
202 }
203 }//end if a wave/sound file
204
205
206 return filename;
207}
208
209void handle_upload_object(void* data)
210{
211 const char* filename = upload_pick(data);
212 if (filename)
213 {
214 // start the import
215 LLFloaterImport* floaterp = new LLFloaterImport(filename);
216 gUICtrlFactory->buildFloater(floaterp, "floater_import.xml");
217 }
218}
219
220class LLFileUploadImage : public view_listener_t
221{
222 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
223 {
224 const char* filename = upload_pick((void *)(S32)LLFilePicker::FFLOAD_IMAGE);
225 if (filename)
226 {
227 LLFloaterImagePreview* floaterp = new LLFloaterImagePreview(filename);
228 gUICtrlFactory->buildFloater(floaterp, "floater_image_preview.xml");
229 }
230 return TRUE;
231 }
232};
233
234class LLFileUploadSound : public view_listener_t
235{
236 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
237 {
238 const char* filename = upload_pick((void*)((S32)LLFilePicker::FFLOAD_WAV));
239 if (filename)
240 {
241 LLFloaterNameDesc* floaterp = new LLFloaterNameDesc(filename);
242 gUICtrlFactory->buildFloater(floaterp, "floater_sound_preview.xml");
243 }
244 return true;
245 }
246};
247
248class LLFileUploadAnim : public view_listener_t
249{
250 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
251 {
252 const char* filename = upload_pick((void*)((S32)LLFilePicker::FFLOAD_ANIM));
253 if (filename)
254 {
255 LLFloaterAnimPreview* floaterp = new LLFloaterAnimPreview(filename);
256 gUICtrlFactory->buildFloater(floaterp, "floater_animation_preview.xml");
257 }
258 return true;
259 }
260};
261
262class LLFileUploadBulk : public view_listener_t
263{
264 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
265 {
266 if( gAgent.cameraMouselook() )
267 {
268 gAgent.changeCameraToDefault();
269 }
270
271 // TODO:
272 // Iterate over all files
273 // Check extensions for uploadability, cost
274 // Check user balance for entire cost
275 // Charge user entire cost
276 // Loop, uploading
277 // If an upload fails, refund the user for that one
278 //
279 // Also fix single upload to charge first, then refund
280
281 LLFilePicker& picker = LLFilePicker::instance();
282 if (picker.getMultipleOpenFiles())
283 {
284 const char* filename = picker.getFirstFile();
285 const char* name = picker.getDirname();
286
287 LLString asset_name = name;
288 LLString::replaceNonstandardASCII( asset_name, '?' );
289 LLString::replaceChar(asset_name, '|', '?');
290 LLString::stripNonprintable(asset_name);
291 LLString::trim(asset_name);
292
293 char* asset_name_str = (char*)asset_name.c_str();
294 char* end_p = strrchr(asset_name_str, '.'); // strip extension if exists
295 if( !end_p )
296 {
297 end_p = asset_name_str + strlen( asset_name_str ); /* Flawfinder: ignore */
298 }
299
300 S32 len = llmin( (S32) (DB_INV_ITEM_NAME_STR_LEN), (S32) (end_p - asset_name_str) );
301
302 asset_name = asset_name.substr( 0, len );
303
304 upload_new_resource(filename, asset_name, asset_name, 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE); // file
305 }
306 else
307 {
308 llinfos << "Couldn't import objects from file" << llendl;
309 }
310 return true;
311 }
312};
313
314void upload_error(const char* error_message, const char* label, const std::string filename, const LLStringBase<char>::format_map_t args)
315{
316 llwarns << error_message << llendl;
317 gViewerWindow->alertXml(label, args);
318 if(remove(filename.c_str()) == -1)
319 {
320 lldebugs << "unable to remove temp file" << llendl;
321 }
322 LLFilePicker::instance().reset();
323}
324
325class LLFileEnableCloseWindow : public view_listener_t
326{
327 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
328 {
329 bool new_value = gFloaterView->getFocusedFloater() != NULL || gSnapshotFloaterView->getFocusedFloater() != NULL;
330 // horrendously opaque, this code
331 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
332 return true;
333 }
334};
335
336class LLFileCloseWindow : public view_listener_t
337{
338 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
339 {
340 LLFloater::closeFocusedFloater();
341
342 return true;
343 }
344};
345
346class LLFileCloseAllWindows : public view_listener_t
347{
348 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
349 {
350 bool app_quitting = false;
351 gFloaterView->closeAllChildren(app_quitting);
352
353 return true;
354 }
355};
356
357class LLFileSaveTexture : public view_listener_t
358{
359 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
360 {
361 LLFloater* top = gFloaterView->getFrontmost();
362 if (top)
363 {
364 top->saveAs();
365 }
366 return true;
367 }
368};
369
370class LLFileTakeSnapshot : public view_listener_t
371{
372 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
373 {
374 LLFloaterSnapshot::show(NULL);
375 return true;
376 }
377};
378
379class LLFileTakeSnapshotToDisk : public view_listener_t
380{
381 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
382 {
383 LLPointer<LLImageRaw> raw = new LLImageRaw;
384
385 S32 width = gViewerWindow->getWindowDisplayWidth();
386 S32 height = gViewerWindow->getWindowDisplayHeight();
387
388 if (gSavedSettings.getBOOL("HighResSnapshot"))
389 {
390 width *= 2;
391 height *= 2;
392 }
393
394 if (gViewerWindow->rawSnapshot(raw,
395 width,
396 height,
397 TRUE,
398 gSavedSettings.getBOOL("RenderUIInSnapshot"),
399 FALSE))
400 {
401 if (!gQuietSnapshot)
402 {
403 gViewerWindow->playSnapshotAnimAndSound();
404 }
405 LLImageBase::setSizeOverride(TRUE);
406 gViewerWindow->saveImageNumbered(raw);
407 LLImageBase::setSizeOverride(FALSE);
408 }
409 return true;
410 }
411};
412
413class LLFileSaveMovie : public view_listener_t
414{
415 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
416 {
417 LLViewerWindow::saveMovieNumbered(NULL);
418 return true;
419 }
420};
421
422class LLFileSetWindowSize : public view_listener_t
423{
424 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
425 {
426 LLString size = userdata.asString();
427 S32 width, height;
428 sscanf(size.c_str(), "%d,%d", &width, &height);
429 LLViewerWindow::movieSize(width, height);
430 return true;
431 }
432};
433
434class LLFileQuit : public view_listener_t
435{
436 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
437 {
438 app_request_quit();
439 return true;
440 }
441};
442
443void handle_upload(void* data)
444{
445 const char* filename = upload_pick(data);
446 if (filename)
447 {
448 LLFloaterNameDesc* floaterp = new LLFloaterNameDesc(filename);
449 gUICtrlFactory->buildFloater(floaterp, "floater_name_description.xml");
450 }
451}
452
453void handle_compress_image(void*)
454{
455 LLFilePicker& picker = LLFilePicker::instance();
456 if (picker.getOpenFile(LLFilePicker::FFLOAD_IMAGE))
457 {
458 std::string infile(picker.getFirstFile());
459 std::string outfile = infile + ".j2c";
460
461 llinfos << "Input: " << infile << llendl;
462 llinfos << "Output: " << outfile << llendl;
463
464 BOOL success;
465
466 success = LLViewerImageList::createUploadFile(infile, outfile, IMG_CODEC_TGA);
467
468 if (success)
469 {
470 llinfos << "Compression complete" << llendl;
471 }
472 else
473 {
474 llinfos << "Compression failed: " << LLImageBase::getLastError() << llendl;
475 }
476 }
477}
478
479void upload_new_resource(const LLString& src_filename, std::string name,
480 std::string desc, S32 compression_info,
481 LLAssetType::EType destination_folder_type,
482 LLInventoryType::EType inv_type,
483 U32 next_owner_perm,
484 const LLString& display_name,
485 LLAssetStorage::LLStoreAssetCallback callback,
486 void *userdata)
487{
488 // Generate the temporary UUID.
489 LLString filename = gDirUtilp->getTempFilename();
490 LLTransactionID tid;
491 LLAssetID uuid;
492
493 LLStringBase<char>::format_map_t args;
494
495 LLString ext = src_filename.substr(src_filename.find_last_of('.'));
496 LLAssetType::EType asset_type = LLAssetType::AT_NONE;
497 char error_message[MAX_STRING]; /* Flawfinder: ignore */
498 error_message[0] = '\0';
499 LLString temp_str;
500
501 BOOL error = FALSE;
502
503 if (ext.empty())
504 {
505 LLString::size_type offset = filename.find_last_of(gDirUtilp->getDirDelimiter());
506 if (offset != LLString::npos)
507 offset++;
508 LLString short_name = filename.substr(offset);
509
510 // No extension
511 snprintf(error_message, /* Flawfinder: ignore */
512 MAX_STRING,
513 "No file extension for the file: '%s'\nPlease make sure the file has a correct file extension",
514 short_name.c_str());
515 args["[FILE]"] = short_name;
516 upload_error(error_message, "NofileExtension", filename, args);
517 return;
518 }
519 else if( LLString::compareInsensitive(ext.c_str(),".bmp") == 0 )
520 {
521 asset_type = LLAssetType::AT_TEXTURE;
522 if (!LLViewerImageList::createUploadFile(src_filename,
523 filename,
524 IMG_CODEC_BMP ))
525 {
526 snprintf(error_message, MAX_STRING, "Problem with file %s:\n\n%s\n", /* Flawfinder: ignore */
527 src_filename.c_str(), LLImageBase::getLastError().c_str());
528 args["[FILE]"] = src_filename;
529 args["[ERROR]"] = LLImageBase::getLastError();
530 upload_error(error_message, "ProblemWithFile", filename, args);
531 return;
532 }
533 }
534 else if( LLString::compareInsensitive(ext.c_str(),".tga") == 0 )
535 {
536 asset_type = LLAssetType::AT_TEXTURE;
537 if (!LLViewerImageList::createUploadFile(src_filename,
538 filename,
539 IMG_CODEC_TGA ))
540 {
541 snprintf(error_message, MAX_STRING, "Problem with file %s:\n\n%s\n", /* Flawfinder: ignore */
542 src_filename.c_str(), LLImageBase::getLastError().c_str());
543 args["[FILE]"] = src_filename;
544 args["[ERROR]"] = LLImageBase::getLastError();
545 upload_error(error_message, "ProblemWithFile", filename, args);
546 return;
547 }
548 }
549 else if( LLString::compareInsensitive(ext.c_str(),".jpg") == 0 || LLString::compareInsensitive(ext.c_str(),".jpeg") == 0)
550 {
551 asset_type = LLAssetType::AT_TEXTURE;
552 if (!LLViewerImageList::createUploadFile(src_filename,
553 filename,
554 IMG_CODEC_JPEG ))
555 {
556 snprintf(error_message, MAX_STRING, "Problem with file %s:\n\n%s\n", /* Flawfinder: ignore */
557 src_filename.c_str(), LLImageBase::getLastError().c_str());
558 args["[FILE]"] = src_filename;
559 args["[ERROR]"] = LLImageBase::getLastError();
560 upload_error(error_message, "ProblemWithFile", filename, args);
561 return;
562 }
563 }
564 else if(LLString::compareInsensitive(ext.c_str(),".wav") == 0)
565 {
566 asset_type = LLAssetType::AT_SOUND; // tag it as audio
567 S32 encode_result = 0;
568
569 S32 bitrate = 128;
570
571 if (compression_info)
572 {
573 bitrate = compression_info;
574 }
575 llinfos << "Attempting to encode wav as an ogg file at " << bitrate << "kbps" << llendl;
576
577 encode_result = encode_vorbis_file_at(src_filename.c_str(), filename.c_str(), bitrate*1000);
578
579 if (LLVORBISENC_NOERR != encode_result)
580 {
581 switch(encode_result)
582 {
583 case LLVORBISENC_DEST_OPEN_ERR:
584 snprintf(error_message, MAX_STRING, "Couldn't open temporary compressed sound file for writing: %s\n", filename.c_str()); /* Flawfinder: ignore */
585 args["[FILE]"] = filename;
586 upload_error(error_message, "CannotOpenTemporarySoundFile", filename, args);
587 break;
588
589 default:
590 snprintf(error_message, MAX_STRING, "Unknown vorbis encode failure on: %s\n", src_filename.c_str()); /* Flawfinder: ignore */
591 args["[FILE]"] = src_filename;
592 upload_error(error_message, "UnknownVorbisEncodeFailure", filename, args);
593 break;
594 }
595 return;
596 }
597 }
598 else if(LLString::compareInsensitive(ext.c_str(),".tmp") == 0)
599 {
600 // This is a generic .lin resource file
601 asset_type = LLAssetType::AT_OBJECT;
602 FILE* in = LLFile::fopen(src_filename.c_str(), "rb"); /* Flawfinder: ignore */
603 if (in)
604 {
605 // read in the file header
606 char buf[16384]; /* Flawfinder: ignore */
607 S32 read; /* Flawfinder: ignore */
608 S32 version;
609 if (fscanf(in, "LindenResource\nversion %d\n", &version))
610 {
611 if (2 == version)
612 {
613 // *NOTE: This buffer size is hard coded into scanf() below.
614 char label[MAX_STRING]; /* Flawfinder: ignore */
615 char value[MAX_STRING]; /* Flawfinder: ignore */
616 S32 tokens_read;
617 while (fgets(buf, 1024, in))
618 {
619 label[0] = '\0';
620 value[0] = '\0';
621 tokens_read = sscanf( /* Flawfinder: ignore */
622 buf,
623 "%254s %254s\n",
624 label, value);
625
626 llinfos << "got: " << label << " = " << value
627 << llendl;
628
629 if (EOF == tokens_read)
630 {
631 fclose(in);
632 snprintf(error_message, MAX_STRING, "corrupt resource file: %s", src_filename.c_str()); /* Flawfinder: ignore */
633 args["[FILE]"] = src_filename;
634 upload_error(error_message, "CorruptResourceFile", filename, args);
635 return;
636 }
637
638 if (2 == tokens_read)
639 {
640 if (! strcmp("type", label))
641 {
642 asset_type = (LLAssetType::EType)(atoi(value));
643 }
644 }
645 else
646 {
647 if (! strcmp("_DATA_", label))
648 {
649 // below is the data section
650 break;
651 }
652 }
653 // other values are currently discarded
654 }
655
656 }
657 else
658 {
659 fclose(in);
660 snprintf(error_message, MAX_STRING, "unknown linden resource file version in file: %s", src_filename.c_str()); /* Flawfinder: ignore */
661 args["[FILE]"] = src_filename;
662 upload_error(error_message, "UnknownResourceFileVersion", filename, args);
663 return;
664 }
665 }
666 else
667 {
668 // this is an original binary formatted .lin file
669 // start over at the beginning of the file
670 fseek(in, 0, SEEK_SET);
671
672 const S32 MAX_ASSET_DESCRIPTION_LENGTH = 256;
673 const S32 MAX_ASSET_NAME_LENGTH = 64;
674 S32 header_size = 34 + MAX_ASSET_DESCRIPTION_LENGTH + MAX_ASSET_NAME_LENGTH;
675 S16 type_num;
676
677 // read in and throw out most of the header except for the type
678 fread(buf, header_size, 1, in);
679 memcpy(&type_num, buf + 16, sizeof(S16)); /* Flawfinder: ignore */
680 asset_type = (LLAssetType::EType)type_num;
681 }
682
683 // copy the file's data segment into another file for uploading
684 FILE* out = LLFile::fopen(filename.c_str(), "wb"); /* Flawfinder: ignore */
685 if (out)
686 {
687 while((read = fread(buf, 1, 16384, in))) /* Flawfinder: ignore */
688 {
689 fwrite(buf, 1, read, out); /* Flawfinder: ignore */
690 }
691 fclose(out);
692 }
693 else
694 {
695 fclose(in);
696 snprintf(error_message, MAX_STRING, "Unable to create output file: %s", filename.c_str()); /* Flawfinder: ignore */
697 args["[FILE]"] = filename;
698 upload_error(error_message, "UnableToCreateOutputFile", filename, args);
699 return;
700 }
701
702 fclose(in);
703 }
704 else
705 {
706 llinfos << "Couldn't open .lin file " << src_filename << llendl;
707 }
708 }
709 else if (LLString::compareInsensitive(ext.c_str(),".bvh") == 0)
710 {
711 snprintf(error_message, MAX_STRING, "We do not currently support bulk upload of animation files\n"); /* Flawfinder: ignore */
712 upload_error(error_message, "DoNotSupportBulkAnimationUpload", filename, args);
713 return;
714 }
715 else
716 {
717 // Unknown extension
718 snprintf(error_message, MAX_STRING, "Unknown file extension %s\nExpected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh", ext.c_str()); /* Flawfinder: ignore */
719 error = TRUE;;
720 }
721
722 // gen a new transaction ID for this asset
723 tid.generate();
724
725 if (!error)
726 {
727 uuid = tid.makeAssetID(gAgent.getSecureSessionID());
728 // copy this file into the vfs for upload
729 S32 file_size;
730 apr_file_t* fp = ll_apr_file_open(filename, LL_APR_RB, &file_size);
731 if (fp)
732 {
733 LLVFile file(gVFS, uuid, asset_type, LLVFile::WRITE);
734
735 file.setMaxSize(file_size);
736
737 const S32 buf_size = 65536;
738 U8 copy_buf[buf_size];
739 while ((file_size = ll_apr_file_read(fp, copy_buf, buf_size)))
740 {
741 file.write(copy_buf, file_size);
742 }
743 apr_file_close(fp);
744 }
745 else
746 {
747 snprintf(error_message, MAX_STRING, "Unable to access output file: %s", filename.c_str()); /* Flawfinder: ignore */
748 error = TRUE;
749 }
750 }
751
752 if (!error)
753 {
754 LLString t_disp_name = display_name;
755 if (t_disp_name.empty())
756 {
757 t_disp_name = src_filename;
758 }
759 upload_new_resource(tid, asset_type, name, desc, compression_info, // tid
760 destination_folder_type, inv_type, next_owner_perm,
761 display_name, callback, userdata);
762 }
763 else
764 {
765 llwarns << error_message << llendl;
766 LLStringBase<char>::format_map_t args;
767 args["[ERROR_MESSAGE]"] = error_message;
768 gViewerWindow->alertXml("ErrorMessage", args);
769 if(LLFile::remove(filename.c_str()) == -1)
770 {
771 lldebugs << "unable to remove temp file" << llendl;
772 }
773 LLFilePicker::instance().reset();
774 }
775}
776
777void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result) // StoreAssetData callback (fixed)
778{
779 LLResourceData* data = (LLResourceData*)user_data;
780 //LLAssetType::EType pref_loc = data->mPreferredLocation;
781 BOOL is_balance_sufficient = TRUE;
782 if(result >= 0)
783 {
784 LLAssetType::EType dest_loc = (data->mPreferredLocation == LLAssetType::AT_NONE) ? data->mAssetInfo.mType : data->mPreferredLocation;
785
786 if (LLAssetType::AT_SOUND == data->mAssetInfo.mType ||
787 LLAssetType::AT_TEXTURE == data->mAssetInfo.mType ||
788 LLAssetType::AT_ANIMATION == data->mAssetInfo.mType)
789 {
790 // Charge the user for the upload.
791 LLViewerRegion* region = gAgent.getRegion();
792 S32 upload_cost = gGlobalEconomy->getPriceUpload();
793
794 if(!(can_afford_transaction(upload_cost)))
795 {
796 LLFloaterBuyCurrency::buyCurrency(
797 llformat("Uploading %s costs",
798 data->mAssetInfo.getName().c_str()),
799 upload_cost);
800 is_balance_sufficient = FALSE;
801 }
802 else if(region)
803 {
804 // Charge user for upload
805 gStatusBar->debitBalance(upload_cost);
806
807 LLMessageSystem* msg = gMessageSystem;
808 msg->newMessageFast(_PREHASH_MoneyTransferRequest);
809 msg->nextBlockFast(_PREHASH_AgentData);
810 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
811 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
812 msg->nextBlockFast(_PREHASH_MoneyData);
813 msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID());
814 msg->addUUIDFast(_PREHASH_DestID, LLUUID::null);
815 msg->addU8("Flags", 0);
816 msg->addS32Fast(_PREHASH_Amount, upload_cost);
817 msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY);
818 msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY);
819 msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE);
820 msg->addStringFast(_PREHASH_Description, NULL);
821 msg->sendReliable(region->getHost());
822 }
823 }
824
825 if(is_balance_sufficient)
826 {
827 // Actually add the upload to inventory
828 llinfos << "Adding " << uuid << " to inventory." << llendl;
829 LLUUID folder_id(gInventory.findCategoryUUIDForType(dest_loc));
830 if(folder_id.notNull())
831 {
832 U32 next_owner_perm = data->mNextOwnerPerm;
833 if(PERM_NONE == next_owner_perm)
834 {
835 next_owner_perm = PERM_MOVE | PERM_TRANSFER;
836 }
837 create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
838 folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(),
839 data->mAssetInfo.getDescription(), data->mAssetInfo.mType,
840 data->mInventoryType, NOT_WEARABLE, next_owner_perm,
841 LLPointer<LLInventoryCallback>(NULL));
842 }
843 else
844 {
845 llwarns << "Can't find a folder to put it in" << llendl;
846 }
847 }
848 }
849 else // if(result >= 0)
850 {
851 LLStringBase<char>::format_map_t args;
852 args["[FILE]"] = LLInventoryType::lookupHumanReadable(data->mInventoryType);
853 args["[REASON]"] = LLString(LLAssetStorage::getErrorString(result));
854 gViewerWindow->alertXml("CannotUploadReason", args);
855 }
856
857 LLUploadDialog::modalUploadFinished();
858 delete data;
859
860 // *NOTE: This is a pretty big hack. What this does is check the
861 // file picker if there are any more pending uploads. If so,
862 // upload that file.
863 const char* next_file = LLFilePicker::instance().getNextFile();
864 if(is_balance_sufficient && next_file)
865 {
866 const char* name = LLFilePicker::instance().getDirname();
867
868 LLString asset_name = name;
869 LLString::replaceNonstandardASCII( asset_name, '?' );
870 LLString::replaceChar(asset_name, '|', '?');
871 LLString::stripNonprintable(asset_name);
872 LLString::trim(asset_name);
873
874 char* asset_name_str = (char*)asset_name.c_str();
875 char* end_p = strrchr(asset_name_str, '.'); // strip extension if exists
876 if( !end_p )
877 {
878 end_p = asset_name_str + strlen( asset_name_str ); /* Flawfinder: ignore */
879 }
880
881 S32 len = llmin( (S32) (DB_INV_ITEM_NAME_STR_LEN), (S32) (end_p - asset_name_str) );
882
883 asset_name = asset_name.substr( 0, len );
884
885 upload_new_resource(next_file, asset_name, asset_name, // file
886 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE);
887 }
888}
889
890void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type,
891 std::string name,
892 std::string desc, S32 compression_info,
893 LLAssetType::EType destination_folder_type,
894 LLInventoryType::EType inv_type,
895 U32 next_owner_perm,
896 const LLString& display_name,
897 LLAssetStorage::LLStoreAssetCallback callback,
898 void *userdata)
899{
900 LLAssetID uuid = tid.makeAssetID(gAgent.getSecureSessionID());
901
902 if( LLAssetType::AT_SOUND == asset_type )
903 {
904 gViewerStats->incStat(LLViewerStats::ST_UPLOAD_SOUND_COUNT );
905 }
906 else
907 if( LLAssetType::AT_TEXTURE == asset_type )
908 {
909 gViewerStats->incStat(LLViewerStats::ST_UPLOAD_TEXTURE_COUNT );
910 }
911 else
912 if( LLAssetType::AT_ANIMATION == asset_type)
913 {
914 gViewerStats->incStat(LLViewerStats::ST_UPLOAD_ANIM_COUNT );
915 }
916
917 if(LLInventoryType::IT_NONE == inv_type)
918 {
919 inv_type = LLInventoryType::defaultForAssetType(asset_type);
920 }
921 LLString::stripNonprintable(name);
922 LLString::stripNonprintable(desc);
923 if(name.empty())
924 {
925 name = "(No Name)";
926 }
927 if(desc.empty())
928 {
929 desc = "(No Description)";
930 }
931
932 // At this point, we're ready for the upload.
933 LLString upload_message = "Uploading...\n\n";
934 upload_message.append(display_name);
935 LLUploadDialog::modalUploadDialog(upload_message);
936
937 llinfos << "*** Uploading: " << llendl;
938 llinfos << "Type: " << LLAssetType::lookup(asset_type) << llendl;
939 llinfos << "UUID: " << uuid << llendl;
940 llinfos << "Name: " << name << llendl;
941 llinfos << "Desc: " << desc << llendl;
942 lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type) << llendl;
943 lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl;
944 std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory");
945 if (!url.empty())
946 {
947 llinfos << "New Agent Inventory via capability" << llendl;
948 LLSD body;
949 body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type);
950 body["asset_type"] = LLAssetType::lookup(asset_type);
951 body["inventory_type"] = LLInventoryType::lookup(inv_type);
952 body["name"] = name;
953 body["description"] = desc;
954
955 std::ostringstream llsdxml;
956 LLSDSerialize::toXML(body, llsdxml);
957 lldebugs << "posting body to capability: " << llsdxml.str() << llendl;
958 LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, uuid, asset_type));
959 }
960 else
961 {
962 llinfos << "NewAgentInventory capability not found, new agent inventory via asset system." << llendl;
963 // check for adequate funds
964 // TODO: do this check on the sim
965 if (LLAssetType::AT_SOUND == asset_type ||
966 LLAssetType::AT_TEXTURE == asset_type ||
967 LLAssetType::AT_ANIMATION == asset_type)
968 {
969 S32 upload_cost = gGlobalEconomy->getPriceUpload();
970 S32 balance = gStatusBar->getBalance();
971 if (balance < upload_cost)
972 {
973 // insufficient funds, bail on this upload
974 LLFloaterBuyCurrency::buyCurrency("Uploading costs", upload_cost);
975 return;
976 }
977 }
978
979 LLResourceData* data = new LLResourceData;
980 data->mAssetInfo.mTransactionID = tid;
981 data->mAssetInfo.mUuid = uuid;
982 data->mAssetInfo.mType = asset_type;
983 data->mAssetInfo.mCreatorID = gAgentID;
984 data->mInventoryType = inv_type;
985 data->mNextOwnerPerm = next_owner_perm;
986 data->mUserData = userdata;
987 data->mAssetInfo.setName(name);
988 data->mAssetInfo.setDescription(desc);
989 data->mPreferredLocation = destination_folder_type;
990
991 LLAssetStorage::LLStoreAssetCallback asset_callback = &upload_done_callback;
992 if (callback)
993 {
994 asset_callback = callback;
995 }
996 gAssetStorage->storeAssetData(data->mAssetInfo.mTransactionID, data->mAssetInfo.mType,
997 asset_callback,
998 (void*)data,
999 FALSE);
1000 }
1001}
1002
1003
1004void init_menu_file()
1005{
1006 (new LLFileUploadImage())->registerListener(gMenuHolder, "File.UploadImage");
1007 (new LLFileUploadSound())->registerListener(gMenuHolder, "File.UploadSound");
1008 (new LLFileUploadAnim())->registerListener(gMenuHolder, "File.UploadAnim");
1009 (new LLFileUploadBulk())->registerListener(gMenuHolder, "File.UploadBulk");
1010 (new LLFileCloseWindow())->registerListener(gMenuHolder, "File.CloseWindow");
1011 (new LLFileCloseAllWindows())->registerListener(gMenuHolder, "File.CloseAllWindows");
1012 (new LLFileEnableCloseWindow())->registerListener(gMenuHolder, "File.EnableCloseWindow");
1013 (new LLFileSaveTexture())->registerListener(gMenuHolder, "File.SaveTexture");
1014 (new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot");
1015 (new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk");
1016 (new LLFileSaveMovie())->registerListener(gMenuHolder, "File.SaveMovie");
1017 (new LLFileSetWindowSize())->registerListener(gMenuHolder, "File.SetWindowSize");
1018 (new LLFileQuit())->registerListener(gMenuHolder, "File.Quit");
1019
1020 (new LLFileEnableUpload())->registerListener(gMenuHolder, "File.EnableUpload");
1021 (new LLFileEnableSaveAs())->registerListener(gMenuHolder, "File.EnableSaveAs");
1022}
diff --git a/linden/indra/newview/llviewermenufile.h b/linden/indra/newview/llviewermenufile.h
new file mode 100644
index 0000000..32806fb
--- /dev/null
+++ b/linden/indra/newview/llviewermenufile.h
@@ -0,0 +1,59 @@
1/**
2 * @file llviewermenufile.h
3 * @brief "File" menu in the main menu bar.
4 *
5 * Copyright (c) 2002-2007, Linden Research, Inc.
6 *
7 * Second Life Viewer Source Code
8 * The source code in this file ("Source Code") is provided by Linden Lab
9 * to you under the terms of the GNU General Public License, version 2.0
10 * ("GPL"), unless you have obtained a separate licensing agreement
11 * ("Other License"), formally executed by you and Linden Lab. Terms of
12 * the GPL can be found in doc/GPL-license.txt in this distribution, or
13 * online at http://secondlife.com/developers/opensource/gplv2
14 *
15 * There are special exceptions to the terms and conditions of the GPL as
16 * it is applied to this Source Code. View the full text of the exception
17 * in the file doc/FLOSS-exception.txt in this software distribution, or
18 * online at http://secondlife.com/developers/opensource/flossexception
19 *
20 * By copying, modifying or distributing this software, you acknowledge
21 * that you have read and understood your obligations described above,
22 * and agree to abide by those obligations.
23 *
24 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
25 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
26 * COMPLETENESS OR PERFORMANCE.
27 */
28
29#ifndef LLVIEWERMENUFILE_H
30#define LLVIEWERMENUFILE_H
31
32#include "llassettype.h"
33#include "llinventorytype.h"
34
35class LLTransactionID;
36
37
38void init_menu_file();
39
40void upload_new_resource(const LLString& src_filename, std::string name,
41 std::string desc, S32 compression_info,
42 LLAssetType::EType destination_folder_type,
43 LLInventoryType::EType inv_type,
44 U32 next_owner_perm = 0x0, // PERM_NONE
45 const LLString& display_name = LLString::null,
46 LLAssetStorage::LLStoreAssetCallback callback = NULL,
47 void *userdata = NULL);
48
49void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType type,
50 std::string name,
51 std::string desc, S32 compression_info,
52 LLAssetType::EType destination_folder_type,
53 LLInventoryType::EType inv_type,
54 U32 next_owner_perm = 0x0, // PERM_NONE
55 const LLString& display_name = LLString::null,
56 LLAssetStorage::LLStoreAssetCallback callback = NULL,
57 void *userdata = NULL);
58
59#endif
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp
index 5dab363..5eafd9d 100644
--- a/linden/indra/newview/llviewermessage.cpp
+++ b/linden/indra/newview/llviewermessage.cpp
@@ -145,8 +145,14 @@ extern BOOL gDebugClicks;
145extern void bad_network_handler(); 145extern void bad_network_handler();
146 146
147// function prototypes 147// function prototypes
148void open_offer(const std::vector<LLUUID>& items); 148void open_offer(const std::vector<LLUUID>& items, const std::string& from_name);
149void friendship_offer_callback(S32 option, void* user_data); 149void friendship_offer_callback(S32 option, void* user_data);
150bool check_offer_throttle(const std::string& from_name, bool check_only);
151
152//inventory offer throttle globals
153LLFrameTimer gThrottleTimer;
154const U32 OFFER_THROTTLE_MAX_COUNT=5; //number of items per time period
155const F32 OFFER_THROTTLE_TIME=10.f; //time period in seconds
150 156
151struct LLFriendshipOffer 157struct LLFriendshipOffer
152{ 158{
@@ -195,11 +201,6 @@ void give_money(const LLUUID& uuid, LLViewerRegion* region, S32 amount, BOOL is_
195 } 201 }
196} 202}
197 203
198BOOL can_afford_transaction(S32 cost)
199{
200 return((cost <= 0)||((gStatusBar) && (gStatusBar->getBalance() >=cost)));
201}
202
203void send_complete_agent_movement(const LLHost& sim_host) 204void send_complete_agent_movement(const LLHost& sim_host)
204{ 205{
205 LLMessageSystem* msg = gMessageSystem; 206 LLMessageSystem* msg = gMessageSystem;
@@ -275,11 +276,19 @@ void process_layer_data(LLMessageSystem *mesgsys, void **user_data)
275 276
276 mesgsys->getS8Fast(_PREHASH_LayerID, _PREHASH_Type, type); 277 mesgsys->getS8Fast(_PREHASH_LayerID, _PREHASH_Type, type);
277 size = mesgsys->getSizeFast(_PREHASH_LayerData, _PREHASH_Data); 278 size = mesgsys->getSizeFast(_PREHASH_LayerData, _PREHASH_Data);
278 if(!size) 279 if (0 == size)
279 { 280 {
280 llwarns << "Layer data has zero size." << llendl; 281 llwarns << "Layer data has zero size." << llendl;
281 return; 282 return;
282 } 283 }
284 if (size < 0)
285 {
286 // getSizeFast() is probably trying to tell us about an error
287 llwarns << "getSizeFast() returned negative result: "
288 << size
289 << llendl;
290 return;
291 }
283 U8 *datap = new U8[size]; 292 U8 *datap = new U8[size];
284 mesgsys->getBinaryDataFast(_PREHASH_LayerData, _PREHASH_Data, datap, size); 293 mesgsys->getBinaryDataFast(_PREHASH_LayerData, _PREHASH_Data, datap, size);
285 LLVLData *vl_datap = new LLVLData(regionp, type, datap, size); 294 LLVLData *vl_datap = new LLVLData(regionp, type, datap, size);
@@ -326,25 +335,29 @@ void export_complete()
326 while ((pos = strstr(pos+1, "<sl:image ")) != 0) 335 while ((pos = strstr(pos+1, "<sl:image ")) != 0)
327 { 336 {
328 char *pos_check = strstr(pos, "checksum=\""); 337 char *pos_check = strstr(pos, "checksum=\"");
329 char *pos_uuid = strstr(pos_check, "\">");
330 338
331 if (pos_check && pos_uuid) 339 if (pos_check)
332 { 340 {
333 char image_uuid_str[UUID_STR_SIZE]; /* Flawfinder: ignore */ 341 char *pos_uuid = strstr(pos_check, "\">");
334 memcpy(image_uuid_str, pos_uuid+2, UUID_STR_SIZE-1); /* Flawfinder: ignore */
335 image_uuid_str[UUID_STR_SIZE-1] = 0;
336 342
337 LLUUID image_uuid(image_uuid_str); 343 if (pos_uuid)
344 {
345 char image_uuid_str[UUID_STR_SIZE]; /* Flawfinder: ignore */
346 memcpy(image_uuid_str, pos_uuid+2, UUID_STR_SIZE-1); /* Flawfinder: ignore */
347 image_uuid_str[UUID_STR_SIZE-1] = 0;
348
349 LLUUID image_uuid(image_uuid_str);
338 350
339 llinfos << "Found UUID: " << image_uuid << llendl; 351 llinfos << "Found UUID: " << image_uuid << llendl;
340 352
341 std::map<LLUUID, LLString>::iterator itor = gImageChecksums.find(image_uuid); 353 std::map<LLUUID, LLString>::iterator itor = gImageChecksums.find(image_uuid);
342 if (itor != gImageChecksums.end()) 354 if (itor != gImageChecksums.end())
343 {
344 llinfos << "Replacing with checksum: " << itor->second << llendl;
345 if (itor->second.c_str() != NULL)
346 { 355 {
347 memcpy(&pos_check[10], itor->second.c_str(), 32); /* Flawfinder: ignore */ 356 llinfos << "Replacing with checksum: " << itor->second << llendl;
357 if (itor->second.c_str() != NULL)
358 {
359 memcpy(&pos_check[10], itor->second.c_str(), 32); /* Flawfinder: ignore */
360 }
348 } 361 }
349 } 362 }
350 } 363 }
@@ -354,7 +367,7 @@ void export_complete()
354 fwrite(buffer, 1, length, fXMLOut); 367 fwrite(buffer, 1, length, fXMLOut);
355 fclose(fXMLOut); 368 fclose(fXMLOut);
356 369
357 delete buffer; 370 delete [] buffer;
358} 371}
359 372
360 373
@@ -432,7 +445,7 @@ void exported_j2c_complete(const LLTSCode status, void *user_data)
432 char *end = strrchr(file_path, gDirUtilp->getDirDelimiter()[0]); 445 char *end = strrchr(file_path, gDirUtilp->getDirDelimiter()[0]);
433 end[0] = 0; 446 end[0] = 0;
434 LLString output_file = llformat("%s/image-%03d.tga", file_path, image_num);//filename; 447 LLString output_file = llformat("%s/image-%03d.tga", file_path, image_num);//filename;
435 delete file_path; 448 delete [] file_path;
436 //S32 name_len = output_file.length(); 449 //S32 name_len = output_file.length();
437 //strcpy(&output_file[name_len-3], "tga"); 450 //strcpy(&output_file[name_len-3], "tga");
438 FILE* fOut = LLFile::fopen(output_file.c_str(), "wb"); /* Flawfinder: ignore */ 451 FILE* fOut = LLFile::fopen(output_file.c_str(), "wb"); /* Flawfinder: ignore */
@@ -599,31 +612,44 @@ void join_group_callback(S32 option, void* user_data)
599class LLOpenAgentOffer : public LLInventoryFetchObserver 612class LLOpenAgentOffer : public LLInventoryFetchObserver
600{ 613{
601public: 614public:
602 LLOpenAgentOffer() {} 615 LLOpenAgentOffer(const std::string& from_name) : mFromName(from_name) {}
603 virtual ~LLOpenAgentOffer() {} 616 /*virtual*/ void done()
604
605 virtual void done()
606 { 617 {
607 open_offer(mComplete); 618 open_offer(mComplete, mFromName);
608 gInventory.removeObserver(this); 619 gInventory.removeObserver(this);
609 delete this; 620 delete this;
610 } 621 }
622private:
623 std::string mFromName;
611}; 624};
612 625
613class LLOpenTaskOffer : public LLInventoryExistenceObserver 626//unlike the FetchObserver for AgentOffer, we only make one
627//instance of the AddedObserver for TaskOffers
628//and it never dies. We do this because we don't know the UUID of
629//task offers until they are accepted, so we don't wouldn't
630//know what to watch for, so instead we just watch for all additions. -Gigs
631class LLOpenTaskOffer : public LLInventoryAddedObserver
614{ 632{
615public:
616 LLOpenTaskOffer() {}
617 virtual ~LLOpenTaskOffer() {}
618
619protected: 633protected:
620 virtual void done() 634 /*virtual*/ void done()
621 { 635 {
622 open_offer(mExist); 636 open_offer(mAdded, "");
623 gInventory.removeObserver(this); 637 mAdded.clear();
624 delete this;
625 } 638 }
626}; 639 };
640
641//one global instance to bind them
642LLOpenTaskOffer* gNewInventoryObserver=NULL;
643
644void start_new_inventory_observer()
645{
646 if (!gNewInventoryObserver) //task offer observer
647 {
648 // Observer is deleted by gInventory
649 gNewInventoryObserver = new LLOpenTaskOffer;
650 gInventory.addObserver(gNewInventoryObserver);
651 }
652}
627 653
628class LLDiscardAgentOffer : public LLInventoryFetchComboObserver 654class LLDiscardAgentOffer : public LLInventoryFetchComboObserver
629{ 655{
@@ -675,7 +701,71 @@ protected:
675}; 701};
676 702
677 703
678void open_offer(const std::vector<LLUUID>& items) 704//Returns TRUE if we are OK, FALSE if we are throttled
705//Set check_only true if you want to know the throttle status
706//without registering a hit -Gigs
707bool check_offer_throttle(const std::string& from_name, bool check_only)
708{
709 static U32 throttle_count;
710 static bool throttle_logged;
711 LLChat chat;
712 LLString log_message;
713
714 if (!gSavedSettings.getBOOL("ShowNewInventory"))
715 return false;
716
717 if (check_only)
718 {
719 return gThrottleTimer.hasExpired();
720 }
721
722 if(gThrottleTimer.checkExpirationAndReset(OFFER_THROTTLE_TIME))
723 {
724 //llinfos << "Throttle Expired" << llendl;
725 throttle_count=1;
726 throttle_logged=false;
727 return true;
728 }
729 else //has not expired
730 {
731 //llinfos << "Throttle Not Expired, Count: " << throttle_count << llendl;
732 // When downloading the initial inventory we get a lot of new items
733 // coming in and can't tell that from spam. JC
734 if (gStartupState >= STATE_STARTED
735 && throttle_count >= OFFER_THROTTLE_MAX_COUNT)
736 {
737 if (!throttle_logged)
738 {
739 // Use the name of the last item giver, who is probably the person
740 // spamming you. JC
741 std::ostringstream message;
742 message << gSecondLife;
743 if (!from_name.empty())
744 {
745 message << ": Items coming in too fast from " << from_name;
746 }
747 else
748 {
749 message << ": Items coming in too fast";
750 }
751 message << ", automatic preview disabled for "
752 << OFFER_THROTTLE_TIME << " seconds.";
753 chat.mText = message.str();
754 //this is kinda important, so actually put it on screen
755 LLFloaterChat::addChat(chat, FALSE, FALSE);
756 throttle_logged=true;
757 }
758 return false;
759 }
760 else
761 {
762 throttle_count++;
763 return true;
764 }
765 }
766}
767
768void open_offer(const std::vector<LLUUID>& items, const std::string& from_name)
679{ 769{
680 std::vector<LLUUID>::const_iterator it = items.begin(); 770 std::vector<LLUUID>::const_iterator it = items.begin();
681 std::vector<LLUUID>::const_iterator end = items.end(); 771 std::vector<LLUUID>::const_iterator end = items.end();
@@ -693,33 +783,66 @@ void open_offer(const std::vector<LLUUID>& items)
693 { 783 {
694 continue; 784 continue;
695 } 785 }
696 switch(item->getType()) 786 //if we are throttled, don't display them - Gigs
787 if (check_offer_throttle(from_name, false))
697 { 788 {
698 case LLAssetType::AT_NOTECARD: 789 // I'm not sure this is a good idea. JC
699 open_notecard(*it, LLString("Note: ") + item->getName(), TRUE, LLUUID::null, FALSE); 790 // bool show_keep_discard = item->getPermissions().getCreator() != gAgent.getID();
700 break; 791 bool show_keep_discard = true;
701 case LLAssetType::AT_LANDMARK: 792 switch(item->getType())
702 open_landmark(*it, LLString("Landmark: ") + item->getName(), TRUE, LLUUID::null, FALSE);
703 break;
704 case LLAssetType::AT_TEXTURE:
705 open_texture(*it, LLString("Texture: ") + item->getName(), TRUE, LLUUID::null, FALSE);
706 break;
707 default:
708 {
709 // Don't auto-open the inventory - just select it if we
710 // already have an active inventory.
711 LLInventoryView* view = LLInventoryView::getActiveInventory();
712 if(view)
713 { 793 {
714 LLUICtrl* focus_ctrl = gFocusMgr.getKeyboardFocus(); 794 case LLAssetType::AT_NOTECARD:
715 LLFocusMgr::FocusLostCallback callback; 795 open_notecard(*it, LLString("Note: ") + item->getName(), show_keep_discard, LLUUID::null, FALSE);
716 callback = gFocusMgr.getFocusCallback(); 796 break;
717 view->getPanel()->setSelection(item->getUUID(), TAKE_FOCUS_NO); 797 case LLAssetType::AT_LANDMARK:
718 gFocusMgr.setKeyboardFocus(focus_ctrl, callback); 798 open_landmark(*it, LLString("Landmark: ") + item->getName(), show_keep_discard, LLUUID::null, FALSE);
799 break;
800 case LLAssetType::AT_TEXTURE:
801 open_texture(*it, LLString("Texture: ") + item->getName(), show_keep_discard, LLUUID::null, FALSE);
802 break;
803 default:
719 break; 804 break;
720 } 805 }
721 } 806 }
807 //highlight item, if it's not in the trash or lost+found
808
809 // Don't auto-open the inventory floater
810 LLInventoryView* view = LLInventoryView::getActiveInventory();
811 if(!view)
812 {
813 return;
814 }
815
816 //Trash Check
817 LLUUID trash_id;
818 trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
819 if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
820 {
821 return;
722 } 822 }
823 LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
824 //BOOL inventory_has_focus = gFocusMgr.childHasKeyboardFocus(view);
825 BOOL user_is_away = gAwayTimer.getStarted();
826
827 // don't select lost and found items if the user is active
828 if (gInventory.isObjectDescendentOf(item->getUUID(), lost_and_found_id)
829 && !user_is_away)
830 {
831 return;
832 }
833
834 //Not sure about this check. Could make it easy to miss incoming items. -Gigs
835 //don't dick with highlight while the user is working
836 //if(inventory_has_focus && !user_is_away)
837 // break;
838 //llinfos << "Highlighting" << item->getUUID() << llendl;
839 //highlight item
840
841 LLUICtrl* focus_ctrl = gFocusMgr.getKeyboardFocus();
842 LLFocusMgr::FocusLostCallback callback;
843 callback = gFocusMgr.getFocusCallback();
844 view->getPanel()->setSelection(item->getUUID(), TAKE_FOCUS_NO);
845 gFocusMgr.setKeyboardFocus(focus_ctrl, callback);
723 } 846 }
724} 847}
725 848
@@ -807,11 +930,11 @@ void inventory_offer_callback(S32 option, void* user_data)
807 char group_name[MAX_STRING]; /* Flawfinder: ignore */ 930 char group_name[MAX_STRING]; /* Flawfinder: ignore */
808 if (gCacheName->getGroupName(info->mFromID, group_name)) 931 if (gCacheName->getGroupName(info->mFromID, group_name))
809 { 932 {
810 from_string = LLString("An object named ") + info->mFromName + " owned by the group '" + group_name + "'"; 933 from_string = LLString("An object named '") + info->mFromName + "' owned by the group '" + group_name + "'";
811 } 934 }
812 else 935 else
813 { 936 {
814 from_string = LLString("An object named ") + info->mFromName + " owned by an unknown group"; 937 from_string = LLString("An object named '") + info->mFromName + "' owned by an unknown group";
815 } 938 }
816 } 939 }
817 else 940 else
@@ -820,11 +943,11 @@ void inventory_offer_callback(S32 option, void* user_data)
820 char last_name[MAX_STRING]; /* Flawfinder: ignore */ 943 char last_name[MAX_STRING]; /* Flawfinder: ignore */
821 if (gCacheName->getName(info->mFromID, first_name, last_name)) 944 if (gCacheName->getName(info->mFromID, first_name, last_name))
822 { 945 {
823 from_string = LLString("An object named ") + info->mFromName + " owned by " + first_name + " " + last_name; 946 from_string = LLString("An object named '") + info->mFromName + "' owned by " + first_name + " " + last_name;
824 } 947 }
825 else 948 else
826 { 949 {
827 from_string = LLString("An object named ") + info->mFromName + " owned by an unknown user"; 950 from_string = LLString("An object named '") + info->mFromName + "' owned by an unknown user";
828 } 951 }
829 } 952 }
830 } 953 }
@@ -833,9 +956,11 @@ void inventory_offer_callback(S32 option, void* user_data)
833 from_string = info->mFromName; 956 from_string = info->mFromName;
834 } 957 }
835 958
959 bool busy=FALSE;
960
836 switch(option) 961 switch(option)
837 { 962 {
838 case 0: 963 case IOR_ACCEPT:
839 // ACCEPT. The math for the dialog works, because the accept 964 // ACCEPT. The math for the dialog works, because the accept
840 // for inventory_offered, task_inventory_offer or 965 // for inventory_offered, task_inventory_offer or
841 // group_notice_inventory is 1 greater than the offer integer value. 966 // group_notice_inventory is 1 greater than the offer integer value.
@@ -846,9 +971,15 @@ void inventory_offer_callback(S32 option, void* user_data)
846 sizeof(info->mFolderID.mData)); 971 sizeof(info->mFolderID.mData));
847 // send the message 972 // send the message
848 msg->sendReliable(info->mHost); 973 msg->sendReliable(info->mHost);
849 log_message = info->mFromName + " gave you " + info->mDesc + "."; 974
850 chat.mText = log_message; 975 //don't spam them if they are getting flooded
851 LLFloaterChat::addChatHistory(chat); 976 if (check_offer_throttle(info->mFromName, true))
977 {
978 log_message = info->mFromName + " gave you " + info->mDesc + ".";
979 chat.mText = log_message;
980 LLFloaterChat::addChatHistory(chat);
981 }
982
852 // we will want to open this item when it comes back. 983 // we will want to open this item when it comes back.
853 lldebugs << "Initializing an opener for tid: " << info->mTransactionID 984 lldebugs << "Initializing an opener for tid: " << info->mTransactionID
854 << llendl; 985 << llendl;
@@ -861,7 +992,7 @@ void inventory_offer_callback(S32 option, void* user_data)
861 // so we can fetch it out of our inventory. 992 // so we can fetch it out of our inventory.
862 LLInventoryFetchObserver::item_ref_t items; 993 LLInventoryFetchObserver::item_ref_t items;
863 items.push_back(info->mObjectID); 994 items.push_back(info->mObjectID);
864 LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer; 995 LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(from_string);
865 open_agent_offer->fetchItems(items); 996 open_agent_offer->fetchItems(items);
866 if(catp || (itemp && itemp->isComplete())) 997 if(catp || (itemp && itemp->isComplete()))
867 { 998 {
@@ -877,22 +1008,10 @@ void inventory_offer_callback(S32 option, void* user_data)
877 case IM_GROUP_NOTICE: 1008 case IM_GROUP_NOTICE:
878 case IM_GROUP_NOTICE_REQUESTED: 1009 case IM_GROUP_NOTICE_REQUESTED:
879 { 1010 {
880 // This is an offer from a task or group. 1011 // This is an offer from a task or group.
881 // Because it would be easy 1012 // We don't use a new instance of an opener
882 // to write a task which would overload your inventory, we 1013 // We instead use the singular observer gOpenTaskOffer
883 // force the offer to stay in an instant message until 1014 // Since it already exists, we don't need to actually do anything
884 // accepted. Thus, we have to respond, and then wait for
885 // the update to come back before we open the item.
886 LLOpenTaskOffer* open_task_offer = new LLOpenTaskOffer;
887 open_task_offer->watchItem(info->mObjectID);
888 if(itemp && itemp->isComplete())
889 {
890 opener->changed(0x0);
891 }
892 else
893 {
894 opener = open_task_offer;
895 }
896 } 1015 }
897 break; 1016 break;
898 default: 1017 default:
@@ -901,9 +1020,12 @@ void inventory_offer_callback(S32 option, void* user_data)
901 } 1020 }
902 break; 1021 break;
903 1022
904 case 2: 1023 case IOR_BUSY:
1024 //Busy falls through to decline. Says to make busy message.
1025 busy=TRUE;
1026 case IOR_MUTE:
905 // MUTE falls through to decline 1027 // MUTE falls through to decline
906 case 1: 1028 case IOR_DECLINE:
907 // DECLINE. The math for the dialog works, because the decline 1029 // DECLINE. The math for the dialog works, because the decline
908 // for inventory_offered, task_inventory_offer or 1030 // for inventory_offered, task_inventory_offer or
909 // group_notice_inventory is 2 greater than the offer integer value. 1031 // group_notice_inventory is 2 greater than the offer integer value.
@@ -941,7 +1063,7 @@ void inventory_offer_callback(S32 option, void* user_data)
941 } 1063 }
942 1064
943 } 1065 }
944 if (!info->mFromGroup && !info->mFromObject) 1066 if (busy || (!info->mFromGroup && !info->mFromObject))
945 { 1067 {
946 busy_message(msg,info->mFromID); 1068 busy_message(msg,info->mFromID);
947 } 1069 }
@@ -964,88 +1086,73 @@ void inventory_offer_callback(S32 option, void* user_data)
964 1086
965void inventory_offer_handler(LLOfferInfo* info, BOOL from_task) 1087void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)
966{ 1088{
967 switch(info->mType) 1089
1090 //Until throttling is implmented, busy mode should reject inventory instead of silently
1091 //accepting it. SEE SL-39554
1092 if (gAgent.getBusy())
1093 {
1094 inventory_offer_callback(IOR_BUSY, info);
1095 return;
1096 }
1097
1098 //If muted, don't even go through the messaging stuff. Just curtail the offer here.
1099 if (gMuteListp->isMuted(info->mFromID, info->mFromName))
1100 {
1101 inventory_offer_callback(IOR_MUTE, info);
1102 return;
1103 }
1104
1105 if (gSavedSettings.getBOOL("ShowNewInventory")
1106 && (info->mType == LLAssetType::AT_NOTECARD
1107 || info->mType == LLAssetType::AT_LANDMARK
1108 || info->mType == LLAssetType::AT_TEXTURE))
968 { 1109 {
969 // For certain types, just accept the items into the inventory, 1110 // For certain types, just accept the items into the inventory,
970 // and we'll automatically open them on receipt. 1111 // and we'll automatically open them on receipt.
971 case LLAssetType::AT_NOTECARD: 1112 // 0 = accept button
972 case LLAssetType::AT_LANDMARK: 1113 inventory_offer_callback(IOR_ACCEPT, info);
973 case LLAssetType::AT_TEXTURE: 1114 return;
974 { 1115 }
975 // 0 = accept button 1116
976 inventory_offer_callback(0, info); 1117 LLString::format_map_t args;
977 //LLInventoryView::sOpenNextNewItem = TRUE; 1118 args["[OBJECTNAME]"] = info->mDesc;
978 } 1119 args["[OBJECTTYPE]"] = LLAssetType::lookupHumanReadable(info->mType);
979 break; 1120
980 1121 // Name cache callbacks don't store userdata, so can't save
981 case LLAssetType::AT_SOUND: 1122 // off the LLOfferInfo. Argh. JC
982 case LLAssetType::AT_CALLINGCARD: 1123 BOOL name_found = FALSE;
983 case LLAssetType::AT_SCRIPT: 1124 char first_name[MAX_STRING]; /* Flawfinder: ignore */
984 case LLAssetType::AT_CLOTHING: 1125 char last_name[MAX_STRING]; /* Flawfinder: ignore */
985 case LLAssetType::AT_OBJECT: 1126 if (info->mFromGroup)
986 case LLAssetType::AT_CATEGORY: 1127 {
987 case LLAssetType::AT_ROOT_CATEGORY: 1128 if (gCacheName->getGroupName(info->mFromID, first_name))
988 case LLAssetType::AT_LSL_TEXT: 1129 {
989 case LLAssetType::AT_LSL_BYTECODE: 1130 args["[FIRST]"] = first_name;
990 case LLAssetType::AT_TEXTURE_TGA: 1131 args["[LAST]"] = "";
991 case LLAssetType::AT_BODYPART: 1132 name_found = TRUE;
992 case LLAssetType::AT_TRASH: 1133 }
993 case LLAssetType::AT_SNAPSHOT_CATEGORY: 1134 }
994 case LLAssetType::AT_LOST_AND_FOUND: 1135 else
995 case LLAssetType::AT_ANIMATION: 1136 {
996 case LLAssetType::AT_GESTURE: 1137 if (gCacheName->getName(info->mFromID, first_name, last_name))
997 default: 1138 {
998 { 1139 args["[FIRST]"] = first_name;
999 LLString::format_map_t args; 1140 args["[LAST]"] = last_name;
1000 args["[OBJECTNAME]"] = info->mDesc; 1141 name_found = TRUE;
1001 args["[OBJECTTYPE]"] = LLAssetType::lookupHumanReadable(info->mType); 1142 }
1002 1143 }
1003 // Name cache callbacks don't store userdata, so can't save 1144 if (from_task)
1004 // off the LLOfferInfo. Argh. JC 1145 {
1005 BOOL name_found = FALSE; 1146 args["[OBJECTFROMNAME]"] = info->mFromName;
1006 char first_name[MAX_STRING]; /* Flawfinder: ignore */ 1147 LLNotifyBox::showXml(name_found ? "ObjectGiveItem" : "ObjectGiveItemUnknownUser",
1007 char last_name[MAX_STRING]; /* Flawfinder: ignore */ 1148 args, &inventory_offer_callback, (void*)info);
1008 if (info->mFromGroup) 1149 }
1009 { 1150 else
1010 if (gCacheName->getGroupName(info->mFromID, first_name)) 1151 {
1011 { 1152 // XUI:translate -> [FIRST] [LAST]
1012 args["[FIRST]"] = first_name; 1153 args["[NAME]"] = info->mFromName;
1013 args["[LAST]"] = ""; 1154 LLNotifyBox::showXml("UserGiveItem", args,
1014 name_found = TRUE; 1155 &inventory_offer_callback, (void*)info);
1015 }
1016 }
1017 else
1018 {
1019 if (gCacheName->getName(info->mFromID, first_name, last_name))
1020 {
1021 args["[FIRST]"] = first_name;
1022 args["[LAST]"] = last_name;
1023 name_found = TRUE;
1024 }
1025 }
1026 if (from_task)
1027 {
1028 args["[OBJECTFROMNAME]"] = info->mFromName;
1029 if (name_found)
1030 {
1031 LLNotifyBox::showXml("ObjectGiveItem", args,
1032 &inventory_offer_callback, (void*)info);
1033 }
1034 else
1035 {
1036 LLNotifyBox::showXml("ObjectGiveItemUnknownUser", args,
1037 &inventory_offer_callback, (void*)info);
1038 }
1039 }
1040 else
1041 {
1042 // XUI:translate -> [FIRST] [LAST]
1043 args["[NAME]"] = info->mFromName;
1044 LLNotifyBox::showXml("UserGiveItem", args,
1045 &inventory_offer_callback, (void*)info);
1046 }
1047 break;
1048 }
1049 } 1156 }
1050} 1157}
1051 1158
@@ -1538,10 +1645,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
1538 } 1645 }
1539 else 1646 else
1540 { 1647 {
1541 if (dialog == IM_TASK_INVENTORY_OFFERED) 1648 inventory_offer_handler(info, dialog == IM_TASK_INVENTORY_OFFERED);
1542 inventory_offer_handler(info, TRUE);
1543 else
1544 inventory_offer_handler(info, FALSE);
1545 } 1649 }
1546 } 1650 }
1547 break; 1651 break;
@@ -1760,6 +1864,14 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
1760 1864
1761 case IM_GOTO_URL: 1865 case IM_GOTO_URL:
1762 { 1866 {
1867 if (binary_bucket_size <= 0)
1868 {
1869 llwarns << "bad binary_bucket_size: "
1870 << binary_bucket_size
1871 << " - aborting function." << llendl;
1872 return;
1873 }
1874
1763 char* url = new char[binary_bucket_size]; 1875 char* url = new char[binary_bucket_size];
1764 if (url == NULL) 1876 if (url == NULL)
1765 { 1877 {
@@ -1985,16 +2097,22 @@ void process_offer_callingcard(LLMessageSystem* msg, void**)
1985 { 2097 {
1986 // automatically decline offer 2098 // automatically decline offer
1987 callingcard_offer_callback(1, (void*)offerdata); 2099 callingcard_offer_callback(1, (void*)offerdata);
1988 return; 2100 offerdata = NULL; // pointer was freed by callback
2101 }
2102 else
2103 {
2104 LLNotifyBox::showXml("OfferCallingCard", args,
2105 &callingcard_offer_callback, (void*)offerdata);
2106 offerdata = NULL; // pointer ownership transferred
1989 } 2107 }
1990
1991 LLNotifyBox::showXml("OfferCallingCard", args,
1992 &callingcard_offer_callback, (void*)offerdata);
1993 } 2108 }
1994 else 2109 else
1995 { 2110 {
1996 llwarns << "Calling card offer from an unknown source." << llendl; 2111 llwarns << "Calling card offer from an unknown source." << llendl;
1997 } 2112 }
2113
2114 delete offerdata; // !=NULL if we didn't give ownership away
2115 offerdata = NULL;
1998} 2116}
1999 2117
2000void process_accept_callingcard(LLMessageSystem* msg, void**) 2118void process_accept_callingcard(LLMessageSystem* msg, void**)
@@ -3609,7 +3727,7 @@ void process_avatar_sit_response(LLMessageSystem *mesgsys, void **user_data)
3609 if (object) 3727 if (object)
3610 { 3728 {
3611 LLVector3 sit_spot = object->getPositionAgent() + (sitPosition * object->getRotation()); 3729 LLVector3 sit_spot = object->getPositionAgent() + (sitPosition * object->getRotation());
3612 if (!use_autopilot || (avatar->mIsSitting && avatar->getRoot() == object->getRoot())) 3730 if (!use_autopilot || (avatar && avatar->mIsSitting && avatar->getRoot() == object->getRoot()))
3613 { 3731 {
3614 //we're already sitting on this object, so don't autopilot 3732 //we're already sitting on this object, so don't autopilot
3615 } 3733 }
@@ -5002,9 +5120,10 @@ void onCovenantLoadComplete(LLVFS *vfs,
5002 5120
5003 if( (file_length > 19) && !strncmp( buffer, "Linden text version", 19 ) ) 5121 if( (file_length > 19) && !strncmp( buffer, "Linden text version", 19 ) )
5004 { 5122 {
5005 LLViewerTextEditor* editor = new LLViewerTextEditor("temp", 5123 LLViewerTextEditor* editor =
5006 LLRect(0,0,0,0), 5124 new LLViewerTextEditor("temp",
5007 file_length+1); 5125 LLRect(0,0,0,0),
5126 file_length+1);
5008 if( !editor->importBuffer( buffer ) ) 5127 if( !editor->importBuffer( buffer ) )
5009 { 5128 {
5010 llwarns << "Problem importing estate covenant." << llendl; 5129 llwarns << "Problem importing estate covenant." << llendl;
@@ -5020,27 +5139,32 @@ void onCovenantLoadComplete(LLVFS *vfs,
5020 } 5139 }
5021 else 5140 else
5022 { 5141 {
5023 if( gViewerStats ) 5142 llwarns << "Problem importing estate covenant: Covenant file format error." << llendl;
5024 { 5143 covenant_text = "Problem importing estate covenant: Covenant file format error.";
5025 gViewerStats->incStat( LLViewerStats::ST_DOWNLOAD_FAILED ); 5144 }
5026 } 5145 }
5027 5146 else
5028 if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status || 5147 {
5029 LL_ERR_FILE_EMPTY == status) 5148 if( gViewerStats )
5030 { 5149 {
5031 covenant_text = "Estate covenant notecard is missing from database."; 5150 gViewerStats->incStat( LLViewerStats::ST_DOWNLOAD_FAILED );
5032 }
5033 else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)
5034 {
5035 covenant_text = "Insufficient permissions to view estate covenant.";
5036 }
5037 else
5038 {
5039 covenant_text = "Unable to load estate covenant at this time.";
5040 }
5041
5042 llwarns << "Problem loading notecard: " << status << llendl;
5043 } 5151 }
5152
5153 if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status ||
5154 LL_ERR_FILE_EMPTY == status)
5155 {
5156 covenant_text = "Estate covenant notecard is missing from database.";
5157 }
5158 else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)
5159 {
5160 covenant_text = "Insufficient permissions to view estate covenant.";
5161 }
5162 else
5163 {
5164 covenant_text = "Unable to load estate covenant at this time.";
5165 }
5166
5167 llwarns << "Problem loading notecard: " << status << llendl;
5044 } 5168 }
5045 LLPanelEstateCovenant::updateCovenantText(covenant_text, asset_uuid); 5169 LLPanelEstateCovenant::updateCovenantText(covenant_text, asset_uuid);
5046 LLPanelLandCovenant::updateCovenantText(covenant_text); 5170 LLPanelLandCovenant::updateCovenantText(covenant_text);
diff --git a/linden/indra/newview/llviewermessage.h b/linden/indra/newview/llviewermessage.h
index ce8f6a7..14f2cda 100644
--- a/linden/indra/newview/llviewermessage.h
+++ b/linden/indra/newview/llviewermessage.h
@@ -48,6 +48,14 @@ class LLViewerRegion;
48// Prototypes 48// Prototypes
49// 49//
50 50
51enum InventoryOfferResponse
52{
53 IOR_ACCEPT,
54 IOR_DECLINE,
55 IOR_MUTE,
56 IOR_BUSY
57};
58
51BOOL can_afford_transaction(S32 cost); 59BOOL can_afford_transaction(S32 cost);
52void give_money(const LLUUID& uuid, LLViewerRegion* region, S32 amount, BOOL is_group = FALSE, 60void give_money(const LLUUID& uuid, LLViewerRegion* region, S32 amount, BOOL is_group = FALSE,
53 S32 trx_type = TRANS_GIFT, const LLString& desc = LLString::null); 61 S32 trx_type = TRANS_GIFT, const LLString& desc = LLString::null);
@@ -190,6 +198,7 @@ void invalid_message_callback(LLMessageSystem*, void*, EMessageException);
190 198
191void process_initiate_download(LLMessageSystem* msg, void**); 199void process_initiate_download(LLMessageSystem* msg, void**);
192void inventory_offer_callback(S32 option, void* user_data); 200void inventory_offer_callback(S32 option, void* user_data);
201void start_new_inventory_observer();
193 202
194struct LLOfferInfo 203struct LLOfferInfo
195{ 204{
diff --git a/linden/indra/newview/llviewerobject.cpp b/linden/indra/newview/llviewerobject.cpp
index 5cb65b6..58d57b5 100644
--- a/linden/indra/newview/llviewerobject.cpp
+++ b/linden/indra/newview/llviewerobject.cpp
@@ -639,10 +639,10 @@ BOOL LLViewerObject::setDrawableParent(LLDrawable* parentp)
639} 639}
640 640
641U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, 641U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
642 void **user_data, 642 void **user_data,
643 U32 block_num, 643 U32 block_num,
644 const EObjectUpdateType update_type, 644 const EObjectUpdateType update_type,
645 LLDataPacker *dp) 645 LLDataPacker *dp)
646{ 646{
647 LLMemType mt(LLMemType::MTYPE_OBJECT); 647 LLMemType mt(LLMemType::MTYPE_OBJECT);
648 648
@@ -658,6 +658,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
658 from_region_handle(region_handle, &x, &y); 658 from_region_handle(region_handle, &x, &y);
659 659
660 llerrs << "Object has invalid region " << x << ":" << y << "!" << llendl; 660 llerrs << "Object has invalid region " << x << ":" << y << "!" << llendl;
661 return retval;
661 } 662 }
662 663
663 U16 time_dilation16; 664 U16 time_dilation16;
@@ -934,7 +935,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
934 935
935 // Check for appended generic data 936 // Check for appended generic data
936 S32 data_size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_Data); 937 S32 data_size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_Data);
937 if (data_size == 0) 938 if (data_size <= 0)
938 { 939 {
939 mData = NULL; 940 mData = NULL;
940 } 941 }
@@ -1757,9 +1758,16 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
1757 if (gPingInterpolate) 1758 if (gPingInterpolate)
1758 { 1759 {
1759 LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mesgsys->getSender()); 1760 LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mesgsys->getSender());
1760 F32 ping_delay = 0.5f * mTimeDilation * ( ((F32)cdp->getPingDelay()) * 0.001f + gFrameDTClamped); 1761 if (cdp)
1761 LLVector3 diff = getVelocity() * (0.5f*mTimeDilation*(gFrameDTClamped + ((F32)ping_delay)*0.001f)); 1762 {
1762 new_pos_parent += diff; 1763 F32 ping_delay = 0.5f * mTimeDilation * ( ((F32)cdp->getPingDelay()) * 0.001f + gFrameDTClamped);
1764 LLVector3 diff = getVelocity() * (0.5f*mTimeDilation*(gFrameDTClamped + ((F32)ping_delay)*0.001f));
1765 new_pos_parent += diff;
1766 }
1767 else
1768 {
1769 llwarns << "findCircuit() returned NULL; skipping interpolation" << llendl;
1770 }
1763 } 1771 }
1764 1772
1765 ////////////////////////// 1773 //////////////////////////
@@ -4134,7 +4142,7 @@ void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& ow
4134 { 4142 {
4135 return; 4143 return;
4136 } 4144 }
4137 4145
4138 if (audio_uuid.isNull()) 4146 if (audio_uuid.isNull())
4139 { 4147 {
4140 if (mAudioSourcep && mAudioSourcep->isLoop() && !mAudioSourcep->hasPendingPreloads()) 4148 if (mAudioSourcep && mAudioSourcep->isLoop() && !mAudioSourcep->hasPendingPreloads())
@@ -4169,7 +4177,8 @@ void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& ow
4169 } 4177 }
4170 } 4178 }
4171 4179
4172 if ( mAudioSourcep ) 4180 // don't clean up before previous sound is done. Solves: SL-33486
4181 if ( mAudioSourcep && mAudioSourcep->isDone() )
4173 { 4182 {
4174 gAudiop->cleanupAudioSource(mAudioSourcep); 4183 gAudiop->cleanupAudioSource(mAudioSourcep);
4175 mAudioSourcep = NULL; 4184 mAudioSourcep = NULL;
diff --git a/linden/indra/newview/llviewerparceloverlay.cpp b/linden/indra/newview/llviewerparceloverlay.cpp
index d5ad910..e31b714 100644
--- a/linden/indra/newview/llviewerparceloverlay.cpp
+++ b/linden/indra/newview/llviewerparceloverlay.cpp
@@ -485,20 +485,21 @@ void LLViewerParcelOverlay::updatePropertyLines()
485 // shuffling. 485 // shuffling.
486 S32 new_vertex_count = new_vertex_array.count(); 486 S32 new_vertex_count = new_vertex_array.count();
487 487
488 // NOTE: If the new_vertex_count is 0 and wasn't 0 previously 488 if (!(mVertexArray && mColorArray && new_vertex_count == mVertexCount))
489 // the arrays are still allocated as the arrays aren't set to NULL, etc.
490 // This won't cause any problems, but might waste a few cycles copying over
491 // old data. - jwolk
492 if ( !(mVertexArray && mColorArray && new_vertex_count == mVertexCount) && new_vertex_count > 0 )
493 { 489 {
494 // ...need new arrays 490 // ...need new arrays
495 delete[] mVertexArray; 491 delete[] mVertexArray;
492 mVertexArray = NULL;
496 delete[] mColorArray; 493 delete[] mColorArray;
494 mColorArray = NULL;
497 495
498 mVertexCount = new_vertex_count; 496 mVertexCount = new_vertex_count;
499 497
500 mVertexArray = new F32[3 * mVertexCount]; 498 if (new_vertex_count > 0)
501 mColorArray = new U8 [4 * mVertexCount]; 499 {
500 mVertexArray = new F32[3 * mVertexCount];
501 mColorArray = new U8 [4 * mVertexCount];
502 }
502 } 503 }
503 504
504 // Copy the new data into the arrays 505 // Copy the new data into the arrays
diff --git a/linden/indra/newview/llviewerwindow.cpp b/linden/indra/newview/llviewerwindow.cpp
index 9498dbd..c57c84a 100644
--- a/linden/indra/newview/llviewerwindow.cpp
+++ b/linden/indra/newview/llviewerwindow.cpp
@@ -1504,27 +1504,8 @@ LLViewerWindow::LLViewerWindow(
1504 // stuff like AGP if we think that it'll crash the viewer. 1504 // stuff like AGP if we think that it'll crash the viewer.
1505 // 1505 //
1506 gFeatureManagerp->initGraphicsFeatureMasks(); 1506 gFeatureManagerp->initGraphicsFeatureMasks();
1507
1508 // The ATI Mobility Radeon with 1.15.0 causes crashes in FMOD on startup for
1509 // unknown reasons, but only if you have an old settings.ini file.
1510 // In this case, force the graphics settings back to recommended, but only
1511 // do it once. JC
1512 std::string gpu_string = gFeatureManagerp->getGPUString();
1513 LLString::toLower(gpu_string);
1514 bool upgrade_to_1_15 = (gSavedSettings.getString("LastRunVersion") != "1.15.0");
1515 bool mobility_radeon = (gpu_string.find("mobility radeon") != std::string::npos);
1516 bool mobility_radeon_upgrade_hack = upgrade_to_1_15 && mobility_radeon;
1517 if (mobility_radeon_upgrade_hack)
1518 {
1519 llinfos << "1.15.0 update on Mobility Radeon" << llendl;
1520 llinfos << "Forcing recommended graphics settings" << llendl;
1521 llinfos << "Forcing audio off" << llendl;
1522 gUseAudio = FALSE;
1523 }
1524
1525 if (gFeatureManagerp->isSafe() 1507 if (gFeatureManagerp->isSafe()
1526 || (gSavedSettings.getS32("LastFeatureVersion") != gFeatureManagerp->getVersion()) 1508 || (gSavedSettings.getS32("LastFeatureVersion") != gFeatureManagerp->getVersion()))
1527 || mobility_radeon_upgrade_hack)
1528 { 1509 {
1529 gFeatureManagerp->applyRecommendedFeatures(); 1510 gFeatureManagerp->applyRecommendedFeatures();
1530 } 1511 }
@@ -1747,7 +1728,7 @@ void LLViewerWindow::initBase()
1747 mToolTip->setBorderVisible( FALSE ); 1728 mToolTip->setBorderVisible( FALSE );
1748 mToolTip->setBackgroundColor( gColors.getColor( "ToolTipBgColor" ) ); 1729 mToolTip->setBackgroundColor( gColors.getColor( "ToolTipBgColor" ) );
1749 mToolTip->setBackgroundVisible( TRUE ); 1730 mToolTip->setBackgroundVisible( TRUE );
1750 mToolTip->setDropshadowVisible( FALSE ); 1731 mToolTip->setFontStyle(LLFontGL::NORMAL);
1751 mToolTip->setBorderDropshadowVisible( TRUE ); 1732 mToolTip->setBorderDropshadowVisible( TRUE );
1752 mToolTip->setVisible( FALSE ); 1733 mToolTip->setVisible( FALSE );
1753 1734
diff --git a/linden/indra/newview/llvlcomposition.cpp b/linden/indra/newview/llvlcomposition.cpp
index af0fe96..370bf24 100644
--- a/linden/indra/newview/llvlcomposition.cpp
+++ b/linden/indra/newview/llvlcomposition.cpp
@@ -126,6 +126,13 @@ BOOL LLVLComposition::generateHeights(const F32 x, const F32 y,
126 } 126 }
127 127
128 llassert(mSurfacep); 128 llassert(mSurfacep);
129
130 if (!mSurfacep || !mSurfacep->getRegion())
131 {
132 // We don't always have the region yet here....
133 return FALSE;
134 }
135
129 S32 x_begin, y_begin, x_end, y_end; 136 S32 x_begin, y_begin, x_end, y_end;
130 137
131 x_begin = llround( x * mScaleInv ); 138 x_begin = llround( x * mScaleInv );
diff --git a/linden/indra/newview/llvoavatar.cpp b/linden/indra/newview/llvoavatar.cpp
index 25c6eb6..37380a4 100644
--- a/linden/indra/newview/llvoavatar.cpp
+++ b/linden/indra/newview/llvoavatar.cpp
@@ -1486,6 +1486,7 @@ void LLVOAvatar::initClass()
1486 if (!root) 1486 if (!root)
1487 { 1487 {
1488 llerrs << "No root node found in avatar configuration file: " << xmlFile << llendl; 1488 llerrs << "No root node found in avatar configuration file: " << xmlFile << llendl;
1489 return;
1489 } 1490 }
1490 1491
1491 //------------------------------------------------------------------------- 1492 //-------------------------------------------------------------------------
@@ -1893,6 +1894,7 @@ void LLVOAvatar::buildCharacter()
1893 mEyeRightp)) 1894 mEyeRightp))
1894 { 1895 {
1895 llerrs << "Failed to create avatar." << llendl; 1896 llerrs << "Failed to create avatar." << llendl;
1897 return;
1896 } 1898 }
1897 1899
1898 //------------------------------------------------------------------------- 1900 //-------------------------------------------------------------------------
@@ -2461,7 +2463,7 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
2461 2463
2462 if (LLVOAvatar::sJointDebug) 2464 if (LLVOAvatar::sJointDebug)
2463 { 2465 {
2464 llinfos << getNVPair("FirstName")->getString() << getNVPair("LastName")->getString() << ": joint touches: " << LLJoint::sNumTouches << " updates: " << LLJoint::sNumUpdates << llendl; 2466 llinfos << getFullname() << ": joint touches: " << LLJoint::sNumTouches << " updates: " << LLJoint::sNumUpdates << llendl;
2465 } 2467 }
2466 2468
2467 LLJoint::sNumUpdates = 0; 2469 LLJoint::sNumUpdates = 0;
@@ -4809,7 +4811,7 @@ BOOL LLVOAvatar::allocateCollisionVolumes( U32 num )
4809LLJoint *LLVOAvatar::getCharacterJoint( U32 num ) 4811LLJoint *LLVOAvatar::getCharacterJoint( U32 num )
4810{ 4812{
4811 if ((S32)num >= mNumJoints 4813 if ((S32)num >= mNumJoints
4812 || num < 0) 4814 || (S32)num < 0)
4813 { 4815 {
4814 return NULL; 4816 return NULL;
4815 } 4817 }
diff --git a/linden/indra/newview/llvoclouds.cpp b/linden/indra/newview/llvoclouds.cpp
index 24084cf..be7c1b1 100644
--- a/linden/indra/newview/llvoclouds.cpp
+++ b/linden/indra/newview/llvoclouds.cpp
@@ -126,6 +126,12 @@ BOOL LLVOClouds::updateGeometry(LLDrawable *drawable)
126 for ( ; face_indx < num_faces; face_indx++) 126 for ( ; face_indx < num_faces; face_indx++)
127 { 127 {
128 facep = drawable->getFace(face_indx); 128 facep = drawable->getFace(face_indx);
129 if (!facep)
130 {
131 llwarns << "No facep for index " << face_indx << llendl;
132 continue;
133 }
134
129 if (isParticle()) 135 if (isParticle())
130 { 136 {
131 facep->setSize(1,1); 137 facep->setSize(1,1);
@@ -143,6 +149,12 @@ BOOL LLVOClouds::updateGeometry(LLDrawable *drawable)
143 for ( ; face_indx < drawable->getNumFaces(); face_indx++) 149 for ( ; face_indx < drawable->getNumFaces(); face_indx++)
144 { 150 {
145 facep = drawable->getFace(face_indx); 151 facep = drawable->getFace(face_indx);
152 if (!facep)
153 {
154 llwarns << "No facep for index " << face_indx << llendl;
155 continue;
156 }
157
146 facep->setTEOffset(face_indx); 158 facep->setTEOffset(face_indx);
147 facep->setSize(0,0); 159 facep->setSize(0,0);
148 } 160 }
diff --git a/linden/indra/newview/llvopartgroup.cpp b/linden/indra/newview/llvopartgroup.cpp
index 28aeb29..fbf753a 100644
--- a/linden/indra/newview/llvopartgroup.cpp
+++ b/linden/indra/newview/llvopartgroup.cpp
@@ -151,7 +151,7 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
151 151
152 if (!num_parts) 152 if (!num_parts)
153 { 153 {
154 if (drawable->getNumFaces()) 154 if (group && drawable->getNumFaces())
155 { 155 {
156 group->dirtyGeom(); 156 group->dirtyGeom();
157 } 157 }
@@ -206,6 +206,12 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
206 count++; 206 count++;
207 207
208 facep = drawable->getFace(i); 208 facep = drawable->getFace(i);
209 if (!facep)
210 {
211 llwarns << "No face found for index " << i << "!" << llendl;
212 continue;
213 }
214
209 facep->setTEOffset(i); 215 facep->setTEOffset(i);
210 const F32 NEAR_PART_DIST_SQ = 5.f*5.f; // Only discard particles > 5 m from the camera 216 const F32 NEAR_PART_DIST_SQ = 5.f*5.f; // Only discard particles > 5 m from the camera
211 const F32 MIN_PART_AREA = .005f*.005f; // only less than 5 mm x 5 mm at 1 m from camera 217 const F32 MIN_PART_AREA = .005f*.005f; // only less than 5 mm x 5 mm at 1 m from camera
@@ -259,6 +265,11 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
259 for (i = count; i < drawable->getNumFaces(); i++) 265 for (i = count; i < drawable->getNumFaces(); i++)
260 { 266 {
261 LLFace* facep = drawable->getFace(i); 267 LLFace* facep = drawable->getFace(i);
268 if (!facep)
269 {
270 llwarns << "No face found for index " << i << "!" << llendl;
271 continue;
272 }
262 facep->setTEOffset(i); 273 facep->setTEOffset(i);
263 facep->setSize(0,0); 274 facep->setSize(0,0);
264 } 275 }
diff --git a/linden/indra/newview/llwindebug.cpp b/linden/indra/newview/llwindebug.cpp
index 6221b85..7433984 100644
--- a/linden/indra/newview/llwindebug.cpp
+++ b/linden/indra/newview/llwindebug.cpp
@@ -131,6 +131,8 @@ BOOL LLWinDebug::setupExceptionHandler()
131 if (!f_mdwp) 131 if (!f_mdwp)
132 { 132 {
133 write_debug("No MiniDumpWriteDump!\n"); 133 write_debug("No MiniDumpWriteDump!\n");
134 FreeLibrary(hDll);
135 hDll = NULL;
134 ok = FALSE; 136 ok = FALSE;
135 } 137 }
136 } 138 }
diff --git a/linden/indra/newview/llworldmap.cpp b/linden/indra/newview/llworldmap.cpp
index f2a2c90..db7ac19 100644
--- a/linden/indra/newview/llworldmap.cpp
+++ b/linden/indra/newview/llworldmap.cpp
@@ -491,7 +491,7 @@ void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**)
491 U32 agent_flags; 491 U32 agent_flags;
492 msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags); 492 msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags);
493 493
494 if (agent_flags < 0 || agent_flags >= MAP_SIM_IMAGE_TYPES) 494 if ((S32)agent_flags < 0 || agent_flags >= MAP_SIM_IMAGE_TYPES)
495 { 495 {
496 llwarns << "Invalid map image type returned! " << agent_flags << llendl; 496 llwarns << "Invalid map image type returned! " << agent_flags << llendl;
497 return; 497 return;
diff --git a/linden/indra/newview/llworldmapview.cpp b/linden/indra/newview/llworldmapview.cpp
index 01dd1b8..328af72 100644
--- a/linden/indra/newview/llworldmapview.cpp
+++ b/linden/indra/newview/llworldmapview.cpp
@@ -178,7 +178,6 @@ LLWorldMapView::LLWorldMapView(const std::string& name, const LLRect& rect )
178 LLRect major_dir_rect( 0, DIR_HEIGHT, DIR_WIDTH, 0 ); 178 LLRect major_dir_rect( 0, DIR_HEIGHT, DIR_WIDTH, 0 );
179 179
180 mTextBoxNorth = new LLTextBox( "N", major_dir_rect ); 180 mTextBoxNorth = new LLTextBox( "N", major_dir_rect );
181 mTextBoxNorth->setDropshadowVisible( TRUE );
182 addChild( mTextBoxNorth ); 181 addChild( mTextBoxNorth );
183 182
184 LLColor4 minor_color( 1.f, 1.f, 1.f, .7f ); 183 LLColor4 minor_color( 1.f, 1.f, 1.f, .7f );
diff --git a/linden/indra/newview/macview.xcodeproj/project.pbxproj b/linden/indra/newview/macview.xcodeproj/project.pbxproj
index 9534878..8bc52b1 100644
--- a/linden/indra/newview/macview.xcodeproj/project.pbxproj
+++ b/linden/indra/newview/macview.xcodeproj/project.pbxproj
@@ -40,6 +40,8 @@
40 1A758C940A436FD800589675 /* llpanellandobjects.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A758C930A436FD800589675 /* llpanellandobjects.cpp */; }; 40 1A758C940A436FD800589675 /* llpanellandobjects.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A758C930A436FD800589675 /* llpanellandobjects.cpp */; };
41 1A758C960A436FDE00589675 /* llpanellandoptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A758C950A436FDE00589675 /* llpanellandoptions.cpp */; }; 41 1A758C960A436FDE00589675 /* llpanellandoptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A758C950A436FDE00589675 /* llpanellandoptions.cpp */; };
42 1A83767E0BA2169600F28979 /* llviewergenericmessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A83767D0BA2169600F28979 /* llviewergenericmessage.cpp */; }; 42 1A83767E0BA2169600F28979 /* llviewergenericmessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A83767D0BA2169600F28979 /* llviewergenericmessage.cpp */; };
43 1A8870D50BCC5A6300E89AA6 /* llinventorytype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A8870D40BCC5A6300E89AA6 /* llinventorytype.cpp */; };
44 1A8870E50BCC5A9500E89AA6 /* llviewermenufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A8870E40BCC5A9500E89AA6 /* llviewermenufile.cpp */; };
43 1A89230508B12D1000A04AA9 /* llurlwhitelist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A89230308B12D1000A04AA9 /* llurlwhitelist.cpp */; }; 45 1A89230508B12D1000A04AA9 /* llurlwhitelist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A89230308B12D1000A04AA9 /* llurlwhitelist.cpp */; };
44 1A89230808B12D2E00A04AA9 /* llfloateropenobject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A89230608B12D2E00A04AA9 /* llfloateropenobject.cpp */; }; 46 1A89230808B12D2E00A04AA9 /* llfloateropenobject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A89230608B12D2E00A04AA9 /* llfloateropenobject.cpp */; };
45 1A89230A08B12D9900A04AA9 /* llmediabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A89230908B12D9800A04AA9 /* llmediabase.cpp */; }; 47 1A89230A08B12D9900A04AA9 /* llmediabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A89230908B12D9800A04AA9 /* llmediabase.cpp */; };
@@ -850,6 +852,11 @@
850 1A758C990A43700400589675 /* llagentdata.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llagentdata.h; sourceTree = "<group>"; }; 852 1A758C990A43700400589675 /* llagentdata.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llagentdata.h; sourceTree = "<group>"; };
851 1A83767C0BA2169600F28979 /* llviewergenericmessage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llviewergenericmessage.h; sourceTree = "<group>"; }; 853 1A83767C0BA2169600F28979 /* llviewergenericmessage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llviewergenericmessage.h; sourceTree = "<group>"; };
852 1A83767D0BA2169600F28979 /* llviewergenericmessage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llviewergenericmessage.cpp; sourceTree = "<group>"; }; 854 1A83767D0BA2169600F28979 /* llviewergenericmessage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llviewergenericmessage.cpp; sourceTree = "<group>"; };
855 1A8870D30BCC5A6300E89AA6 /* llinventorytype.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llinventorytype.h; sourceTree = "<group>"; };
856 1A8870D40BCC5A6300E89AA6 /* llinventorytype.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llinventorytype.cpp; sourceTree = "<group>"; };
857 1A8870E30BCC5A9500E89AA6 /* llviewermenufile.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llviewermenufile.h; sourceTree = "<group>"; };
858 1A8870E40BCC5A9500E89AA6 /* llviewermenufile.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llviewermenufile.cpp; sourceTree = "<group>"; };
859 1A8870E60BCC5AAD00E89AA6 /* llresourcedata.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llresourcedata.h; sourceTree = "<group>"; };
853 1A89230308B12D1000A04AA9 /* llurlwhitelist.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llurlwhitelist.cpp; sourceTree = "<group>"; }; 860 1A89230308B12D1000A04AA9 /* llurlwhitelist.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llurlwhitelist.cpp; sourceTree = "<group>"; };
854 1A89230408B12D1000A04AA9 /* llurlwhitelist.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llurlwhitelist.h; sourceTree = "<group>"; }; 861 1A89230408B12D1000A04AA9 /* llurlwhitelist.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llurlwhitelist.h; sourceTree = "<group>"; };
855 1A89230608B12D2E00A04AA9 /* llfloateropenobject.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloateropenobject.cpp; sourceTree = "<group>"; }; 862 1A89230608B12D2E00A04AA9 /* llfloateropenobject.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloateropenobject.cpp; sourceTree = "<group>"; };
@@ -2334,6 +2341,8 @@
2334 1A83767C0BA2169600F28979 /* llviewergenericmessage.h */, 2341 1A83767C0BA2169600F28979 /* llviewergenericmessage.h */,
2335 1A83767D0BA2169600F28979 /* llviewergenericmessage.cpp */, 2342 1A83767D0BA2169600F28979 /* llviewergenericmessage.cpp */,
2336 9C18425A0B9F951500208356 /* llcaphttpsender.cpp */, 2343 9C18425A0B9F951500208356 /* llcaphttpsender.cpp */,
2344 1A8870E30BCC5A9500E89AA6 /* llviewermenufile.h */,
2345 1A8870E40BCC5A9500E89AA6 /* llviewermenufile.cpp */,
2337 A3C20E4B0BB0BD12007E872B /* llviewerjoystick.cpp */, 2346 A3C20E4B0BB0BD12007E872B /* llviewerjoystick.cpp */,
2338 A3C20E490BB0BCDF007E872B /* llglslshader.cpp */, 2347 A3C20E490BB0BCDF007E872B /* llglslshader.cpp */,
2339 AAF5FFD00B13F71900D28A84 /* lltexturecache.cpp */, 2348 AAF5FFD00B13F71900D28A84 /* lltexturecache.cpp */,
@@ -2863,6 +2872,8 @@
2863 6192217F074A9B58005E1F34 /* llinventory */ = { 2872 6192217F074A9B58005E1F34 /* llinventory */ = {
2864 isa = PBXGroup; 2873 isa = PBXGroup;
2865 children = ( 2874 children = (
2875 1A8870D30BCC5A6300E89AA6 /* llinventorytype.h */,
2876 1A8870D40BCC5A6300E89AA6 /* llinventorytype.cpp */,
2866 913B26970B4DDCDA0030C3EC /* lllandmark.cpp */, 2877 913B26970B4DDCDA0030C3EC /* lllandmark.cpp */,
2867 913B26980B4DDCDA0030C3EC /* lllandmark.h */, 2878 913B26980B4DDCDA0030C3EC /* lllandmark.h */,
2868 C1F5D0A30B138AEB00827F1D /* lluserrelations.cpp */, 2879 C1F5D0A30B138AEB00827F1D /* lluserrelations.cpp */,
@@ -3499,6 +3510,7 @@
3499 isa = PBXGroup; 3510 isa = PBXGroup;
3500 children = ( 3511 children = (
3501 9C1842500B9F94F200208356 /* llcaphttpsender.h */, 3512 9C1842500B9F94F200208356 /* llcaphttpsender.h */,
3513 1A8870E60BCC5AAD00E89AA6 /* llresourcedata.h */,
3502 A3C20E4E0BB0BD49007E872B /* llviewerjoystick.h */, 3514 A3C20E4E0BB0BD49007E872B /* llviewerjoystick.h */,
3503 A3C20E4D0BB0BD37007E872B /* llglslshader.h */, 3515 A3C20E4D0BB0BD37007E872B /* llglslshader.h */,
3504 1AF7C1F20AF6C45000C4BF4A /* llweb.h */, 3516 1AF7C1F20AF6C45000C4BF4A /* llweb.h */,
@@ -4538,6 +4550,8 @@
4538 9C659A870BAB0B6E00D2EB60 /* llmessageconfig.cpp in Sources */, 4550 9C659A870BAB0B6E00D2EB60 /* llmessageconfig.cpp in Sources */,
4539 A3C20E4A0BB0BCDF007E872B /* llglslshader.cpp in Sources */, 4551 A3C20E4A0BB0BCDF007E872B /* llglslshader.cpp in Sources */,
4540 A3C20E4C0BB0BD12007E872B /* llviewerjoystick.cpp in Sources */, 4552 A3C20E4C0BB0BD12007E872B /* llviewerjoystick.cpp in Sources */,
4553 1A8870D50BCC5A6300E89AA6 /* llinventorytype.cpp in Sources */,
4554 1A8870E50BCC5A9500E89AA6 /* llviewermenufile.cpp in Sources */,
4541 ); 4555 );
4542 runOnlyForDeploymentPostprocessing = 0; 4556 runOnlyForDeploymentPostprocessing = 0;
4543 }; 4557 };
diff --git a/linden/indra/newview/newview.vcproj b/linden/indra/newview/newview.vcproj
index 33c2d90..699a2bc 100644
--- a/linden/indra/newview/newview.vcproj
+++ b/linden/indra/newview/newview.vcproj
@@ -1121,6 +1121,9 @@
1121 RelativePath=".\llviewermenu.cpp"> 1121 RelativePath=".\llviewermenu.cpp">
1122 </File> 1122 </File>
1123 <File 1123 <File
1124 RelativePath=".\llviewermenufile.cpp">
1125 </File>
1126 <File
1124 RelativePath=".\llviewermessage.cpp"> 1127 RelativePath=".\llviewermessage.cpp">
1125 </File> 1128 </File>
1126 <File 1129 <File
@@ -1942,6 +1945,9 @@
1942 RelativePath=".\llregionposition.h"> 1945 RelativePath=".\llregionposition.h">
1943 </File> 1946 </File>
1944 <File 1947 <File
1948 RelativePath=".\llresourcedata.h">
1949 </File>
1950 <File
1945 RelativePath=".\llrig.h"> 1951 RelativePath=".\llrig.h">
1946 </File> 1952 </File>
1947 <File 1953 <File
@@ -2146,6 +2152,9 @@
2146 RelativePath=".\llviewermenu.h"> 2152 RelativePath=".\llviewermenu.h">
2147 </File> 2153 </File>
2148 <File 2154 <File
2155 RelativePath=".\llviewermenufile.h">
2156 </File>
2157 <File
2149 RelativePath=".\llviewermessage.h"> 2158 RelativePath=".\llviewermessage.h">
2150 </File> 2159 </File>
2151 <File 2160 <File
@@ -2863,6 +2872,9 @@
2863 </File> 2872 </File>
2864 </Filter> 2873 </Filter>
2865 <File 2874 <File
2875 RelativePath=".\files.lst">
2876 </File>
2877 <File
2866 RelativePath=".\llviewerprecompiledheaders.cpp"> 2878 RelativePath=".\llviewerprecompiledheaders.cpp">
2867 <FileConfiguration 2879 <FileConfiguration
2868 Name="Debug|Win32"> 2880 Name="Debug|Win32">
diff --git a/linden/indra/newview/newview_vc8.vcproj b/linden/indra/newview/newview_vc8.vcproj
index e98c4ed..4cb359b 100644
--- a/linden/indra/newview/newview_vc8.vcproj
+++ b/linden/indra/newview/newview_vc8.vcproj
@@ -41,13 +41,12 @@
41 <Tool 41 <Tool
42 Name="VCCLCompilerTool" 42 Name="VCCLCompilerTool"
43 Optimization="0" 43 Optimization="0"
44 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;" 44 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;;..\llwindow\Logitech_LCD;..\llwindow\Logitech_LCD\LCDUI"
45 PreprocessorDefinitions="WIN32;_DEBUG;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_DEBUG;XP_WIN;XP_WIN32;MOZILLA_INTERNAL_API" 45 PreprocessorDefinitions="WIN32;_DEBUG;LL_WINDOWS;LL_DEBUG;XP_WIN;XP_WIN32;MOZILLA_INTERNAL_API"
46 MinimalRebuild="false" 46 MinimalRebuild="false"
47 BasicRuntimeChecks="3" 47 BasicRuntimeChecks="3"
48 RuntimeLibrary="1" 48 RuntimeLibrary="1"
49 StructMemberAlignment="4" 49 StructMemberAlignment="4"
50 TreatWChar_tAsBuiltInType="false"
51 ForceConformanceInForLoopScope="true" 50 ForceConformanceInForLoopScope="true"
52 UsePrecompiledHeader="0" 51 UsePrecompiledHeader="0"
53 PrecompiledHeaderThrough="llviewerprecompiledheaders.h" 52 PrecompiledHeaderThrough="llviewerprecompiledheaders.h"
@@ -67,7 +66,7 @@
67 /> 66 />
68 <Tool 67 <Tool
69 Name="VCLinkerTool" 68 Name="VCLinkerTool"
70 AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc80-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib LibOpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib-vc80.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib" 69 AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc71-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib LibOpenJPEG.lib llmozlib.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib lglcd.lib"
71 OutputFile="$(ConfigurationName)/debugview.exe" 70 OutputFile="$(ConfigurationName)/debugview.exe"
72 LinkIncremental="2" 71 LinkIncremental="2"
73 AdditionalLibraryDirectories="&quot;../lib_$(ConfigurationName)/i686-win32&quot;;&quot;../../libraries/i686-win32/lib_debug&quot;" 72 AdditionalLibraryDirectories="&quot;../lib_$(ConfigurationName)/i686-win32&quot;;&quot;../../libraries/i686-win32/lib_debug&quot;"
@@ -133,7 +132,7 @@
133 Name="VCCLCompilerTool" 132 Name="VCCLCompilerTool"
134 InlineFunctionExpansion="2" 133 InlineFunctionExpansion="2"
135 EnableIntrinsicFunctions="true" 134 EnableIntrinsicFunctions="true"
136 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;" 135 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;;..\llwindow\Logitech_LCD;..\llwindow\Logitech_LCD\LCDUI"
137 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE;XP_WIN;XP_WIN32;MOZILLA_INTERNAL_API" 136 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE;XP_WIN;XP_WIN32;MOZILLA_INTERNAL_API"
138 StringPooling="true" 137 StringPooling="true"
139 RuntimeLibrary="0" 138 RuntimeLibrary="0"
@@ -158,7 +157,7 @@
158 /> 157 />
159 <Tool 158 <Tool
160 Name="VCLinkerTool" 159 Name="VCLinkerTool"
161 AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc80-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib LibOpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib-vc80.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib" 160 AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc80-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib LibOpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib-vc80.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib lglcd.lib"
162 OutputFile="$(ConfigurationName)/newview.exe" 161 OutputFile="$(ConfigurationName)/newview.exe"
163 LinkIncremental="2" 162 LinkIncremental="2"
164 AdditionalLibraryDirectories="&quot;../lib_$(ConfigurationName)/i686-win32&quot;;&quot;../../libraries/i686-win32/lib_release&quot;" 163 AdditionalLibraryDirectories="&quot;../lib_$(ConfigurationName)/i686-win32&quot;;&quot;../../libraries/i686-win32/lib_release&quot;"
@@ -225,12 +224,10 @@
225 /> 224 />
226 <Tool 225 <Tool
227 Name="VCCLCompilerTool" 226 Name="VCCLCompilerTool"
228 WholeProgramOptimization="true" 227 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;;..\llwindow\Logitech_LCD;..\llwindow\Logitech_LCD\LCDUI"
229 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;" 228 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;LL_RELEASE;LL_RELEASE_FOR_DOWNLOAD;XP_WIN;XP_WIN32;MOZILLA_INTERNAL_API"
230 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE;LL_RELEASE_FOR_DOWNLOAD;XP_WIN;XP_WIN32;MOZILLA_INTERNAL_API"
231 RuntimeLibrary="0" 229 RuntimeLibrary="0"
232 StructMemberAlignment="0" 230 StructMemberAlignment="0"
233 TreatWChar_tAsBuiltInType="false"
234 UsePrecompiledHeader="2" 231 UsePrecompiledHeader="2"
235 PrecompiledHeaderThrough="llviewerprecompiledheaders.h" 232 PrecompiledHeaderThrough="llviewerprecompiledheaders.h"
236 WarningLevel="3" 233 WarningLevel="3"
@@ -249,7 +246,7 @@
249 /> 246 />
250 <Tool 247 <Tool
251 Name="VCLinkerTool" 248 Name="VCLinkerTool"
252 AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc80-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib LibOpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib-vc80.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib" 249 AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc71-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib LibOpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib lglcd.lib"
253 OutputFile="$(ConfigurationName)/SecondLife.exe" 250 OutputFile="$(ConfigurationName)/SecondLife.exe"
254 LinkIncremental="0" 251 LinkIncremental="0"
255 AdditionalLibraryDirectories="&quot;../lib_release/i686-win32&quot;;&quot;../../libraries/i686-win32/lib_release&quot;" 252 AdditionalLibraryDirectories="&quot;../lib_release/i686-win32&quot;;&quot;../../libraries/i686-win32/lib_release&quot;"
@@ -259,7 +256,6 @@
259 SubSystem="2" 256 SubSystem="2"
260 OptimizeReferences="2" 257 OptimizeReferences="2"
261 EnableCOMDATFolding="2" 258 EnableCOMDATFolding="2"
262 LinkTimeCodeGeneration="1"
263 TargetMachine="1" 259 TargetMachine="1"
264 /> 260 />
265 <Tool 261 <Tool
@@ -315,15 +311,13 @@
315 <Tool 311 <Tool
316 Name="VCCLCompilerTool" 312 Name="VCCLCompilerTool"
317 Optimization="0" 313 Optimization="0"
318 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;" 314 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;;..\llwindow\Logitech_LCD;..\llwindow\Logitech_LCD\LCDUI"
319 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE;XP_WIN;XP_WIN32;MOZILLA_INTERNAL_API" 315 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;LL_RELEASE;XP_WIN;XP_WIN32;MOZILLA_INTERNAL_API"
320 RuntimeLibrary="0" 316 RuntimeLibrary="0"
321 StructMemberAlignment="0" 317 StructMemberAlignment="0"
322 TreatWChar_tAsBuiltInType="false"
323 ForceConformanceInForLoopScope="true" 318 ForceConformanceInForLoopScope="true"
324 UsePrecompiledHeader="2" 319 UsePrecompiledHeader="2"
325 PrecompiledHeaderThrough="llviewerprecompiledheaders.h" 320 PrecompiledHeaderThrough="llviewerprecompiledheaders.h"
326 BrowseInformation="1"
327 WarningLevel="3" 321 WarningLevel="3"
328 WarnAsError="true" 322 WarnAsError="true"
329 Detect64BitPortabilityProblems="false" 323 Detect64BitPortabilityProblems="false"
@@ -340,7 +334,7 @@
340 /> 334 />
341 <Tool 335 <Tool
342 Name="VCLinkerTool" 336 Name="VCLinkerTool"
343 AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc80-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib LibOpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib-vc80.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib" 337 AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc71-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib LibOpenJPEG.lib llmozlib.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib lglcd.lib"
344 OutputFile="$(ConfigurationName)/newview_noopt.exe" 338 OutputFile="$(ConfigurationName)/newview_noopt.exe"
345 LinkIncremental="2" 339 LinkIncremental="2"
346 AdditionalLibraryDirectories="&quot;../lib_releasenoopt/i686-win32&quot;;&quot;../../libraries/i686-win32/lib_release&quot;" 340 AdditionalLibraryDirectories="&quot;../lib_releasenoopt/i686-win32&quot;;&quot;../../libraries/i686-win32/lib_release&quot;"
@@ -979,6 +973,10 @@
979 > 973 >
980 </File> 974 </File>
981 <File 975 <File
976 RelativePath=".\lllcd.cpp"
977 >
978 </File>
979 <File
982 RelativePath=".\lllocalanimationobject.cpp" 980 RelativePath=".\lllocalanimationobject.cpp"
983 > 981 >
984 </File> 982 </File>
@@ -1175,6 +1173,10 @@
1175 > 1173 >
1176 </File> 1174 </File>
1177 <File 1175 <File
1176 RelativePath=".\llpanelLCD.cpp"
1177 >
1178 </File>
1179 <File
1178 RelativePath=".\llpanellogin.cpp" 1180 RelativePath=".\llpanellogin.cpp"
1179 > 1181 >
1180 </File> 1182 </File>
@@ -1753,10 +1755,6 @@
1753 > 1755 >
1754 </File> 1756 </File>
1755 <File 1757 <File
1756 RelativePath=".\llagparray.h"
1757 >
1758 </File>
1759 <File
1760 RelativePath=".\llanimalcontrols.h" 1758 RelativePath=".\llanimalcontrols.h"
1761 > 1759 >
1762 </File> 1760 </File>
@@ -1893,18 +1891,10 @@
1893 > 1891 >
1894 </File> 1892 </File>
1895 <File 1893 <File
1896 RelativePath=".\lldrawpoolclouds.h"
1897 >
1898 </File>
1899 <File
1900 RelativePath=".\lldrawpoolground.h" 1894 RelativePath=".\lldrawpoolground.h"
1901 > 1895 >
1902 </File> 1896 </File>
1903 <File 1897 <File
1904 RelativePath=".\lldrawpoolhud.h"
1905 >
1906 </File>
1907 <File
1908 RelativePath=".\lldrawpoolsimple.h" 1898 RelativePath=".\lldrawpoolsimple.h"
1909 > 1899 >
1910 </File> 1900 </File>
@@ -1925,10 +1915,6 @@
1925 > 1915 >
1926 </File> 1916 </File>
1927 <File 1917 <File
1928 RelativePath=".\lldrawpooltreenew.h"
1929 >
1930 </File>
1931 <File
1932 RelativePath=".\lldrawpoolwater.h" 1918 RelativePath=".\lldrawpoolwater.h"
1933 > 1919 >
1934 </File> 1920 </File>
@@ -2337,6 +2323,10 @@
2337 > 2323 >
2338 </File> 2324 </File>
2339 <File 2325 <File
2326 RelativePath=".\lllcd.h"
2327 >
2328 </File>
2329 <File
2340 RelativePath=".\lllightconstants.h" 2330 RelativePath=".\lllightconstants.h"
2341 > 2331 >
2342 </File> 2332 </File>
@@ -2537,6 +2527,10 @@
2537 > 2527 >
2538 </File> 2528 </File>
2539 <File 2529 <File
2530 RelativePath=".\llpanelLCD.h"
2531 >
2532 </File>
2533 <File
2540 RelativePath=".\llpanellogin.h" 2534 RelativePath=".\llpanellogin.h"
2541 > 2535 >
2542 </File> 2536 </File>
@@ -3041,10 +3035,6 @@
3041 > 3035 >
3042 </File> 3036 </File>
3043 <File 3037 <File
3044 RelativePath=".\llvotreenew.h"
3045 >
3046 </File>
3047 <File
3048 RelativePath=".\llvovolume.h" 3038 RelativePath=".\llvovolume.h"
3049 > 3039 >
3050 </File> 3040 </File>
@@ -3487,6 +3477,10 @@
3487 > 3477 >
3488 </File> 3478 </File>
3489 <File 3479 <File
3480 RelativePath=".\res\icon1.ico"
3481 >
3482 </File>
3483 <File
3490 RelativePath=".\Info-SecondLife.plist" 3484 RelativePath=".\Info-SecondLife.plist"
3491 > 3485 >
3492 </File> 3486 </File>
@@ -3507,6 +3501,10 @@
3507 > 3501 >
3508 </File> 3502 </File>
3509 <File 3503 <File
3504 RelativePath=".\skins\xui\en-us\LCD_text.xml"
3505 >
3506 </File>
3507 <File
3510 RelativePath=".\res\ll_icon.ico" 3508 RelativePath=".\res\ll_icon.ico"
3511 > 3509 >
3512 </File> 3510 </File>
@@ -3751,6 +3749,10 @@
3751 > 3749 >
3752 </File> 3750 </File>
3753 <File 3751 <File
3752 RelativePath=".\skins\xui\en-us\panel_preferences_LCD.xml"
3753 >
3754 </File>
3755 <File
3754 RelativePath=".\skins\xui\en-us\panel_preferences_network.xml" 3756 RelativePath=".\skins\xui\en-us\panel_preferences_network.xml"
3755 > 3757 >
3756 </File> 3758 </File>
diff --git a/linden/indra/newview/pipeline.cpp b/linden/indra/newview/pipeline.cpp
index 5d4618e..d030ac2 100644
--- a/linden/indra/newview/pipeline.cpp
+++ b/linden/indra/newview/pipeline.cpp
@@ -768,6 +768,7 @@ void LLPipeline::updateMoveDampedAsync(LLDrawable* drawablep)
768 if (!drawablep) 768 if (!drawablep)
769 { 769 {
770 llerrs << "updateMove called with NULL drawablep" << llendl; 770 llerrs << "updateMove called with NULL drawablep" << llendl;
771 return;
771 } 772 }
772 if (drawablep->isState(LLDrawable::EARLY_MOVE)) 773 if (drawablep->isState(LLDrawable::EARLY_MOVE))
773 { 774 {
@@ -1124,7 +1125,7 @@ void LLPipeline::updateGeom(F32 max_dtime)
1124 last_bridge = bridge; 1125 last_bridge = bridge;
1125 1126
1126 BOOL update_complete = TRUE; 1127 BOOL update_complete = TRUE;
1127 if (drawablep && !drawablep->isDead()) 1128 if (!drawablep->isDead())
1128 { 1129 {
1129 update_complete = updateDrawableGeom(drawablep, FALSE); 1130 update_complete = updateDrawableGeom(drawablep, FALSE);
1130 count++; 1131 count++;
@@ -1398,7 +1399,9 @@ void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera)
1398 LLMemType mt(LLMemType::MTYPE_PIPELINE); 1399 LLMemType mt(LLMemType::MTYPE_PIPELINE);
1399 LLFastTimer ftm(LLFastTimer::FTM_STATESORT_DRAWABLE); 1400 LLFastTimer ftm(LLFastTimer::FTM_STATESORT_DRAWABLE);
1400 1401
1401 if (drawablep->isDead() || !hasRenderType(drawablep->getRenderType())) 1402 if (!drawablep
1403 || drawablep->isDead()
1404 || !hasRenderType(drawablep->getRenderType()))
1402 { 1405 {
1403 return; 1406 return;
1404 } 1407 }
@@ -1412,7 +1415,7 @@ void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera)
1412 } 1415 }
1413 } 1416 }
1414 1417
1415 if (drawablep && (hasRenderType(drawablep->mRenderType))) 1418 if (hasRenderType(drawablep->mRenderType))
1416 { 1419 {
1417 if (!drawablep->isState(LLDrawable::INVISIBLE|LLDrawable::FORCE_INVISIBLE)) 1420 if (!drawablep->isState(LLDrawable::INVISIBLE|LLDrawable::FORCE_INVISIBLE))
1418 { 1421 {
@@ -1835,6 +1838,7 @@ void LLPipeline::renderHighlights()
1835 if (!facep || facep->getDrawable()->isDead()) 1838 if (!facep || facep->getDrawable()->isDead())
1836 { 1839 {
1837 llerrs << "Bad face on selection" << llendl; 1840 llerrs << "Bad face on selection" << llendl;
1841 return;
1838 } 1842 }
1839 1843
1840 facep->renderSelected(mFaceSelectImagep, color); 1844 facep->renderSelected(mFaceSelectImagep, color);
@@ -4045,4 +4049,4 @@ void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res,
4045 glPopMatrix(); 4049 glPopMatrix();
4046 glMatrixMode(GL_MODELVIEW); 4050 glMatrixMode(GL_MODELVIEW);
4047 glPopMatrix(); 4051 glPopMatrix();
4048} \ No newline at end of file 4052}
diff --git a/linden/indra/newview/releasenotes.txt b/linden/indra/newview/releasenotes.txt
index 2fc26c7..c6c57f0 100644
--- a/linden/indra/newview/releasenotes.txt
+++ b/linden/indra/newview/releasenotes.txt
@@ -1,6 +1,54 @@
1Release Notes for Second Life 1.15.1(3) May 14, 2007
2=====================================
3Changes:
4* Soft shadow for text is now an option available via the text style flag
5* Expanded Tools->Report Bug to include additional information and links
6* Alt-Left and Alt-Right switch between tabs in IM
7* Ctrl-W closes one tab in IM window (Ctrl-T closes IM window)
8* Ctrl-Shift-W closes all windows
9* Inventory system folders may be sorted to top
10* Busy mode declines notecards and textures and silently sends all other transfers to Inventory
11* L$ balance displays "Loading..." (instead of a blank) when first checking your balance
12* Minimap is enabled when Second Life runs for the first time
13* Texture transfers are limited to 5 items per 10 seconds
14
15Bug fixes:
16* Fixed windows maximizing when opening other windows
17* Fixed floating text inworld (original hard shadow restored)
18* Fixed LSL Help window restoring when clicking on script editor
19* Fixed LSL Wiki Help window forgetting its size
20* Fixed Ctrl-W closing the floater instead of one IM panel
21* Fixed a client crash when deleting an object from inventory
22* Fixed avatar eyeball shader
23* Fixed closing an inventory folder while selection is inside moves selection to 'My Inventory'
24* Fixed nametag text leaving background box while moving
25* Fixed graphics cards with unlisted memory sizes defaulting to 16MB
26* Fixed right-clicking on self failing if you are wearing a HUD
27* Fixed llSetText appearance on HUD attachments
28* Fixed Alt-WASD behavior when sitting
29* Fixed first digit in Pay dialog cannot be erased
30* Fixed reference ruler measuring to region edge instead of reference object
31* Fixed permissions on group-owned object's script when group member clicks New Script
32* Improved detection of Linux video memory
33* VWR-38: Magic Opening Folders
34* VWR-42: llSetSoundQueueing() is broken
35* VWR-71: Tabulating and moving by word (Ctrl-left, ctrl-right) off-by-one errors in scripting editor.
36* VWR-136: Seg fault in llpolymorph.cpp
37* VWR-148: llListStatistics tooltip wrong
38* VWR-154: typo in en-US/floater_mute.xml 'Resident' not 'resident'
39* VWR-155: typo in en-US/floater_mute.xml 'Resident' not 'Person'
40* VWR-165: First Digit in the 'Pay' dialog does not erase without entering more digits
41* VWR-166: moving of open folders in the inventory to an other indentation level leaves the contents on the previous level
42* VWR-192: textures in windows only stretches horizontally
43* VWR-326: Allow a 'limit texture recieving' in the client
44* VWR-346: Selecting Client>Character>Flush Animations immediately crashes 1.14.0.x
45* VWR-379: Fix shell scripts to use bash and not sh when appropriate.
46* VWR-414: 8-bit character in llagent.cpp comment confuses Japanese text editors
47* VWR-415: Definitions of WM_MOUSEWHEEL and WHEEL_DELTA need conditionals (on Windows)
48* VWR-429: add scons option making FMOD optional
49
1Release Notes for Second Life 1.15.0(2) April 25, 2007 50Release Notes for Second Life 1.15.0(2) April 25, 2007
2===================================== 51=====================================
3
4Changes: 52Changes:
5* Improved Help menu with links to additional resources 53* Improved Help menu with links to additional resources
6* 'Add as Friend' button added to Profile 54* 'Add as Friend' button added to Profile
diff --git a/linden/indra/newview/res/newViewRes.rc b/linden/indra/newview/res/newViewRes.rc
index e544a39..e9ac143 100644
--- a/linden/indra/newview/res/newViewRes.rc
+++ b/linden/indra/newview/res/newViewRes.rc
@@ -227,8 +227,8 @@ TOOLPIPETTE CURSOR "toolpipette.cur"
227// 227//
228 228
229VS_VERSION_INFO VERSIONINFO 229VS_VERSION_INFO VERSIONINFO
230 FILEVERSION 1,15,0,2 230 FILEVERSION 1,15,1,3
231 PRODUCTVERSION 1,15,0,2 231 PRODUCTVERSION 1,15,1,3
232 FILEFLAGSMASK 0x3fL 232 FILEFLAGSMASK 0x3fL
233#ifdef _DEBUG 233#ifdef _DEBUG
234 FILEFLAGS 0x1L 234 FILEFLAGS 0x1L
@@ -245,12 +245,12 @@ BEGIN
245 BEGIN 245 BEGIN
246 VALUE "CompanyName", "Linden Lab" 246 VALUE "CompanyName", "Linden Lab"
247 VALUE "FileDescription", "Second Life" 247 VALUE "FileDescription", "Second Life"
248 VALUE "FileVersion", "1.15.0.2" 248 VALUE "FileVersion", "1.15.1.3"
249 VALUE "InternalName", "Second Life" 249 VALUE "InternalName", "Second Life"
250 VALUE "LegalCopyright", "Copyright © 2001-2007, Linden Research, Inc." 250 VALUE "LegalCopyright", "Copyright © 2001-2007, Linden Research, Inc."
251 VALUE "OriginalFilename", "SecondLife.exe" 251 VALUE "OriginalFilename", "SecondLife.exe"
252 VALUE "ProductName", "Second Life" 252 VALUE "ProductName", "Second Life"
253 VALUE "ProductVersion", "1.15.0.2" 253 VALUE "ProductVersion", "1.15.1.3"
254 END 254 END
255 END 255 END
256 BLOCK "VarFileInfo" 256 BLOCK "VarFileInfo"
diff --git a/linden/indra/newview/secondlife setup build uma.bat b/linden/indra/newview/secondlife setup build uma.bat
index 72c27fb..ad2d849 100644
--- a/linden/indra/newview/secondlife setup build uma.bat
+++ b/linden/indra/newview/secondlife setup build uma.bat
@@ -1,4 +1,4 @@
1@rem Invoke the script which preps then runs the installer. 1@rem Invoke the script which preps then runs the installer.
2@rem This batch file is customized per grid. 2@rem This batch file is customized per grid.
3 3
4@"secondlife setup build.bat" --grid=uma 4@"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
index 2036c33..f957918 100644
--- a/linden/indra/newview/secondlife setup build vaak.bat
+++ b/linden/indra/newview/secondlife setup build vaak.bat
@@ -1,4 +1,4 @@
1@rem Invoke the script which preps then runs the installer. 1@rem Invoke the script which preps then runs the installer.
2@rem This batch file is customized per grid. 2@rem This batch file is customized per grid.
3 3
4@"secondlife setup build.bat" --grid=vaak 4@"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
index ffc8568..4f88805 100644
--- a/linden/indra/newview/secondlife setup build yami.bat
+++ b/linden/indra/newview/secondlife setup build yami.bat
@@ -1,4 +1,4 @@
1@rem Invoke the script which preps then runs the installer. 1@rem Invoke the script which preps then runs the installer.
2@rem This batch file is customized per grid. 2@rem This batch file is customized per grid.
3 3
4@"secondlife setup build.bat" --grid=yami 4@"secondlife setup build.bat" --grid=yami
diff --git a/linden/indra/newview/skins/xui/en-us/alerts.xml b/linden/indra/newview/skins/xui/en-us/alerts.xml
index 265fca8..a783d00 100644
--- a/linden/indra/newview/skins/xui/en-us/alerts.xml
+++ b/linden/indra/newview/skins/xui/en-us/alerts.xml
@@ -11,7 +11,7 @@
11 <alert modal="true" name="FloaterNotFound"> 11 <alert modal="true" name="FloaterNotFound">
12 <message name="message"> 12 <message name="message">
13 Floater error: Could not find the following controls: 13 Floater error: Could not find the following controls:
14 14
15[CONTROLS] 15[CONTROLS]
16 </message> 16 </message>
17 <option name="OK"> 17 <option name="OK">
@@ -126,7 +126,7 @@ Enter a brief description of the group&apos;s purpose.
126 <alert modal="true" name="CharacterSnapshotSaved"> 126 <alert modal="true" name="CharacterSnapshotSaved">
127 <message name="message"> 127 <message name="message">
128 A snapshot of your character has been saved. 128 A snapshot of your character has been saved.
129 129
130Visit the Webpage Studio exhibit to see it. 130Visit the Webpage Studio exhibit to see it.
131 </message> 131 </message>
132 </alert> 132 </alert>
@@ -146,8 +146,8 @@ Visit the Webpage Studio exhibit to see it.
146 </alert> 146 </alert>
147 <alert modal="true" name="GrantModifyRights"> 147 <alert modal="true" name="GrantModifyRights">
148 <message name="message"> 148 <message name="message">
149 Granting modify rights to another resident allows them to change 149 Granting modify rights to another resident allows them to change
150ANY objects you may have in-world. Be VERY careful when handing 150ANY objects you may have in-world. Be VERY careful when handing
151out this permission. 151out this permission.
152Do you want to grant modify rights for [FIRST_NAME] [LAST_NAME]? 152Do you want to grant modify rights for [FIRST_NAME] [LAST_NAME]?
153 </message> 153 </message>
@@ -212,10 +212,10 @@ Do you want to grant modify rights for [FIRST_NAME] [LAST_NAME]?
212 <alert modal="true" name="CreateGroupCanAfford"> 212 <alert modal="true" name="CreateGroupCanAfford">
213 <message name="message"> 213 <message name="message">
214 Creating a group costs L$[COST]. 214 Creating a group costs L$[COST].
215 215
216To maintain the group for more than three days, 216To maintain the group for more than three days,
217you must reach a total of three or more members. 217you must reach a total of three or more members.
218 218
219Create group? 219Create group?
220 </message> 220 </message>
221 <option name="Create"> 221 <option name="Create">
@@ -275,16 +275,16 @@ Are you sure you want to continue?
275 </alert> 275 </alert>
276 <alert modal="true" name="AssignDangerousActionWarning"> 276 <alert modal="true" name="AssignDangerousActionWarning">
277 <message name="message"> 277 <message name="message">
278 You are about to add the Ability &apos;[ACTION_NAME]&apos; to the 278 You are about to add the Ability &apos;[ACTION_NAME]&apos; to the
279Role &apos;[ROLE_NAME]&apos;. 279Role &apos;[ROLE_NAME]&apos;.
280 280
281 *WARNING* 281 *WARNING*
282 Any Member in a Role with this Ability can assign themselves-- 282 Any Member in a Role with this Ability can assign themselves--
283 and any other member--to Roles that have more powers than they 283 and any other member--to Roles that have more powers than they
284 currently have, potentially elevating themselves to 284 currently have, potentially elevating themselves to
285 near-Owner power. Be sure you know what you&apos;re doing before 285 near-Owner power. Be sure you know what you&apos;re doing before
286 assigning this Ability. 286 assigning this Ability.
287 287
288Add this Ability to &apos;[ROLE_NAME]&apos;? 288Add this Ability to &apos;[ROLE_NAME]&apos;?
289 </message> 289 </message>
290 <option name="Yes"> 290 <option name="Yes">
@@ -296,14 +296,14 @@ Add this Ability to &apos;[ROLE_NAME]&apos;?
296 </alert> 296 </alert>
297 <alert modal="true" name="AssignDangerousAbilityWarning"> 297 <alert modal="true" name="AssignDangerousAbilityWarning">
298 <message name="message"> 298 <message name="message">
299 You are about to add the Ability &apos;[ACTION_NAME]&apos; to the 299 You are about to add the Ability &apos;[ACTION_NAME]&apos; to the
300Role &apos;[ROLE_NAME]&apos;. 300Role &apos;[ROLE_NAME]&apos;.
301 301
302 *WARNING* 302 *WARNING*
303 Any Member in a Role with this Ability can assign themselves-- 303 Any Member in a Role with this Ability can assign themselves--
304 and any other member--all Abilities, elevating themselves 304 and any other member--all Abilities, elevating themselves
305 to near-Owner power. 305 to near-Owner power.
306 306
307Add this Ability to &apos;[ROLE_NAME]&apos;? 307Add this Ability to &apos;[ROLE_NAME]&apos;?
308 </message> 308 </message>
309 <option name="Yes"> 309 <option name="Yes">
@@ -364,7 +364,7 @@ Go to the Second Life web site for more information on partnering?
364 If this resident has a web profile URL set then you can: 364 If this resident has a web profile URL set then you can:
365 * Click Load to load the page with the embedded web browser. 365 * Click Load to load the page with the embedded web browser.
366 * Click Open to view externally in your default web browser. 366 * Click Open to view externally in your default web browser.
367 367
368When viewing your profile you can enter any URL as your Web Profile. 368When viewing your profile you can enter any URL as your Web Profile.
369Residents can visit the URL you specify when they view your profile. 369Residents can visit the URL you specify when they view your profile.
370 </message> 370 </message>
@@ -373,7 +373,7 @@ Residents can visit the URL you specify when they view your profile.
373 <message name="message"> 373 <message name="message">
374 If this resident has a web profile URL set then you can: 374 If this resident has a web profile URL set then you can:
375 * Click Open to view externally in your default web browser. 375 * Click Open to view externally in your default web browser.
376 376
377When viewing your profile you can enter any URL as your Web Profile. 377When viewing your profile you can enter any URL as your Web Profile.
378Residents can visit the URL you specify when they view your profile. 378Residents can visit the URL you specify when they view your profile.
379 </message> 379 </message>
@@ -478,7 +478,7 @@ Please select an individual to sell to if selling for L$0.
478 <message name="message"> 478 <message name="message">
479 The selected [LAND_SIZE] sq. m. land is being set for sale. 479 The selected [LAND_SIZE] sq. m. land is being set for sale.
480Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME]. 480Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME].
481 481
482Would you like to continue making this change? 482Would you like to continue making this change?
483 </message> 483 </message>
484 <option name="Continue"> 484 <option name="Continue">
@@ -493,10 +493,10 @@ Would you like to continue making this change?
493 Are you sure you want to return all objects shared with 493 Are you sure you want to return all objects shared with
494the group &apos;[NAME]&apos; on this parcel of land 494the group &apos;[NAME]&apos; on this parcel of land
495back to their previous owner&apos;s inventory? 495back to their previous owner&apos;s inventory?
496 496
497*WARNING* This will delete the non-transferable objects 497*WARNING* This will delete the non-transferable objects
498deeded to the group! 498deeded to the group!
499 499
500Objects: [N] 500Objects: [N]
501 </message> 501 </message>
502 <option name="Return"> 502 <option name="Return">
@@ -511,7 +511,7 @@ Objects: [N]
511 Are you sure you want to return all objects owned by the 511 Are you sure you want to return all objects owned by the
512resident &apos;[NAME]&apos; on this parcel of land 512resident &apos;[NAME]&apos; on this parcel of land
513back to their inventory? 513back to their inventory?
514 514
515Objects: [N] 515Objects: [N]
516 </message> 516 </message>
517 <option name="Return"> 517 <option name="Return">
@@ -526,7 +526,7 @@ Objects: [N]
526 Are you sure you want to return all objects 526 Are you sure you want to return all objects
527owned by you on this parcel of land back to 527owned by you on this parcel of land back to
528your inventory? 528your inventory?
529 529
530Objects: [N] 530Objects: [N]
531 </message> 531 </message>
532 <option name="Return"> 532 <option name="Return">
@@ -542,10 +542,10 @@ Objects: [N]
542by you on this parcel of land back to their owner&apos;s inventory? 542by you on this parcel of land back to their owner&apos;s inventory?
543Transferable objects deeded to a group will be 543Transferable objects deeded to a group will be
544returned to their previous owners. 544returned to their previous owners.
545 545
546*WARNING* This will delete the non-transferable objects 546*WARNING* This will delete the non-transferable objects
547deeded to the group! 547deeded to the group!
548 548
549Objects: [N] 549Objects: [N]
550 </message> 550 </message>
551 <option name="Return"> 551 <option name="Return">
@@ -561,10 +561,10 @@ Objects: [N]
561by [NAME] on this parcel of land back to their owner&apos;s inventory? 561by [NAME] on this parcel of land back to their owner&apos;s inventory?
562Transferable objects deeded to a group will be 562Transferable objects deeded to a group will be
563returned to their previous owners. 563returned to their previous owners.
564 564
565*WARNING* This will delete the non-transferable objects 565*WARNING* This will delete the non-transferable objects
566deeded to the group! 566deeded to the group!
567 567
568Objects: [N] 568Objects: [N]
569 </message> 569 </message>
570 <option name="Return"> 570 <option name="Return">
@@ -602,7 +602,7 @@ in this region back to their owner&apos;s inventory?
602 Return the objects on this parcel of land 602 Return the objects on this parcel of land
603that are NOT shared with the group [NAME] 603that are NOT shared with the group [NAME]
604back to their owners? 604back to their owners?
605 605
606Objects: [N] 606Objects: [N]
607 </message> 607 </message>
608 <option name="Return"> 608 <option name="Return">
@@ -690,7 +690,7 @@ The outfit folder contains no clothing, body parts, or attachments.
690 <alert modal="true" name="MustHaveAccountToLogIn"> 690 <alert modal="true" name="MustHaveAccountToLogIn">
691 <message name="message"> 691 <message name="message">
692 You must have an account to connect to [SECOND_LIFE]. 692 You must have an account to connect to [SECOND_LIFE].
693 693
694Go to www.secondlife.com to create a new account? 694Go to www.secondlife.com to create a new account?
695 </message> 695 </message>
696 <option name="OK"> 696 <option name="OK">
@@ -704,10 +704,10 @@ Go to www.secondlife.com to create a new account?
704 <message name="message"> 704 <message name="message">
705 Classified ads appear in the &apos;Classified&apos; section of the 705 Classified ads appear in the &apos;Classified&apos; section of the
706Search directory for one week. 706Search directory for one week.
707 707
708Fill out your ad, then click &apos;Publish...&apos; to add it to the 708Fill out your ad, then click &apos;Publish...&apos; to add it to the
709directory. 709directory.
710 710
711You&apos;ll be asked for a price to pay when clicking Publish. 711You&apos;ll be asked for a price to pay when clicking Publish.
712Paying more makes your ad appear higher in the list, and 712Paying more makes your ad appear higher in the list, and
713also appear higher when people search for keywords. 713also appear higher when people search for keywords.
@@ -750,7 +750,7 @@ There is no reimbursement for fees paid.
750 Some of the display changes that you have made 750 Some of the display changes that you have made
751require [SECOND_LIFE] to shut down immediately, 751require [SECOND_LIFE] to shut down immediately,
752which will cause you to lose any work in progress. 752which will cause you to lose any work in progress.
753 753
754Apply those changes and quit 754Apply those changes and quit
755 </message> 755 </message>
756 <option name="ApplyandQuit"> 756 <option name="ApplyandQuit">
@@ -960,15 +960,6 @@ based on your system configuration.
960 OK 960 OK
961 </option> 961 </option>
962 </alert> 962 </alert>
963 <alert modal="true" name="DisplaySettingsNoShaders">
964 <message name="message">
965 [SECOND_LIFE] crashed while initializing graphics drivers.
966Shaders will be disabled in order to avoid some common driver errors.
967This will disable some graphics features.
968We recommend updating your graphics card drivers.
969Shaders can be re-enabled in Preferences &gt; Graphics Detail.
970 </message>
971 </alert>
972 <alert modal="true" name="CannotRequestDomain"> 963 <alert modal="true" name="CannotRequestDomain">
973 <message name="message"> 964 <message name="message">
974 Unable to connect to server. 965 Unable to connect to server.
@@ -980,7 +971,7 @@ Could not request domain name: [HOST]
980 Unable to find the server domain name. 971 Unable to find the server domain name.
981This could be the result of a lost network connection 972This could be the result of a lost network connection
982or a server problem. 973or a server problem.
983 974
984Please try again in a few minutes, or click Help 975Please try again in a few minutes, or click Help
985for advice and a link to the system status web page. 976for advice and a link to the system status web page.
986 </message> 977 </message>
@@ -1012,7 +1003,7 @@ please go to the support section and report this problem.
1012Often this means that your computer&apos;s clock is set incorrectly. 1003Often this means that your computer&apos;s clock is set incorrectly.
1013Please go to Control Panels and make sure the time and date 1004Please go to Control Panels and make sure the time and date
1014are set correctly. 1005are set correctly.
1015 1006
1016If you continue to receive this error, please go 1007If you continue to receive this error, please go
1017to the Support section of the SecondLife.com web site 1008to the Support section of the SecondLife.com web site
1018and report the problem. 1009and report the problem.
@@ -1060,7 +1051,7 @@ SecondLife.com web site.
1060 <message name="message"> 1051 <message name="message">
1061 Unknown problem trying to connect. 1052 Unknown problem trying to connect.
1062(Blank error message from server.) 1053(Blank error message from server.)
1063 1054
1064Please try again in a few minutes, or click Help 1055Please try again in a few minutes, or click Help
1065for advice and a link to the system status web page. 1056for advice and a link to the system status web page.
1066 </message> 1057 </message>
@@ -1074,7 +1065,7 @@ for advice and a link to the system status web page.
1074 <alert modal="true" name="CannotConnectNoReplyFromLogin"> 1065 <alert modal="true" name="CannotConnectNoReplyFromLogin">
1075 <message name="message"> 1066 <message name="message">
1076 Unable to connect. No reply from login database. 1067 Unable to connect. No reply from login database.
1077 1068
1078Please try again in a few minutes, or click Help 1069Please try again in a few minutes, or click Help
1079for advice and a link to the system status web page. 1070for advice and a link to the system status web page.
1080 </message> 1071 </message>
@@ -1093,10 +1084,10 @@ for advice and a link to the system status web page.
1093 <alert modal="true" name="FirstRunDialog"> 1084 <alert modal="true" name="FirstRunDialog">
1094 <message name="message"> 1085 <message name="message">
1095 [SECOND_LIFE] installation is complete. 1086 [SECOND_LIFE] installation is complete.
1096 1087
1097If this is your first time using [SECOND_LIFE], you will need to create 1088If this is your first time using [SECOND_LIFE], you will need to create
1098an account before you can log on. 1089an account before you can log on.
1099 1090
1100Return to www.secondlife.com to create a new account? 1091Return to www.secondlife.com to create a new account?
1101 </message> 1092 </message>
1102 <option name="NewAccount..."> 1093 <option name="NewAccount...">
@@ -1124,7 +1115,7 @@ Please check your network connection.
1124 <message name="message"> 1115 <message name="message">
1125 Unable to connect. Login packet never received by 1116 Unable to connect. Login packet never received by
1126login server. 1117login server.
1127 1118
1128Please try again in a few minutes, or click Help 1119Please try again in a few minutes, or click Help
1129for advice and a link to the system status web page. 1120for advice and a link to the system status web page.
1130 </message> 1121 </message>
@@ -1137,11 +1128,11 @@ for advice and a link to the system status web page.
1137 </alert> 1128 </alert>
1138 <alert modal="true" name="WelcomeToSecondLife"> 1129 <alert modal="true" name="WelcomeToSecondLife">
1139 <message name="message"> 1130 <message name="message">
1140 Welcome to [SECOND_LIFE]! 1131 Welcome to [SECOND_LIFE]!
1141 1132
1142Use arrow keys to walk. 1133Use arrow keys to walk.
1143 1134
1144Please choose the male or female character. 1135Please choose the male or female character.
1145You can change your mind later. 1136You can change your mind later.
1146 </message> 1137 </message>
1147 <option name="Male"> 1138 <option name="Male">
@@ -1153,10 +1144,10 @@ You can change your mind later.
1153 </alert> 1144 </alert>
1154 <alert modal="true" name="WelcomeToSecondLifeSimple"> 1145 <alert modal="true" name="WelcomeToSecondLifeSimple">
1155 <message name="message"> 1146 <message name="message">
1156 Welcome to [SECOND_LIFE]! 1147 Welcome to [SECOND_LIFE]!
1157 1148
1158Use arrow keys to walk. 1149Use arrow keys to walk.
1159 1150
1160Please choose the male or female character. 1151Please choose the male or female character.
1161 </message> 1152 </message>
1162 <option name="Male"> 1153 <option name="Male">
@@ -1287,7 +1278,7 @@ same region.
1287 <alert modal="true" name="TakeLockedOrNotOwnedBy"> 1278 <alert modal="true" name="TakeLockedOrNotOwnedBy">
1288 <message name="message"> 1279 <message name="message">
1289 At least one object is locked or not owned by you. 1280 At least one object is locked or not owned by you.
1290If an object is not owned by you and you take it, 1281If an object is not owned by you and you take it,
1291next owner permissions will be applied to it and 1282next owner permissions will be applied to it and
1292possibly restrict your ability to modify or copy it 1283possibly restrict your ability to modify or copy it
1293in the future. 1284in the future.
@@ -1304,8 +1295,8 @@ Are you sure you want to take these itmes?
1304 <alert modal="true" name="PromptGoToCurrencyPage"> 1295 <alert modal="true" name="PromptGoToCurrencyPage">
1305 <message name="message"> 1296 <message name="message">
1306 [EXTRA] 1297 [EXTRA]
1307 1298
1308 1299
1309Go to [URL] for information on purchasing currency? 1300Go to [URL] for information on purchasing currency?
1310 </message> 1301 </message>
1311 <option name="GotoPage"> 1302 <option name="GotoPage">
@@ -1364,50 +1355,50 @@ Expected [VALIDS]
1364 </alert> 1355 </alert>
1365 <alert modal="true" name="SoundFileNotRIFF"> 1356 <alert modal="true" name="SoundFileNotRIFF">
1366 <message name="message"> 1357 <message name="message">
1367 File does not appear to be a RIFF WAVE file: 1358 File does not appear to be a RIFF WAVE file:
1368[FILE] 1359[FILE]
1369 </message> 1360 </message>
1370 </alert> 1361 </alert>
1371 <alert modal="true" name="SoundFileNotPCM"> 1362 <alert modal="true" name="SoundFileNotPCM">
1372 <message name="message"> 1363 <message name="message">
1373 File does not appear to be a PCM WAVE audio file: 1364 File does not appear to be a PCM WAVE audio file:
1374[FILE] 1365[FILE]
1375 </message> 1366 </message>
1376 </alert> 1367 </alert>
1377 <alert modal="true" name="SoundFileInvalidChannelCount"> 1368 <alert modal="true" name="SoundFileInvalidChannelCount">
1378 <message name="message"> 1369 <message name="message">
1379 File has invalid number of channels (must be mono or stereo): 1370 File has invalid number of channels (must be mono or stereo):
1380[FILE] 1371[FILE]
1381 </message> 1372 </message>
1382 </alert> 1373 </alert>
1383 <alert modal="true" name="SoundFileInvalidSampleRate"> 1374 <alert modal="true" name="SoundFileInvalidSampleRate">
1384 <message name="message"> 1375 <message name="message">
1385 File does not appear to be a supported sample rate (must be 44.1k): 1376 File does not appear to be a supported sample rate (must be 44.1k):
1386[FILE] 1377[FILE]
1387 </message> 1378 </message>
1388 </alert> 1379 </alert>
1389 <alert modal="true" name="SoundFileInvalidWordSize"> 1380 <alert modal="true" name="SoundFileInvalidWordSize">
1390 <message name="message"> 1381 <message name="message">
1391 File does not appear to be a supported word size (must be 8 or 16 bit): 1382 File does not appear to be a supported word size (must be 8 or 16 bit):
1392[FILE] 1383[FILE]
1393 </message> 1384 </message>
1394 </alert> 1385 </alert>
1395 <alert modal="true" name="SoundFileInvalidHeader"> 1386 <alert modal="true" name="SoundFileInvalidHeader">
1396 <message name="message"> 1387 <message name="message">
1397 Could not find &apos;data&apos; chunk in WAV header: 1388 Could not find &apos;data&apos; chunk in WAV header:
1398[FILE] 1389[FILE]
1399 </message> 1390 </message>
1400 </alert> 1391 </alert>
1401 <alert modal="true" name="SoundFileInvalidTooLong"> 1392 <alert modal="true" name="SoundFileInvalidTooLong">
1402 <message name="message"> 1393 <message name="message">
1403 Audio file is too long (10 second maximum): 1394 Audio file is too long (10 second maximum):
1404[FILE] 1395[FILE]
1405 </message> 1396 </message>
1406 </alert> 1397 </alert>
1407 <alert modal="true" name="ProblemWithFile"> 1398 <alert modal="true" name="ProblemWithFile">
1408 <message name="message"> 1399 <message name="message">
1409 Problem with file [FILE]: 1400 Problem with file [FILE]:
1410 1401
1411[ERROR] 1402[ERROR]
1412 </message> 1403 </message>
1413 </alert> 1404 </alert>
@@ -1679,11 +1670,11 @@ Try selecting a smaller area.
1679 </alert> 1670 </alert>
1680 <alert modal="true" name="ParcelCanPlayMusic"> 1671 <alert modal="true" name="ParcelCanPlayMusic">
1681 <message name="message"> 1672 <message name="message">
1682 This location can play streaming music. 1673 This location can play streaming music.
1683 1674
1684Music requires a 768 kbps or faster 1675Music requires a 768 kbps or faster
1685Internet connection. 1676Internet connection.
1686 1677
1687Play music when available? 1678Play music when available?
1688 </message> 1679 </message>
1689 <option name="PlayMusic"> 1680 <option name="PlayMusic">
@@ -1695,14 +1686,14 @@ Play music when available?
1695 </alert> 1686 </alert>
1696 <alert modal="true" name="ParcelCanPlayMedia"> 1687 <alert modal="true" name="ParcelCanPlayMedia">
1697 <message name="message"> 1688 <message name="message">
1698 This location can play streaming video. 1689 This location can play streaming video.
1699 1690
1700Streaming video requires a 768 kbps or 1691Streaming video requires a 768 kbps or
1701faster Internet connection. 1692faster Internet connection.
1702 1693
1703Play streaming video when available? 1694Play streaming video when available?
1704 1695
1705(You can change this option later under 1696(You can change this option later under
1706Preferences &gt; Audio &amp; Video.) 1697Preferences &gt; Audio &amp; Video.)
1707 </message> 1698 </message>
1708 <option name="PlayMedia"> 1699 <option name="PlayMedia">
@@ -1815,7 +1806,7 @@ The region [REGION] does not allow transfer of land.
1815 <message name="message"> 1806 <message name="message">
1816 Unable to abandon land: 1807 Unable to abandon land:
1817You must select an entire parcel to release it. 1808You must select an entire parcel to release it.
1818Try double-clicking to select an entire parcel, or 1809Try double-clicking to select an entire parcel, or
1819first divide your parcel. 1810first divide your parcel.
1820 </message> 1811 </message>
1821 </alert> 1812 </alert>
@@ -1824,7 +1815,7 @@ first divide your parcel.
1824 You are about to release [AREA] sq. meters of land. 1815 You are about to release [AREA] sq. meters of land.
1825Releasing this parcel will remove it from your land 1816Releasing this parcel will remove it from your land
1826holdings, but will not credit any L$. 1817holdings, but will not credit any L$.
1827 1818
1828Release this land? 1819Release this land?
1829 </message> 1820 </message>
1830 <option name="Release"> 1821 <option name="Release">
@@ -1853,7 +1844,7 @@ and dragging.
1853 Dividing this land will split this parcel into two 1844 Dividing this land will split this parcel into two
1854and each parcel can have its own settings. Some settings 1845and each parcel can have its own settings. Some settings
1855will be reset to defaults after the operation. 1846will be reset to defaults after the operation.
1856 1847
1857Divide land? 1848Divide land?
1858 </message> 1849 </message>
1859 <option name="Divide"> 1850 <option name="Divide">
@@ -1901,12 +1892,12 @@ and dragging.
1901 </alert> 1892 </alert>
1902 <alert modal="true" name="JoinLandWarning"> 1893 <alert modal="true" name="JoinLandWarning">
1903 <message name="message"> 1894 <message name="message">
1904 Joining this land will create one large parcel 1895 Joining this land will create one large parcel
1905out of all parcels intersecting the selected rectangle. 1896out of all parcels intersecting the selected rectangle.
1906 1897
1907You will need to reset the name and options of the 1898You will need to reset the name and options of the
1908new parcel. 1899new parcel.
1909 1900
1910Join land? 1901Join land?
1911 </message> 1902 </message>
1912 <option name="Join"> 1903 <option name="Join">
@@ -1984,7 +1975,7 @@ and provide details about your network setup.
1984 <alert modal="true" name="AppEarlyExit"> 1975 <alert modal="true" name="AppEarlyExit">
1985 <message name="message"> 1976 <message name="message">
1986 [MESSAGE] 1977 [MESSAGE]
1987 1978
1988We are unable to recover from this problem. Please 1979We are unable to recover from this problem. Please
1989uninstall and reinstall before trying again. If this 1980uninstall and reinstall before trying again. If this
1990problem persists, check the Tech Support FAQ at: 1981problem persists, check the Tech Support FAQ at:
@@ -1997,9 +1988,9 @@ www.secondlife.com/support.
1997 <alert modal="true" name="YouHaveBeenLoggedOut"> 1988 <alert modal="true" name="YouHaveBeenLoggedOut">
1998 <message name="message"> 1989 <message name="message">
1999 You have been logged out of [SECOND_LIFE]: 1990 You have been logged out of [SECOND_LIFE]:
2000 1991
2001[MESSAGE] 1992[MESSAGE]
2002 1993
2003Click Continue to look at existing IM and chat. 1994Click Continue to look at existing IM and chat.
2004You will not be able to perform any other operations. 1995You will not be able to perform any other operations.
2005Click Quit to exit [SECOND_LIFE] immediately. 1996Click Quit to exit [SECOND_LIFE] immediately.
@@ -2020,10 +2011,10 @@ Please activate another group using Edit -&gt; Groups...
2020 </alert> 2011 </alert>
2021 <alert model="true" name="AddFriend" title="Add Friend"> 2012 <alert model="true" name="AddFriend" title="Add Friend">
2022 <message name="message"> 2013 <message name="message">
2023 Friends can give permissions to 2014 Friends can give permissions to
2024track each other on the map and 2015track each other on the map and
2025receive online status updates. 2016receive online status updates.
2026 2017
2027Offer friendship to [NAME]? 2018Offer friendship to [NAME]?
2028 </message> 2019 </message>
2029 <option name="Offer"> 2020 <option name="Offer">
@@ -2058,9 +2049,9 @@ Offer friendship to [NAME]?
2058 <alert modal="true" name="GodDeleteAllScriptedPublicObjectsByUser"> 2049 <alert modal="true" name="GodDeleteAllScriptedPublicObjectsByUser">
2059 <message name="message"> 2050 <message name="message">
2060 Are you sure you want to delete all scripted objects owned by 2051 Are you sure you want to delete all scripted objects owned by
2061 2052
2062** [AVATAR_NAME] ** 2053** [AVATAR_NAME] **
2063 2054
2064on all others land in this sim? 2055on all others land in this sim?
2065 </message> 2056 </message>
2066 <option name="DELETE!!"> 2057 <option name="DELETE!!">
@@ -2073,9 +2064,9 @@ on all others land in this sim?
2073 <alert modal="true" name="GodDeleteAllScriptedObjectsByUser"> 2064 <alert modal="true" name="GodDeleteAllScriptedObjectsByUser">
2074 <message name="message"> 2065 <message name="message">
2075 Are you sure you want to DELETE ALL scripted objects owned by 2066 Are you sure you want to DELETE ALL scripted objects owned by
2076 2067
2077** [AVATAR_NAME] ** 2068** [AVATAR_NAME] **
2078 2069
2079on ALL LAND in this sim? 2070on ALL LAND in this sim?
2080 </message> 2071 </message>
2081 <option name="!!DELETEALL!!"> 2072 <option name="!!DELETEALL!!">
@@ -2089,9 +2080,9 @@ on ALL LAND in this sim?
2089 <message name="message"> 2080 <message name="message">
2090 Are you sure you want to DELETE ALL objects (scripted or not) 2081 Are you sure you want to DELETE ALL objects (scripted or not)
2091owned by 2082owned by
2092 2083
2093** [AVATAR_NAME] ** 2084** [AVATAR_NAME] **
2094 2085
2095on ALL LAND in this sim? 2086on ALL LAND in this sim?
2096 </message> 2087 </message>
2097 <option name="!!DELETEALL!!"> 2088 <option name="!!DELETEALL!!">
@@ -2104,7 +2095,7 @@ on ALL LAND in this sim?
2104 <alert modal="true" name="PublishGroupInfoToWeb"> 2095 <alert modal="true" name="PublishGroupInfoToWeb">
2105 <message name="message"> 2096 <message name="message">
2106 Selecting the &quot;Publish on the Web&quot; option allows us to publish 2097 Selecting the &quot;Publish on the Web&quot; option allows us to publish
2107the group name, insignia, charter, titles, and founder on the 2098the group name, insignia, charter, titles, and founder on the
2108[SECOND_LIFE] website. You are responsible for indicating if any 2099[SECOND_LIFE] website. You are responsible for indicating if any
2109of the above content is considered Mature according to the 2100of the above content is considered Mature according to the
2110Community Standards. 2101Community Standards.
@@ -2123,7 +2114,7 @@ Community Standards.
2123 <alert modal="true" name="MinClassifiedPrice"> 2114 <alert modal="true" name="MinClassifiedPrice">
2124 <message name="message"> 2115 <message name="message">
2125 Price to pay for listing must be at least L$[MIN_PRICE]. 2116 Price to pay for listing must be at least L$[MIN_PRICE].
2126 2117
2127Please enter a higher price. 2118Please enter a higher price.
2128 </message> 2119 </message>
2129 </alert> 2120 </alert>
@@ -2284,11 +2275,11 @@ Please select a smaller area and try again.
2284 <message name="message"> 2275 <message name="message">
2285 By deeding this parcel, the group will be required 2276 By deeding this parcel, the group will be required
2286to have and maintain sufficient land use credits. 2277to have and maintain sufficient land use credits.
2287 2278
2288The purchase price of the land is not refunded to 2279The purchase price of the land is not refunded to
2289the owner. If a deeded parcel is sold, the sale 2280the owner. If a deeded parcel is sold, the sale
2290price will be divided evenly among group members. 2281price will be divided evenly among group members.
2291 2282
2292Deed this [AREA] square meters of land to the group 2283Deed this [AREA] square meters of land to the group
2293&apos;[GROUP_NAME]&apos;? 2284&apos;[GROUP_NAME]&apos;?
2294 </message> 2285 </message>
@@ -2303,14 +2294,14 @@ Deed this [AREA] square meters of land to the group
2303 <message name="message"> 2294 <message name="message">
2304 By deeding this parcel, the group will be required 2295 By deeding this parcel, the group will be required
2305to have and maintain sufficient land use credits. 2296to have and maintain sufficient land use credits.
2306 2297
2307The deed will include a simultaneous land 2298The deed will include a simultaneous land
2308contribution to the group from &apos;[FIRST_NAME] [LAST_NAME]&apos;. 2299contribution to the group from &apos;[FIRST_NAME] [LAST_NAME]&apos;.
2309 2300
2310The purchase price of the land is not refunded to 2301The purchase price of the land is not refunded to
2311the owner. If a deeded parcel is sold, the sale 2302the owner. If a deeded parcel is sold, the sale
2312price will be divided evenly among group members. 2303price will be divided evenly among group members.
2313 2304
2314Deed this [AREA] square meters of land to the group 2305Deed this [AREA] square meters of land to the group
2315&apos;[GROUP_NAME]&apos;? 2306&apos;[GROUP_NAME]&apos;?
2316 </message> 2307 </message>
@@ -2344,7 +2335,7 @@ Could not request domain name: [HOST_NAME]
2344 Unable to find the server domain name. 2335 Unable to find the server domain name.
2345This could be the result of a lost network connection 2336This could be the result of a lost network connection
2346or a server problem. 2337or a server problem.
2347 2338
2348Please try again in a few minutes, or click Help 2339Please try again in a few minutes, or click Help
2349for advice and a link to the system status web page. 2340for advice and a link to the system status web page.
2350 </message> 2341 </message>
@@ -2383,7 +2374,7 @@ for advice and a link to the system status web page.
2383 <alert modal="true" name="AvatarMoved"> 2374 <alert modal="true" name="AvatarMoved">
2384 <message name="message"> 2375 <message name="message">
2385 Your [TYPE] location is not currently available. 2376 Your [TYPE] location is not currently available.
2386[HELP] 2377[HELP]
2387You have been moved into a nearby region. 2378You have been moved into a nearby region.
2388 </message> 2379 </message>
2389 </alert> 2380 </alert>
@@ -2397,10 +2388,10 @@ will see you correctly.
2397 <alert modal="true" name="FirstRun"> 2388 <alert modal="true" name="FirstRun">
2398 <message name="message"> 2389 <message name="message">
2399 [SECOND_LIFE] installation is complete. 2390 [SECOND_LIFE] installation is complete.
2400 2391
2401If this is your first time using [SECOND_LIFE], you will need to create 2392If this is your first time using [SECOND_LIFE], you will need to create
2402an account before you can log on. 2393an account before you can log on.
2403 2394
2404Return to www.secondlife.com to create a new account? 2395Return to www.secondlife.com to create a new account?
2405 </message> 2396 </message>
2406 <option name="NewAccount..."> 2397 <option name="NewAccount...">
@@ -2421,7 +2412,7 @@ Please check your network connection.
2421 <message name="message"> 2412 <message name="message">
2422 Unable to connect. Login packet never received by 2413 Unable to connect. Login packet never received by
2423login server. 2414login server.
2424 2415
2425Please try again in a few minutes, or click Help 2416Please try again in a few minutes, or click Help
2426for advice and a link to the system status web page. 2417for advice and a link to the system status web page.
2427 </message> 2418 </message>
@@ -2435,9 +2426,9 @@ for advice and a link to the system status web page.
2435 <alert modal="true" name="WelcomeNoClothes"> 2426 <alert modal="true" name="WelcomeNoClothes">
2436 <message name="message"> 2427 <message name="message">
2437 Your character will appear in a moment. 2428 Your character will appear in a moment.
2438 2429
2439Use arrow keys to walk. 2430Use arrow keys to walk.
2440 2431
2441Press the F1 key at any time for help or 2432Press the F1 key at any time for help or
2442to learn more about [SECOND_LIFE]. 2433to learn more about [SECOND_LIFE].
2443 </message> 2434 </message>
@@ -2445,12 +2436,12 @@ to learn more about [SECOND_LIFE].
2445 <alert modal="true" name="WelcomeChooseSex" nodefault="true"> 2436 <alert modal="true" name="WelcomeChooseSex" nodefault="true">
2446 <message name="message"> 2437 <message name="message">
2447 Your character will appear in a moment. 2438 Your character will appear in a moment.
2448 2439
2449Use arrow keys to walk. 2440Use arrow keys to walk.
2450 2441
2451Press the F1 key at any time for help or 2442Press the F1 key at any time for help or
2452to learn more about [SECOND_LIFE]. 2443to learn more about [SECOND_LIFE].
2453 2444
2454Please choose the male or female character. 2445Please choose the male or female character.
2455You can change your mind later. 2446You can change your mind later.
2456 </message> 2447 </message>
@@ -2479,10 +2470,10 @@ You can change your mind later.
2479 <alert modal="true" name="FlushMapVisibilityCaches"> 2470 <alert modal="true" name="FlushMapVisibilityCaches">
2480 <message name="message"> 2471 <message name="message">
2481 This will flush the map caches on this region. 2472 This will flush the map caches on this region.
2482 2473
2483This is really only useful for debugging. 2474This is really only useful for debugging.
2484 2475
2485(In production, wait 5 minutes, then everyone&apos;s map will 2476(In production, wait 5 minutes, then everyone&apos;s map will
2486update after they relog.) 2477update after they relog.)
2487 </message> 2478 </message>
2488 <option name="OK"> 2479 <option name="OK">
@@ -2543,34 +2534,34 @@ non ALL LAND in this region?
2543 </alert> 2534 </alert>
2544 <alert modal="true" name="InvalidTerrainBitDepth"> 2535 <alert modal="true" name="InvalidTerrainBitDepth">
2545 <message name="message"> 2536 <message name="message">
2546 Couldn&apos;t set region textures: 2537 Couldn&apos;t set region textures:
2547 2538
2548Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH]. 2539Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH].
2549 2540
2550Replace texture [TEXTURE_NUM] with a 24 bit 512x512 or smaller image 2541Replace texture [TEXTURE_NUM] with a 24 bit 512x512 or smaller image
2551then click &quot;Set&quot; again. 2542then click &quot;Set&quot; again.
2552 </message> 2543 </message>
2553 </alert> 2544 </alert>
2554 <alert modal="true" name="InvalidTerrainSize"> 2545 <alert modal="true" name="InvalidTerrainSize">
2555 <message name="message"> 2546 <message name="message">
2556 Couldn&apos;t set region textures: 2547 Couldn&apos;t set region textures:
2557 2548
2558Terrain texture [TEXTURE_NUM] is too large at [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]. 2549Terrain texture [TEXTURE_NUM] is too large at [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
2559 2550
2560Replace texture [TEXTURE_NUM] with a 24 bit 512x512 or smaller image 2551Replace texture [TEXTURE_NUM] with a 24 bit 512x512 or smaller image
2561then click &quot;Set&quot; again. 2552then click &quot;Set&quot; again.
2562 </message> 2553 </message>
2563 </alert> 2554 </alert>
2564 <alert modal="true" name="RawUploadStarted"> 2555 <alert modal="true" name="RawUploadStarted">
2565 <message name="message"> 2556 <message name="message">
2566 Upload started. It may take up to two minutes, 2557 Upload started. It may take up to two minutes,
2567depending on your connection speed. 2558depending on your connection speed.
2568 </message> 2559 </message>
2569 </alert> 2560 </alert>
2570 <alert modal="true" name="ConfirmBakeTerrain"> 2561 <alert modal="true" name="ConfirmBakeTerrain">
2571 <message name="message"> 2562 <message name="message">
2572 Do you really want to bake the current terrain, 2563 Do you really want to bake the current terrain,
2573make it the center for terrain raise/lower limits 2564make it the center for terrain raise/lower limits
2574and the default for the &apos;Revert&apos; tool? 2565and the default for the &apos;Revert&apos; tool?
2575 </message> 2566 </message>
2576 <option name="Bake"> 2567 <option name="Bake">
@@ -2618,19 +2609,19 @@ and the default for the &apos;Revert&apos; tool?
2618 </alert> 2609 </alert>
2619 <alert modal="true" name="ClassifiedMustBeAlphanumeric"> 2610 <alert modal="true" name="ClassifiedMustBeAlphanumeric">
2620 <message name="message"> 2611 <message name="message">
2621 The name of your classified must start with a letter 2612 The name of your classified must start with a letter
2622from A to Z or a number. No punctuation is allowed. 2613from A to Z or a number. No punctuation is allowed.
2623 </message> 2614 </message>
2624 </alert> 2615 </alert>
2625 <alert modal="true" name="CantSetBuyObject"> 2616 <alert modal="true" name="CantSetBuyObject">
2626 <message name="message"> 2617 <message name="message">
2627 Can&apos;t set Buy Object, because the object is not for sale. 2618 Can&apos;t set Buy Object, because the object is not for sale.
2628Please set the object for sale and try again. 2619Please set the object for sale and try again.
2629 </message> 2620 </message>
2630 </alert> 2621 </alert>
2631 <alert modal="true" name="FinishedRawDownload"> 2622 <alert modal="true" name="FinishedRawDownload">
2632 <message name="message"> 2623 <message name="message">
2633 Finished download of raw terrain file to: 2624 Finished download of raw terrain file to:
2634[DOWNLOAD_PATH] 2625[DOWNLOAD_PATH]
2635 </message> 2626 </message>
2636 </alert> 2627 </alert>
@@ -2638,7 +2629,7 @@ Please set the object for sale and try again.
2638 <message name="message"> 2629 <message name="message">
2639 A new version of [SECOND_LIFE] is available. 2630 A new version of [SECOND_LIFE] is available.
2640[MESSAGE] 2631[MESSAGE]
2641 2632
2642You must download this update to use the system. 2633You must download this update to use the system.
2643 </message> 2634 </message>
2644 <option name="Download"> 2635 <option name="Download">
@@ -2652,7 +2643,7 @@ You must download this update to use the system.
2652 <message name="message"> 2643 <message name="message">
2653 An updated version of [SECOND_LIFE] is available. 2644 An updated version of [SECOND_LIFE] is available.
2654[MESSAGE] 2645[MESSAGE]
2655 2646
2656This update is not required, but we suggest you install it to improve performance and stability. 2647This update is not required, but we suggest you install it to improve performance and stability.
2657 </message> 2648 </message>
2658 <option name="Download"> 2649 <option name="Download">
@@ -2666,7 +2657,7 @@ This update is not required, but we suggest you install it to improve performanc
2666 <message name="message"> 2657 <message name="message">
2667 An updated version of [SECOND_LIFE] is available. 2658 An updated version of [SECOND_LIFE] is available.
2668[MESSAGE] 2659[MESSAGE]
2669 2660
2670This update is not required, but we suggest you install it to improve performance and stability. 2661This update is not required, but we suggest you install it to improve performance and stability.
2671 </message> 2662 </message>
2672 <option name="Download"> 2663 <option name="Download">
@@ -2682,7 +2673,7 @@ This update is not required, but we suggest you install it to improve performanc
2682[MESSAGE] 2673[MESSAGE]
2683 2674
2684You must download this update to use the system. 2675You must download this update to use the system.
2685 2676
2686Download to your Applications folder? 2677Download to your Applications folder?
2687 </message> 2678 </message>
2688 <option name="Download"> 2679 <option name="Download">
@@ -2696,9 +2687,9 @@ Download to your Applications folder?
2696 <message name="message"> 2687 <message name="message">
2697 An updated version of [SECOND_LIFE] is available. 2688 An updated version of [SECOND_LIFE] is available.
2698[MESSAGE] 2689[MESSAGE]
2699 2690
2700This update is not required, but we suggest you install it to improve performance and stability. 2691This update is not required, but we suggest you install it to improve performance and stability.
2701 2692
2702Download to your Applications folder? 2693Download to your Applications folder?
2703 </message> 2694 </message>
2704 <option name="Download"> 2695 <option name="Download">
@@ -2712,9 +2703,9 @@ Download to your Applications folder?
2712 <message name="message"> 2703 <message name="message">
2713 An updated version of [SECOND_LIFE] is available. 2704 An updated version of [SECOND_LIFE] is available.
2714[MESSAGE] 2705[MESSAGE]
2715 2706
2716This update is not required, but we suggest you install it to improve performance and stability. 2707This update is not required, but we suggest you install it to improve performance and stability.
2717 2708
2718Download to your Applications folder? 2709Download to your Applications folder?
2719 </message> 2710 </message>
2720 <option name="Download"> 2711 <option name="Download">
@@ -2743,10 +2734,10 @@ Download to your Applications folder?
2743 <message name="message"> 2734 <message name="message">
2744 Classified ads appear in the &apos;Classified&apos; section of the 2735 Classified ads appear in the &apos;Classified&apos; section of the
2745Find directory for one week. 2736Find directory for one week.
2746 2737
2747Fill out your ad, then click &apos;Publish...&apos; to add it to the 2738Fill out your ad, then click &apos;Publish...&apos; to add it to the
2748directory. 2739directory.
2749 2740
2750You&apos;ll be asked for a price to pay when clicking Publish. 2741You&apos;ll be asked for a price to pay when clicking Publish.
2751Paying more makes your ad appear higher in the list, and 2742Paying more makes your ad appear higher in the list, and
2752also appear higher when people search for keywords. 2743also appear higher when people search for keywords.
@@ -2775,6 +2766,62 @@ also appear higher when people search for keywords.
2775 Cancel 2766 Cancel
2776 </option> 2767 </option>
2777 </alert> 2768 </alert>
2769 <alert modal="true" name="WebLaunchBugReport101">
2770 <message name="message">
2771 Visit the [SECOND_LIFE] Wiki and Learn how to Report Bugs Correctly.
2772 </message>
2773 <ignore>
2774 When launching web browser to view the Bug Reporting 101 Wiki
2775 </ignore>
2776 <option name="Gotopage">
2777 Go to page
2778 </option>
2779 <option name="Cancel">
2780 Cancel
2781 </option>
2782 </alert>
2783 <alert modal="true" name="WebLaunchSecurityIssues">
2784 <message name="message">
2785 Visit the [SECOND_LIFE] Wiki for Details of How to Report a Security Issue.
2786 </message>
2787 <ignore>
2788 When launching web browser to view Security Issues Wiki
2789 </ignore>
2790 <option name="Gotopage">
2791 Go to page
2792 </option>
2793 <option name="Cancel">
2794 Cancel
2795 </option>
2796 </alert>
2797 <alert modal="true" name="WebLaunchPublicIssue">
2798 <message name="message">
2799 Visit the [SECOND_LIFE] Public Issue Tracker, Where you can Report Bugs and other Issues.
2800 </message>
2801 <ignore>
2802 When launching web browser to view the Public Issue Tracker
2803 </ignore>
2804 <option name="Gotopage">
2805 Go to page
2806 </option>
2807 <option name="Cancel">
2808 Cancel
2809 </option>
2810 </alert>
2811 <alert modal="true" name="WebLaunchPublicIssueHelp">
2812 <message name="message">
2813 Visit the [SECOND_LIFE] Wiki for info on how to use the Public Issue Tracker.
2814 </message>
2815 <ignore>
2816 When launching web browser to view Public Issue Tracker Wiki
2817 </ignore>
2818 <option name="Gotopage">
2819 Go to page
2820 </option>
2821 <option name="Cancel">
2822 Cancel
2823 </option>
2824 </alert>
2778 <alert modal="true" name="WebLaunchForums"> 2825 <alert modal="true" name="WebLaunchForums">
2779 <message name="message"> 2826 <message name="message">
2780 Search the [SECOND_LIFE] Knowledge Base for the latest tips and tricks. 2827 Search the [SECOND_LIFE] Knowledge Base for the latest tips and tricks.
@@ -2865,7 +2912,7 @@ also appear higher when people search for keywords.
2865objects to their owners? Transferable deeded 2912objects to their owners? Transferable deeded
2866objects will be returned to their previous owners. 2913objects will be returned to their previous owners.
2867(All objects returned will return to the folder they were last in.) 2914(All objects returned will return to the folder they were last in.)
2868 2915
2869*WARNING* No-transfer deeded objects will be deleted! 2916*WARNING* No-transfer deeded objects will be deleted!
2870 </message> 2917 </message>
2871 <ignore> 2918 <ignore>
@@ -2931,7 +2978,7 @@ Leave Group?
2931 </alert> 2978 </alert>
2932 <alert modal="true" name="MuteByName" title="Mute object by name"> 2979 <alert modal="true" name="MuteByName" title="Mute object by name">
2933 <message name="message"> 2980 <message name="message">
2934 Mute by name only affects object chat and IM, not sounds. 2981 Mute by name only affects object chat and IM, not sounds.
2935You must type the object&apos;s name exactly. 2982You must type the object&apos;s name exactly.
2936 </message> 2983 </message>
2937 <editline> 2984 <editline>
@@ -3173,13 +3220,13 @@ sent to everyone currently in your estate.
3173 </alert> 3220 </alert>
3174 <alert name="ChangeLindenEstate" title="Change Linden Estate"> 3221 <alert name="ChangeLindenEstate" title="Change Linden Estate">
3175 <message name="message"> 3222 <message name="message">
3176 You are about to change a Linden owned estate (mainland, 3223 You are about to change a Linden owned estate (mainland,
3177teen grid, orientation, etc.). 3224teen grid, orientation, etc.).
3178 3225
3179This is EXTREMELY DANGEROUS because it can fundamentally 3226This is EXTREMELY DANGEROUS because it can fundamentally
3180affect the user experience. On the mainland, it will change 3227affect the user experience. On the mainland, it will change
3181thousands of regions and make the spaceserver hiccup. 3228thousands of regions and make the spaceserver hiccup.
3182 3229
3183Proceed? 3230Proceed?
3184 </message> 3231 </message>
3185 <option name="ChangeEstate"> 3232 <option name="ChangeEstate">
@@ -3191,16 +3238,16 @@ Proceed?
3191 </alert> 3238 </alert>
3192 <alert name="ChangeLindenAccess" title="Change Linden Estate Access"> 3239 <alert name="ChangeLindenAccess" title="Change Linden Estate Access">
3193 <message name="message"> 3240 <message name="message">
3194 You are about to change the access list for a Linden owned 3241 You are about to change the access list for a Linden owned
3195estate (mainland, teen grid, orientation, etc.). 3242estate (mainland, teen grid, orientation, etc.).
3196 3243
3197This is DANGEROUS and should only be done to invoke the 3244This is DANGEROUS and should only be done to invoke the
3198hack allowing objects/money to be transfered in/out of 3245hack allowing objects/money to be transfered in/out of
3199a grid. 3246a grid.
3200 3247
3201It will change thousands of regions and make the 3248It will change thousands of regions and make the
3202spaceserver hiccup. 3249spaceserver hiccup.
3203 3250
3204Proceed? 3251Proceed?
3205 </message> 3252 </message>
3206 <option name="ChangeEstate"> 3253 <option name="ChangeEstate">
@@ -3393,7 +3440,7 @@ Proceed?
3393 <alert name="PublishClassified"> 3440 <alert name="PublishClassified">
3394 <message name="message"> 3441 <message name="message">
3395 Remember: Classified ad fees are non-refundable. 3442 Remember: Classified ad fees are non-refundable.
3396 3443
3397Publish this classified now for L$[AMOUNT]? 3444Publish this classified now for L$[AMOUNT]?
3398 </message> 3445 </message>
3399 <option name="Publish"> 3446 <option name="Publish">
@@ -3431,7 +3478,7 @@ sent to everyone in this region.
3431 <message name="message"> 3478 <message name="message">
3432 If this box is checked, land owners will not be able to terraform 3479 If this box is checked, land owners will not be able to terraform
3433their land regardless of the per-parcel &apos;Edit Terrain&apos; setting. 3480their land regardless of the per-parcel &apos;Edit Terrain&apos; setting.
3434 3481
3435Default: off 3482Default: off
3436 </message> 3483 </message>
3437 </alert> 3484 </alert>
@@ -3439,7 +3486,7 @@ Default: off
3439 <message name="message"> 3486 <message name="message">
3440 If this box is checked, people will not be able to fly in this region 3487 If this box is checked, people will not be able to fly in this region
3441regardless of the per-parcel &apos;Fly&apos; setting. 3488regardless of the per-parcel &apos;Fly&apos; setting.
3442 3489
3443Default: off 3490Default: off
3444 </message> 3491 </message>
3445 </alert> 3492 </alert>
@@ -3447,18 +3494,18 @@ Default: off
3447 <message name="message"> 3494 <message name="message">
3448 Checking this box enables the health system across all parcels 3495 Checking this box enables the health system across all parcels
3449regardless of individual parcel settings. If this box is left 3496regardless of individual parcel settings. If this box is left
3450unchecked, individual parcel owners will still be able to 3497unchecked, individual parcel owners will still be able to
3451activate the health system on their parcels. 3498activate the health system on their parcels.
3452 3499
3453Default: off 3500Default: off
3454 </message> 3501 </message>
3455 </alert> 3502 </alert>
3456 <alert modal="true" name="HelpRegionAgentLimit" title="Agent Limit"> 3503 <alert modal="true" name="HelpRegionAgentLimit" title="Agent Limit">
3457 <message name="message"> 3504 <message name="message">
3458 Sets the maximum number of avatars allowed in this region. 3505 Sets the maximum number of avatars allowed in this region.
3459Note that the more avatars you have in one region, the worse 3506Note that the more avatars you have in one region, the worse
3460the performance can be. 3507the performance can be.
3461 3508
3462Default: 30 3509Default: 30
3463 </message> 3510 </message>
3464 </alert> 3511 </alert>
@@ -3472,7 +3519,7 @@ allowed per region remains 15,000 no matter what the value set for
3472Object Bonus. Once this value is set, it should not be lowered until 3519Object Bonus. Once this value is set, it should not be lowered until
3473you are certain that changing it will not force return or deletion of 3520you are certain that changing it will not force return or deletion of
3474the objects currently on parcels. 3521the objects currently on parcels.
3475 3522
3476Default: 1.0 3523Default: 1.0
3477 </message> 3524 </message>
3478 </alert> 3525 </alert>
@@ -3482,10 +3529,10 @@ Default: 1.0
3482corner of the screen and in pop-up tips on the map. Maturity 3529corner of the screen and in pop-up tips on the map. Maturity
3483also affects search results - residents can choose not to find 3530also affects search results - residents can choose not to find
3484content in Mature regions. 3531content in Mature regions.
3485 3532
3486The pop-up tips on the map will not change for 5 minutes, because 3533The pop-up tips on the map will not change for 5 minutes, because
3487the system only updates map information periodically. 3534the system only updates map information periodically.
3488 3535
3489Default: PG 3536Default: PG
3490 </message> 3537 </message>
3491 </alert> 3538 </alert>
@@ -3496,49 +3543,49 @@ Agents may only push themselves, or be pushed by scripts owned by
3496the owner of a parcel, or that are set to the group of the parcel, 3543the owner of a parcel, or that are set to the group of the parcel,
3497assuming the parcel has a group set/deeded. 3544assuming the parcel has a group set/deeded.
3498Push refers to the llPushObject() LSL function. 3545Push refers to the llPushObject() LSL function.
3499 3546
3500Default: Off 3547Default: Off
3501 </message> 3548 </message>
3502 </alert> 3549 </alert>
3503 <alert modal="true" name="HelpParcelChanges" title="Parcel Join/Subdivide"> 3550 <alert modal="true" name="HelpParcelChanges" title="Parcel Join/Subdivide">
3504 <message name="message"> 3551 <message name="message">
3505 Sets whether or not parcels not owned by the estate owner 3552 Sets whether or not parcels not owned by the estate owner
3506can be joined or subdivided. 3553can be joined or subdivided.
3507If this option is unchecked: 3554If this option is unchecked:
3508 * Only estate owners or managers can join or subdivide parcels. 3555 * Only estate owners or managers can join or subdivide parcels.
3509 * They may only join or subdivide parcels belonging to the owner, 3556 * They may only join or subdivide parcels belonging to the owner,
3510 or to a group where they have the appropriate group powers. 3557 or to a group where they have the appropriate group powers.
3511If this option is checked: 3558If this option is checked:
3512 * All parcel owners can join or subdivide the parcels they own. 3559 * All parcel owners can join or subdivide the parcels they own.
3513 * For group owned parcels, those with appropriate group powers 3560 * For group owned parcels, those with appropriate group powers
3514 may join or subdivide parcels. 3561 may join or subdivide parcels.
3515 3562
3516Default: Checked 3563Default: Checked
3517 </message> 3564 </message>
3518 </alert> 3565 </alert>
3519 <alert modal="true" name="RegionMaturityChange" title="Changed Region Maturity"> 3566 <alert modal="true" name="RegionMaturityChange" title="Changed Region Maturity">
3520 <message name="message"> 3567 <message name="message">
3521 The maturity rating for this region has been updated. 3568 The maturity rating for this region has been updated.
3522 3569
3523The world map, however, will take approximately 5 minutes 3570The world map, however, will take approximately 5 minutes
3524to update, because the system only updates map information 3571to update, because the system only updates map information
3525periodically. 3572periodically.
3526 </message> 3573 </message>
3527 </alert> 3574 </alert>
3528 <alert modal="true" name="HelpRegionLandResell" title="Land Resale"> 3575 <alert modal="true" name="HelpRegionLandResell" title="Land Resale">
3529 <message name="message"> 3576 <message name="message">
3530 Estate owners and managers can sell any land owned by the estate owner. 3577 Estate owners and managers can sell any land owned by the estate owner.
3531If this option is left unchecked, buyers cannot resell their land in this region. 3578If this option is left unchecked, buyers cannot resell their land in this region.
3532If this option is checked, buyers can resell their land in this region. 3579If this option is checked, buyers can resell their land in this region.
3533 3580
3534Default: Disallow 3581Default: Disallow
3535 </message> 3582 </message>
3536 </alert> 3583 </alert>
3537 <alert modal="true" name="HelpEstateCovenantID" title="Covenant Asset ID"> 3584 <alert modal="true" name="HelpEstateCovenantID" title="Covenant Asset ID">
3538 <message name="message"> 3585 <message name="message">
3539 Sets the notecard asset ID for the Estate Covenant belonging to this 3586 Sets the notecard asset ID for the Estate Covenant belonging to this
3540estate. 3587estate.
3541 3588
3542Default: 00000000-0000-0000-0000-000000000000 or none 3589Default: 00000000-0000-0000-0000-000000000000 or none
3543 </message> 3590 </message>
3544 </alert> 3591 </alert>
@@ -3546,200 +3593,200 @@ Default: 00000000-0000-0000-0000-000000000000 or none
3546 <message name="message"> 3593 <message name="message">
3547 When sim performance is poor, a script may be to blame. Open the 3594 When sim performance is poor, a script may be to blame. Open the
3548Statistics Bar (Ctrl-Shift-1). Look at the Simulator Physics FPS. 3595Statistics Bar (Ctrl-Shift-1). Look at the Simulator Physics FPS.
3549If it is lower than 45 then open the &apos;Time&apos; panel located at the 3596If it is lower than 45 then open the &apos;Time&apos; panel located at the
3550bottom of the Stats Bar. If Script Time reads 25 ms or higher, click 3597bottom of the Stats Bar. If Script Time reads 25 ms or higher, click
3551the &apos;Get Top Scripts&apos; button. You will be given the name and location 3598the &apos;Get Top Scripts&apos; button. You will be given the name and location
3552of scripts that may be causing poor performance. 3599of scripts that may be causing poor performance.
3553 3600
3554Checking the &apos;Disable Scripts&apos; box and then pressing the &apos;Apply&apos; 3601Checking the &apos;Disable Scripts&apos; box and then pressing the &apos;Apply&apos;
3555button will temporarily disable all scripts in this region. You may 3602button will temporarily disable all scripts in this region. You may
3556need to do this in order to travel to the location of a noted 3603need to do this in order to travel to the location of a noted
3557&apos;top script&apos;. Once you have arrived at the location, investigate the 3604&apos;top script&apos;. Once you have arrived at the location, investigate the
3558script to determine if it is causing the problem. You may want to 3605script to determine if it is causing the problem. You may want to
3559contact the owner of the script or delete or return the object. 3606contact the owner of the script or delete or return the object.
3560Uncheck the &apos;Disable Script&apos; box and then &apos;Apply&apos; to reactivate 3607Uncheck the &apos;Disable Script&apos; box and then &apos;Apply&apos; to reactivate
3561the scripts in the region. 3608the scripts in the region.
3562 3609
3563Default: off 3610Default: off
3564 </message> 3611 </message>
3565 </alert> 3612 </alert>
3566 <alert modal="true" name="HelpRegionDisableCollisions" title="Disable Collisions"> 3613 <alert modal="true" name="HelpRegionDisableCollisions" title="Disable Collisions">
3567 <message name="message"> 3614 <message name="message">
3568 When sim performance is poor, physical objects may be to blame. 3615 When sim performance is poor, physical objects may be to blame.
3569Open the Statistics Bar (Ctrl-Shift-1). Look at the Simulator 3616Open the Statistics Bar (Ctrl-Shift-1). Look at the Simulator
3570Physics FPS. If it is lower than 45 then open the &apos;Time&apos; panel 3617Physics FPS. If it is lower than 45 then open the &apos;Time&apos; panel
3571located at the bottom of the Stats Bar. If Sim Time (Physics) 3618located at the bottom of the Stats Bar. If Sim Time (Physics)
3572reads 20 ms or higher, click the &apos;Get Top Colliders&apos; button. 3619reads 20 ms or higher, click the &apos;Get Top Colliders&apos; button.
3573You will be given the name and location of physical objects 3620You will be given the name and location of physical objects
3574that may be causing poor performance. 3621that may be causing poor performance.
3575 3622
3576Checking the &apos;Disable Collisions&apos; box and then pressing the &apos;Apply&apos; 3623Checking the &apos;Disable Collisions&apos; box and then pressing the &apos;Apply&apos;
3577button will temporarily disable object-object collisions. You may 3624button will temporarily disable object-object collisions. You may
3578need to do this in order to travel to the location of a noted 3625need to do this in order to travel to the location of a noted
3579&apos;top collider&apos;. Once you have arrived at the location, investigate the 3626&apos;top collider&apos;. Once you have arrived at the location, investigate the
3580object - is it constantly colliding with other objects? You may want to 3627object - is it constantly colliding with other objects? You may want to
3581contact the owner of the object or delete or return the object. 3628contact the owner of the object or delete or return the object.
3582Uncheck the &apos;Disable Collisions&apos; box and then &apos;Apply&apos; to reactivate 3629Uncheck the &apos;Disable Collisions&apos; box and then &apos;Apply&apos; to reactivate
3583collisions in the region. 3630collisions in the region.
3584 3631
3585Default: off 3632Default: off
3586 </message> 3633 </message>
3587 </alert> 3634 </alert>
3588 <alert modal="true" name="HelpRegionDisablePhysics" title="Disable Physics"> 3635 <alert modal="true" name="HelpRegionDisablePhysics" title="Disable Physics">
3589 <message name="message"> 3636 <message name="message">
3590 Disable Physics is similar to Disable Collisions, except all 3637 Disable Physics is similar to Disable Collisions, except all
3591physics simulation is disabled. This means that not only will 3638physics simulation is disabled. This means that not only will
3592objects stop colliding, but avatars will be unable to move. 3639objects stop colliding, but avatars will be unable to move.
3593 3640
3594This should only be used when Disable Collisions does not 3641This should only be used when Disable Collisions does not
3595give back enough performance to the region to investigate 3642give back enough performance to the region to investigate
3596a physics problem or &apos;Top Collider&apos;. 3643a physics problem or &apos;Top Collider&apos;.
3597 3644
3598Be sure to re-enable physics when you are done, or avatars 3645Be sure to re-enable physics when you are done, or avatars
3599will continue to be unable to move. 3646will continue to be unable to move.
3600 3647
3601Default: off 3648Default: off
3602 </message> 3649 </message>
3603 </alert> 3650 </alert>
3604 <alert modal="true" name="HelpRegionTopColliders" title="Top Colliders"> 3651 <alert modal="true" name="HelpRegionTopColliders" title="Top Colliders">
3605 <message name="message"> 3652 <message name="message">
3606 Show a list of objects experiencing the greatest number 3653 Show a list of objects experiencing the greatest number
3607of potential object-object collisions. These objects can 3654of potential object-object collisions. These objects can
3608slow sim performance. Select View &gt; Statistics Bar and 3655slow sim performance. Select View &gt; Statistics Bar and
3609look under Simulator &gt; Time &gt; Sim Time (Physics) to see 3656look under Simulator &gt; Time &gt; Sim Time (Physics) to see
3610if more than 20 ms is being spent in physics. 3657if more than 20 ms is being spent in physics.
3611 </message> 3658 </message>
3612 </alert> 3659 </alert>
3613 <alert modal="true" name="HelpRegionTopScripts" title="Top Scripts"> 3660 <alert modal="true" name="HelpRegionTopScripts" title="Top Scripts">
3614 <message name="message"> 3661 <message name="message">
3615 Show a list of objects spending the most time running 3662 Show a list of objects spending the most time running
3616LSL scripts. These objects can slow sim performance. 3663LSL scripts. These objects can slow sim performance.
3617Select View &gt; Statistics Bar and look under 3664Select View &gt; Statistics Bar and look under
3618Simulator &gt; Time &gt; Script Time to see if more than 3665Simulator &gt; Time &gt; Script Time to see if more than
361925 ms is being spent in scripts. 366625 ms is being spent in scripts.
3620 </message> 3667 </message>
3621 </alert> 3668 </alert>
3622 <alert modal="true" name="HelpRegionRestart" title="Restart Region"> 3669 <alert modal="true" name="HelpRegionRestart" title="Restart Region">
3623 <message name="message"> 3670 <message name="message">
3624 Restart the server process running this region after a 3671 Restart the server process running this region after a
3625two minute warning. All residents in the region will be 3672two minute warning. All residents in the region will be
3626disconnected. The region will save its data, and should 3673disconnected. The region will save its data, and should
3627come back up within 90 seconds. 3674come back up within 90 seconds.
3628 3675
3629Restarting the region will not fix most performance 3676Restarting the region will not fix most performance
3630problems, and should usually be used only when directed. 3677problems, and should usually be used only when directed.
3631 </message> 3678 </message>
3632 </alert> 3679 </alert>
3633 <alert modal="true" name="HelpRegionWaterHeight" title="Water Height"> 3680 <alert modal="true" name="HelpRegionWaterHeight" title="Water Height">
3634 <message name="message"> 3681 <message name="message">
3635 This is the height in meters where water appears. If 3682 This is the height in meters where water appears. If
3636this setting is anything other than 20 and you have 3683this setting is anything other than 20 and you have
3637water that is adjacent to the edge of world or &apos;void&apos; 3684water that is adjacent to the edge of world or &apos;void&apos;
3638water, there will be a visible gap. 3685water, there will be a visible gap.
3639 3686
3640Default: 20 3687Default: 20
3641 </message> 3688 </message>
3642 </alert> 3689 </alert>
3643 <alert modal="true" name="HelpRegionTerrainRaise" title="Terrain Raise"> 3690 <alert modal="true" name="HelpRegionTerrainRaise" title="Terrain Raise">
3644 <message name="message"> 3691 <message name="message">
3645 This is the distance that parcel owners can raise 3692 This is the distance that parcel owners can raise
3646their terrain above the &apos;baked&apos; terrain default 3693their terrain above the &apos;baked&apos; terrain default
3647height. 3694height.
3648 3695
3649Default: 4 3696Default: 4
3650 </message> 3697 </message>
3651 </alert> 3698 </alert>
3652 <alert modal="true" name="HelpRegionTerrainLower" title="Terrain Lower"> 3699 <alert modal="true" name="HelpRegionTerrainLower" title="Terrain Lower">
3653 <message name="message"> 3700 <message name="message">
3654 This is the distance that parcel owners can lower 3701 This is the distance that parcel owners can lower
3655their terrain below the &apos;baked&apos; terrain default 3702their terrain below the &apos;baked&apos; terrain default
3656height. 3703height.
3657 3704
3658Default: -4 3705Default: -4
3659 </message> 3706 </message>
3660 </alert> 3707 </alert>
3661 <alert modal="true" name="HelpRegionUploadRaw" title="Upload RAW Terrain"> 3708 <alert modal="true" name="HelpRegionUploadRaw" title="Upload RAW Terrain">
3662 <message name="message"> 3709 <message name="message">
3663 This button uploads a .RAW file to the region you are in. 3710 This button uploads a .RAW file to the region you are in.
3664The file must have the correct dimensions/number of channels: 3711The file must have the correct dimensions/number of channels:
3665RGB, 256x256 and 13 channels. The best way to create a 3712RGB, 256x256 and 13 channels. The best way to create a
3666terrain file is to download the existing RAW file. A good 3713terrain file is to download the existing RAW file. A good
3667first step is to modify the first channel (land height), 3714first step is to modify the first channel (land height),
3668and upload it. 3715and upload it.
3669 3716
3670The upload can take up to 45 seconds. Note that uploading a 3717The upload can take up to 45 seconds. Note that uploading a
3671terrain file *will not* move the objects that are on the land, 3718terrain file *will not* move the objects that are on the land,
3672only the terrain itself and the permissions associated with the 3719only the terrain itself and the permissions associated with the
3673parcels. This can result in objects going underground. 3720parcels. This can result in objects going underground.
3674 3721
3675For more information on editing region height fields, go to: 3722For more information on editing region height fields, go to:
3676http://secondlife.com/tiki/tiki-index.php?page=RawTerrainFile 3723http://secondlife.com/tiki/tiki-index.php?page=RawTerrainFile
3677 </message> 3724 </message>
3678 </alert> 3725 </alert>
3679 <alert modal="true" name="HelpRegionDownloadRaw" title="Download RAW Terrain"> 3726 <alert modal="true" name="HelpRegionDownloadRaw" title="Download RAW Terrain">
3680 <message name="message"> 3727 <message name="message">
3681 This button downloads a file containing the height field data, 3728 This button downloads a file containing the height field data,
3682parcel dimensions, parcel for sale status and some parcel permissions 3729parcel dimensions, parcel for sale status and some parcel permissions
3683for this region. When opening the file in a program such as 3730for this region. When opening the file in a program such as
3684Photoshop you must specify the document&apos;s dimensions which 3731Photoshop you must specify the document&apos;s dimensions which
3685are: RGB, 256x256 with 13 channels. This terrain file cannot 3732are: RGB, 256x256 with 13 channels. This terrain file cannot
3686be opened in any other way. 3733be opened in any other way.
3687 3734
3688For more information on editing region height fields, go to: 3735For more information on editing region height fields, go to:
3689http://secondlife.com/tiki/tiki-index.php?page=RawTerrainFile 3736http://secondlife.com/tiki/tiki-index.php?page=RawTerrainFile
3690 </message> 3737 </message>
3691 </alert> 3738 </alert>
3692 <alert modal="true" name="HelpRegionUseEstateSun" title="Use Estate Sun"> 3739 <alert modal="true" name="HelpRegionUseEstateSun" title="Use Estate Sun">
3693 <message name="message"> 3740 <message name="message">
3694 This checkbox makes the sun position in this region the 3741 This checkbox makes the sun position in this region the
3695same as the sun position in the rest of the estate. 3742same as the sun position in the rest of the estate.
3696 3743
3697Default: on 3744Default: on
3698 </message> 3745 </message>
3699 </alert> 3746 </alert>
3700 <alert modal="true" name="HelpRegionFixedSun" title="Fixed Sun"> 3747 <alert modal="true" name="HelpRegionFixedSun" title="Fixed Sun">
3701 <message name="message"> 3748 <message name="message">
3702 This checkbox sets the sun position to the position 3749 This checkbox sets the sun position to the position
3703in the Phase slider and stops the sun from moving. 3750in the Phase slider and stops the sun from moving.
3704 3751
3705Default: off 3752Default: off
3706 </message> 3753 </message>
3707 </alert> 3754 </alert>
3708 <alert modal="true" name="HelpRegionBakeTerrain" title="Bake Terrain"> 3755 <alert modal="true" name="HelpRegionBakeTerrain" title="Bake Terrain">
3709 <message name="message"> 3756 <message name="message">
3710 This button saves the current shape of the terrain as the 3757 This button saves the current shape of the terrain as the
3711new default for the region. Once baked, the land can revert 3758new default for the region. Once baked, the land can revert
3712to the saved shape whenever you or others use the Edit Terrain 3759to the saved shape whenever you or others use the Edit Terrain
3713&apos;Revert&apos; option/tool. The baked terrain is also the middle 3760&apos;Revert&apos; option/tool. The baked terrain is also the middle
3714point for the terrain raise and lower limits. 3761point for the terrain raise and lower limits.
3715 </message> 3762 </message>
3716 </alert> 3763 </alert>
3717 <alert modal="true" name="HelpEstateEstateManager" title="Estate Managers"> 3764 <alert modal="true" name="HelpEstateEstateManager" title="Estate Managers">
3718 <message name="message"> 3765 <message name="message">
3719 An estate manager is a resident to whom you have delegated 3766 An estate manager is a resident to whom you have delegated
3720control of region and estate settings. An estate manager 3767control of region and estate settings. An estate manager
3721can change any setting in these panels, except for uploading, 3768can change any setting in these panels, except for uploading,
3722downloading, and baking terrain. In particular, they can 3769downloading, and baking terrain. In particular, they can
3723allow or ban residents from your estate. 3770allow or ban residents from your estate.
3724 3771
3725Estate managers can only be added or removed by the owner 3772Estate managers can only be added or removed by the owner
3726of the estate, not by each other. Please only choose 3773of the estate, not by each other. Please only choose
3727residents you trust as estate managers, as you will be 3774residents you trust as estate managers, as you will be
3728ultimately responsible for their actions. 3775ultimately responsible for their actions.
3729 </message> 3776 </message>
3730 </alert> 3777 </alert>
3731 <alert modal="true" name="HelpEstateUseGlobalTime" title="Use Global Time"> 3778 <alert modal="true" name="HelpEstateUseGlobalTime" title="Use Global Time">
3732 <message name="message"> 3779 <message name="message">
3733 This checkbox makes the sun in your estate follow 3780 This checkbox makes the sun in your estate follow
3734the same position as on the Linden-owned &apos;mainland&apos; 3781the same position as on the Linden-owned &apos;mainland&apos;
3735estates. 3782estates.
3736 3783
3737Default: on 3784Default: on
3738 </message> 3785 </message>
3739 </alert> 3786 </alert>
3740 <alert modal="true" name="HelpEstateFixedSun" title="Fixed Sun"> 3787 <alert modal="true" name="HelpEstateFixedSun" title="Fixed Sun">
3741 <message name="message"> 3788 <message name="message">
3742 This checkbox sets the sun position to the position 3789 This checkbox sets the sun position to the position
3743in the Phase slider and stops the sun from moving. 3790in the Phase slider and stops the sun from moving.
3744 </message> 3791 </message>
3745 </alert> 3792 </alert>
@@ -3747,91 +3794,91 @@ in the Phase slider and stops the sun from moving.
3747 <message name="message"> 3794 <message name="message">
3748 Sets whether residents who are on other estates can enter this 3795 Sets whether residents who are on other estates can enter this
3749 estate without being on an access list. 3796 estate without being on an access list.
3750 3797
3751Default: on 3798Default: on
3752 </message> 3799 </message>
3753 </alert> 3800 </alert>
3754 <alert modal="true" name="HelpEstateAllowDirectTeleport" title="Allow Direct Teleport"> 3801 <alert modal="true" name="HelpEstateAllowDirectTeleport" title="Allow Direct Teleport">
3755 <message name="message"> 3802 <message name="message">
3756 When checked, allows residents to directly teleport to any 3803 When checked, allows residents to directly teleport to any
3757point in your estate. When unchecked, residents teleport 3804point in your estate. When unchecked, residents teleport
3758to the nearest telehub. 3805to the nearest telehub.
3759 3806
3760Default: off 3807Default: off
3761 </message> 3808 </message>
3762 </alert> 3809 </alert>
3763 <alert modal="true" name="HelpEstateAllowResident" title="Allow Access"> 3810 <alert modal="true" name="HelpEstateAllowResident" title="Allow Access">
3764 <message name="message"> 3811 <message name="message">
3765 If any resident is listed here, access to the estate will be 3812 If any resident is listed here, access to the estate will be
3766limited to residents on this list and groups listed below. 3813limited to residents on this list and groups listed below.
3767 3814
3768(If the estate is visible from the mainland, access cannot be 3815(If the estate is visible from the mainland, access cannot be
3769limited to a resident or group list, and these controls will be 3816limited to a resident or group list, and these controls will be
3770disabled. Only the &apos;access denied&apos; list will be used.) 3817disabled. Only the &apos;access denied&apos; list will be used.)
3771 </message> 3818 </message>
3772 </alert> 3819 </alert>
3773 <alert modal="true" name="HelpEstateAllowGroup" title="Allow Group Access"> 3820 <alert modal="true" name="HelpEstateAllowGroup" title="Allow Group Access">
3774 <message name="message"> 3821 <message name="message">
3775 If any group is listed here, access to the estate will be 3822 If any group is listed here, access to the estate will be
3776limited to the groups on this list and residents specifically 3823limited to the groups on this list and residents specifically
3777allowed above. 3824allowed above.
3778 3825
3779(If the estate is visible from the mainland, access cannot be 3826(If the estate is visible from the mainland, access cannot be
3780limited to a resident or group list, and these controls will be 3827limited to a resident or group list, and these controls will be
3781disabled. Only the &apos;access denied&apos; list will be used.) 3828disabled. Only the &apos;access denied&apos; list will be used.)
3782 </message> 3829 </message>
3783 </alert> 3830 </alert>
3784 <alert modal="true" name="HelpEstateBanResident" title="Deny Access"> 3831 <alert modal="true" name="HelpEstateBanResident" title="Deny Access">
3785 <message name="message"> 3832 <message name="message">
3786 Residents on this list are denied access to your estate, 3833 Residents on this list are denied access to your estate,
3787regardless of the allow and group settings above. 3834regardless of the allow and group settings above.
3788 3835
3789Adding a resident to this list will remove them from 3836Adding a resident to this list will remove them from
3790the allow list. 3837the allow list.
3791 </message> 3838 </message>
3792 </alert> 3839 </alert>
3793 <alert modal="true" name="HelpEstateCovenant" title="Estate Covenant"> 3840 <alert modal="true" name="HelpEstateCovenant" title="Estate Covenant">
3794 <message name="message"> 3841 <message name="message">
3795 Setting an estate covenant enables you to sell parcels 3842 Setting an estate covenant enables you to sell parcels
3796within that estate. If a covenant is not set, you cannot 3843within that estate. If a covenant is not set, you cannot
3797sell the land. The notecard for your covenant can be empty 3844sell the land. The notecard for your covenant can be empty
3798if you do not wish to apply any rules or advise buyers of 3845if you do not wish to apply any rules or advise buyers of
3799anything in relation to the land before they buy it. 3846anything in relation to the land before they buy it.
3800 3847
3801A covenant can be used to communicate rules, guidelines, 3848A covenant can be used to communicate rules, guidelines,
3802cultural information or simply your own expectations to the 3849cultural information or simply your own expectations to the
3803prospective buyer. This can include zoning, building regulations, 3850prospective buyer. This can include zoning, building regulations,
3804payment options or any other information you feel it is 3851payment options or any other information you feel it is
3805important for the new owner to have seen and to have agreed 3852important for the new owner to have seen and to have agreed
3806to before they purchase. 3853to before they purchase.
3807 3854
3808The buyer must agree to the covenant by ticking the check box 3855The buyer must agree to the covenant by ticking the check box
3809before they will be able to finish the purchase. Estate 3856before they will be able to finish the purchase. Estate
3810covenants are always visible in the About Land dialog for 3857covenants are always visible in the About Land dialog for
3811any parcels that have one set. 3858any parcels that have one set.
3812 </message> 3859 </message>
3813 </alert> 3860 </alert>
3814 <alert modal="true" name="BuyObjectOneOnly" title="Can&apos;t Buy Objects"> 3861 <alert modal="true" name="BuyObjectOneOnly" title="Can&apos;t Buy Objects">
3815 <message name="message"> 3862 <message name="message">
3816 Unable to buy more than one object at a time. 3863 Unable to buy more than one object at a time.
3817Please select only one object and try again. 3864Please select only one object and try again.
3818 </message> 3865 </message>
3819 </alert> 3866 </alert>
3820 <alert modal="true" name="BuyObjectOneOwner" title="Can&apos;t Buy Objects"> 3867 <alert modal="true" name="BuyObjectOneOwner" title="Can&apos;t Buy Objects">
3821 <message name="message"> 3868 <message name="message">
3822 Cannot buy objects from different owners at the same time. 3869 Cannot buy objects from different owners at the same time.
3823Please select only one object and try again. 3870Please select only one object and try again.
3824 </message> 3871 </message>
3825 </alert> 3872 </alert>
3826 <alert modal="true" name="BuyContentsOneOnly" title="Can&apos;t Buy Contents"> 3873 <alert modal="true" name="BuyContentsOneOnly" title="Can&apos;t Buy Contents">
3827 <message name="message"> 3874 <message name="message">
3828 Unable to buy the contents of more than one object at a time. 3875 Unable to buy the contents of more than one object at a time.
3829Please select only one object and try again. 3876Please select only one object and try again.
3830 </message> 3877 </message>
3831 </alert> 3878 </alert>
3832 <alert modal="true" name="BuyContentsOneOwner" title="Can&apos;t Buy Contents"> 3879 <alert modal="true" name="BuyContentsOneOwner" title="Can&apos;t Buy Contents">
3833 <message name="message"> 3880 <message name="message">
3834 Cannot buy objects from different owners at the same time. 3881 Cannot buy objects from different owners at the same time.
3835Please select only one object and try again. 3882Please select only one object and try again.
3836 </message> 3883 </message>
3837 </alert> 3884 </alert>
@@ -3936,9 +3983,9 @@ They will be copied to your inventory.
3936 <alert modal="true" name="ConfirmPurchase" nodefault="true"> 3983 <alert modal="true" name="ConfirmPurchase" nodefault="true">
3937 <message name="message"> 3984 <message name="message">
3938 This transaction will: 3985 This transaction will:
3939 3986
3940[ACTION] 3987[ACTION]
3941 3988
3942Are you sure you want to proceed with this purchase? 3989Are you sure you want to proceed with this purchase?
3943 </message> 3990 </message>
3944 <option name="Confirm"> 3991 <option name="Confirm">
@@ -3951,9 +3998,9 @@ Are you sure you want to proceed with this purchase?
3951 <alert modal="true" name="ConfirmPurchasePassword" nodefault="true"> 3998 <alert modal="true" name="ConfirmPurchasePassword" nodefault="true">
3952 <message name="message"> 3999 <message name="message">
3953 This transaction will: 4000 This transaction will:
3954 4001
3955[ACTION] 4002[ACTION]
3956 4003
3957Are you sure you want to proceed with this purchase? 4004Are you sure you want to proceed with this purchase?
3958Please re-enter your password and click Confirm. 4005Please re-enter your password and click Confirm.
3959 </message> 4006 </message>
@@ -3980,7 +4027,7 @@ will retain their original values.
3980 <message name="message"> 4027 <message name="message">
3981 You have selected &apos;no copy&apos; inventory items. 4028 You have selected &apos;no copy&apos; inventory items.
3982These items will be moved to your inventory, not copied. 4029These items will be moved to your inventory, not copied.
3983 4030
3984Move the inventory item(s)? 4031Move the inventory item(s)?
3985 </message> 4032 </message>
3986 <ignore> 4033 <ignore>
@@ -3995,12 +4042,12 @@ Move the inventory item(s)?
3995 </alert> 4042 </alert>
3996 <alert modal="true" name="MoveInventoryFromScriptedObject"> 4043 <alert modal="true" name="MoveInventoryFromScriptedObject">
3997 <message name="message"> 4044 <message name="message">
3998 You have selected &apos;no copy&apos; inventory items. These items 4045 You have selected &apos;no copy&apos; inventory items. These items
3999will be moved to your inventory, not copied. 4046will be moved to your inventory, not copied.
4000 4047
4001Because this object is scripted, moving these items 4048Because this object is scripted, moving these items
4002to your inventory may cause the script to malfunction. 4049to your inventory may cause the script to malfunction.
4003 4050
4004Move the inventory item(s)? 4051Move the inventory item(s)?
4005 </message> 4052 </message>
4006 <ignore> 4053 <ignore>
@@ -4015,9 +4062,9 @@ Move the inventory item(s)?
4015 </alert> 4062 </alert>
4016 <alert name="ClickActionNotPayable"> 4063 <alert name="ClickActionNotPayable">
4017 <message name="message"> 4064 <message name="message">
4018 Warning: The Pay Object click action has been set, but it 4065 Warning: The Pay Object click action has been set, but it
4019will only work if a script is added with a money() event. 4066will only work if a script is added with a money() event.
4020This is because residents generally expect that objects 4067This is because residents generally expect that objects
4021will react somehow when money is payed into them. 4068will react somehow when money is payed into them.
4022 </message> 4069 </message>
4023 <ignore> 4070 <ignore>
@@ -4045,48 +4092,48 @@ will react somehow when money is payed into them.
4045 </alert> 4092 </alert>
4046 <alert modal="true" name="HelpReportAbuseEmailLL" > 4093 <alert modal="true" name="HelpReportAbuseEmailLL" >
4047 <message name="message"> 4094 <message name="message">
4048Use this tool to report violations of the Terms of Service 4095Use this tool to report violations of the Terms of Service
4049and Community Standards. See: 4096and Community Standards. See:
4050- 4097-
4051http://secondlife.com/corporate/tos.php 4098http://secondlife.com/corporate/tos.php
4052http://secondlife.com/corporate/cs.php 4099http://secondlife.com/corporate/cs.php
4053- 4100-
4054All reported abuses of the Terms of Service and Community Standards 4101All reported abuses of the Terms of Service and Community Standards
4055are investigated and resolved. You will receive an email informing you 4102are investigated and resolved. You will receive an email informing you
4056of the resolution when it occurs. You can also view the incident 4103of the resolution when it occurs. You can also view the incident
4057resolution on the Police Blotter at: 4104resolution on the Police Blotter at:
4058- 4105-
4059http://secondlife.com/community/blotter.php 4106http://secondlife.com/community/blotter.php
4060 </message> 4107 </message>
4061 </alert> 4108 </alert>
4062 <alert modal="true" name="HelpReportAbuseEmailEO"> 4109 <alert modal="true" name="HelpReportAbuseEmailEO">
4063 <message name="message"> 4110 <message name="message">
4064IMPORTANT: This report will go to the owner of the 4111IMPORTANT: This report will go to the owner of the
4065region you are currently in and not to Linden Lab. 4112region you are currently in and not to Linden Lab.
4066- 4113-
4067As a service to residents and visitors, the owner of 4114As a service to residents and visitors, the owner of
4068the region you are in has elected to receive and resolve 4115the region you are in has elected to receive and resolve
4069all reports originating in this region. Linden Lab will 4116all reports originating in this region. Linden Lab will
4070not investigate reports you file from this location. 4117not investigate reports you file from this location.
4071The region owner will resolve reports based on the local 4118The region owner will resolve reports based on the local
4072rules of this region as outlined in the estate Covenant. 4119rules of this region as outlined in the estate Covenant.
4073(View covenants by going to the World menu and selecting 4120(View covenants by going to the World menu and selecting
4074About Land.) 4121About Land.)
4075- 4122-
4076The resolution of this report applies only to this Region; 4123The resolution of this report applies only to this Region;
4077Residents access to other areas of Second Life will not be 4124Residents access to other areas of Second Life will not be
4078affected by the outcome of this report. Only Linden Lab can 4125affected by the outcome of this report. Only Linden Lab can
4079restrict access to the entirety of Second Life. 4126restrict access to the entirety of Second Life.
4080 </message> 4127 </message>
4081 </alert> 4128 </alert>
4082 <alert modal="true" name="HelpReportBug"> 4129 <alert modal="true" name="HelpReportBug">
4083 <message name="message"> 4130 <message name="message">
4084 Use this tool to *only* report technical features that do not perform as 4131 Use this tool to *only* report technical features that do not perform as
4085described or expected, please provide as much detail as possible, You 4132described or expected, please provide as much detail as possible, You
4086may reply to the auto-response email to add more details to your report. 4133may reply to the auto-response email to add more details to your report.
4087All bug reports are investigated and assessed. No email response will be sent. 4134All bug reports are investigated and assessed. No email response will be sent.
4088- 4135-
4089If you are having a technical difficulty, please contact Support at: 4136If you are having a technical difficulty, please contact Support at:
4090http://secondlife.com/community/support.php 4137http://secondlife.com/community/support.php
4091- 4138-
4092Note: Incomplete reports will not be investigated 4139Note: Incomplete reports will not be investigated
@@ -4095,42 +4142,42 @@ Note: Incomplete reports will not be investigated
4095 <alert modal="true" name="HelpReportAbuseSelectCategory"> 4142 <alert modal="true" name="HelpReportAbuseSelectCategory">
4096 <message name="message"> 4143 <message name="message">
4097 Please select a category for this abuse report. 4144 Please select a category for this abuse report.
4098 4145
4099Selecting a category helps us file and process abuse reports. 4146Selecting a category helps us file and process abuse reports.
4100 </message> 4147 </message>
4101 </alert> 4148 </alert>
4102 <alert modal="true" name="HelpReportBugSelectCategory"> 4149 <alert modal="true" name="HelpReportBugSelectCategory">
4103 <message name="message"> 4150 <message name="message">
4104 Please select a category for this bug. 4151 Please select a category for this bug.
4105 4152
4106Selecting a category helps us file and process bug reports. 4153Selecting a category helps us file and process bug reports.
4107 </message> 4154 </message>
4108 </alert> 4155 </alert>
4109 <alert modal="true" name="HelpReportAbuseAbuserNameEmpty"> 4156 <alert modal="true" name="HelpReportAbuseAbuserNameEmpty">
4110 <message name="message"> 4157 <message name="message">
4111 Please enter the name of the abuser. 4158 Please enter the name of the abuser.
4112 4159
4113Entering an accurate value helps us file and process abuse reports. 4160Entering an accurate value helps us file and process abuse reports.
4114 </message> 4161 </message>
4115 </alert> 4162 </alert>
4116 <alert modal="true" name="HelpReportAbuseAbuserLocationEmpty"> 4163 <alert modal="true" name="HelpReportAbuseAbuserLocationEmpty">
4117 <message name="message"> 4164 <message name="message">
4118 Please enter the location where the abuse took place. 4165 Please enter the location where the abuse took place.
4119 4166
4120Entering an accurate value helps us file and process abuse reports. 4167Entering an accurate value helps us file and process abuse reports.
4121 </message> 4168 </message>
4122 </alert> 4169 </alert>
4123 <alert modal="true" name="HelpReportAbuseSummaryEmpty"> 4170 <alert modal="true" name="HelpReportAbuseSummaryEmpty">
4124 <message name="message"> 4171 <message name="message">
4125 Please enter a summary of the abuse that took place. 4172 Please enter a summary of the abuse that took place.
4126 4173
4127Entering an accurate summary helps us file and process abuse reports. 4174Entering an accurate summary helps us file and process abuse reports.
4128 </message> 4175 </message>
4129 </alert> 4176 </alert>
4130 <alert modal="true" name="HelpReportBugSummaryEmpty"> 4177 <alert modal="true" name="HelpReportBugSummaryEmpty">
4131 <message name="message"> 4178 <message name="message">
4132 Please enter a summary of the bug. 4179 Please enter a summary of the bug.
4133 4180
4134Entering an accurate summary helps us file and process bug reports. 4181Entering an accurate summary helps us file and process bug reports.
4135 </message> 4182 </message>
4136 </alert> 4183 </alert>
@@ -4139,7 +4186,7 @@ Entering an accurate summary helps us file and process bug reports.
4139 Please enter a detailed description of the abuse that took place. 4186 Please enter a detailed description of the abuse that took place.
4140Be as specific as you can, including names and the details of the 4187Be as specific as you can, including names and the details of the
4141incident you are reporting. 4188incident you are reporting.
4142 4189
4143Entering an accurate description helps us file and process abuse reports. 4190Entering an accurate description helps us file and process abuse reports.
4144 </message> 4191 </message>
4145 </alert> 4192 </alert>
@@ -4148,24 +4195,24 @@ Entering an accurate description helps us file and process abuse reports.
4148 Please enter a detailed description of the bug. 4195 Please enter a detailed description of the bug.
4149Be as specific as you can, including steps to reproduce the bug 4196Be as specific as you can, including steps to reproduce the bug
4150if possible. 4197if possible.
4151 4198
4152Entering an accurate description helps us file and process bug reports. 4199Entering an accurate description helps us file and process bug reports.
4153 </message> 4200 </message>
4154 </alert> 4201 </alert>
4155 <alert modal="true" name="HelpReportAbuseContainsCopyright"> 4202 <alert modal="true" name="HelpReportAbuseContainsCopyright">
4156 <message name="message"> 4203 <message name="message">
4157 Dear Resident, 4204 Dear Resident,
4158 4205
4159Reports about copyright infringement can only be submitted 4206Reports about copyright infringement can only be submitted
4160as described at http://secondlife.com/corporate/dmca.php. 4207as described at http://secondlife.com/corporate/dmca.php.
4161 4208
4162Reports concerning copyright infringement will automatically 4209Reports concerning copyright infringement will automatically
4163be discarded if they are submitted through the &apos;Abuse Report&apos; 4210be discarded if they are submitted through the &apos;Abuse Report&apos;
4164feature. If your report does not relate to copyright infringement, 4211feature. If your report does not relate to copyright infringement,
4165you may close this window and finish submitting your report. 4212you may close this window and finish submitting your report.
4166 4213
4167Thank you, 4214Thank you,
4168 4215
4169Linden Lab 4216Linden Lab
4170 </message> 4217 </message>
4171 </alert> 4218 </alert>
@@ -4195,7 +4242,7 @@ Do you want to replace it with the selected object?
4195 You are in Busy Mode, which means you will not 4242 You are in Busy Mode, which means you will not
4196receive any items offered in exchange for 4243receive any items offered in exchange for
4197this payment. 4244this payment.
4198 4245
4199Would you like to leave Busy Mode before 4246Would you like to leave Busy Mode before
4200completing this transaction? 4247completing this transaction?
4201 </message> 4248 </message>
@@ -4242,9 +4289,9 @@ the contents of your Lost And Found folder?
4242 <alert modal="true" name="CopySLURL"> 4289 <alert modal="true" name="CopySLURL">
4243 <message name="message"> 4290 <message name="message">
4244 The following SLURL has been copied to your clipboard: 4291 The following SLURL has been copied to your clipboard:
4245 4292
4246 [SLURL] 4293 [SLURL]
4247 4294
4248 Put it in a web page to give others easy access to this location or 4295 Put it in a web page to give others easy access to this location or
4249 try it out yourself by pasting it into the address bar of your web browser. 4296 try it out yourself by pasting it into the address bar of your web browser.
4250 </message> 4297 </message>
@@ -4288,4 +4335,11 @@ the contents of your Lost And Found folder?
4288 OK 4335 OK
4289 </option> 4336 </option>
4290 </alert> 4337 </alert>
4338 <alert modal="true" name="Cannot_Purchase_an_Attachment">
4339 <message name="message">
4340 Items may not be purchased while
4341 they are part of an attachment.
4342 </message>
4343 </alert>
4344
4291</alerts> 4345</alerts>
diff --git a/linden/indra/newview/skins/xui/en-us/floater_avatar_picker.xml b/linden/indra/newview/skins/xui/en-us/floater_avatar_picker.xml
index a0e6a91..71a3bd4 100644
--- a/linden/indra/newview/skins/xui/en-us/floater_avatar_picker.xml
+++ b/linden/indra/newview/skins/xui/en-us/floater_avatar_picker.xml
@@ -6,7 +6,7 @@
6 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 6 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
7 bottom="-40" drop_shadow_visible="true" follows="left|top" 7 bottom="-40" drop_shadow_visible="true" follows="left|top"
8 font="SansSerifSmall" h_pad="0" halign="left" height="16" hidden="false" 8 font="SansSerifSmall" h_pad="0" halign="left" height="16" hidden="false"
9 left="12" mouse_opaque="true" name="Type part of the person&apos;s name:" 9 left="12" mouse_opaque="true" name="Type part of the resident&apos;s name:"
10 v_pad="0" width="220"> 10 v_pad="0" width="220">
11 Type part of the resident&apos;s name: 11 Type part of the resident&apos;s name:
12 </text> 12 </text>
@@ -24,7 +24,7 @@
24 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 24 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
25 bottom_delta="-24" drop_shadow_visible="true" follows="left|top" 25 bottom_delta="-24" drop_shadow_visible="true" follows="left|top"
26 font="SansSerifSmall" h_pad="0" halign="left" height="16" hidden="false" 26 font="SansSerifSmall" h_pad="0" halign="left" height="16" hidden="false"
27 left="12" mouse_opaque="true" name="Or select a calling card:" v_pad="0" 27 left="12" mouse_opaque="true" name="Or select their calling card:" v_pad="0"
28 width="220"> 28 width="220">
29 Or select a calling card: 29 Or select a calling card:
30 </text> 30 </text>
diff --git a/linden/indra/newview/skins/xui/en-us/floater_inventory.xml b/linden/indra/newview/skins/xui/en-us/floater_inventory.xml
index 52af7a3..d9d8eb8 100755..100644
--- a/linden/indra/newview/skins/xui/en-us/floater_inventory.xml
+++ b/linden/indra/newview/skins/xui/en-us/floater_inventory.xml
@@ -149,6 +149,11 @@
149 name="Folders Always By Name" width="118"> 149 name="Folders Always By Name" width="118">
150 <on_click filter="" function="Inventory.SetSortBy" userdata="foldersalwaysbyname" /> 150 <on_click filter="" function="Inventory.SetSortBy" userdata="foldersalwaysbyname" />
151 </menu_item_check> 151 </menu_item_check>
152 <menu_item_check bottom_delta="-18" control_name="Inventory.SystemFoldersToTop" height="18"
153 hidden="false" label="System Folders To Top" left="0" mouse_opaque="true"
154 name="System Folders To Top" width="118">
155 <on_click filter="" function="Inventory.SetSortBy" userdata="systemfolderstotop" />
156 </menu_item_check>
152 </menu> 157 </menu>
153 <menu bottom_delta="28" color="0, 0, 0, 1" drop_shadow="true" height="49" 158 <menu bottom_delta="28" color="0, 0, 0, 1" drop_shadow="true" height="49"
154 hidden="false" label="Filters" left="0" mouse_opaque="false" name="Filters" 159 hidden="false" label="Filters" left="0" mouse_opaque="false" name="Filters"
diff --git a/linden/indra/newview/skins/xui/en-us/floater_lsl_guide.xml b/linden/indra/newview/skins/xui/en-us/floater_lsl_guide.xml
index 29d1fa2..773b54b 100644
--- a/linden/indra/newview/skins/xui/en-us/floater_lsl_guide.xml
+++ b/linden/indra/newview/skins/xui/en-us/floater_lsl_guide.xml
@@ -1,23 +1,21 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater bottom="-500" can_close="true" can_drag_on_left="false" can_minimize="true" 1<floater bottom="-500" can_close="true" can_drag_on_left="false" can_minimize="true"
3 can_resize="true" enabled="true" follows="left|top" height="400" 2 can_resize="true" enabled="true" follows="left|top" height="400"
4 hidden="false" left="306" min_height="271" min_width="350" 3 hidden="false" left="306" min_height="271" min_width="350"
5 mouse_opaque="true" name="script ed float" 4 mouse_opaque="true" name="script ed float" rect_control="LSLHelpRect"
6 title="LSL Wiki" width="370"> 5 title="LSL Wiki" width="370">
7 <check_box bottom="-45" enabled="true" follows="top|left" font="SansSerif" 6 <check_box bottom="-45" enabled="true" follows="top|left" font="SansSerif" halign="center"
8 halign="center" height="20" hidden="false" label="Follow cursor" 7 height="20" hidden="false" label="Follow cursor" left="10"
9 left="10" mouse_opaque="true" name="lock_check" width="60" /> 8 mouse_opaque="true" name="lock_check" width="60" />
10 <combo_box bottom_delta="0" enabled="true" follows="top|left|right" font="SansSerif" 9 <combo_box allow_text_entry="true" bottom_delta="0" enabled="true"
11 halign="center" height="20" hidden="false" label="Lock" 10 follows="top|left|right" font="SansSerif" halign="center" height="20"
12 left_delta="100" mouse_opaque="true" name="history_combo" 11 hidden="false" label="Lock" left_delta="100" mouse_opaque="true"
13 width="90" /> 12 name="history_combo" width="90" />
14 <button bottom_delta="0" enabled="true" follows="top|right" font="SansSerif" 13 <button bottom_delta="0" enabled="true" follows="top|right" font="SansSerif"
15 halign="center" height="20" hidden="false" label="Back" 14 halign="center" height="20" hidden="false" label="Back" left_delta="95"
16 left_delta="95" mouse_opaque="true" name="back_btn" 15 mouse_opaque="true" name="back_btn" width="70" />
17 width="70" />
18 <button bottom_delta="0" enabled="true" follows="top|right" font="SansSerif" 16 <button bottom_delta="0" enabled="true" follows="top|right" font="SansSerif"
19 halign="center" height="20" hidden="false" label="Forward" 17 halign="center" height="20" hidden="false" label="Forward" left_delta="75"
20 left_delta="75" mouse_opaque="true" name="fwd_btn" 18 mouse_opaque="true" name="fwd_btn" width="70" />
21 width="70" /> 19 <web_browser bottom="10" follows="left|right|top|bottom" left="10" name="lsl_guide_html"
22 <web_browser left="10" right="-10" follows="left|right|top|bottom" bottom="10" top="-50" name="lsl_guide_html"/> 20 right="-10" top="-50" />
23</floater> 21</floater>
diff --git a/linden/indra/newview/skins/xui/en-us/floater_mute.xml b/linden/indra/newview/skins/xui/en-us/floater_mute.xml
index bb45932..132f53a 100644
--- a/linden/indra/newview/skins/xui/en-us/floater_mute.xml
+++ b/linden/indra/newview/skins/xui/en-us/floater_mute.xml
@@ -11,8 +11,8 @@
11 hidden="false" left="4" mouse_opaque="true" multi_select="false" 11 hidden="false" left="4" mouse_opaque="true" multi_select="false"
12 name="mutes" tool_tip="List of currently muted residents" width="292" /> 12 name="mutes" tool_tip="List of currently muted residents" width="292" />
13 <button bottom="-244" enabled="true" follows="left|bottom" font="SansSerif" 13 <button bottom="-244" enabled="true" follows="left|bottom" font="SansSerif"
14 halign="center" height="20" hidden="false" label="Mute resident..." 14 halign="center" height="20" hidden="false" label="Mute Resident..."
15 label_selected="Mute resident..." left="4" mouse_opaque="true" 15 label_selected="Mute Resident..." left="4" mouse_opaque="true"
16 name="Mute resident..." tool_tip="Pick a resident to mute" width="200" /> 16 name="Mute resident..." tool_tip="Pick a resident to mute" width="200" />
17 <button bottom="-268" enabled="true" follows="left|bottom" font="SansSerif" 17 <button bottom="-268" enabled="true" follows="left|bottom" font="SansSerif"
18 halign="center" height="20" hidden="false" label="Mute object by name..." 18 halign="center" height="20" hidden="false" label="Mute object by name..."
diff --git a/linden/indra/newview/skins/xui/en-us/floater_sell_land.xml b/linden/indra/newview/skins/xui/en-us/floater_sell_land.xml
index 13e5f2e..13e5f2e 100755..100644
--- a/linden/indra/newview/skins/xui/en-us/floater_sell_land.xml
+++ b/linden/indra/newview/skins/xui/en-us/floater_sell_land.xml
diff --git a/linden/indra/newview/skins/xui/en-us/menu_inventory.xml b/linden/indra/newview/skins/xui/en-us/menu_inventory.xml
index bd955e3..bd955e3 100755..100644
--- a/linden/indra/newview/skins/xui/en-us/menu_inventory.xml
+++ b/linden/indra/newview/skins/xui/en-us/menu_inventory.xml
diff --git a/linden/indra/newview/skins/xui/en-us/menu_pie_attachment.xml b/linden/indra/newview/skins/xui/en-us/menu_pie_attachment.xml
index 66e12f0..66e12f0 100755..100644
--- a/linden/indra/newview/skins/xui/en-us/menu_pie_attachment.xml
+++ b/linden/indra/newview/skins/xui/en-us/menu_pie_attachment.xml
diff --git a/linden/indra/newview/skins/xui/en-us/menu_pie_avatar.xml b/linden/indra/newview/skins/xui/en-us/menu_pie_avatar.xml
index 91e27b7..91e27b7 100755..100644
--- a/linden/indra/newview/skins/xui/en-us/menu_pie_avatar.xml
+++ b/linden/indra/newview/skins/xui/en-us/menu_pie_avatar.xml
diff --git a/linden/indra/newview/skins/xui/en-us/menu_pie_land.xml b/linden/indra/newview/skins/xui/en-us/menu_pie_land.xml
index cb06ebf..cb06ebf 100755..100644
--- a/linden/indra/newview/skins/xui/en-us/menu_pie_land.xml
+++ b/linden/indra/newview/skins/xui/en-us/menu_pie_land.xml
diff --git a/linden/indra/newview/skins/xui/en-us/menu_pie_object.xml b/linden/indra/newview/skins/xui/en-us/menu_pie_object.xml
index e59ac38..e59ac38 100755..100644
--- a/linden/indra/newview/skins/xui/en-us/menu_pie_object.xml
+++ b/linden/indra/newview/skins/xui/en-us/menu_pie_object.xml
diff --git a/linden/indra/newview/skins/xui/en-us/menu_pie_self.xml b/linden/indra/newview/skins/xui/en-us/menu_pie_self.xml
index 82113d4..82113d4 100755..100644
--- a/linden/indra/newview/skins/xui/en-us/menu_pie_self.xml
+++ b/linden/indra/newview/skins/xui/en-us/menu_pie_self.xml
diff --git a/linden/indra/newview/skins/xui/en-us/menu_viewer.xml b/linden/indra/newview/skins/xui/en-us/menu_viewer.xml
index d964ec3..6d4840f 100755..100644
--- a/linden/indra/newview/skins/xui/en-us/menu_viewer.xml
+++ b/linden/indra/newview/skins/xui/en-us/menu_viewer.xml
@@ -39,6 +39,12 @@
39 <on_click function="File.CloseWindow" userdata="" /> 39 <on_click function="File.CloseWindow" userdata="" />
40 <on_enable function="File.EnableCloseWindow" userdata="" /> 40 <on_enable function="File.EnableCloseWindow" userdata="" />
41 </menu_item_call> 41 </menu_item_call>
42 <menu_item_call bottom="-113" enabled="true" height="19" hidden="false" label="Close All Windows"
43 left="0" mouse_opaque="true" name="Close All Windows" shortcut="control|shift|W"
44 width="243">
45 <on_click function="File.CloseAllWindows" userdata="" />
46 <on_enable function="File.EnableCloseWindow" userdata="" />
47 </menu_item_call>
42 <menu_item_separator bottom="-121" enabled="true" height="8" hidden="false" label="-----------" 48 <menu_item_separator bottom="-121" enabled="true" height="8" hidden="false" label="-----------"
43 left="0" mouse_opaque="true" name="separator2" width="243" /> 49 left="0" mouse_opaque="true" name="separator2" width="243" />
44 <menu_item_call bottom="-140" enabled="true" height="19" hidden="false" 50 <menu_item_call bottom="-140" enabled="true" height="19" hidden="false"
@@ -771,12 +777,43 @@
771 <on_click function="Tools.SelectedScriptAction" userdata="stop" /> 777 <on_click function="Tools.SelectedScriptAction" userdata="stop" />
772 <on_enable function="EditableSelected" /> 778 <on_enable function="EditableSelected" />
773 </menu_item_call> 779 </menu_item_call>
774 <menu_item_separator bottom="-411" enabled="true" height="8" hidden="false" label="-----------" 780 <menu_item_separator bottom="-411" enabled="true" height="8" hidden="false" label="-----------"
775 left="0" mouse_opaque="true" name="separator6" width="250" /> 781 left="0" mouse_opaque="true" name="separator7" width="250" />
776 <menu_item_call bottom="-240" enabled="true" height="19" hidden="false" label="Report Bug..." 782 <menu bottom="-554" color="0 0 0 1" drop_shadow="true" enabled="true" height="109"
783 hidden="false" label="Bug Reporting" left="0" mouse_opaque="false"
784 name="Select Tool" opaque="true" tear_off="true" create_jump_keys="true"
785 width="118">
786 <menu_item_call bottom="-240" enabled="true" height="19" hidden="false" label="Report Bug..."
777 left="0" mouse_opaque="true" name="Report Bug..." width="166"> 787 left="0" mouse_opaque="true" name="Report Bug..." width="166">
778 <on_click function="ShowFloater" userdata="bug reporter" /> 788 <on_click function="ShowFloater" userdata="bug reporter" />
779 </menu_item_call> 789 </menu_item_call>
790 <menu_item_call bottom="-94" enabled="true" height="19" hidden="false"
791 label="Bug Reporting 101..." left="0" mouse_opaque="true"
792 name="Bug Reporing 101..." width="166">
793 <on_click function="PromptShowURL"
794 userdata="WebLaunchBugReport101,https://wiki.secondlife.com/wiki/Bug_Reporting_101" />
795 </menu_item_call>
796 <menu_item_call bottom="-94" enabled="true" height="19" hidden="false"
797 label="Security Issues..." left="0" mouse_opaque="true"
798 name="Security Issues..." width="166">
799 <on_click function="PromptShowURL"
800 userdata="WebLaunchSecurityIssues,https://wiki.secondlife.com/wiki/Security_issues" />
801 </menu_item_call>
802 <menu_item_separator bottom="-411" enabled="true" height="8" hidden="false" label="-----------"
803 left="0" mouse_opaque="true" name="separator7" width="250" />
804 <menu_item_call bottom="-94" enabled="true" height="19" hidden="false"
805 label="Public Issue Tracker..." left="0" mouse_opaque="true"
806 name="Public Issue Tracker..." width="166">
807 <on_click function="PromptShowURL"
808 userdata="WebLaunchPublicIssue,https://jira.secondlife.com" />
809 </menu_item_call>
810 <menu_item_call bottom="-94" enabled="true" height="19" hidden="false"
811 label="Public Issue Tracker Help..." left="0" mouse_opaque="true"
812 name="Publc Issue Tracker Help..." width="166">
813 <on_click function="PromptShowURL"
814 userdata="WebLaunchPublicIssueHelp,https://wiki.secondlife.com/wiki/Issue_tracker" />
815 </menu_item_call>
816 </menu>
780 </menu> 817 </menu>
781 <menu bottom="219" color="0 0 0 1" drop_shadow="true" enabled="true" height="317" 818 <menu bottom="219" color="0 0 0 1" drop_shadow="true" enabled="true" height="317"
782 hidden="false" label="Help" left="227" mouse_opaque="false" name="Help" 819 hidden="false" label="Help" left="227" mouse_opaque="false" name="Help"
diff --git a/linden/indra/newview/skins/xui/en-us/notify.xml b/linden/indra/newview/skins/xui/en-us/notify.xml
index 291b1b8..54451ab 100644
--- a/linden/indra/newview/skins/xui/en-us/notify.xml
+++ b/linden/indra/newview/skins/xui/en-us/notify.xml
@@ -420,7 +420,7 @@ No scripts will run except those belonging to the land owner.
420 </notify> 420 </notify>
421 <notify name="ObjectGiveItem" tip="false"> 421 <notify name="ObjectGiveItem" tip="false">
422 <message name="message"> 422 <message name="message">
423 An object named [OBJECTFROMNAME] owned by [FIRST] [LAST] has given you a [OBJECTTYPE] named &apos;[OBJECTNAME]&apos;. 423 An object named [OBJECTFROMNAME] owned by [FIRST] [LAST] has given you a [OBJECTTYPE] named [OBJECTNAME].
424 </message> 424 </message>
425 <option name="Keep"> 425 <option name="Keep">
426 Keep 426 Keep
@@ -434,7 +434,7 @@ No scripts will run except those belonging to the land owner.
434 </notify> 434 </notify>
435 <notify name="ObjectGiveItemUnknownUser" tip="false"> 435 <notify name="ObjectGiveItemUnknownUser" tip="false">
436 <message name="message"> 436 <message name="message">
437 An object named [OBJECTFROMNAME] owned by (an unknown user) has given you a [OBJECTTYPE] named &apos;[OBJECTNAME]&apos;. 437 An object named [OBJECTFROMNAME] owned by (an unknown user) has given you a [OBJECTTYPE] named [OBJECTNAME].
438 </message> 438 </message>
439 <option name="Keep"> 439 <option name="Keep">
440 Keep 440 Keep
diff --git a/linden/indra/newview/skins/xui/en-us/panel_preferences_general.xml b/linden/indra/newview/skins/xui/en-us/panel_preferences_general.xml
index a92155a..8297887 100644
--- a/linden/indra/newview/skins/xui/en-us/panel_preferences_general.xml
+++ b/linden/indra/newview/skins/xui/en-us/panel_preferences_general.xml
@@ -69,12 +69,11 @@
69 label="Notify when Linden dollars (L$) spent or received" left="148" 69 label="Notify when Linden dollars (L$) spent or received" left="148"
70 mouse_opaque="true" name="notify_money_change_checkbox" radio_style="false" 70 mouse_opaque="true" name="notify_money_change_checkbox" radio_style="false"
71 width="256" /> 71 width="256" />
72 <check_box bottom="-326" control_name="ProbeHardwareOnStartup" enabled="true" 72 <check_box bottom="-326" control_name="ShowNewInventory" enabled="true"
73 follows="left|top" font="SansSerifSmall" height="16" hidden="false" 73 follows="left|top" font="SansSerifSmall" height="16" hidden="false"
74 initial_value="false" label="Auto-detect graphics hardware on next startup" 74 initial_value="false" label="Automatic previews of new notecards/textures/landmarks"
75 left="148" mouse_opaque="true" name="probe_hardware_checkbox" 75 left="148" mouse_opaque="true" name="show_new_inventory"
76 radio_style="false" 76 radio_style="false"
77 tool_tip="Second Life automatically configures some graphics settings based on your hardware. If you install new hardware, you should have Second Life detect it again."
78 width="270" /> 77 width="270" />
79 <check_box bottom="-344" control_name="UseDefaultColorPicker" enabled="true" 78 <check_box bottom="-344" control_name="UseDefaultColorPicker" enabled="true"
80 follows="left|top" font="SansSerifSmall" height="16" hidden="false" 79 follows="left|top" font="SansSerifSmall" height="16" hidden="false"
diff --git a/linden/indra/newview/skins/xui/en-us/panel_preferences_graphics3.xml b/linden/indra/newview/skins/xui/en-us/panel_preferences_graphics3.xml
index 3a1f32e..fd48f34 100644
--- a/linden/indra/newview/skins/xui/en-us/panel_preferences_graphics3.xml
+++ b/linden/indra/newview/skins/xui/en-us/panel_preferences_graphics3.xml
@@ -109,4 +109,11 @@
109 increment="1" initial_val="1" label="Debug Beacon Line Width:" 109 increment="1" initial_val="1" label="Debug Beacon Line Width:"
110 label_width="138" left="10" max_val="127" min_val="1" mouse_opaque="true" 110 label_width="138" left="10" max_val="127" min_val="1" mouse_opaque="true"
111 name="debug beacon line width" width="202" /> 111 name="debug beacon line width" width="202" />
112 <check_box bottom="-304" control_name="ProbeHardwareOnStartup" enabled="true"
113 follows="left|top" font="SansSerifSmall" height="16" hidden="false"
114 initial_value="false" label="Auto-detect graphics hardware on next startup"
115 left="148" mouse_opaque="true" name="probe_hardware_checkbox"
116 radio_style="false"
117 tool_tip="Second Life automatically configures some graphics settings based on your hardware. If you install new hardware, you should have Second Life detect it again."
118 width="270" />
112</panel> 119</panel>
diff --git a/linden/indra/newview/skins/xui/en-us/panel_status_bar.xml b/linden/indra/newview/skins/xui/en-us/panel_status_bar.xml
index 2ee26d1..9feaafc 100644
--- a/linden/indra/newview/skins/xui/en-us/panel_status_bar.xml
+++ b/linden/indra/newview/skins/xui/en-us/panel_status_bar.xml
@@ -18,7 +18,7 @@
18 halign="right" height="18" hidden="false" left="-120" mouse_opaque="true" 18 halign="right" height="18" hidden="false" left="-120" mouse_opaque="true"
19 name="BalanceText" text_color="0 1 0 1" tool_tip="Account Balance" 19 name="BalanceText" text_color="0 1 0 1" tool_tip="Account Balance"
20 v_pad="2" width="76"> 20 v_pad="2" width="76">
21 L$ 21 Loading...
22 </text> 22 </text>
23 <button bottom="-18" enabled="true" follows="right|bottom" font="SansSerif" 23 <button bottom="-18" enabled="true" follows="right|bottom" font="SansSerif"
24 halign="center" height="16" hidden="false" 24 halign="center" height="16" hidden="false"
diff --git a/linden/indra/newview/viewer.cpp b/linden/indra/newview/viewer.cpp
index c42ac69..b71c6f2 100644
--- a/linden/indra/newview/viewer.cpp
+++ b/linden/indra/newview/viewer.cpp
@@ -27,6 +27,9 @@
27 */ 27 */
28 28
29#include "llviewerprecompiledheaders.h" 29#include "llviewerprecompiledheaders.h"
30
31#include "viewer.h"
32
30#include "llparcel.h" 33#include "llparcel.h"
31#include "llviewerparcelmgr.h" 34#include "llviewerparcelmgr.h"
32#include "llviewerjoystick.h" 35#include "llviewerjoystick.h"
@@ -104,8 +107,6 @@
104//#define LL_SEND_CRASH_REPORTS 0 107//#define LL_SEND_CRASH_REPORTS 0
105 108
106 109
107#include "viewer.h"
108
109// 110//
110// Linden library headers 111// Linden library headers
111// 112//
@@ -411,8 +412,6 @@ LLFrameTimer gRestoreGLTimer;
411BOOL gRestoreGL = FALSE; 412BOOL gRestoreGL = FALSE;
412 413
413 414
414LLGlobalEconomy *gGlobalEconomy = NULL;
415
416// VFS globals - see viewer.h 415// VFS globals - see viewer.h
417LLVFS* gStaticVFS = NULL; 416LLVFS* gStaticVFS = NULL;
418 417
@@ -485,6 +484,7 @@ static const char USAGE[] = "\n"
485"usage:\tviewer [options]\n" 484"usage:\tviewer [options]\n"
486"options:\n" 485"options:\n"
487" -login <first> <last> <password> log in as a user\n" 486" -login <first> <last> <password> log in as a user\n"
487" -autologin log in as last saved user\n"
488" -loginuri <URI> login server and CGI script to use\n" 488" -loginuri <URI> login server and CGI script to use\n"
489" -helperuri <URI> helper web CGI prefix to use\n" 489" -helperuri <URI> helper web CGI prefix to use\n"
490" -settings <filename> specify the filename of a\n" 490" -settings <filename> specify the filename of a\n"
@@ -515,6 +515,8 @@ static const char USAGE[] = "\n"
515#if LL_WINDOWS 515#if LL_WINDOWS
516" -noprobe disable hardware probe\n" 516" -noprobe disable hardware probe\n"
517#endif 517#endif
518" -noquicktime disable QuickTime movies, speeds startup\n"
519" -nopreload don't preload UI images or sounds, speeds startup\n"
518// these seem to be unused 520// these seem to be unused
519//" -noenv turn off environmental effects\n" 521//" -noenv turn off environmental effects\n"
520//" -proxy <proxy_ip> specify the proxy ip address\n" 522//" -proxy <proxy_ip> specify the proxy ip address\n"
@@ -536,6 +538,8 @@ std::string gChannelName = "Second Life Release";
536 538
537LLUUID gInventoryLibraryOwner; 539LLUUID gInventoryLibraryOwner;
538LLUUID gInventoryLibraryRoot; 540LLUUID gInventoryLibraryRoot;
541bool gPreloadImages = true;
542bool gPreloadSounds = true;
539 543
540LLString gCmdLineFirstName; 544LLString gCmdLineFirstName;
541LLString gCmdLineLastName; 545LLString gCmdLineLastName;
@@ -4035,7 +4039,7 @@ void init_audio()
4035 4039
4036 BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); 4040 BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio");
4037 4041
4038 if (!mute_audio) 4042 if (!mute_audio && gPreloadSounds)
4039 { 4043 {
4040 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndAlert"))); 4044 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndAlert")));
4041 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndBadKeystroke"))); 4045 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndBadKeystroke")));
@@ -4198,8 +4202,13 @@ BOOL add_object( LLPCode pcode, S32 x, S32 y, U8 use_physics )
4198 return FALSE; 4202 return FALSE;
4199 } 4203 }
4200 4204
4201 if (regionp 4205 if (NULL == regionp)
4202 && (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX)) 4206 {
4207 llwarns << "regionp was NULL; aborting function." << llendl;
4208 return FALSE;
4209 }
4210
4211 if (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX)
4203 { 4212 {
4204 LLFirstUse::useSandbox(); 4213 LLFirstUse::useSandbox();
4205 } 4214 }
@@ -5692,6 +5701,19 @@ int parse_args(int argc, char **argv)
5692 { 5701 {
5693 gProbeHardware = FALSE; 5702 gProbeHardware = FALSE;
5694 } 5703 }
5704 else if (!strcmp(argv[j], "-noquicktime"))
5705 {
5706 // Developers can log in faster if they don't load all the
5707 // quicktime dlls.
5708 gUseQuickTime = false;
5709 }
5710 else if (!strcmp(argv[j], "-nopreload"))
5711 {
5712 // Developers can log in faster if they don't decode sounds
5713 // or images on startup, ~5 seconds faster.
5714 gPreloadSounds = false;
5715 gPreloadImages = false;
5716 }
5695 else if (!strcmp(argv[j], "-purge")) 5717 else if (!strcmp(argv[j], "-purge"))
5696 { 5718 {
5697 purge_cache(); 5719 purge_cache();
diff --git a/linden/indra/newview/viewer.h b/linden/indra/newview/viewer.h
index f082e99..141206c 100644
--- a/linden/indra/newview/viewer.h
+++ b/linden/indra/newview/viewer.h
@@ -29,44 +29,41 @@
29#ifndef LL_VIEWER_H 29#ifndef LL_VIEWER_H
30#define LL_VIEWER_H 30#define LL_VIEWER_H
31 31
32#include "stdtypes.h" 32// DO NOT ADD DEPENDENCIES HERE
33#include "v3math.h" 33// Almost every file in the viewer depends on this file.
34#include "llcoord.h" 34// If you need to add a shared class, put it in its own
35 35// little file. JC
36#include "lltimer.h"
37#include "llframetimer.h"
38#include "lluuid.h"
39#include "llsys.h"
40#include "lltransactiontypes.h" 36#include "lltransactiontypes.h"
41#include "llviewercontrol.h" 37#include "llviewercontrol.h"
42 38
43// ************************************************************
44// Enabled this definition to compile a 'hacked' viewer that 39// Enabled this definition to compile a 'hacked' viewer that
45// allows a hacked godmode to be toggled on and off. 40// allows a hacked godmode to be toggled on and off.
46#define TOGGLE_HACKED_GODLIKE_VIEWER 41#define TOGGLE_HACKED_GODLIKE_VIEWER
47
48#ifdef TOGGLE_HACKED_GODLIKE_VIEWER 42#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
49extern BOOL gHackGodmode; 43extern BOOL gHackGodmode;
50#endif 44#endif
51// ************************************************************ 45
52 46
53// 47//
54// Forward Declarations 48// Forward Declarations
55// 49//
56class LLVector3d; 50class LLAudioEngine;
57class LLViewerObject; 51class LLFrameTimer;
58class LLMessageSystem; 52class LLMessageSystem;
59class LLHost; 53class LLHost;
60class LLAudioEngine;
61class LLViewerRegion;
62class LLVFS;
63class LLGlobalEconomy;
64class LLPieMenu; 54class LLPieMenu;
65class LLWorkerThread; 55class LLWorkerThread;
66class LLTextureFetch; 56class LLTextureFetch;
67class LLTextureCache; 57class LLTextureCache;
68class LLPumpIO; 58class LLPumpIO;
69class LLHTTPNode; 59class LLHTTPNode;
60class LLTimer;
61class LLUUID;
62class LLVector3;
63class LLVector3d;
64class LLViewerObject;
65class LLViewerRegion;
66class LLVFS;
70 67
71// 68//
72// Global Variables 69// Global Variables
@@ -79,6 +76,7 @@ extern BOOL gNoRender;
79extern LLMemoryInfo gSysMemory; 76extern LLMemoryInfo gSysMemory;
80extern BOOL gLogMessages; 77extern BOOL gLogMessages;
81extern BOOL gUseAudio; 78extern BOOL gUseAudio;
79extern bool gPreloadImages;
82extern BOOL gConnectToSomething; 80extern BOOL gConnectToSomething;
83extern BOOL gGodConnect; 81extern BOOL gGodConnect;
84extern BOOL gRunLocal; 82extern BOOL gRunLocal;
@@ -143,8 +141,6 @@ extern BOOL gShowObjectUpdates;
143extern BOOL gTeleportDisplay; 141extern BOOL gTeleportDisplay;
144extern LLFrameTimer gTeleportDisplayTimer; 142extern LLFrameTimer gTeleportDisplayTimer;
145 143
146extern LLGlobalEconomy *gGlobalEconomy;
147
148extern std::map<S32,LLFrameTimer> gDebugTimers; 144extern std::map<S32,LLFrameTimer> gDebugTimers;
149 145
150// VFS globals - gVFS is for general use 146// VFS globals - gVFS is for general use
diff --git a/linden/indra/newview/viewer_manifest.py b/linden/indra/newview/viewer_manifest.py
index 0c8ef60..2f4eb7c 100755
--- a/linden/indra/newview/viewer_manifest.py
+++ b/linden/indra/newview/viewer_manifest.py
@@ -84,7 +84,6 @@ class ViewerManifest(LLManifest):
84 self.end_prefix("html/*") 84 self.end_prefix("html/*")
85 self.end_prefix("skins") 85 self.end_prefix("skins")
86 86
87 self.path("featuretable.txt")
88 self.path("releasenotes.txt") 87 self.path("releasenotes.txt")
89 self.path("lsl_guide.html") 88 self.path("lsl_guide.html")
90 self.path("gpu_table.txt") 89 self.path("gpu_table.txt")
@@ -135,6 +134,8 @@ class WindowsManifest(ViewerManifest):
135 self.path(self.find_existing_file('ReleaseForDownload/llkdu.dll', 'llkdu.dll', '../../libraries/i686-win32/lib_release/llkdu.dll'), dst='llkdu.dll') 134 self.path(self.find_existing_file('ReleaseForDownload/llkdu.dll', 'llkdu.dll', '../../libraries/i686-win32/lib_release/llkdu.dll'), dst='llkdu.dll')
136 self.path(src="licenses-win32.txt", dst="licenses.txt") 135 self.path(src="licenses-win32.txt", dst="licenses.txt")
137 136
137 self.path("featuretable.txt")
138
138 # For use in crash reporting (generates minidumps) 139 # For use in crash reporting (generates minidumps)
139 self.path("dbghelp.dll") 140 self.path("dbghelp.dll")
140 141
@@ -408,6 +409,8 @@ class Linux_i686Manifest(LinuxManifest):
408 # recurse 409 # recurse
409 self.end_prefix("res-sdl") 410 self.end_prefix("res-sdl")
410 411
412 self.path("featuretable_linux.txt")
413
411 self.path("app_settings/mozilla-runtime-linux-i686") 414 self.path("app_settings/mozilla-runtime-linux-i686")
412 415
413 if self.prefix("../../libraries/i686-linux/lib_release_client", "lib"): 416 if self.prefix("../../libraries/i686-linux/lib_release_client", "lib"):