DRTVWR-546 merge in master v6.5.1
commit
353329c2c2
559
.hgtags
559
.hgtags
|
|
@ -1,559 +0,0 @@
|
|||
003dd9461bfa479049afcc34545ab3431b147c7c v2start
|
||||
52d96ad3d39be29147c5b2181b3bb46af6164f0e alpha-3
|
||||
d6781e22543acd7e21b967209f3c6e7003d380e3 fork to viewer-2-0
|
||||
7f16e79826d377f5f9f5b33dc721ab56d0d7dc8f alpha-4
|
||||
7f16e79826d377f5f9f5b33dc721ab56d0d7dc8f fork to viewer-20qa
|
||||
d40ac9dd949cba6dab1cc386da6a2027690c2519 alpha-5
|
||||
d2382d374139850efa5bb6adfb229e3e656cfc40 howard-demo
|
||||
b8419565906e4feb434426d8d9b17dd1458e24b2 alpha-6
|
||||
17fc2908e9a1ef34a9f53a41a393caf5c3cac390 beta-3-5
|
||||
3469d90a115b900f8f250e137bbd9b684130f5d2 beta-4
|
||||
12769e547e30067d494a6c01479a18107366ce2f beta-5
|
||||
4f777ffb99fefdc6497c61385c22688ff149c659 viewer-2-0-0
|
||||
668851b2ef0f8cf8df07a0fba429e4a6c1e70abb viewer-2-0-1
|
||||
08398e650c222336bb2b6de0cd3bba944aef11b4 2-1rn1
|
||||
80bc6cff515118a36108967af49d3f8105c95bc9 viewer-2-0-2-start
|
||||
46002088d9a4489e323b8d56131c680eaa21258c viewer-2-1-0-start
|
||||
3e4b947f79d88c385e8218cbc0731cef0e42cfc4 2-1-beta-1
|
||||
0962101bfa7df0643a6e625786025fe7f8a6dc97 2-1-beta-2
|
||||
1e2b517adc2ecb342cd3c865f2a6ccf82a3cf8d7 2-1-beta-3
|
||||
c6969fe44e58c542bfc6f1bd6c0be2fa860929ac 2-1-beta-4
|
||||
b03065d018b8a2e28b7de85b293a4c992cb4c12d 2-1-release
|
||||
19547b909b404552593be5ec7c18241e062a6d65 2-1-1-beta-1
|
||||
6e3b2e13906ba8ff22d3c8490b02d518adb2c907 2-1-1-beta-2
|
||||
bb38ff1a763738609e1b3cada6d15fa61e5e84b9 2-1-1-release
|
||||
bb38ff1a763738609e1b3cada6d15fa61e5e84b9 2.1.1-release
|
||||
c6e6324f5be1401f077ad18a4a0f6b46451c2f7b last_sprint
|
||||
7076e22f9f43f479a4ea75eac447a36364bead5a 2.2.0-beta1
|
||||
7076e22f9f43f479a4ea75eac447a36364bead5a DRTVWR-5_2.2.0-beta1
|
||||
7076e22f9f43f479a4ea75eac447a36364bead5a beta_2.1.3
|
||||
9822eb3e25f7fe0c28ffd8aba45c507caa383cbc 2.2.0-beta2
|
||||
9822eb3e25f7fe0c28ffd8aba45c507caa383cbc DRTVWR-3_2.2.0-beta2
|
||||
b0cd7e150009809a0b5b0a9d5785cd4bb230413a 2.2.0-beta3
|
||||
b0cd7e150009809a0b5b0a9d5785cd4bb230413a DRTVWR-7_2.2.0-beta3
|
||||
00a831292231faad7e44c69f76cb96f175b8dfad 2.2.0-beta4
|
||||
1415e6538d54fd5d568ee88343424d57c6803c2c 2.2.0-release
|
||||
1415e6538d54fd5d568ee88343424d57c6803c2c DRTVWR-8_2.2.0-release
|
||||
98e0d6df638429fd2f0476667504bd5a6b298def 2.3.0-start
|
||||
a3c12342b1af0951b8aa3b828aacef17fcea8178 2.3.0-beta1
|
||||
a3c12342b1af0951b8aa3b828aacef17fcea8178 DRTVWR-14_2.3.0-beta1
|
||||
db0fe9bb65187f365e58a717dd23d0f4754a9c1d 2.3.0-beta2
|
||||
db0fe9bb65187f365e58a717dd23d0f4754a9c1d DRTVWR-17_2.3.0-beta2
|
||||
6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 2.3.0-beta3
|
||||
6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 2.3.0-release
|
||||
6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 DRTVWR-13_2.3.0-release
|
||||
6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 DRTVWR-20_2.3.0-beta3
|
||||
dbc206fc61d89ff4cfe15aade0bf0c7bc7fee1c9 2.4.0-start
|
||||
3bc1f50a72e117f4d4ad8d555f0c785ea8cc201e 2.4.0-beta1
|
||||
3bc1f50a72e117f4d4ad8d555f0c785ea8cc201e DRTVWR-26_2.4.0-beta1
|
||||
25bd6007e3d2fc15db9326ed4b18a24a5969a46a 2.4.0-beta2
|
||||
25bd6007e3d2fc15db9326ed4b18a24a5969a46a DRTVWR-27_2.4.0-beta2
|
||||
1ed382c6a08ba3850b6ce9061bc551ddece0ea07 2.4.0-release
|
||||
1ed382c6a08ba3850b6ce9061bc551ddece0ea07 DRTVWR-25_2.4.0-release
|
||||
a82e5b1e22c7f90e3c7977d146b80588f004ed0d 2.5.0-start
|
||||
345b17e7cf630db77e840b4fe3451bd476d750a3 2.5.0-beta1
|
||||
345b17e7cf630db77e840b4fe3451bd476d750a3 DRTVWR-32_2.5.0-beta1
|
||||
54d772d8687c69b1d773f6ce14bbc7bdc9d6c05f 2.5.0-beta2
|
||||
54d772d8687c69b1d773f6ce14bbc7bdc9d6c05f DRTVWR-33--2.5.0beta2
|
||||
54d772d8687c69b1d773f6ce14bbc7bdc9d6c05f DRTVWR-33_2.5.0-beta2
|
||||
b723921b5c711bd24dbe77dc76ef488b544dac78 2.5.0-beta3
|
||||
b723921b5c711bd24dbe77dc76ef488b544dac78 2.5.0-release
|
||||
b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-31_2.5.0-release
|
||||
b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-34_2.5.0-beta3
|
||||
b542f8134a2bb5dd054ff4e509a44b2ee463b1bf nat-eventapi2-base
|
||||
63a6aedfce785a6c760377bf685b2dae616797d2 2.5.1-start
|
||||
4dede9ae1ec74d41f6887719f6f1de7340d8578d 2.5.1-release
|
||||
4dede9ae1ec74d41f6887719f6f1de7340d8578d DRTVWR-37_2.5.1-release
|
||||
b53a0576eec80614d7767ed72b40ed67aeff27c9 2.5.2-release
|
||||
b53a0576eec80614d7767ed72b40ed67aeff27c9 DRTVWR-38_2.5.2-release
|
||||
4e9eec6a347f89b2b3f295beb72f1cf7837dff66 2.6.0-start
|
||||
9283d6d1d7eb71dfe4c330e7c9144857e7356bde 2.6.0-beta1
|
||||
9283d6d1d7eb71dfe4c330e7c9144857e7356bde DRTVWR-40_2.6.0-beta1
|
||||
461c8c65b5c799ddfe365422f9be9c0095d91e7d 2.6.0-beta1-tip
|
||||
9e4641f4a7870c0f565a25a2971368d5a29516a1 2.6.0-beta2
|
||||
9e4641f4a7870c0f565a25a2971368d5a29516a1 DRTVWR-41_2.6.0-beta2
|
||||
42f32494bac475d0737799346f6831558ae8bf5d 2.6.0-release
|
||||
42f32494bac475d0737799346f6831558ae8bf5d DRTVWR-39_2.6.0-release
|
||||
c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-beta1
|
||||
c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-start
|
||||
c5bdef3aaa2744626aef3c217ce29e1900d357b3 DRTVWR-43_2.6.1-beta1
|
||||
c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release
|
||||
c9182ed77d427c759cfacf49a7b71a2e20d522aa DRTVWR-42_2.6.1-release
|
||||
56b2778c743c2a964d82e1caf11084d76a87de2c 2.6.2-start
|
||||
d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1
|
||||
d1203046bb653b763f835b04d184646949d8dd5c DRTVWR-45_2.6.2-beta1
|
||||
214180ad5714ce8392b82bbebcc92f4babd98300 2.6.2-release
|
||||
214180ad5714ce8392b82bbebcc92f4babd98300 DRTVWR-44_2.6.2-release
|
||||
52b2263ab28f0976c689fd0b76c55a9eb027cdbf end-of-develop.py
|
||||
ec32f1045e7c2644015245df3a9933620aa194b8 2.6.3-start
|
||||
d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1
|
||||
d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1
|
||||
0630e977504af5ea320c58d33cae4e1ddee793e9 2.6.3-beta2
|
||||
0630e977504af5ea320c58d33cae4e1ddee793e9 DRTVWR-48_2.6.3-beta2
|
||||
8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release
|
||||
8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release
|
||||
3178e311da3a8739a85363665006ea3c4610cad4 dons-headless-hackathon-work
|
||||
7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd 2.6.5-beta1
|
||||
7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd DRTVWR-50_2.6.5-beta1
|
||||
800cefce8d364ffdd2f383cbecb91294da3ea424 2.6.6-start
|
||||
bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 2.6.6-beta1
|
||||
bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 DRTVWR-52_2.6.6-beta1
|
||||
dac76a711da5f1489a01c1fa62ec97d99c25736d 2.6.6-release
|
||||
dac76a711da5f1489a01c1fa62ec97d99c25736d DRTVWR-51_2.6.6-release
|
||||
5e349dbe9cc84ea5795af8aeb6d473a0af9d4953 2.6.8-start
|
||||
beafa8a9bd1d1b670b7523d865204dc4a4b38eef 2.6.8-beta1
|
||||
beafa8a9bd1d1b670b7523d865204dc4a4b38eef DRTVWR-55_2.6.8-beta1
|
||||
be2000b946f8cb3de5f44b2d419287d4c48ec4eb 2.6.8-release
|
||||
be2000b946f8cb3de5f44b2d419287d4c48ec4eb DRTVWR-54_2.6.8-release
|
||||
e67da2c6e3125966dd49eef98b36317afac1fcfe 2.6.9-start
|
||||
77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-beta1
|
||||
77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-release
|
||||
77e5a08344c95738ab879f9671b7758cddd712a3 DRTVWR-56_2.6.9-release
|
||||
77e5a08344c95738ab879f9671b7758cddd712a3 DRTVWR-57_2.6.9-beta1
|
||||
8835e0e3c0d3a48244c287bc05811dfc2fba43ec 2.7.0-start
|
||||
43c7ee846b7eed80786acbbf35d03bd016a3e85d 2.7.0-beta1
|
||||
43c7ee846b7eed80786acbbf35d03bd016a3e85d DRTVWR-59_2.7.0-beta1
|
||||
54fd44ac92e4c61435ea33effe093a3527e18d98 2.7.1-start
|
||||
0c4d0c24278074f219e5a32e72b449e78301d11b 2.7.1-beta1
|
||||
0c4d0c24278074f219e5a32e72b449e78301d11b DRTVWR-61_2.7.1-beta1
|
||||
9f79a6ed8fdcd2f3dac33ea6b3236eeb278dccfe 2.7.2-start
|
||||
e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb 2.7.2-beta1
|
||||
e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb DRTVWR-63_2.7.2-beta1
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb 2.7.1-release
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb 2.7.2-release
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb DRTVWR-60_2.7.1-release
|
||||
fe3a8e7973072ea62043c08b19b66626c1a720eb DRTVWR-62_2.7.2-release
|
||||
6a3e7e403bd19e45fdfc2fcc716867af3ab80861 2.7.3-start
|
||||
6af10678de4736222b2c3f7e010e984fb5b327de 2.7.4-start
|
||||
be963a4eef635542f9617d7f5fd22ba48fb71958 2.7.4-beta1
|
||||
be963a4eef635542f9617d7f5fd22ba48fb71958 DRTVWR-67_2.7.4-beta1
|
||||
057f319dd8eccdf63a54d99686c68cdcb31b6abc 2.7.4-release
|
||||
057f319dd8eccdf63a54d99686c68cdcb31b6abc DRTVWR-66_2.7.4-release
|
||||
19a498fa62570f352d7d246f17e3c81cc1d82d8b 2.7.5-start
|
||||
09984bfa6cae17e0f72d02b75c1b7393c65eecfc 2.7.5-beta1
|
||||
09984bfa6cae17e0f72d02b75c1b7393c65eecfc DRTVWR-69_2.7.5-beta1
|
||||
6866d9df6efbd441c66451debd376d21211de39c 2.7.5-release
|
||||
6866d9df6efbd441c66451debd376d21211de39c DRTVWR-68_2.7.5-release
|
||||
e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-beta1
|
||||
e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-start
|
||||
e1ed60913230dd64269a7f7fc52cbc6004f6d52c DRTVWR-71_2.8.0-beta1
|
||||
493d9127ee50e84ba08a736a65a23ca86f7a5b01 2.8.0-release
|
||||
493d9127ee50e84ba08a736a65a23ca86f7a5b01 DRTVWR-70_2.8.0-release
|
||||
502f6a5deca9365ddae57db4f1e30172668e171e 2.8.1-start
|
||||
2c7e459e0c883f8e406b932e41e60097e9ee077e 2.8.1-beta1
|
||||
2c7e459e0c883f8e406b932e41e60097e9ee077e DRTVWR-73_2.8.1-beta1
|
||||
29e93d7e19991011bd12b5748142b11a5dcb4370 2.8.1-release
|
||||
29e93d7e19991011bd12b5748142b11a5dcb4370 DRTVWR-72_2.8.1-release
|
||||
4780e3bd2b3042f91be3426151f28c30d199bb3b 2.8.1-hotfix
|
||||
4780e3bd2b3042f91be3426151f28c30d199bb3b DRTVWR-76_2.8.1-hotfix
|
||||
54bc7823ad4e3a436fef79710f685a7372bbf795 2.8.2-start
|
||||
ac0f1a132d35c02a58861d37cca75b0429ac9137 2.8.3-start
|
||||
599677276b227357140dda35bea4a2c18e2e67b5 2.8.3-beta1
|
||||
599677276b227357140dda35bea4a2c18e2e67b5 DRTVWR-75_2.8.3-beta1
|
||||
fb85792b84bf28428889c4cc966469d92e5dac4c 2.8.3-release
|
||||
fb85792b84bf28428889c4cc966469d92e5dac4c DRTVWR-74_2.8.3-release
|
||||
6b678ea52f90d5c14181661dcd2546e25bde483e 3.0.0-start
|
||||
b0be6ce3adfef3a014a2389d360539f8a86c5439 3.0.0-beta1
|
||||
b0be6ce3adfef3a014a2389d360539f8a86c5439 DRTVWR-78_3.0.0-beta1
|
||||
1778f26b6d0ae762dec3ca37140f66620f2485d9 3.0.0-release
|
||||
1778f26b6d0ae762dec3ca37140f66620f2485d9 DRTVWR-77_3.0.0-release
|
||||
82a2079ffcb57ecb1b3849cb41376b443e1eb912 3.0.1-start
|
||||
364fd63517fbacbbcb9129d096187171ba8c9e48 3.0.1-beta1
|
||||
364fd63517fbacbbcb9129d096187171ba8c9e48 DRTVWR-81_3.0.1-beta1
|
||||
f2412ecd6740803ea9452f1d17fd872e263a0df7 3.0.2-start
|
||||
42784bf50fa01974bada2a1af3892ee09c93fcda 3.0.2-beta1
|
||||
42784bf50fa01974bada2a1af3892ee09c93fcda DRTVWR-83_3.0.2-beta1
|
||||
e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e 3.0.2-beta2
|
||||
e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e DRTVWR-86_3.0.2-beta2
|
||||
b95ddac176ac944efdc85cbee94ac2e1eab44c79 3.0.3-start
|
||||
6694f3f062aa45f64ab391d25a3eb3d5eb1b0871 3.0.3-beta1
|
||||
6694f3f062aa45f64ab391d25a3eb3d5eb1b0871 DRTVWR-85_3.0.3-beta1
|
||||
61aa7974df089e8621fe9a4c69bcdefdb3cc208a 3.0.3-beta2
|
||||
61aa7974df089e8621fe9a4c69bcdefdb3cc208a DRTVWR-89_3.0.3-beta2
|
||||
0496d2f74043cf4e6058e76ac3db03d44cff42ce 3.0.3-release
|
||||
0496d2f74043cf4e6058e76ac3db03d44cff42ce DRTVWR-84_3.0.3-release
|
||||
586907287be581817b2422b5137971b22d54ea48 3.0.4-start
|
||||
92a3aa04775438226399b19deee12ac3b5a62838 3.0.5-start
|
||||
c7282e59f374ee904bd793c3c444455e3399b0c5 3.1.0-start
|
||||
2657fa785bbfac115852c41bd0adaff74c2ad5da 3.1.0-beta1
|
||||
2657fa785bbfac115852c41bd0adaff74c2ad5da DRTVWR-93_3.1.0-beta1
|
||||
bc01ee26fd0f1866e266429e85f76340523e91f1 3.1.0-beta2
|
||||
bc01ee26fd0f1866e266429e85f76340523e91f1 DRTVWR-96_3.1.0-beta2
|
||||
ae2de7b0b33c03dc5bdf3a7bfa54463b512221b2 3.1.0-release
|
||||
ae2de7b0b33c03dc5bdf3a7bfa54463b512221b2 DRTVWR-92_3.1.0-release
|
||||
a8230590e28e4f30f5105549e0e43211d9d55711 3.2.0-start
|
||||
e440cd1dfbd128d7d5467019e497f7f803640ad6 3.2.0-beta1
|
||||
e440cd1dfbd128d7d5467019e497f7f803640ad6 DRTVWR-95_3.2.0-beta1
|
||||
9bcc2b7176634254e501e3fb4c5b56c1f637852e 3.2.0-beta2
|
||||
9bcc2b7176634254e501e3fb4c5b56c1f637852e DRTVWR-97_3.2.0-beta2
|
||||
2a13d30ee50ccfed50268238e36bb90d738ccc9e 3.2.0-beta3
|
||||
2a13d30ee50ccfed50268238e36bb90d738ccc9e DRTVWR-98_3.2.0-beta3
|
||||
3150219d229d628f0c15e58e8a51511cbd97e58d 3.2.0-release
|
||||
3150219d229d628f0c15e58e8a51511cbd97e58d DRTVWR-94_3.2.0-release
|
||||
c4911ec8cd81e676dfd2af438b3e065407a94a7a 3.2.1-start
|
||||
9e390d76807fa70d356b8716fb83b8ce42a629ef 3.2.1-beta1
|
||||
9e390d76807fa70d356b8716fb83b8ce42a629ef DRTVWR-100_3.2.1-beta1
|
||||
a8c7030d6845186fac7c188be4323a0e887b4184 3.2.1-release
|
||||
a8c7030d6845186fac7c188be4323a0e887b4184 DRTVWR-99_3.2.1-release
|
||||
40b46edba007d15d0059c80864b708b99c1da368 3.2.2-start
|
||||
523df3e67378541498d516d52af4402176a26bac 3.2.2-beta1
|
||||
523df3e67378541498d516d52af4402176a26bac DRTVWR-102_3.2.2-beta1
|
||||
80f3e30d8aa4d8f674a48bd742aaa6d8e9eae0b5 3.2.3-start
|
||||
3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-beta1
|
||||
3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-start
|
||||
3fe994349fae64fc40874bb59db387131eb35a41 DRTVWR-104_3.2.4-beta1
|
||||
bd6bcde2584491fd9228f1fa51c4575f4e764e19 3.2.4-release
|
||||
bd6bcde2584491fd9228f1fa51c4575f4e764e19 DRTVWR-103_3.2.4-release
|
||||
8a44ff3d2104269ce76145c2772cf1bdff2a2abe 3.2.5-start
|
||||
3d2d5d244c6398a4214c666d5dd3965b0918709a 3.2.5-beta1
|
||||
3d2d5d244c6398a4214c666d5dd3965b0918709a DRTVWR-106_3.2.5-beta1
|
||||
65a2c1c8d855b88edfbea4e16ef2f27e7cff8b1d 3.2.5-beta2
|
||||
65a2c1c8d855b88edfbea4e16ef2f27e7cff8b1d DRTVWR-107_3.2.5-beta2
|
||||
c6175c955a19e9b9353d242889ec1779b5762522 3.2.5-release
|
||||
c6175c955a19e9b9353d242889ec1779b5762522 DRTVWR-105_3.2.5-release
|
||||
2174ed1c7129562428a5cfe8651ed77b8d26ae18 3.2.6-start
|
||||
286d73ff5c19f6c00e023dc1b60975ed6bbe2872 3.2.6-beta1
|
||||
286d73ff5c19f6c00e023dc1b60975ed6bbe2872 DRTVWR-109_3.2.6-beta1
|
||||
4891c46a56fed7512c783b9cbe7cb7260727bf0c 3.2.7-start
|
||||
3d75c836d178c7c7e788f256afe195f6cab764a2 3.2.7-beta1
|
||||
3d75c836d178c7c7e788f256afe195f6cab764a2 DRTVWR-111_3.2.7-beta1
|
||||
89980333c99dbaf1787fe20784f1d8849e9b5d4f 3.2.8-start
|
||||
16f8e2915f3f2e4d732fb3125daf229cb0fd1875 3.2.8-beta1
|
||||
16f8e2915f3f2e4d732fb3125daf229cb0fd1875 DRTVWR-114_3.2.8-beta1
|
||||
987425b1acf4752379b2e1eb20944b4b35d67a85 3.2.8-beta2
|
||||
987425b1acf4752379b2e1eb20944b4b35d67a85 DRTVWR-115_3.2.8-beta2
|
||||
51b2fd52e36aab8f670e0874e7e1472434ec4b4a 3.2.8-release
|
||||
51b2fd52e36aab8f670e0874e7e1472434ec4b4a DRTVWR-113_3.2.8-release
|
||||
37dd400ad721e2a89ee820ffc1e7e433c68f3ca2 3.2.9-start
|
||||
e9c82fca5ae6fb8a8af29012d78fb194a29323f3 3.2.9-beta1
|
||||
e9c82fca5ae6fb8a8af29012d78fb194a29323f3 DRTVWR-117_3.2.9-beta1
|
||||
a01ef9bed28627f4ca543fbc1d70c79cc297a90f 3.2.9-beta2
|
||||
a01ef9bed28627f4ca543fbc1d70c79cc297a90f DRTVWR-118_3.2.9-beta2
|
||||
d5f263687f43f278107363365938f0a214920a4b 3.3.0-beta1
|
||||
d5f263687f43f278107363365938f0a214920a4b 3.3.0-start
|
||||
d5f263687f43f278107363365938f0a214920a4b DRTVWR-119
|
||||
5e8d2662f38a66eca6c591295f5880d47afc73f7 3.3.0-release
|
||||
3e2fca4ed1a0dc9fe6d8a6664e71098bb035a367 3.3.1-start
|
||||
3e2fca4ed1a0dc9fe6d8a6664e71098bb035a367 DRTVWR-125
|
||||
28b95a6a28dca3338d9a1f4f204b96678df9f6a5 3.3.1-beta1
|
||||
1dc545e44617975da2a4a32fe303386c687a6ca1 3.3.1-beta2
|
||||
1dc545e44617975da2a4a32fe303386c687a6ca1 DRTVWR-139
|
||||
1dc545e44617975da2a4a32fe303386c687a6ca1 viewer-beta-candidate
|
||||
c623bbc854b6f7ee1b33a3718f76715046aa2937 3.3.1-release
|
||||
d29a260119f8d5a5d168e25fed0c7ea6b3f40161 3.3.2-beta1
|
||||
675668bd24d3bea570814f71762a2a806f7e1b8d 3.3.2-beta2
|
||||
675668bd24d3bea570814f71762a2a806f7e1b8d 3.3.2-release
|
||||
15e90b52dc0297921b022b90d10d797436b8a1bd viewer-release-candidate
|
||||
bb9932a7a5fd00edf52d95f354e3b37ae6a942db DRTVWR-156
|
||||
6414ecdabc5d89515b08d1f872cf923ed3a5523a DRTVWR-148
|
||||
2a3965b3ad202df7ea25d2be689291bb14a1280e DRTVWR-155
|
||||
24a7281bef42bd4430ceb25db8b195449c2c7de3 DRTVWR-153
|
||||
5910f8063a7e1ddddf504c2f35ca831cc5e8f469 DRTVWR-160
|
||||
f0a174c2adb4bc39b16722a61d7eeb4f2a1d4843 3.3.3-beta1
|
||||
f0a174c2adb4bc39b16722a61d7eeb4f2a1d4843 DRTVWR-144
|
||||
2d6c0634b11e6f3df11002b8510a72a0433da00a DRTVWR-164
|
||||
600f3b3920d94de805ac6dc8bb6def9c069dd360 DRTVWR-162
|
||||
80b5e5e9775966d3839331ffa7a16a60f9d7c930 DRTVWR-165
|
||||
fdcc08a4f20ae9bb060f4693c8980d216534efdf 3.3.3-beta2
|
||||
af5f3e43e6e4424b1da19d9e16f6b853a7b822ed DRTVWR-169
|
||||
4b3c68199a86cabaa5d9466d7b0f7e141e901d7a 3.3.3-beta3
|
||||
6428242e124b523813bfaf4c45b3d422f0298c81 3.3.3-release
|
||||
a716684aa7c07c440b1de5815b8a1f3dd3fd8bfb DRTVWR-159
|
||||
9a78ac13f047056f788c4734dd91aebfe30970e3 DRTVWR-157
|
||||
089e5c84b2dece68f2b016c842ef9b5de4786842 DRTVWR-161
|
||||
c08e2ac17a99973b2a94477659220b99b8847ae2 DRTVWR-163
|
||||
b9d0170b62eb1c7c3adaa37a0b13a833e5e659f9 DRTVWR-171
|
||||
050e48759337249130f684b4a21080b683f61732 DRTVWR-168
|
||||
09ef7fd1b0781f33b8a3a9af6236b7bcb4831910 DRTVWR-170
|
||||
f87bfbe0b62d26f451d02a47c80ebef6b9168fc2 DRTVWR-158
|
||||
f91d003091a61937a044652c4c674447f7dcbb7a 3.3.4-beta1
|
||||
bce218b2b45b730b22cc51e4807aa8b571cadef3 DRTVWR-173
|
||||
cbea6356ce9cb0c313b6777f10c5c14783264fcc DRTVWR-174
|
||||
82b5330bc8b17d0d4b598832e9c5a92e90075682 3.3.4-beta2
|
||||
57d221de3df94f90b55204313c2cef044a3c0ae2 DRTVWR-176
|
||||
eb539c65e6ee26eea2bf373af2d0f4b52dc91289 DRTVWR-177
|
||||
a8057e1b9a1246b434a27405be35e030f7d28b0c 3.3.4-beta3
|
||||
4281aa899fb2cedb7a9ca7ce91c5c29d4aa69594 DRTVWR-180
|
||||
5c08e1d8edd871807153603b690e3ee9dbb548aa DRTVWR-183
|
||||
6c75f220b103db1420919c8b635fe53e2177f318 3.3.4-beta4
|
||||
9cd174d3a54d93d409a7c346a15b8bfb40fc58f4 DRTVWR-184
|
||||
ab2ffc547c8a8950ff187c4f6c95e5334fab597b 3.3.4-beta5
|
||||
28e100d0379a2b0710c57647a28fc5239d3d7b99 3.3.4-release
|
||||
6dfb0fba782c9233dd95f24ec48146db0d3f210b DRTVWR-199
|
||||
7c9102fb998885621919f2474a002c35b583539b 3.3.4-release2
|
||||
8c9085066c78ed5f6c9379dc054c82a6fcdb1851 DRTVWR-207
|
||||
351eea5f9dc192fc5ddea3b02958de97677a0a12 3.3.4-release3
|
||||
005dfe5c4c377207d065fb27858d2eb0b53b143a DRTVWR-167
|
||||
888768f162d2c0a8de1dcc5fb9a08bd8bd120a6b DRTVWR-175
|
||||
a8b3eca451a9eaab59987efb0ab1c4217e3f2dcc DRTVWR-182
|
||||
1f27cdfdc54246484f8afbbe42ce48e954175cbd 3.4.0-beta1
|
||||
9ee9387789701d597130f879d9011a4958753862 DRTVWR-189
|
||||
47f0d08ba7ade0a3905074009067c6d3df7e16ae DRTVWR-190
|
||||
421126293dcbde918e0da027ca0ab9deb5b4fbf2 DRTVWR-192
|
||||
33a2fc7a910ae29ff8b4850316ed7fbff9f64d33 DRTVWR-195
|
||||
e9732c739c8a72a590216951505ea9c76a526a84 DRTVWR-193
|
||||
7602f61c804a512764e349c034c02ddabeefebc4 DRTVWR-196
|
||||
ae5c83dd61d2d37c45f1d5b8bf2b036d87599f1b DRTVWR-198
|
||||
507bdfbd6bf844a511c1ffeda4baa80016ed1346 DRTVWR-197
|
||||
b1dbb1a83f48f93f6f878cff9e52d2cb635e145c 3.4.0-beta2
|
||||
37402e2b19af970d51b0a814d79892cc5647532b DRTVWR-200
|
||||
182a9bf30e81070361bb020a78003b1cf398e79c 3.4.0-beta3
|
||||
7649a3dff5ec22d3727377e5f02efd0f421e4cb5 DRTVWR-201
|
||||
84fb70dfe3444e75a44fb4bee43e2fc8221cebdd 3.4.0-beta4
|
||||
573e863be2f26d3687161def4b9fea9b7038dda8 3.4.0-beta5
|
||||
af7b28e75bd5a629cd9e0dc46fb3f1757626f493 DRTVWR-212
|
||||
015012c2b740ccdec8a8c3d6e5f898449ecfe0b8 DRTVWR-213
|
||||
62b07aa81b1957897c3846292bb9412977b0af6c 3.3.4-beta6
|
||||
ceed0b65a69f1eac20d523e0203320a32f9a3f3c DRTVWR-215
|
||||
733ceac77583874f3626ef7a15c105b83ef0f5bb 3.4.0-beta7
|
||||
97977c67245f52db20eb15f1918cc0f24778cabc 3.4.0-release
|
||||
5adb2b8f96c3cac88ad7c7d996d707f1b29df336 3.4.1-beta1
|
||||
b3f74858a1c8720c82d0978f3877a3fc8ba459ec 3.4.1-beta1a
|
||||
2b779f233ee6f38c89cb921650c773a96e63da92 DRTVWR-220
|
||||
0b9d95f4bfb6867cbf56eaec51633b0da2f1262d DRTVWR-221
|
||||
e6e553761829dc0270eaaa712b7cb0622535b076 3.4.1-beta3
|
||||
f00068a66a2e2f72acbe3f690b98b323e740b289 DRTVWR-222
|
||||
305950187c628a5d6743ee9ea711cc5b9177a18e 3.4.1-beta4
|
||||
dd23d4da3bcb2ffda58569e759feb7c119982973 DRTVWR-224
|
||||
0bd3744ff060452aa13ff4992eafb381df7b1012 3.4.1-beta5
|
||||
29075f8c1abed53dcf195a59f61744e27a91108f DRTVWR-226
|
||||
fba99f381b8d4ad1b7b42fa4993b29998d95be18 DRTVWR-179
|
||||
49ed253c80bed7410e238eeab35a9f14cb034364 3.4.1-beta6
|
||||
468ca3268229011a59df99229b24315844b33d34 DRTVWR-227
|
||||
524da902713e8b60322640b9825101add4a7c497 3.4.1-beta7
|
||||
173c2809f9873499c4b9d6bc044ec941c954d3fb DRTVWR-228
|
||||
1dc94555582f52718834081e7659e973ae4521f7 3.4.1-beta8
|
||||
52c164c8023a5e65f3dc1b0bbb7fa1dd0c631b6b DRTVWR-231
|
||||
464cf7a63a9a2f95bc4972dc022ca765e93de7d3 DRTVWR-233
|
||||
637fe8bbee5e24940448198c221d5ee0fa3247b4 3.4.1-beta9
|
||||
4e0d84e92132e9e95a1d52a1e49bad69c278ea05 3.4.1-beta10
|
||||
f7cbd60a3f57ff1101157eeb79ea21e8898bedae DRTVWR-235
|
||||
baf97f06ae17223614c5e31aa42e71d87cff07fe DRTVWR-236
|
||||
18498afcdb835d6fc4d36ed935347d3b65307bad 3.4.1-beta11
|
||||
b2f21e3442542283a80e7eaebae9f833e5a927b6 DRTVWR-237
|
||||
3f9be82de642d468c5fc272cb9d96b46b5498402 3.4.1-beta12
|
||||
e59ffd3fe0838ae6b09b242a6e9df71761b88f41 3.4.1-release
|
||||
81f6b745ef27f5915fd07f988fdec9944f2bb73e DRTVWR-186
|
||||
cc953f00956be52cc64c30637bbeec310eea603f DRTVWR-181
|
||||
c04e68e1b0034fd0a20815ae24c77e5f8428e822 DRTVWR-188
|
||||
4b2c52aecb7a75de31dbb12d9f5b9a251d8707be DRTVWR-191
|
||||
78ca0bbf43a92e8914d4cfa87d69a6717ef7d4cf DRTVWR-194
|
||||
248f4acd92a706c79e842bc83d80baa7369c0c2e DRTVWR-203
|
||||
de3be913f68813a9bac7d1c671fef96d1159bcd6 DRTVWR-202
|
||||
34dbbe2b00afe90352d3acf8290eb10ab90d1c8b oz-build-test-tag
|
||||
6ee71714935ffcd159db3d4f5800c1929aac54e1 DRTVWR-205
|
||||
7b22c612fc756e0ea63b10b163e81d107f85dbf8 DRTVWR-206
|
||||
b61afe175b829c149d369524a4e974dfda99facf DRTVWR-219
|
||||
32896d5e920ca9a29256ff3b747c2e99752aa5ae DRTVWR-217
|
||||
704bbae7b182a1f2811a47a054e680522966f54a 3.4.2-beta1
|
||||
288539fc0408ed4b69a99665de33bbbc2c3c08fe DRTVWR-216
|
||||
e664473c16df1d82ffaff382e7b3e023da202d52 3.4.2-beta2
|
||||
0891d7a773a31397dcad48be3fa66531d567a821 DRTVWR-242
|
||||
710785535362b3cb801b6a3dc4703be3373bd0cd 3.4.2-beta3
|
||||
e9a5886052433d5db9e504ffaca10890f9932979 DRTVWR-243
|
||||
73b84b9864dc650fe7c8fc9f52361450f0849004 3.4.2-beta4
|
||||
16310aabccf315870f7cc9bf966926c0ad6954fa 3.4.2-release
|
||||
d799593b53ed733862e9a13871e318e886469377 DRTVWR-208
|
||||
e497dcde7a3653e384eb223a8a460030e89c294c DRTVWR-223
|
||||
93ab02d83f51e30a3cabad98aff89601befd9413 DRTVWR-240
|
||||
2aa72e3372a83dece4df9cf72fb1e7c34f90b5e3 DRTVWR-209
|
||||
f7bedce18ad52283e6072814db23318907261487 DRTVWR-238
|
||||
7b64c96fbcadf360bd2feaae19d330166b70877c DRTVWR-210
|
||||
5e4e4128b256525bafc07a62e35ae8527aaa9c9d DRTVWR-241
|
||||
f1d3b3fcab28ed9ea532bf50db0ba96f5c8cc8e9 DRTVWR-232
|
||||
4918b150e75df6b516fb6c2616d32043fa6b4cac DRTVWR-245
|
||||
94ab2b49458ab372a95d2d6949fdf574f413068d 3.4.3-beta1
|
||||
965b9a35e260c0f53be1a25f0db7abc8a67eaf47 DRTVWR-252
|
||||
bb10adc4f76cf0067fca7075146f00cdc0740e9d DRTVWR-251
|
||||
ab0aa2f6ba22b52fed30a2337197f589156edc75 DRTVWR-253
|
||||
48382ec79741671d19ce4cc3e8cd59e9a521e4a7 DRTVWR-254
|
||||
937ec902bb9a1cbceff17bd89e3923352b0a5fbc DRTVWR-256
|
||||
44e764a6ac9e672a4f3bce821a4b6a218590c374 DRTVWR-258
|
||||
c23d734065ed593b2413385aecd8366d8e0ee96b DRTVWR-257
|
||||
452ce96d4046dc05a3ecaecc203e2cc8ddd72e76 DRTVWR-259
|
||||
daca610d840625b5bebb966a57cb49581852c417 DRTVWR-265
|
||||
9afbdc4e24cc04feacfb2b7a10b78a64f780901a DRTVWR-266
|
||||
73280db02501f5ad041fc18b1eba68e73a81996c DRTVWR-267
|
||||
870e2d79e0063fda87187f17bbc2747766733194 3.4.3-beta3
|
||||
0a2ca6546b499239afeb66d17b2fadbcdbe36ab1 3.4.3-release
|
||||
4c3460cb1fb7c6da9965e09c734d282a8e9c81f0 DRTVWR-229
|
||||
f4481df42f9a4a92bf475a80f0c51d1a4bbdfd59 DRTVWR-246
|
||||
39c5204b6e800983a41ccac8ad6dc993120197c6 DRTVWR-247
|
||||
7c7d57d393e8ae7b61623279de06eb4a62ccae6a DRTVWR-249
|
||||
f72b50ef168c159d6e79e97aa2bcafaf8577ab99 DRTVWR-230
|
||||
b418be80903520c492e1173f3afbc4021cad5d07 DRTVWR-255
|
||||
9aa1aa9f1fe13c194695a0b8f0af298296241dc2 DRTVWR-260
|
||||
84fbaf2d4141bd161731430e760949dc787ca206 DRTVWR-244
|
||||
083d2d36b5bb1c54fc3dd7caac0e7ac381a9cef0 3.4.4-beta1
|
||||
b634dec987c16e8c9c938e11e52591d9ead8fa9b DRTVWR-270
|
||||
cd39255bd23330fd30c04105f2811e941d8524fe 3.4.4-beta2
|
||||
2c4011bbc2b15b82198fd8b51f3a9fe765a08c4d DRTVWR-271
|
||||
2f8a3ef687bc55828abcb17ac1ad7cde70536d7e 3.4.4-beta3
|
||||
35cfd4cf5b895fa776592f2e630e330be7f0604e DRTVWR-273
|
||||
c374035d459af3c03dea2dd90880dfc25de64706 DRTVWR-275
|
||||
05d9f1dd7a954069af2a33abedb7713fa36a04cb 3.4.4-beta4
|
||||
e1bb1ae7d8b12faeb37933a737c199cc9b9f89cc 3.4.4-release
|
||||
391a8c74cec7275c5d26c85ad108d4782a3e3dd9 DRTVWR-268
|
||||
a36f1f354b02aa6e448ca13685de167d0a0a3d03 DRTVWR-272
|
||||
37dba00ad820de3a808d4039396b162a9c275b3e DRTVWR-269
|
||||
7c6dfdc1b7a2ce0d8e3a8f3ce3058547ea065c0f DRTVWR-250
|
||||
b9ff9730daa53a541925300cbd02bb14575a5705 DRTVWR-277
|
||||
af6b711a97073431953b55ee808aaa09900c27e5 DRTVWR-276
|
||||
8302fefde6c8f4a64bfc7f04929f8bc85f5c6c7b DRTVWR-279
|
||||
c296133849d1f103c0e2abc41e6599daed00b67b DRTVWR-280
|
||||
40a2265058abc9fde4914c10185f916435818621 3.4.5-beta1
|
||||
5df4802bec93c8d0a509946d826bb4c50c5442ec DRTVWR-281
|
||||
7c1c33ba4cfd2d15ca51cc1ac440eca551331a4a DRTVWR-283
|
||||
6b9c7dbebef793230d64e1b452577c8b142d4143 3.4.5-beta2
|
||||
ccf991e02dc2f63fb646324230d54832683f4a9b DRTVWR-286
|
||||
2d849850558a5a0324b398d1c102d30bcbdfb88f DRTVWR-287
|
||||
e06898df8644fe567bee94f817d03abc1c380993 3.4.5-beta3
|
||||
a676b4d6c037b39fe5b8e42cf8839a9303936089 DRTVWR-289
|
||||
28fa8b944a0c1869636ab00cc400f5aa71f6fa3c DRTVWR-290
|
||||
7f09bbc28c297f14b67961be7b6575445fa160e8 DRTVWR-291
|
||||
b23419a2748483c98f3b84b630468a21c88feba5 DRTVWR-292
|
||||
1567de5700c273b583dac41b64275c223287306e 3.4.5-beta4
|
||||
1cce8447f8f574673e3f47d6fe584262e6964fe2 DRTVWR-296
|
||||
0a5d409161ef2a89b28c9a741051dd2dedc707d6 DRTVWR-297
|
||||
852b69ef0b5fe6b13b69cc2217282cc64de6afab 3.4.5-beta5
|
||||
a49c715243a36a8a380504d14cb7416b3039c956 3.4.5-release
|
||||
37947e4f771f001b551581bf7cd0051c3153beed DRTVWR-282
|
||||
6482cceb91cda68b799f3e6cdc66d33bf123547a DRTVWR-284
|
||||
092a9effbedd1a0276fa5ced520992ce00f96fbf CHUI-PV-0
|
||||
279ef1dfc9b749a6cc499cf190fec0c090b6d682 DRTVWR-288
|
||||
9b19edaf1d8ddf435f60fbbb444dd25db8f63953 3.5.0-beta1
|
||||
c6b3561c7d7ad365eeba669db54eb57b5149ce75 3.5.0-beta2
|
||||
6d91ffd77bf2a20f18a2175eb7579da880ae12ac DRTVWR-302
|
||||
f6ca5bb75bca975ff0bc77e71e615f6478c4559c 3.5.0-beta3
|
||||
910b5fad950e343b58229f5a0aefa7729b9308b3 DRTVWR-303
|
||||
53cffdde0b3cc367ba9bb6abd5c83ae14df5e882 3.5.0-beta4
|
||||
4d5f6234dc59a0fb6ead5e02c7d343a0610e0488 DRTVWR-304
|
||||
dd058a6093c493120d67c8e02c812c0f7b2d3db0 3.5.0-beta5
|
||||
fd6b510e83f56830e45670c428653134899d3e25 DRTVWR-305
|
||||
55339537d99afc394d1bb7fdb7d074bf321ca62f 3.5.0-beta6
|
||||
902caf2b9fdbdbc5c399c4d5ebcecaf9cb97bab8 DRTVWR-306
|
||||
5c6098fd17d40ee3a38ca6b64f6be9db7f61f0a8 3.5.0-beta7
|
||||
adc360e6bf21390d2665380951d85937cd29a604 3.5.0-release
|
||||
1ada73295ed0eaa4a772ef079c29f57069342c32 DRTVWR-310
|
||||
20cdf370f5c8be6193bef6fb3a81cc3f81275191 3.5.1-beta1
|
||||
2319904200de367646b9a9442239a38d52c1eeb5 DRTVWR-313
|
||||
9d8726eca785acad694564516f16dd639faf45c0 3.5.1-beta2
|
||||
4b7fa963b80e2056ab648f83a4d61310b3cedb3d DRTVWR-314
|
||||
65ae89aeb7ea674a555e439e963f17949322ac94 3.5.1-beta3
|
||||
13149a524874b608aeb76325b35faff113a5ea53 3.5.1-release
|
||||
78a8fe6abf331944d6b6bb1ce1024a6bc08141f4 DRTVWR-298
|
||||
50ccc12f38c3c99f03b374e32429cb043b73e2a6 DRTVWR-294
|
||||
c2b1066514308dff1eeb91162392dfe08bf1c0fe DRTVWR-309
|
||||
e6b8a92acffd693cd1459e4212e3dff1050acf67 DRTVWR-278
|
||||
106f19cc011aafdfc9a6d12b641fe8db6e9735a7 3.5.2-beta1
|
||||
509b97acc4ca1f2644197f1b555773ac0bb6838c 3.5.2-beta2
|
||||
6cb3689d89c13876ce8fa8faefa7b05e4279502d DRTVWR-316
|
||||
cfc3e650e5b2063288e7b832e9c9f521bbdacc92 DRTVWR-315
|
||||
e6e35501f1fea252ef83080adcf30c3cb7c2f75c DRTVWR-299
|
||||
b6a4ac8f1916ede76e8a023e1cf35c045d0ac707 3.5.2-beta3
|
||||
a314f1c94374ab1f6633dd2983f7090a68663eb2 3.5.2-beta4
|
||||
1cfa86d604909dfdb8b372069ff61f9afaa2aac1 MAINT-2647
|
||||
895628bb5e162410cfdf4bca58f0a57d22ccfcde 3.5.2-beta5
|
||||
9013c07bfe1c51107233f1924dccdcc5057dd909 3.5.2-beta6
|
||||
9b1b6f33aa5394b27bb652b31b5cb81ef6060370 3.5.2-release
|
||||
a277b841729f2a62ba1e34acacc964bc13c1ad6f 3.5.3-release
|
||||
fb1630153bac5552046ea914af3f14deabc1def8 3.6.0-materials-beta1
|
||||
0a56f33ad6aa112032b14a41dad759ad377bdde9 3.6.0-release
|
||||
75cf8e855ae1af6895a35da475314c2b5acf1850 3.6.1-release
|
||||
f6741d5fe8d632651424484df0fe0cb4a01e9fbe 3.6.2-release
|
||||
fe4f7c5e9fd27e09d03deb1cc9ab3e5093f6309e 3.6.3-release
|
||||
83357f31d8dbf048a8bfdc323f363bf4d588aca1 CHOP-951-a
|
||||
91ed595b716f14f07409595b734fda891a59379e 3.6.4-release
|
||||
bf6d453046011a11de2643fac610cc5258650f82 3.6.5-release
|
||||
ae457ece77001767ae9613148c495e7b98cc0f4a 3.6.7-release
|
||||
d40c66e410741de7e90b1ed6dac28dd8a2d7e1f6 3.6.8-release
|
||||
70eda3721d36df3e00730629c42a1304e5bc65b8 3.6.9-release
|
||||
5b54b36862ff8bc3b6935673c9d1c1f22ee8d521 3.6.10-release
|
||||
2feb70a4cfde43f2898d95ff8fcae3e67805c7c2 3.6.11-release
|
||||
88bbfd7a6971033f3aa103f3a3500ceb4c73521b 3.6.12-release
|
||||
0d9b9e50f1a8880e05f15688a9ec7d09e0e81013 3.6.13-release
|
||||
5d746de933a98ca17887cde2fece80e9c7ab0b98 3.7.0-release
|
||||
dcb4981ce255841b6083d8f65444b65d5a733a17 3.7.1-release
|
||||
b842534cb4d76c9ef87676a62b1d2d19e79c015f 3.7.2-release
|
||||
962d3f98955bfc7310a7867c8cbc3df075e54aa9 3.7.3-release
|
||||
d076568ff7883b41c149e6afb421f39c29dbfe2b 3.7.4-release
|
||||
fc066b82343fca51f9c1b8eda0abc6bee9bb4503 3.7.5-release
|
||||
d029faf69f20a23007f32420a1ac6a3b89a6d441 3.7.6-release
|
||||
83959480cb986522d07b151a0c778ab7f920d41b 3.7.7-release
|
||||
bba9b3722eea08949e4ff69591f736bf0f808434 3.7.8-release
|
||||
a9f2d0cb11f73b06858e6083bb50083becc3f9cd 3.7.9-release
|
||||
91dae9494b4d147541c7a01902334ba19a7ec05e 3.7.10-release
|
||||
64799eb298834073a3e9992cd8d27c3cb9d30b10 3.7.11-release
|
||||
3b44ea8988cb902f0dda8429e8d5e4569e304532 3.7.12-release
|
||||
d86a7e1bc96d27b683f951d3701d5b7042158c68 3.7.13-release
|
||||
a7872554f3665588f1e8347d472cec3a299254b3 3.7.14-release
|
||||
3f11f57f2b4d15a9f987d12bc70ef507eefb5018 3.7.15-release
|
||||
562e7dace7465060ac9adb2e8eca800b699ff024 3.7.16-release
|
||||
bcc2770e21c125e0bab59141c51db9145aec068d 3.7.17-release
|
||||
2729c1daf0257d68a40bdbc4acf1a16184974bbd 3.7.18-release
|
||||
82973b38a6c9a457333e3519e4f2b16bb5eedf47 3.7.19-release
|
||||
27094824773b907c2e559396e6f9ec3a963de52d 3.7.20-release
|
||||
9ecab4b0c7d8614767724a3422d3c1dca6bd4e4f 3.7.21-release
|
||||
bc61801f614022c920cb5c3df1d7d67a9561ce1f 3.7.22-release
|
||||
3be800e1afad9615442159e388d6d137be7b951e 3.7.23-release
|
||||
d3d0101e980ec95043e0af9b7903045d3bc447e4 3.7.24-release
|
||||
9978a8c3a2ffce4a5e1c186256581c2ac139c9dc 3.7.25-release
|
||||
000e9dda4162cbf0a83ba88558b19473654a09a9 3.7.26-release
|
||||
afd8d4756e8eda3c8f760625d1c17a2ad40ad6c8 3.7.27-release
|
||||
566874eb5ab26c003ef7fb0e22ce40c5fa0013f4 3.7.28-release
|
||||
d07f76c5b9860fb87924d00ca729f7d4532534d6 3.7.29-release
|
||||
67edc442c80b8d2fadd2a6c4a7184b469906cdbf 3.7.30-release
|
||||
797ed69e6134ef48bb922577ab2540fb2d964668 3.8.0-release
|
||||
3f61ed662347dc7c6941b8266e72746a66d90e2a 3.8.1-release
|
||||
3a62616f3dd8bd512fcdfd29ef033b2505b11213 3.8.2-release
|
||||
60572f718879f786f6bc8b5c9373ebebf4693078 3.8.3-release
|
||||
27e3cf444c4cc645884960a61325a9ee0e9a2d0f 3.8.4-release
|
||||
e821ef17c6edea4a59997719d8ba416d8c16e143 3.8.5-release
|
||||
5a5bd148943bfb46cf2ff2ccf376c42dee93d19b 3.8.6-release
|
||||
ae3297cdd03ab14f19f3811acbc4acd3eb600336 4.0.0-release
|
||||
759710a9acef61aaf7b69f4bc4a5a913de87ad8a 4.0.1-release
|
||||
e9d350764dfbf5a46229e627547ef5c1b1eeef00 4.0.2-release
|
||||
86dfba7ec4332c323025ebeacd8bf343ed0d8cfd 4.0.3-release
|
||||
0a5de9ec2cb868f367501024d8d6958c20869053 4.0.4-release
|
||||
450de775fff66a011be1a001acd117cc623c445d 4.0.5-release
|
||||
4070611edd95eb3a683d1cd97c4c07fe67793812 4.0.6-release
|
||||
33981d8130f031597b4c7f4c981b18359afb61a0 4.0.7-release
|
||||
45eaee56883df7a439ed3300c44d3126f7e3a41e 4.0.8-release
|
||||
b280a1c797a3891e68dbc237e73de9cf19f426e9 4.1.1-release
|
||||
bfbba2244320dc2ae47758cd7edd8fa3b67dc756 4.1.2-release
|
||||
b41e1e7c7876f7656c505f552b5888b4e478f92b 5.0.0-release
|
||||
c9ce2295012995e3cf5c57bcffcb4870b94c649f 5.0.1-release
|
||||
cea1632c002c065985ebea15eeeb4aac90f50545 5.0.2-release
|
||||
02c24e9f4f7d8aa0de75f27817dda098582f4936 5.0.3-release
|
||||
022709ef76a331cac1ba6ef1a6da8a5e9ef63f5a 5.0.4-release
|
||||
b4d76b5590fdf8bab72c64442353753a527cbc44 5.0.5-release
|
||||
3e5035dfd8af49bd4c0009f0a76ef46a15991a45 5.0.6-release
|
||||
abcab37e1b29414ab8c03af9ca2ab489d809788a 5.0.7-release
|
||||
505a492f30bd925bb48e2e093ae77c3c2b4c740f 5.0.8-release
|
||||
40ca7118765be85a043b31b011e4ee6bd9e33c95 5.0.9-release
|
||||
ad0e15543836d64d6399d28b32852510435e344a 5.1.0-release
|
||||
26d9e9bb166a9a417f35b1863223a597af8185fd 5.1.1-release
|
||||
2eb917875efdfe920680b9049302d0f03721245d 5.1.2-release
|
||||
7c00e5b6cb3d95712e9d8e29277c805bca2bda90 5.1.3-release
|
||||
7b6b020fd5ad9a8dc3670c5c92d1ca92e55fc485 5.1.4-release
|
||||
2ea47f358b171178eb9a95503a1670d519c2886f 5.1.5-release
|
||||
04538b8157c1f5cdacd9403f0a395452d4a93689 5.1.6-release
|
||||
ac3b1332ad4f55b7182a8cbcc1254535a0069f75 5.1.7-release
|
||||
23ea0fe36fadf009a60c080392ce80e4bf8af8d9 5.1.8-release
|
||||
52422540bfe54b71155aa455360bee6e3ef1fd96 5.1.9-release
|
||||
1cfa567caf5088ae299271be08cc2d9f0801ff6a pre-Poseidon
|
||||
821edfcd14919c0e95c590866171c61fb57e8623 6.0.0-release
|
||||
21b7604680ef6b6ea67f8bebaaa588d6e263bdc1 6.0.1-release
|
||||
a3143db58a0f6b005232bf9018e7fef17ff9ec90 6.1.0-release
|
||||
50f0ece62ddb5a244ecb6d00ef5a89d80ad50efa 6.1.1-release
|
||||
82a89165e5929a6c3073d6cd60a543cb395f147b 6.2.0-release
|
||||
706bdc7e25c6e6b8fb56f4a13fcce2936e70a79c 6.2.1-release
|
||||
ec09daf1899c1c01c4ba0ba950fae572f2a612a8 6.2.2-release
|
||||
ab2ec5c5423b277d23fd0511ce50c15123ff2e03 6.2.3-release
|
||||
67297f9902857e357570c44722ad84de3aff974e 6.2.4-release
|
||||
9777aec6dc4a30a24537297ac040861ce16b82ae 6.3.0-release
|
||||
ece699718f163921717bb95a6131e94af4c4138f 6.3.1-release
|
||||
07f5d5bc9faebb45695853d40a9549773db816c0 6.3.2-release
|
||||
d9a4bd15e2c852953d6c8e84d6f3b7ca442c0e7f 6.3.3-release
|
||||
4033b3f57e76f087235145a3016886ccdc87ffa3 6.3.4-release
|
||||
27ca5834bfe9b80e82db5ea42f08b7eb990b722a 6.3.5-release
|
||||
|
|
@ -14,7 +14,7 @@ build_docs = true
|
|||
build_Linux_Doxygen = true
|
||||
|
||||
# Need viewer-build-variables as well as other shared repositories
|
||||
buildscripts_shared_more_NAMEs="build_secrets build_variables"
|
||||
buildscripts_shared_more_NAMEs="build_secrets build_variables git_hooks"
|
||||
|
||||
################################################################
|
||||
#### Examples of how to set the viewer_channel ####
|
||||
|
|
|
|||
48
README.md
48
README.md
|
|
@ -1,15 +1,39 @@
|
|||
Second Life Viewer
|
||||
====================
|
||||
This project manages the source code for the
|
||||
[Second Life](https://www.secondlife.com) Viewer.
|
||||

|
||||
|
||||
This source is available as open source; for details on licensing, see
|
||||
[the licensing page on the Second Life wiki](https://wiki.secondlife.com/wiki/Linden_Lab_Official:Second_Life_Viewer_Licensing_Program)
|
||||
**[Second Life][] is a free 3D virtual world where users can create, connect and chat with others from around the
|
||||
world.** This repository contains the source code for the official client.
|
||||
|
||||
For information on how to use and contribute to this, see
|
||||
[the open source portal on the wiki](https://wiki.secondlife.com/wiki/Open_Source_Portal).
|
||||
## Open Source
|
||||
|
||||
To download the current default version, visit
|
||||
[the download page](https://secondlife.com/support/downloads). For
|
||||
even newer versions try
|
||||
[the Alternate Viewers page](https://wiki.secondlife.com/wiki/Linden_Lab_Official:Alternate_Viewers)
|
||||
Second Life provides a huge variety of tools for expression, content creation, socialization and play. Its vibrancy is
|
||||
only possible because of input and contributions from its residents. The client codebase has been open source since
|
||||
2007 and is available under the LGPL license. The [Open Source Portal][] contains additional information about Linden
|
||||
Lab's open source history and projects.
|
||||
|
||||
## Download
|
||||
|
||||
Most people use a pre-built viewer release to access Second Life. Windows and macOS builds are
|
||||
[published on the official website][download]. More experimental viewers, such as release candidates and
|
||||
project viewers, are detailed on the [Alternate Viewers page](https://releasenotes.secondlife.com/viewer.html).
|
||||
|
||||
### Third Party Viewers
|
||||
|
||||
Third party maintained forks, which include Linux compatible builds, are indexed in the [Third Party Viewer Directory][tpv].
|
||||
|
||||
## Build Instructions
|
||||
|
||||
[Windows](https://wiki.secondlife.com/wiki/Build_the_Viewer_on_Windows)
|
||||
|
||||
[Mac](https://wiki.secondlife.com/wiki/Build_the_Viewer_on_macOS)
|
||||
|
||||
[Linux](https://wiki.secondlife.com/wiki/Build_the_Viewer_on_Linux)
|
||||
|
||||
## Contribute
|
||||
|
||||
Help make Second Life better! You can get involved with improvements by filing bugs, suggesting enhancements, submitting
|
||||
pull requests and more. See the [open source portal][] for details.
|
||||
|
||||
[Second Life]: https://secondlife.com/
|
||||
[download]: https://secondlife.com/support/downloads/
|
||||
[tpv]: http://wiki.secondlife.com/wiki/Third_Party_Viewer_Directory
|
||||
[open source portal]: http://wiki.secondlife.com/wiki/Open_Source_Portal
|
||||
|
|
|
|||
|
|
@ -580,9 +580,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>45dedb5b09995cd794304150e94fcf21</string>
|
||||
<string>2653c3627fd8687ff9e003425fd14834</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/87950/806969/dullahan-1.12.2.202109170444_91.1.21_g9dd45fe_chromium-91.0.4472.114-darwin64-563968.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/90199/821852/dullahan-1.12.3.202111032211_91.1.21_g9dd45fe_chromium-91.0.4472.114-darwin64-565428.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -592,9 +592,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>d0fd9d7086699da4bb5ccc935622a717</string>
|
||||
<string>b4003772562a5dd40bc112eec7cba5f5</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/88276/809277/dullahan-1.12.2.202109230751_91.1.21_g9dd45fe_chromium-91.0.4472.114-windows-563968.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/90201/821871/dullahan-1.12.3.202111032221_91.1.21_g9dd45fe_chromium-91.0.4472.114-windows-565428.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -604,16 +604,16 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>7e8c3ccd420ff5aef24ff72d609ba394</string>
|
||||
<string>d9030d7a7390b3bda7de2adcc27e535a</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/88275/809281/dullahan-1.12.2.202109230751_91.1.21_g9dd45fe_chromium-91.0.4472.114-windows64-563968.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/90200/821876/dullahan-1.12.3.202111032221_91.1.21_g9dd45fe_chromium-91.0.4472.114-windows64-565428.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>1.12.2.202109230751_91.1.21_g9dd45fe_chromium-91.0.4472.114</string>
|
||||
<string>1.12.3.202111032221_91.1.21_g9dd45fe_chromium-91.0.4472.114</string>
|
||||
</map>
|
||||
<key>elfio</key>
|
||||
<map>
|
||||
|
|
@ -2097,18 +2097,18 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>0a6349b11c8e9d34f0c80b8081736e75</string>
|
||||
<string>35f42f538f4dc3abdfc2b2c4a915d004</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/79438/751815/llca-202104010215.557744-common-557744.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/87228/802959/llca-202109010216.563493-common-563493.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>common</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>202104010215.557744</string>
|
||||
<string>202109010216.563493</string>
|
||||
</map>
|
||||
<key>llphysicsextensions_source</key>
|
||||
<map>
|
||||
|
|
@ -2231,9 +2231,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>2aa4ec0d72bbe4b755730f1bf92b39e7</string>
|
||||
<string>f09066891d5a52add50bdb14efdc86f6</string>
|
||||
<key>url</key>
|
||||
<string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/30340/257304/llphysicsextensions_tpv-1.0.542327-darwin64-542327.tar.bz2</string>
|
||||
<string>https://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/84729/788142/llphysicsextensions_tpv-1.0.561752-darwin64-561752.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -2255,9 +2255,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>ad9aba5e2c43a37b6530a0d2de64df1c</string>
|
||||
<string>60e399f707bca32d0a4f7ee33ac4c35b</string>
|
||||
<key>url</key>
|
||||
<string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/30341/257307/llphysicsextensions_tpv-1.0.542327-windows-542327.tar.bz2</string>
|
||||
<string>https://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/84730/788138/llphysicsextensions_tpv-1.0.561752-windows-561752.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -2267,16 +2267,16 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>46689ff1442a8eccac3a7f3258308e1e</string>
|
||||
<string>a43e360236e7c17b5823f91e4c349e60</string>
|
||||
<key>url</key>
|
||||
<string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/30341/257307/llphysicsextensions_tpv-1.0.542327-windows64-542327.tar.bz2</string>
|
||||
<string>https://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/84731/788139/llphysicsextensions_tpv-1.0.561752-windows64-561752.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>1.0.542327</string>
|
||||
<string>1.0.561752</string>
|
||||
</map>
|
||||
<key>mesa</key>
|
||||
<map>
|
||||
|
|
@ -3180,9 +3180,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>6989053898b8e81e904e75553e378820</string>
|
||||
<string>97fac6d88480445c856083ed20d78093</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/77523/735051/viewer_manager-2.0.556340-darwin64-556340.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/85206/790666/viewer_manager-2.0.562101-darwin64-562101.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -3204,9 +3204,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>3446c1e54bb32542677caad0ec0d42ac</string>
|
||||
<string>3f6271ec0e2e2f0cc1067d4c4102bb4c</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/77525/735058/viewer_manager-2.0.556340-windows-556340.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/85208/790681/viewer_manager-2.0.562101-windows-562101.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -3217,7 +3217,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>source_type</key>
|
||||
<string>hg</string>
|
||||
<key>version</key>
|
||||
<string>2.0.556340</string>
|
||||
<string>2.0.562101</string>
|
||||
</map>
|
||||
<key>vlc-bin</key>
|
||||
<map>
|
||||
|
|
@ -3236,9 +3236,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>b639d0035f4a8c9b4973be428a1b7e61</string>
|
||||
<string>738688816ebd76958e49772712a6b972</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69569/671323/vlc_bin-3.0.9.549888-darwin64-549888.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/90004/820701/vlc_bin-3.0.16.565299-darwin64-565299.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -3260,9 +3260,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>4f50b0c47daa081dd4fcb83763d5b0b2</string>
|
||||
<string>6801f91f3f27e626898bab90d40fc1c3</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69567/671314/vlc_bin-3.0.9.549888-windows-549888.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/90005/820712/vlc_bin-3.0.16.565299-windows-565299.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -3272,16 +3272,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>c2f8c01fb6c261b72beb07f0c4cd423f</string>
|
||||
<string>7f66982d6edf3c38f3493e28826d58e8</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69568/671315/vlc_bin-3.0.9.549888-windows64-549888.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/90006/820713/vlc_bin-3.0.16.565299-windows64-565299.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>3.0.9.549888</string>
|
||||
<string>3.0.16.565299</string>
|
||||
</map>
|
||||
<key>xmlrpc-epi</key>
|
||||
<map>
|
||||
|
|
|
|||
16
build.sh
16
build.sh
|
|
@ -306,6 +306,22 @@ python_cmd "$helpers/codeticket.py" addinput "Viewer Channel" "${viewer_channel}
|
|||
|
||||
initialize_version # provided by buildscripts build.sh; sets version id
|
||||
|
||||
begin_section "coding policy check"
|
||||
# On our TC Windows build hosts, the GitPython library underlying our
|
||||
# coding_policy_git.py script fails to run git for reasons we have not tried
|
||||
# to diagnose. Clearly git works fine on those hosts, or we would never get
|
||||
# this far. Running coding policy checks on one platform *should* suffice...
|
||||
if [[ "$arch" == "Darwin" ]]
|
||||
then
|
||||
# install the git-hooks dependencies
|
||||
pip install -r "$(native_path "$git_hooks_checkout/requirements.txt")" || \
|
||||
fatal "pip install git-hooks failed"
|
||||
# validate the branch we're about to build
|
||||
python_cmd "$git_hooks_checkout/coding_policy_git.py" --all_files || \
|
||||
fatal "coding policy check failed"
|
||||
fi
|
||||
end_section "coding policy check"
|
||||
|
||||
# Now run the build
|
||||
succeeded=true
|
||||
last_built_variant=
|
||||
|
|
|
|||
|
|
@ -1,18 +0,0 @@
|
|||
secondlife-viewer (0.3) unstable; urgency=low
|
||||
|
||||
* Initial debian configuration
|
||||
|
||||
-- Don Kjer <don@lindenlab.com> Wed, 04 Jul 2012 00:43:03 +0000
|
||||
|
||||
secondlife-viewer (0.2) unstable; urgency=low
|
||||
|
||||
* Adding default LSB headers for squeeze
|
||||
|
||||
-- Tyler Kohler <tyler@lindenlab.com> Thu, 24 Mar 2011 09:43:36 -0700
|
||||
|
||||
secondlife-viewer (0.1) unstable; urgency=low
|
||||
|
||||
* Cloned from debian package skeleton.
|
||||
|
||||
-- Lex Linden <lex@lindenlab.com> Mon, 20 Sep 2010 08:01:59 -0700
|
||||
|
||||
|
|
@ -1 +0,0 @@
|
|||
5
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
Source: secondlife-viewer
|
||||
Section: unknown
|
||||
Priority: extra
|
||||
Maintainer: Don Linden <don@lindenlab.com>
|
||||
Build-Depends: debhelper (>= 5)
|
||||
Homepage: http://secondlife.com
|
||||
Standards-Version: 3.7.2
|
||||
|
||||
Package: secondlife-viewer
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends},
|
||||
ia32-libs,
|
||||
ia32-libs-gtk
|
||||
Description: Second Life Viewer
|
||||
Second Life is an online virtual world developed by Linden Lab.
|
||||
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
Second Life Viewer Copyright: 2000-2012 Linden Research, Inc.
|
||||
|
||||
License:
|
||||
|
||||
3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
|
||||
APR Copyright (C) 2011 The Apache Software Foundation
|
||||
Collada DOM Copyright 2006 Sony Computer Entertainment Inc.
|
||||
cURL Copyright (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se)
|
||||
DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
|
||||
expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
|
||||
FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm, and Werner Lemberg.
|
||||
GL Copyright (C) 1999-2004 Brian Paul.
|
||||
GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
|
||||
google-perftools Copyright (c) 2005, Google Inc.
|
||||
Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
|
||||
jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
|
||||
jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
|
||||
ogg/vorbis Copyright (C) 2002, Xiphophorus
|
||||
OpenSSL Copyright (C) 1998-2008 The OpenSSL Project.
|
||||
PCRE Copyright (c) 1997-2012 University of Cambridge
|
||||
SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
|
||||
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
|
||||
zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler.
|
||||
|
||||
Second Life Viewer uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details.
|
||||
|
||||
This software contains source code provided by NVIDIA Corporation.
|
||||
|
||||
All rights reserved. See licenses.txt for details.
|
||||
|
||||
Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
#!/bin/sh
|
||||
# postinst script for secondlife-viewer
|
||||
#
|
||||
# Delete this file if you don't need it.
|
||||
#
|
||||
# see: dh_installdeb(1)
|
||||
|
||||
set -e
|
||||
|
||||
# summary of how this script can be called:
|
||||
# * <postinst> `configure' <most-recently-configured-version>
|
||||
# * <old-postinst> `abort-upgrade' <new version>
|
||||
# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
|
||||
# <new-version>
|
||||
# * <postinst> `abort-remove'
|
||||
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
|
||||
# <failed-install-package> <version> `removing'
|
||||
# <conflicting-package> <version>
|
||||
# for details, see http://www.debian.org/doc/debian-policy/ or
|
||||
# the debian-policy package
|
||||
|
||||
|
||||
case "$1" in
|
||||
configure)
|
||||
;;
|
||||
|
||||
abort-upgrade|abort-remove|abort-deconfigure)
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "postinst called with unknown argument \`$1'" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# dh_installdeb will replace this with shell code automatically
|
||||
# generated by other debhelper scripts. Don't delete this!
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
exit 0
|
||||
|
||||
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
#!/bin/sh
|
||||
# postrm script for secondlife-viewer
|
||||
#
|
||||
# Delete this file if you don't need it.
|
||||
#
|
||||
# see: dh_installdeb(1)
|
||||
|
||||
set -e
|
||||
|
||||
# summary of how this script can be called:
|
||||
# * <postrm> `remove'
|
||||
# * <postrm> `purge'
|
||||
# * <old-postrm> `upgrade' <new-version>
|
||||
# * <new-postrm> `failed-upgrade' <old-version>
|
||||
# * <new-postrm> `abort-install'
|
||||
# * <new-postrm> `abort-install' <old-version>
|
||||
# * <new-postrm> `abort-upgrade' <old-version>
|
||||
# * <disappearer's-postrm> `disappear' <overwriter>
|
||||
# <overwriter-version>
|
||||
# for details, see http://www.debian.org/doc/debian-policy/ or
|
||||
# the debian-policy package
|
||||
|
||||
|
||||
case "$1" in
|
||||
purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "postrm called with unknown argument \`$1'" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# dh_installdeb will replace this with shell code automatically
|
||||
# generated by other debhelper scripts. Don't delete this!
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
exit 0
|
||||
|
||||
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
#!/bin/sh
|
||||
# preinst script for secondlife-viewer
|
||||
#
|
||||
# Delete this file if you don't need it.
|
||||
#
|
||||
# see: dh_installdeb(1)
|
||||
|
||||
set -e
|
||||
|
||||
# summary of how this script can be called:
|
||||
# * <new-preinst> `install'
|
||||
# * <new-preinst> `install' <old-version>
|
||||
# * <new-preinst> `upgrade' <old-version>
|
||||
# * <old-preinst> `abort-upgrade' <new-version>
|
||||
# for details, see http://www.debian.org/doc/debian-policy/ or
|
||||
# the debian-policy package
|
||||
|
||||
|
||||
case "$1" in
|
||||
install|upgrade)
|
||||
;;
|
||||
|
||||
abort-upgrade)
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "preinst called with unknown argument \`$1'" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# dh_installdeb will replace this with shell code automatically
|
||||
# generated by other debhelper scripts. Don't delete this!
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
exit 0
|
||||
|
||||
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
#!/bin/sh
|
||||
# prerm script for secondlife-viewer
|
||||
#
|
||||
# Delete this file if you don't need it.
|
||||
#
|
||||
# see: dh_installdeb(1)
|
||||
|
||||
set -e
|
||||
|
||||
# summary of how this script can be called:
|
||||
# * <prerm> `remove'
|
||||
# * <old-prerm> `upgrade' <new-version>
|
||||
# * <new-prerm> `failed-upgrade' <old-version>
|
||||
# * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
|
||||
# * <deconfigured's-prerm> `deconfigure' `in-favour'
|
||||
# <package-being-installed> <version> `removing'
|
||||
# <conflicting-package> <version>
|
||||
# for details, see http://www.debian.org/doc/debian-policy/ or
|
||||
# the debian-policy package
|
||||
|
||||
|
||||
case "$1" in
|
||||
remove|upgrade|deconfigure)
|
||||
;;
|
||||
|
||||
failed-upgrade)
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "prerm called with unknown argument \`$1'" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# dh_installdeb will replace this with shell code automatically
|
||||
# generated by other debhelper scripts. Don't delete this!
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
exit 0
|
||||
|
||||
|
||||
|
|
@ -1,118 +0,0 @@
|
|||
#!/usr/bin/make -f
|
||||
# -*- makefile -*-
|
||||
# Sample debian/rules that uses debhelper.
|
||||
# This file was originally written by Joey Hess and Craig Small.
|
||||
# As a special exception, when this file is copied by dh-make into a
|
||||
# dh-make output file, you may use that output file without restriction.
|
||||
# This special exception was added by Craig Small in version 0.37 of dh-make.
|
||||
|
||||
# Uncomment this to turn on verbose mode.
|
||||
#export DH_VERBOSE=1
|
||||
|
||||
BASEDIR=opt/linden
|
||||
|
||||
VIEWER_PKG=secondlife-viewer
|
||||
VIEWER_PACKAGEDIR=build-linux-i686/newview/packaged
|
||||
VIEWER_DESTDIR=$(CURDIR)/debian/$(VIEWER_PKG)
|
||||
VIEWER_VERSION:=$(shell dpkg-parsechangelog | grep ^Version | sed 's/^Version: //')
|
||||
VIEWER_INSTALLDIR:=$(BASEDIR)/viewer/SecondLife-i686-$(VIEWER_VERSION)
|
||||
|
||||
configure: configure-stamp
|
||||
configure-stamp:
|
||||
dh_testdir
|
||||
# Add here commands to configure the package.
|
||||
|
||||
touch configure-stamp
|
||||
|
||||
build: build-stamp
|
||||
|
||||
build-stamp: configure-stamp
|
||||
dh_testdir
|
||||
|
||||
# Add here commands to compile the package.
|
||||
#$(MAKE)
|
||||
#docbook-to-man debian/secondlife-viewer.sgml > secondlife-viewer.1
|
||||
|
||||
touch $@
|
||||
|
||||
clean:
|
||||
dh_testdir
|
||||
dh_testroot
|
||||
rm -f build-stamp configure-stamp
|
||||
|
||||
# Add here commands to clean up after the build process.
|
||||
#-$(MAKE) clean
|
||||
|
||||
dh_clean
|
||||
|
||||
install: build
|
||||
dh_testdir
|
||||
dh_testroot
|
||||
dh_clean -k
|
||||
dh_installdirs
|
||||
|
||||
# Add here commands to install the package into debian/secondlife-viewer.
|
||||
for file in $$(find $(VIEWER_PACKAGEDIR) -type f -o -type l | sed 's~$(VIEWER_PACKAGEDIR)/~~'); do \
|
||||
# create containing directory \
|
||||
install -v -m 755 -o root -g root -d "$$(dirname "$(VIEWER_DESTDIR)/$(VIEWER_INSTALLDIR)/$$file")"; \
|
||||
PERM=644; \
|
||||
if [ -x "$(VIEWER_PACKAGEDIR)/$$file" ]; then \
|
||||
PERM=755; \
|
||||
fi; \
|
||||
if [ -L "$(VIEWER_PACKAGEDIR)/$$file" ]; then \
|
||||
REAL="$$( readlink -f $(VIEWER_PACKAGEDIR)/$$file )"; \
|
||||
RELATIVE="$$( echo $$REAL | sed 's~$(CURDIR)/$(VIEWER_PACKAGEDIR)/~~' )"; \
|
||||
echo dh_link -p $(VIEWER_PKG) "$(VIEWER_INSTALLDIR)/$$RELATIVE" "$(VIEWER_INSTALLDIR)/$$file" ; \
|
||||
dh_link -p $(VIEWER_PKG) "$(VIEWER_INSTALLDIR)/$$RELATIVE" "$(VIEWER_INSTALLDIR)/$$file" ; \
|
||||
else \
|
||||
install -v -m $$PERM -o root -g root "$(VIEWER_PACKAGEDIR)/$$file" "$(VIEWER_DESTDIR)/$(VIEWER_INSTALLDIR)/$$file"; \
|
||||
fi; \
|
||||
done
|
||||
dh_link -p $(VIEWER_PKG) /$(VIEWER_INSTALLDIR)/secondlife /usr/bin/secondlife
|
||||
dh_link -p $(VIEWER_PKG) $(BASEDIR)/viewer/SecondLife-i686-$(VIEWER_VERSION) $(BASEDIR)/viewer/SecondLife
|
||||
|
||||
|
||||
# Build architecture-independent files here.
|
||||
binary-indep: build install
|
||||
# We have nothing to do by default.
|
||||
|
||||
# Build architecture-dependent files here.
|
||||
binary-arch: build install
|
||||
dh_testdir
|
||||
dh_testroot
|
||||
dh_installchangelogs
|
||||
dh_installdocs
|
||||
dh_installexamples
|
||||
# dh_install
|
||||
# dh_installmenu
|
||||
# dh_installdebconf
|
||||
# dh_installlogrotate
|
||||
# dh_installemacsen
|
||||
# dh_installpam
|
||||
# dh_installmime
|
||||
# dh_python
|
||||
|
||||
# To add an init script, uncomment this line and edit debian/init.d and
|
||||
# customize debian/secondlife-viewer.default to suit your needs.
|
||||
# dh_installinit
|
||||
|
||||
# To add cron jobs, uncomment this line and make a crontab file named
|
||||
# debian/cron.d, and it will be installed in /etc/cron.d/
|
||||
# dh_installcron
|
||||
|
||||
# dh_installinfo
|
||||
dh_installman
|
||||
dh_link
|
||||
# dh_strip
|
||||
dh_compress
|
||||
# dh_fixperms
|
||||
# dh_perl
|
||||
# dh_makeshlibs
|
||||
dh_installdeb
|
||||
# dh_shlibdeps
|
||||
dh_gencontrol
|
||||
dh_md5sums
|
||||
dh_builddeb
|
||||
|
||||
binary: binary-indep binary-arch
|
||||
.PHONY: build clean binary-indep binary-arch binary install configure
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
# Linden packages install in opt/linden
|
||||
secondlife-viewer: dir-or-file-in-opt
|
||||
secondlife-viewer: section-is-dh_make-template
|
||||
secondlife-viewer: binary-without-manpage
|
||||
secondlife-viewer: maintainer-script-empty postrm
|
||||
secondlife-viewer: maintainer-script-empty preinst
|
||||
secondlife-viewer: maintainer-script-empty prerm
|
||||
secondlife-viewer: unstripped-binary-or-object
|
||||
|
|
@ -270,6 +270,7 @@ Beq Janus
|
|||
SL-13583
|
||||
SL-14766
|
||||
SL-14927
|
||||
SL-11300
|
||||
SL-15709
|
||||
SL-16021
|
||||
Beth Walcher
|
||||
|
|
@ -808,6 +809,7 @@ Jonathan Yap
|
|||
STORM-2104
|
||||
STORM-2142
|
||||
SL-10089
|
||||
BUG-229818
|
||||
Kadah Coba
|
||||
STORM-1060
|
||||
STORM-1843
|
||||
|
|
@ -1361,6 +1363,7 @@ Sovereign Engineer
|
|||
SL-11079
|
||||
OPEN-343
|
||||
SL-11625
|
||||
BUG-229030
|
||||
SL-14705
|
||||
SL-14706
|
||||
SL-14707
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 9.4 KiB |
|
|
@ -60,7 +60,7 @@ if (EXISTS ${CMAKE_SOURCE_DIR}/Server.cmake)
|
|||
set(INSTALL_PROPRIETARY ON CACHE BOOL "Install proprietary binaries")
|
||||
endif (EXISTS ${CMAKE_SOURCE_DIR}/Server.cmake)
|
||||
set(TEMPLATE_VERIFIER_OPTIONS "" CACHE STRING "Options for scripts/template_verifier.py")
|
||||
set(TEMPLATE_VERIFIER_MASTER_URL "http://bitbucket.org/lindenlab/master-message-template/raw/tip/message_template.msg" CACHE STRING "Location of the master message template")
|
||||
set(TEMPLATE_VERIFIER_MASTER_URL "https://bitbucket.org/lindenlab/master-message-template-git/raw/master/message_template.msg" CACHE STRING "Location of the master message template")
|
||||
|
||||
if (NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ BOOL LLViewerVisualParamInfo::parseXml(LLXmlTreeNode *node)
|
|||
static LLStdStringHandle wearable_string = LLXmlTree::addAttributeString("wearable");
|
||||
if( node->getFastAttributeString( wearable_string, wearable) )
|
||||
{
|
||||
mWearableType = LLWearableType::typeNameToType( wearable );
|
||||
mWearableType = LLWearableType::getInstance()->typeNameToType( wearable );
|
||||
}
|
||||
|
||||
static LLStdStringHandle edit_group_string = LLXmlTree::addAttributeString("edit_group");
|
||||
|
|
|
|||
|
|
@ -73,17 +73,17 @@ LLWearable::~LLWearable()
|
|||
|
||||
const std::string& LLWearable::getTypeLabel() const
|
||||
{
|
||||
return LLWearableType::getTypeLabel(mType);
|
||||
return LLWearableType::getInstance()->getTypeLabel(mType);
|
||||
}
|
||||
|
||||
const std::string& LLWearable::getTypeName() const
|
||||
{
|
||||
return LLWearableType::getTypeName(mType);
|
||||
return LLWearableType::getInstance()->getTypeName(mType);
|
||||
}
|
||||
|
||||
LLAssetType::EType LLWearable::getAssetType() const
|
||||
{
|
||||
return LLWearableType::getAssetType(mType);
|
||||
return LLWearableType::getInstance()->getAssetType(mType);
|
||||
}
|
||||
|
||||
BOOL LLWearable::exportFile(const std::string& filename) const
|
||||
|
|
|
|||
|
|
@ -231,10 +231,11 @@ BOOL LLWearableData::getWearableIndex(const LLWearable *wearable, U32& index_fou
|
|||
U32 LLWearableData::getClothingLayerCount() const
|
||||
{
|
||||
U32 count = 0;
|
||||
LLWearableType *wr_inst = LLWearableType::getInstance();
|
||||
for (S32 i = 0; i < LLWearableType::WT_COUNT; i++)
|
||||
{
|
||||
LLWearableType::EType type = (LLWearableType::EType)i;
|
||||
if (LLWearableType::getAssetType(type)==LLAssetType::AT_CLOTHING)
|
||||
if (wr_inst->getAssetType(type)==LLAssetType::AT_CLOTHING)
|
||||
{
|
||||
count += getWearableCount(type);
|
||||
}
|
||||
|
|
@ -244,7 +245,7 @@ U32 LLWearableData::getClothingLayerCount() const
|
|||
|
||||
BOOL LLWearableData::canAddWearable(const LLWearableType::EType type) const
|
||||
{
|
||||
LLAssetType::EType a_type = LLWearableType::getAssetType(type);
|
||||
LLAssetType::EType a_type = LLWearableType::getInstance()->getAssetType(type);
|
||||
if (a_type==LLAssetType::AT_CLOTHING)
|
||||
{
|
||||
return (getClothingLayerCount() < MAX_CLOTHING_LAYERS);
|
||||
|
|
|
|||
|
|
@ -30,153 +30,98 @@
|
|||
#include "llinventorydefines.h"
|
||||
|
||||
|
||||
struct WearableEntry : public LLDictionaryEntry
|
||||
{
|
||||
WearableEntry(LLWearableType& wtype,
|
||||
const std::string &name,
|
||||
const std::string& default_new_name,
|
||||
LLAssetType::EType assetType,
|
||||
LLInventoryType::EIconName iconName,
|
||||
BOOL disable_camera_switch = FALSE,
|
||||
BOOL allow_multiwear = TRUE) :
|
||||
LLDictionaryEntry(name),
|
||||
mAssetType(assetType),
|
||||
mDefaultNewName(default_new_name),
|
||||
mLabel(wtype.mTrans->getString(name)),
|
||||
mIconName(iconName),
|
||||
mDisableCameraSwitch(disable_camera_switch),
|
||||
mAllowMultiwear(allow_multiwear)
|
||||
LLWearableType::LLWearableDictionary::LLWearableDictionary(LLTranslationBridge::ptr_t& trans)
|
||||
{
|
||||
addEntry(LLWearableType::WT_SHAPE, new WearableEntry(trans, "shape", "New Shape", LLAssetType::AT_BODYPART, LLInventoryType::ICONNAME_BODYPART_SHAPE, FALSE, FALSE));
|
||||
addEntry(LLWearableType::WT_SKIN, new WearableEntry(trans, "skin", "New Skin", LLAssetType::AT_BODYPART, LLInventoryType::ICONNAME_BODYPART_SKIN, FALSE, FALSE));
|
||||
addEntry(LLWearableType::WT_HAIR, new WearableEntry(trans, "hair", "New Hair", LLAssetType::AT_BODYPART, LLInventoryType::ICONNAME_BODYPART_HAIR, FALSE, FALSE));
|
||||
addEntry(LLWearableType::WT_EYES, new WearableEntry(trans, "eyes", "New Eyes", LLAssetType::AT_BODYPART, LLInventoryType::ICONNAME_BODYPART_EYES, FALSE, FALSE));
|
||||
addEntry(LLWearableType::WT_SHIRT, new WearableEntry(trans, "shirt", "New Shirt", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_SHIRT, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_PANTS, new WearableEntry(trans, "pants", "New Pants", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_PANTS, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_SHOES, new WearableEntry(trans, "shoes", "New Shoes", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_SHOES, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_SOCKS, new WearableEntry(trans, "socks", "New Socks", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_SOCKS, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_JACKET, new WearableEntry(trans, "jacket", "New Jacket", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_JACKET, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_GLOVES, new WearableEntry(trans, "gloves", "New Gloves", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_GLOVES, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry(trans, "undershirt", "New Undershirt", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_UNDERSHIRT, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry(trans, "underpants", "New Underpants", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_UNDERPANTS, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_SKIRT, new WearableEntry(trans, "skirt", "New Skirt", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_SKIRT, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_ALPHA, new WearableEntry(trans, "alpha", "New Alpha", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_ALPHA, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_TATTOO, new WearableEntry(trans, "tattoo", "New Tattoo", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_TATTOO, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_UNIVERSAL, new WearableEntry(trans, "universal", "New Universal", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_UNIVERSAL, FALSE, TRUE));
|
||||
|
||||
}
|
||||
const LLAssetType::EType mAssetType;
|
||||
const std::string mLabel;
|
||||
const std::string mDefaultNewName; //keep mLabel for backward compatibility
|
||||
LLInventoryType::EIconName mIconName;
|
||||
BOOL mDisableCameraSwitch;
|
||||
BOOL mAllowMultiwear;
|
||||
};
|
||||
addEntry(LLWearableType::WT_PHYSICS, new WearableEntry(trans, "physics", "New Physics", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_PHYSICS, TRUE, TRUE));
|
||||
|
||||
class LLWearableDictionary : public LLParamSingleton<LLWearableDictionary>,
|
||||
public LLDictionary<LLWearableType::EType, WearableEntry>
|
||||
{
|
||||
LLSINGLETON(LLWearableDictionary, LLWearableType&);
|
||||
};
|
||||
|
||||
LLWearableDictionary::LLWearableDictionary(LLWearableType& wtype)
|
||||
{
|
||||
addEntry(LLWearableType::WT_SHAPE, new WearableEntry(wtype, "shape", "New Shape", LLAssetType::AT_BODYPART, LLInventoryType::ICONNAME_BODYPART_SHAPE, FALSE, FALSE));
|
||||
addEntry(LLWearableType::WT_SKIN, new WearableEntry(wtype, "skin", "New Skin", LLAssetType::AT_BODYPART, LLInventoryType::ICONNAME_BODYPART_SKIN, FALSE, FALSE));
|
||||
addEntry(LLWearableType::WT_HAIR, new WearableEntry(wtype, "hair", "New Hair", LLAssetType::AT_BODYPART, LLInventoryType::ICONNAME_BODYPART_HAIR, FALSE, FALSE));
|
||||
addEntry(LLWearableType::WT_EYES, new WearableEntry(wtype, "eyes", "New Eyes", LLAssetType::AT_BODYPART, LLInventoryType::ICONNAME_BODYPART_EYES, FALSE, FALSE));
|
||||
addEntry(LLWearableType::WT_SHIRT, new WearableEntry(wtype, "shirt", "New Shirt", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_SHIRT, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_PANTS, new WearableEntry(wtype, "pants", "New Pants", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_PANTS, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_SHOES, new WearableEntry(wtype, "shoes", "New Shoes", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_SHOES, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_SOCKS, new WearableEntry(wtype, "socks", "New Socks", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_SOCKS, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_JACKET, new WearableEntry(wtype, "jacket", "New Jacket", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_JACKET, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_GLOVES, new WearableEntry(wtype, "gloves", "New Gloves", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_GLOVES, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry(wtype, "undershirt", "New Undershirt", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_UNDERSHIRT, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry(wtype, "underpants", "New Underpants", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_UNDERPANTS, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_SKIRT, new WearableEntry(wtype, "skirt", "New Skirt", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_SKIRT, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_ALPHA, new WearableEntry(wtype, "alpha", "New Alpha", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_ALPHA, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_TATTOO, new WearableEntry(wtype, "tattoo", "New Tattoo", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_TATTOO, FALSE, TRUE));
|
||||
addEntry(LLWearableType::WT_UNIVERSAL, new WearableEntry(wtype, "universal", "New Universal", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_UNIVERSAL, FALSE, TRUE));
|
||||
|
||||
addEntry(LLWearableType::WT_PHYSICS, new WearableEntry(wtype, "physics", "New Physics", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_PHYSICS, TRUE, TRUE));
|
||||
|
||||
addEntry(LLWearableType::WT_INVALID, new WearableEntry(wtype, "invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryType::ICONNAME_UNKNOWN, FALSE, FALSE));
|
||||
addEntry(LLWearableType::WT_NONE, new WearableEntry(wtype, "none", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryType::ICONNAME_NONE, FALSE, FALSE));
|
||||
addEntry(LLWearableType::WT_INVALID, new WearableEntry(trans, "invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryType::ICONNAME_UNKNOWN, FALSE, FALSE));
|
||||
addEntry(LLWearableType::WT_NONE, new WearableEntry(trans, "none", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryType::ICONNAME_NONE, FALSE, FALSE));
|
||||
}
|
||||
|
||||
|
||||
// class LLWearableType
|
||||
|
||||
LLWearableType::LLWearableType(LLTranslationBridge* trans)
|
||||
LLWearableType::LLWearableType(LLTranslationBridge::ptr_t &trans)
|
||||
: mDictionary(trans)
|
||||
{
|
||||
// LLTranslationBridge exists, but is not ready at this point in time since strings.xml is not yet loaded
|
||||
mTrans = trans;
|
||||
}
|
||||
|
||||
LLWearableType::~LLWearableType()
|
||||
{
|
||||
delete mTrans;
|
||||
}
|
||||
|
||||
void LLWearableType::initSingleton()
|
||||
{
|
||||
// To make sure all wrapping functions will crash without initing LLWearableType;
|
||||
LLWearableDictionary::initParamSingleton(*this);
|
||||
|
||||
// Todo: consider merging LLWearableType and LLWearableDictionary
|
||||
}
|
||||
|
||||
// static
|
||||
LLWearableType::EType LLWearableType::typeNameToType(const std::string& type_name)
|
||||
{
|
||||
const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
|
||||
const LLWearableType::EType wearable = dict->lookup(type_name);
|
||||
const LLWearableType::EType wearable = mDictionary.lookup(type_name);
|
||||
return wearable;
|
||||
}
|
||||
|
||||
// static
|
||||
const std::string& LLWearableType::getTypeName(LLWearableType::EType type)
|
||||
{
|
||||
const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
|
||||
const WearableEntry *entry = dict->lookup(type);
|
||||
const WearableEntry *entry = mDictionary.lookup(type);
|
||||
if (!entry) return getTypeName(WT_INVALID);
|
||||
return entry->mName;
|
||||
}
|
||||
|
||||
//static
|
||||
const std::string& LLWearableType::getTypeDefaultNewName(LLWearableType::EType type)
|
||||
{
|
||||
const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
|
||||
const WearableEntry *entry = dict->lookup(type);
|
||||
const WearableEntry *entry = mDictionary.lookup(type);
|
||||
if (!entry) return getTypeDefaultNewName(WT_INVALID);
|
||||
return entry->mDefaultNewName;
|
||||
}
|
||||
|
||||
// static
|
||||
const std::string& LLWearableType::getTypeLabel(LLWearableType::EType type)
|
||||
{
|
||||
const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
|
||||
const WearableEntry *entry = dict->lookup(type);
|
||||
const WearableEntry *entry = mDictionary.lookup(type);
|
||||
if (!entry) return getTypeLabel(WT_INVALID);
|
||||
return entry->mLabel;
|
||||
}
|
||||
|
||||
// static
|
||||
LLAssetType::EType LLWearableType::getAssetType(LLWearableType::EType type)
|
||||
{
|
||||
const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
|
||||
const WearableEntry *entry = dict->lookup(type);
|
||||
const WearableEntry *entry = mDictionary.lookup(type);
|
||||
if (!entry) return getAssetType(WT_INVALID);
|
||||
return entry->mAssetType;
|
||||
}
|
||||
|
||||
// static
|
||||
LLInventoryType::EIconName LLWearableType::getIconName(LLWearableType::EType type)
|
||||
{
|
||||
const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
|
||||
const WearableEntry *entry = dict->lookup(type);
|
||||
const WearableEntry *entry = mDictionary.lookup(type);
|
||||
if (!entry) return getIconName(WT_INVALID);
|
||||
return entry->mIconName;
|
||||
}
|
||||
|
||||
// static
|
||||
BOOL LLWearableType::getDisableCameraSwitch(LLWearableType::EType type)
|
||||
{
|
||||
const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
|
||||
const WearableEntry *entry = dict->lookup(type);
|
||||
const WearableEntry *entry = mDictionary.lookup(type);
|
||||
if (!entry) return FALSE;
|
||||
return entry->mDisableCameraSwitch;
|
||||
}
|
||||
|
||||
// static
|
||||
BOOL LLWearableType::getAllowMultiwear(LLWearableType::EType type)
|
||||
{
|
||||
const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
|
||||
const WearableEntry *entry = dict->lookup(type);
|
||||
const WearableEntry *entry = mDictionary.lookup(type);
|
||||
if (!entry) return FALSE;
|
||||
return entry->mAllowMultiwear;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,10 +35,9 @@
|
|||
|
||||
class LLWearableType : public LLParamSingleton<LLWearableType>
|
||||
{
|
||||
LLSINGLETON(LLWearableType, LLTranslationBridge* trans);
|
||||
LLSINGLETON(LLWearableType, LLTranslationBridge::ptr_t &trans);
|
||||
~LLWearableType();
|
||||
void initSingleton();
|
||||
friend struct WearableEntry;
|
||||
public:
|
||||
enum EType
|
||||
{
|
||||
|
|
@ -67,20 +66,53 @@ public:
|
|||
|
||||
// Most methods are wrappers for dictionary, but if LLWearableType is not initialized,
|
||||
// they will crash. Whole LLWearableType is just wrapper for convinient calls.
|
||||
static const std::string& getTypeName(EType type);
|
||||
static const std::string& getTypeDefaultNewName(EType type);
|
||||
static const std::string& getTypeLabel(EType type);
|
||||
static LLAssetType::EType getAssetType(EType type);
|
||||
static EType typeNameToType(const std::string& type_name);
|
||||
static LLInventoryType::EIconName getIconName(EType type);
|
||||
static BOOL getDisableCameraSwitch(EType type);
|
||||
static BOOL getAllowMultiwear(EType type);
|
||||
const std::string& getTypeName(EType type);
|
||||
const std::string& getTypeDefaultNewName(EType type);
|
||||
const std::string& getTypeLabel(EType type);
|
||||
LLAssetType::EType getAssetType(EType type);
|
||||
EType typeNameToType(const std::string& type_name);
|
||||
LLInventoryType::EIconName getIconName(EType type);
|
||||
BOOL getDisableCameraSwitch(EType type);
|
||||
BOOL getAllowMultiwear(EType type);
|
||||
|
||||
static EType inventoryFlagsToWearableType(U32 flags);
|
||||
|
||||
protected:
|
||||
private:
|
||||
struct WearableEntry : public LLDictionaryEntry
|
||||
{
|
||||
WearableEntry(LLTranslationBridge::ptr_t& trans,
|
||||
const std::string &name,
|
||||
const std::string& default_new_name,
|
||||
LLAssetType::EType assetType,
|
||||
LLInventoryType::EIconName iconName,
|
||||
BOOL disable_camera_switch = FALSE,
|
||||
BOOL allow_multiwear = TRUE) :
|
||||
LLDictionaryEntry(name),
|
||||
mAssetType(assetType),
|
||||
mDefaultNewName(default_new_name),
|
||||
mLabel(trans->getString(name)),
|
||||
mIconName(iconName),
|
||||
mDisableCameraSwitch(disable_camera_switch),
|
||||
mAllowMultiwear(allow_multiwear)
|
||||
{
|
||||
|
||||
LLTranslationBridge* mTrans;
|
||||
}
|
||||
const LLAssetType::EType mAssetType;
|
||||
const std::string mLabel;
|
||||
const std::string mDefaultNewName;
|
||||
LLInventoryType::EIconName mIconName;
|
||||
BOOL mDisableCameraSwitch;
|
||||
BOOL mAllowMultiwear;
|
||||
};
|
||||
|
||||
class LLWearableDictionary : public LLDictionary<LLWearableType::EType, WearableEntry>
|
||||
{
|
||||
public:
|
||||
LLWearableDictionary(LLTranslationBridge::ptr_t& trans);
|
||||
~LLWearableDictionary() {}
|
||||
};
|
||||
|
||||
LLWearableDictionary mDictionary;
|
||||
};
|
||||
|
||||
#endif // LL_LLWEARABLETYPE_H
|
||||
|
|
|
|||
|
|
@ -213,9 +213,9 @@ set(llcommon_HEADER_FILES
|
|||
llqueuedthread.h
|
||||
llrand.h
|
||||
llrefcount.h
|
||||
llregex.h
|
||||
llregistry.h
|
||||
llrun.h
|
||||
llrefcount.h
|
||||
llsafehandle.h
|
||||
llsd.h
|
||||
llsdjson.h
|
||||
|
|
|
|||
|
|
@ -135,6 +135,13 @@ LLCoros::LLCoros():
|
|||
|
||||
LLCoros::~LLCoros()
|
||||
{
|
||||
}
|
||||
|
||||
void LLCoros::cleanupSingleton()
|
||||
{
|
||||
// Some of the coroutines (like voice) will depend onto
|
||||
// origin singletons, so clean coros before deleting those
|
||||
|
||||
printActiveCoroutines("at entry to ~LLCoros()");
|
||||
// Other LLApp status-change listeners do things like close
|
||||
// work queues and inject the Stop exception into pending
|
||||
|
|
@ -150,6 +157,8 @@ LLCoros::~LLCoros()
|
|||
{
|
||||
// don't use llcoro::suspend() because that module depends
|
||||
// on this one
|
||||
// This will yield current(main) thread and will let active
|
||||
// corutines run once
|
||||
boost::this_fiber::yield();
|
||||
}
|
||||
printActiveCoroutines("after pumping");
|
||||
|
|
|
|||
|
|
@ -89,6 +89,8 @@ class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>
|
|||
{
|
||||
LLSINGLETON(LLCoros);
|
||||
~LLCoros();
|
||||
|
||||
void cleanupSingleton();
|
||||
public:
|
||||
/// The viewer's use of the term "coroutine" became deeply embedded before
|
||||
/// the industry term "fiber" emerged to distinguish userland threads from
|
||||
|
|
|
|||
|
|
@ -442,6 +442,62 @@ namespace
|
|||
typedef std::vector<LLError::RecorderPtr> Recorders;
|
||||
typedef std::vector<LLError::CallSite*> CallSiteVector;
|
||||
|
||||
class SettingsConfig : public LLRefCount
|
||||
{
|
||||
friend class Globals;
|
||||
|
||||
public:
|
||||
virtual ~SettingsConfig();
|
||||
|
||||
LLError::ELevel mDefaultLevel;
|
||||
|
||||
bool mLogAlwaysFlush;
|
||||
|
||||
U32 mEnabledLogTypesMask;
|
||||
|
||||
LevelMap mFunctionLevelMap;
|
||||
LevelMap mClassLevelMap;
|
||||
LevelMap mFileLevelMap;
|
||||
LevelMap mTagLevelMap;
|
||||
std::map<std::string, unsigned int> mUniqueLogMessages;
|
||||
|
||||
LLError::FatalFunction mCrashFunction;
|
||||
LLError::TimeFunction mTimeFunction;
|
||||
|
||||
Recorders mRecorders;
|
||||
LLMutex mRecorderMutex;
|
||||
|
||||
int mShouldLogCallCounter;
|
||||
|
||||
private:
|
||||
SettingsConfig();
|
||||
};
|
||||
|
||||
typedef LLPointer<SettingsConfig> SettingsConfigPtr;
|
||||
|
||||
SettingsConfig::SettingsConfig()
|
||||
: LLRefCount(),
|
||||
mDefaultLevel(LLError::LEVEL_DEBUG),
|
||||
mLogAlwaysFlush(true),
|
||||
mEnabledLogTypesMask(255),
|
||||
mFunctionLevelMap(),
|
||||
mClassLevelMap(),
|
||||
mFileLevelMap(),
|
||||
mTagLevelMap(),
|
||||
mUniqueLogMessages(),
|
||||
mCrashFunction(NULL),
|
||||
mTimeFunction(NULL),
|
||||
mRecorders(),
|
||||
mRecorderMutex(),
|
||||
mShouldLogCallCounter(0)
|
||||
{
|
||||
}
|
||||
|
||||
SettingsConfig::~SettingsConfig()
|
||||
{
|
||||
mRecorders.clear();
|
||||
}
|
||||
|
||||
class Globals
|
||||
{
|
||||
public:
|
||||
|
|
@ -449,16 +505,31 @@ namespace
|
|||
protected:
|
||||
Globals();
|
||||
public:
|
||||
std::ostringstream messageStream;
|
||||
bool messageStreamInUse;
|
||||
std::string mFatalMessage;
|
||||
|
||||
void addCallSite(LLError::CallSite&);
|
||||
void invalidateCallSites();
|
||||
|
||||
SettingsConfigPtr getSettingsConfig();
|
||||
|
||||
void resetSettingsConfig();
|
||||
LLError::SettingsStoragePtr saveAndResetSettingsConfig();
|
||||
void restore(LLError::SettingsStoragePtr pSettingsStorage);
|
||||
private:
|
||||
CallSiteVector callSites;
|
||||
SettingsConfigPtr mSettingsConfig;
|
||||
};
|
||||
|
||||
Globals::Globals() {}
|
||||
Globals::Globals()
|
||||
: messageStream(),
|
||||
messageStreamInUse(false),
|
||||
callSites(),
|
||||
mSettingsConfig(new SettingsConfig())
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
Globals* Globals::getInstance()
|
||||
{
|
||||
|
|
@ -486,117 +557,28 @@ namespace
|
|||
|
||||
callSites.clear();
|
||||
}
|
||||
}
|
||||
|
||||
namespace LLError
|
||||
{
|
||||
class SettingsConfig : public LLRefCount
|
||||
{
|
||||
friend class Settings;
|
||||
|
||||
public:
|
||||
virtual ~SettingsConfig();
|
||||
|
||||
LLError::ELevel mDefaultLevel;
|
||||
|
||||
bool mLogAlwaysFlush;
|
||||
|
||||
U32 mEnabledLogTypesMask;
|
||||
|
||||
LevelMap mFunctionLevelMap;
|
||||
LevelMap mClassLevelMap;
|
||||
LevelMap mFileLevelMap;
|
||||
LevelMap mTagLevelMap;
|
||||
std::map<std::string, unsigned int> mUniqueLogMessages;
|
||||
|
||||
LLError::FatalFunction mCrashFunction;
|
||||
LLError::TimeFunction mTimeFunction;
|
||||
|
||||
Recorders mRecorders;
|
||||
|
||||
int mShouldLogCallCounter;
|
||||
|
||||
private:
|
||||
SettingsConfig();
|
||||
};
|
||||
|
||||
typedef LLPointer<SettingsConfig> SettingsConfigPtr;
|
||||
|
||||
class Settings
|
||||
{
|
||||
public:
|
||||
static Settings* getInstance();
|
||||
protected:
|
||||
Settings();
|
||||
public:
|
||||
SettingsConfigPtr getSettingsConfig();
|
||||
|
||||
void reset();
|
||||
SettingsStoragePtr saveAndReset();
|
||||
void restore(SettingsStoragePtr pSettingsStorage);
|
||||
|
||||
private:
|
||||
SettingsConfigPtr mSettingsConfig;
|
||||
};
|
||||
|
||||
SettingsConfig::SettingsConfig()
|
||||
: LLRefCount(),
|
||||
mDefaultLevel(LLError::LEVEL_DEBUG),
|
||||
mLogAlwaysFlush(true),
|
||||
mEnabledLogTypesMask(255),
|
||||
mFunctionLevelMap(),
|
||||
mClassLevelMap(),
|
||||
mFileLevelMap(),
|
||||
mTagLevelMap(),
|
||||
mUniqueLogMessages(),
|
||||
mCrashFunction([](const std::string&){}),
|
||||
mTimeFunction(NULL),
|
||||
mRecorders(),
|
||||
mShouldLogCallCounter(0)
|
||||
{
|
||||
}
|
||||
|
||||
SettingsConfig::~SettingsConfig()
|
||||
{
|
||||
mRecorders.clear();
|
||||
}
|
||||
|
||||
Settings::Settings():
|
||||
mSettingsConfig(new SettingsConfig())
|
||||
{
|
||||
}
|
||||
|
||||
Settings* Settings::getInstance()
|
||||
{
|
||||
// According to C++11 Function-Local Initialization
|
||||
// of static variables is supposed to be thread safe
|
||||
// without risk of deadlocks.
|
||||
static Settings inst;
|
||||
|
||||
return &inst;
|
||||
}
|
||||
|
||||
SettingsConfigPtr Settings::getSettingsConfig()
|
||||
SettingsConfigPtr Globals::getSettingsConfig()
|
||||
{
|
||||
return mSettingsConfig;
|
||||
}
|
||||
|
||||
void Settings::reset()
|
||||
void Globals::resetSettingsConfig()
|
||||
{
|
||||
Globals::getInstance()->invalidateCallSites();
|
||||
invalidateCallSites();
|
||||
mSettingsConfig = new SettingsConfig();
|
||||
}
|
||||
|
||||
SettingsStoragePtr Settings::saveAndReset()
|
||||
LLError::SettingsStoragePtr Globals::saveAndResetSettingsConfig()
|
||||
{
|
||||
SettingsStoragePtr oldSettingsConfig(mSettingsConfig.get());
|
||||
reset();
|
||||
LLError::SettingsStoragePtr oldSettingsConfig(mSettingsConfig.get());
|
||||
resetSettingsConfig();
|
||||
return oldSettingsConfig;
|
||||
}
|
||||
|
||||
void Settings::restore(SettingsStoragePtr pSettingsStorage)
|
||||
void Globals::restore(LLError::SettingsStoragePtr pSettingsStorage)
|
||||
{
|
||||
Globals::getInstance()->invalidateCallSites();
|
||||
invalidateCallSites();
|
||||
SettingsConfigPtr newSettingsConfig(dynamic_cast<SettingsConfig *>(pSettingsStorage.get()));
|
||||
mSettingsConfig = newSettingsConfig;
|
||||
}
|
||||
|
|
@ -723,7 +705,7 @@ namespace
|
|||
|
||||
void commonInit(const std::string& user_dir, const std::string& app_dir, bool log_to_stderr = true)
|
||||
{
|
||||
LLError::Settings::getInstance()->reset();
|
||||
Globals::getInstance()->resetSettingsConfig();
|
||||
|
||||
LLError::setDefaultLevel(LLError::LEVEL_INFO);
|
||||
LLError::setAlwaysFlush(true);
|
||||
|
|
@ -764,13 +746,13 @@ namespace LLError
|
|||
|
||||
void setFatalFunction(const FatalFunction& f)
|
||||
{
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();
|
||||
s->mCrashFunction = f;
|
||||
}
|
||||
|
||||
FatalFunction getFatalFunction()
|
||||
{
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();
|
||||
return s->mCrashFunction;
|
||||
}
|
||||
|
||||
|
|
@ -781,72 +763,77 @@ namespace LLError
|
|||
|
||||
void setTimeFunction(TimeFunction f)
|
||||
{
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();
|
||||
s->mTimeFunction = f;
|
||||
}
|
||||
|
||||
void setDefaultLevel(ELevel level)
|
||||
{
|
||||
Globals::getInstance()->invalidateCallSites();
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
Globals *g = Globals::getInstance();
|
||||
g->invalidateCallSites();
|
||||
SettingsConfigPtr s = g->getSettingsConfig();
|
||||
s->mDefaultLevel = level;
|
||||
}
|
||||
|
||||
ELevel getDefaultLevel()
|
||||
{
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();
|
||||
return s->mDefaultLevel;
|
||||
}
|
||||
|
||||
void setAlwaysFlush(bool flush)
|
||||
{
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();
|
||||
s->mLogAlwaysFlush = flush;
|
||||
}
|
||||
|
||||
bool getAlwaysFlush()
|
||||
{
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();
|
||||
return s->mLogAlwaysFlush;
|
||||
}
|
||||
|
||||
void setEnabledLogTypesMask(U32 mask)
|
||||
{
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();
|
||||
s->mEnabledLogTypesMask = mask;
|
||||
}
|
||||
|
||||
U32 getEnabledLogTypesMask()
|
||||
{
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();
|
||||
return s->mEnabledLogTypesMask;
|
||||
}
|
||||
|
||||
void setFunctionLevel(const std::string& function_name, ELevel level)
|
||||
{
|
||||
Globals::getInstance()->invalidateCallSites();
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
Globals *g = Globals::getInstance();
|
||||
g->invalidateCallSites();
|
||||
SettingsConfigPtr s = g->getSettingsConfig();
|
||||
s->mFunctionLevelMap[function_name] = level;
|
||||
}
|
||||
|
||||
void setClassLevel(const std::string& class_name, ELevel level)
|
||||
{
|
||||
Globals::getInstance()->invalidateCallSites();
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
Globals *g = Globals::getInstance();
|
||||
g->invalidateCallSites();
|
||||
SettingsConfigPtr s = g->getSettingsConfig();
|
||||
s->mClassLevelMap[class_name] = level;
|
||||
}
|
||||
|
||||
void setFileLevel(const std::string& file_name, ELevel level)
|
||||
{
|
||||
Globals::getInstance()->invalidateCallSites();
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
Globals *g = Globals::getInstance();
|
||||
g->invalidateCallSites();
|
||||
SettingsConfigPtr s = g->getSettingsConfig();
|
||||
s->mFileLevelMap[file_name] = level;
|
||||
}
|
||||
|
||||
void setTagLevel(const std::string& tag_name, ELevel level)
|
||||
{
|
||||
Globals::getInstance()->invalidateCallSites();
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
Globals *g = Globals::getInstance();
|
||||
g->invalidateCallSites();
|
||||
SettingsConfigPtr s = g->getSettingsConfig();
|
||||
s->mTagLevelMap[tag_name] = level;
|
||||
}
|
||||
|
||||
|
|
@ -891,8 +878,9 @@ namespace LLError
|
|||
{
|
||||
void configure(const LLSD& config)
|
||||
{
|
||||
Globals::getInstance()->invalidateCallSites();
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
Globals *g = Globals::getInstance();
|
||||
g->invalidateCallSites();
|
||||
SettingsConfigPtr s = g->getSettingsConfig();
|
||||
|
||||
s->mFunctionLevelMap.clear();
|
||||
s->mClassLevelMap.clear();
|
||||
|
|
@ -1019,7 +1007,8 @@ namespace LLError
|
|||
{
|
||||
return;
|
||||
}
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();
|
||||
LLMutexLock lock(&s->mRecorderMutex);
|
||||
s->mRecorders.push_back(recorder);
|
||||
}
|
||||
|
||||
|
|
@ -1029,7 +1018,8 @@ namespace LLError
|
|||
{
|
||||
return;
|
||||
}
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();
|
||||
LLMutexLock lock(&s->mRecorderMutex);
|
||||
s->mRecorders.erase(std::remove(s->mRecorders.begin(), s->mRecorders.end(), recorder),
|
||||
s->mRecorders.end());
|
||||
}
|
||||
|
|
@ -1041,11 +1031,12 @@ namespace LLError
|
|||
// with a Recorders::iterator indicating the position of that entry in
|
||||
// mRecorders. The shared_ptr might be empty (operator!() returns true) if
|
||||
// there was no such RECORDER subclass instance in mRecorders.
|
||||
//
|
||||
// NOTE!!! Requires external mutex lock!!!
|
||||
template <typename RECORDER>
|
||||
std::pair<boost::shared_ptr<RECORDER>, Recorders::iterator>
|
||||
findRecorderPos()
|
||||
findRecorderPos(SettingsConfigPtr &s)
|
||||
{
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
// Since we promise to return an iterator, use a classic iterator
|
||||
// loop.
|
||||
auto end{s->mRecorders.end()};
|
||||
|
|
@ -1076,7 +1067,9 @@ namespace LLError
|
|||
template <typename RECORDER>
|
||||
boost::shared_ptr<RECORDER> findRecorder()
|
||||
{
|
||||
return findRecorderPos<RECORDER>().first;
|
||||
SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();
|
||||
LLMutexLock lock(&s->mRecorderMutex);
|
||||
return findRecorderPos<RECORDER>(s).first;
|
||||
}
|
||||
|
||||
// Remove an entry from SettingsConfig::mRecorders whose RecorderPtr
|
||||
|
|
@ -1085,10 +1078,11 @@ namespace LLError
|
|||
template <typename RECORDER>
|
||||
bool removeRecorder()
|
||||
{
|
||||
auto found = findRecorderPos<RECORDER>();
|
||||
SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();
|
||||
LLMutexLock lock(&s->mRecorderMutex);
|
||||
auto found = findRecorderPos<RECORDER>(s);
|
||||
if (found.first)
|
||||
{
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
s->mRecorders.erase(found.second);
|
||||
}
|
||||
return bool(found.first);
|
||||
|
|
@ -1187,10 +1181,11 @@ namespace
|
|||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LLError::ELevel level = site.mLevel;
|
||||
LLError::SettingsConfigPtr s = LLError::Settings::getInstance()->getSettingsConfig();
|
||||
SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();
|
||||
|
||||
std::string escaped_message;
|
||||
|
||||
LLMutexLock lock(&s->mRecorderMutex);
|
||||
for (Recorders::const_iterator i = s->mRecorders.begin();
|
||||
i != s->mRecorders.end();
|
||||
++i)
|
||||
|
|
@ -1326,7 +1321,8 @@ namespace LLError
|
|||
return false;
|
||||
}
|
||||
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
Globals *g = Globals::getInstance();
|
||||
SettingsConfigPtr s = g->getSettingsConfig();
|
||||
|
||||
s->mShouldLogCallCounter++;
|
||||
|
||||
|
|
@ -1356,7 +1352,7 @@ namespace LLError
|
|||
: false);
|
||||
|
||||
site.mCached = true;
|
||||
Globals::getInstance()->addCallSite(site);
|
||||
g->addCallSite(site);
|
||||
return site.mShouldLog = site.mLevel >= compareLevel;
|
||||
}
|
||||
|
||||
|
|
@ -1371,7 +1367,7 @@ namespace LLError
|
|||
}
|
||||
|
||||
Globals* g = Globals::getInstance();
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
SettingsConfigPtr s = g->getSettingsConfig();
|
||||
|
||||
std::string message = out.str();
|
||||
|
||||
|
|
@ -1416,12 +1412,12 @@ namespace LLError
|
|||
{
|
||||
SettingsStoragePtr saveAndResetSettings()
|
||||
{
|
||||
return Settings::getInstance()->saveAndReset();
|
||||
return Globals::getInstance()->saveAndResetSettingsConfig();
|
||||
}
|
||||
|
||||
void restoreSettings(SettingsStoragePtr pSettingsStorage)
|
||||
{
|
||||
return Settings::getInstance()->restore(pSettingsStorage);
|
||||
return Globals::getInstance()->restore(pSettingsStorage);
|
||||
}
|
||||
|
||||
std::string removePrefix(std::string& s, const std::string& p)
|
||||
|
|
@ -1467,7 +1463,7 @@ namespace LLError
|
|||
|
||||
int shouldLogCallCount()
|
||||
{
|
||||
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
|
||||
SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();
|
||||
return s->mShouldLogCallCounter;
|
||||
}
|
||||
|
||||
|
|
@ -1580,7 +1576,7 @@ bool debugLoggingEnabled(const std::string& tag)
|
|||
return false;
|
||||
}
|
||||
|
||||
LLError::SettingsConfigPtr s = LLError::Settings::getInstance()->getSettingsConfig();
|
||||
SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig();
|
||||
LLError::ELevel level = LLError::LEVEL_DEBUG;
|
||||
bool res = checkLevelMap(s->mTagLevelMap, tag, level);
|
||||
return res;
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@
|
|||
#include <cctype>
|
||||
// external library headers
|
||||
#include <boost/range/iterator_range.hpp>
|
||||
#include <boost/make_shared.hpp>
|
||||
#if LL_WINDOWS
|
||||
#pragma warning (push)
|
||||
#pragma warning (disable : 4701) // compiler thinks might use uninitialized var, but no
|
||||
|
|
@ -285,7 +284,7 @@ LLEventPump::LLEventPump(const std::string& name, bool tweak):
|
|||
// Register every new instance with LLEventPumps
|
||||
mRegistry(LLEventPumps::instance().getHandle()),
|
||||
mName(mRegistry.get()->registerNew(*this, name, tweak)),
|
||||
mSignal(boost::make_shared<LLStandardSignal>()),
|
||||
mSignal(std::make_shared<LLStandardSignal>()),
|
||||
mEnabled(true)
|
||||
{}
|
||||
|
||||
|
|
@ -317,14 +316,24 @@ void LLEventPump::clear()
|
|||
{
|
||||
// Destroy the original LLStandardSignal instance, replacing it with a
|
||||
// whole new one.
|
||||
mSignal = boost::make_shared<LLStandardSignal>();
|
||||
mSignal = std::make_shared<LLStandardSignal>();
|
||||
mConnections.clear();
|
||||
}
|
||||
|
||||
void LLEventPump::reset()
|
||||
{
|
||||
mSignal.reset();
|
||||
// Resetting mSignal is supposed to disconnect everything on its own
|
||||
// But due to crash on 'reset' added explicit cleanup to get more data
|
||||
ConnectionMap::const_iterator iter = mConnections.begin();
|
||||
ConnectionMap::const_iterator end = mConnections.end();
|
||||
while (iter!=end)
|
||||
{
|
||||
iter->second.disconnect();
|
||||
iter++;
|
||||
}
|
||||
mConnections.clear();
|
||||
|
||||
mSignal.reset();
|
||||
//mDeps.clear();
|
||||
}
|
||||
|
||||
|
|
@ -543,7 +552,7 @@ bool LLEventStream::post(const LLSD& event)
|
|||
// *stack* instance of the shared_ptr, ensuring that our heap
|
||||
// LLStandardSignal object will live at least until post() returns, even
|
||||
// if 'this' gets destroyed during the call.
|
||||
boost::shared_ptr<LLStandardSignal> signal(mSignal);
|
||||
std::shared_ptr<LLStandardSignal> signal(mSignal);
|
||||
// Let caller know if any one listener handled the event. This is mostly
|
||||
// useful when using LLEventStream as a listener for an upstream
|
||||
// LLEventPump.
|
||||
|
|
|
|||
|
|
@ -49,8 +49,6 @@
|
|||
#endif
|
||||
|
||||
#include <boost/bind.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/enable_shared_from_this.hpp>
|
||||
#include <boost/utility.hpp> // noncopyable
|
||||
#include <boost/optional/optional.hpp>
|
||||
#include <boost/visit_each.hpp>
|
||||
|
|
@ -571,7 +569,7 @@ protected:
|
|||
const NameList& before);
|
||||
|
||||
/// implement the dispatching
|
||||
boost::shared_ptr<LLStandardSignal> mSignal;
|
||||
std::shared_ptr<LLStandardSignal> mSignal;
|
||||
|
||||
/// valve open?
|
||||
bool mEnabled;
|
||||
|
|
@ -745,14 +743,4 @@ private:
|
|||
LL_COMMON_API bool sendReply(const LLSD& reply, const LLSD& request,
|
||||
const std::string& replyKey="reply");
|
||||
|
||||
// Somewhat to my surprise, passing boost::bind(...boost::weak_ptr<T>...) to
|
||||
// listen() fails in Boost code trying to instantiate LLEventListener (i.e.
|
||||
// LLStandardSignal::slot_type) because the boost::get_pointer() utility function isn't
|
||||
// specialized for boost::weak_ptr. This remedies that omission.
|
||||
namespace boost
|
||||
{
|
||||
template <typename T>
|
||||
T* get_pointer(const weak_ptr<T>& ptr) { return shared_ptr<T>(ptr).get(); }
|
||||
}
|
||||
|
||||
#endif /* ! defined(LL_LLEVENTS_H) */
|
||||
|
|
|
|||
|
|
@ -0,0 +1,89 @@
|
|||
/**
|
||||
* @file llregex.h
|
||||
*
|
||||
* $LicenseInfo:firstyear=2021&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2021, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifndef LLREGEX_H
|
||||
#define LLREGEX_H
|
||||
#include <boost/regex.hpp>
|
||||
|
||||
template <typename S, typename M, typename R>
|
||||
LL_COMMON_API bool ll_regex_match(const S& string, M& match, const R& regex)
|
||||
{
|
||||
try
|
||||
{
|
||||
return boost::regex_match(string, match, regex);
|
||||
}
|
||||
catch (const std::runtime_error& e)
|
||||
{
|
||||
LL_WARNS() << "error matching with '" << regex.str() << "': "
|
||||
<< e.what() << ":\n'" << string << "'" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename S, typename R>
|
||||
LL_COMMON_API bool ll_regex_match(const S& string, const R& regex)
|
||||
{
|
||||
try
|
||||
{
|
||||
return boost::regex_match(string, regex);
|
||||
}
|
||||
catch (const std::runtime_error& e)
|
||||
{
|
||||
LL_WARNS() << "error matching with '" << regex.str() << "': "
|
||||
<< e.what() << ":\n'" << string << "'" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename S, typename M, typename R>
|
||||
bool ll_regex_search(const S& string, M& match, const R& regex)
|
||||
{
|
||||
try
|
||||
{
|
||||
return boost::regex_search(string, match, regex);
|
||||
}
|
||||
catch (const std::runtime_error& e)
|
||||
{
|
||||
LL_WARNS() << "error searching with '" << regex.str() << "': "
|
||||
<< e.what() << ":\n'" << string << "'" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename S, typename R>
|
||||
bool ll_regex_search(const S& string, const R& regex)
|
||||
{
|
||||
try
|
||||
{
|
||||
return boost::regex_search(string, regex);
|
||||
}
|
||||
catch (const std::runtime_error& e)
|
||||
{
|
||||
LL_WARNS() << "error searching with '" << regex.str() << "': "
|
||||
<< e.what() << ":\n'" << string << "'" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#endif // LLREGEX_H
|
||||
|
|
@ -43,12 +43,12 @@
|
|||
#include "llerrorcontrol.h"
|
||||
#include "llevents.h"
|
||||
#include "llformat.h"
|
||||
#include "llregex.h"
|
||||
#include "lltimer.h"
|
||||
#include "llsdserialize.h"
|
||||
#include "llsdutil.h"
|
||||
#include <boost/bind.hpp>
|
||||
#include <boost/circular_buffer.hpp>
|
||||
#include <boost/regex.hpp>
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/range.hpp>
|
||||
|
|
@ -101,39 +101,6 @@ static const F32 MEM_INFO_THROTTLE = 20;
|
|||
// dropped below the login framerate, we'd have very little additional data.
|
||||
static const F32 MEM_INFO_WINDOW = 10*60;
|
||||
|
||||
// Wrap boost::regex_match() with a function that doesn't throw.
|
||||
template <typename S, typename M, typename R>
|
||||
static bool regex_match_no_exc(const S& string, M& match, const R& regex)
|
||||
{
|
||||
try
|
||||
{
|
||||
return boost::regex_match(string, match, regex);
|
||||
}
|
||||
catch (const std::runtime_error& e)
|
||||
{
|
||||
LL_WARNS("LLMemoryInfo") << "error matching with '" << regex.str() << "': "
|
||||
<< e.what() << ":\n'" << string << "'" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Wrap boost::regex_search() with a function that doesn't throw.
|
||||
template <typename S, typename M, typename R>
|
||||
static bool regex_search_no_exc(const S& string, M& match, const R& regex)
|
||||
{
|
||||
try
|
||||
{
|
||||
return boost::regex_search(string, match, regex);
|
||||
}
|
||||
catch (const std::runtime_error& e)
|
||||
{
|
||||
LL_WARNS("LLMemoryInfo") << "error searching with '" << regex.str() << "': "
|
||||
<< e.what() << ":\n'" << string << "'" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
LLOSInfo::LLOSInfo() :
|
||||
mMajorVer(0), mMinorVer(0), mBuild(0), mOSVersionString("")
|
||||
{
|
||||
|
|
@ -377,7 +344,7 @@ LLOSInfo::LLOSInfo() :
|
|||
boost::smatch matched;
|
||||
|
||||
std::string glibc_version(gnu_get_libc_version());
|
||||
if ( regex_match_no_exc(glibc_version, matched, os_version_parse) )
|
||||
if ( ll_regex_match(glibc_version, matched, os_version_parse) )
|
||||
{
|
||||
LL_INFOS("AppInit") << "Using glibc version '" << glibc_version << "' as OS version" << LL_ENDL;
|
||||
|
||||
|
|
@ -1044,7 +1011,7 @@ LLSD LLMemoryInfo::loadStatsMap()
|
|||
while (std::getline(meminfo, line))
|
||||
{
|
||||
LL_DEBUGS("LLMemoryInfo") << line << LL_ENDL;
|
||||
if (regex_match_no_exc(line, matched, stat_rx))
|
||||
if (ll_regex_match(line, matched, stat_rx))
|
||||
{
|
||||
// e.g. "MemTotal: 4108424 kB"
|
||||
LLSD::String key(matched[1].first, matched[1].second);
|
||||
|
|
|
|||
|
|
@ -1451,7 +1451,7 @@ bool LLImageRaw::scale( S32 new_width, S32 new_height, bool scale_image_data )
|
|||
setDataAndSize(new_data, new_width, new_height, components);
|
||||
}
|
||||
}
|
||||
else
|
||||
else try
|
||||
{
|
||||
// copy out existing image data
|
||||
S32 temp_data_size = old_width * old_height * components;
|
||||
|
|
@ -1485,6 +1485,11 @@ bool LLImageRaw::scale( S32 new_width, S32 new_height, bool scale_image_data )
|
|||
}
|
||||
}
|
||||
}
|
||||
catch (std::bad_alloc&) // for temp_buffer
|
||||
{
|
||||
LL_WARNS() << "Failed to allocate temporary image buffer" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -395,7 +395,7 @@ bool LLSettingsBase::validate()
|
|||
|
||||
LLSD LLSettingsBase::settingValidation(LLSD &settings, validation_list_t &validations, bool partial)
|
||||
{
|
||||
static Validator validateName(SETTING_NAME, false, LLSD::TypeString, boost::bind(&Validator::verifyStringLength, _1, 63));
|
||||
static Validator validateName(SETTING_NAME, false, LLSD::TypeString, boost::bind(&Validator::verifyStringLength, _1, _2, 63));
|
||||
static Validator validateId(SETTING_ID, false, LLSD::TypeUUID);
|
||||
static Validator validateHash(SETTING_HASH, false, LLSD::TypeInteger);
|
||||
static Validator validateType(SETTING_TYPE, false, LLSD::TypeString);
|
||||
|
|
@ -534,7 +534,7 @@ bool LLSettingsBase::Validator::verify(LLSD &data, U32 flags)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!mVerify.empty() && !mVerify(data[mName]))
|
||||
if (!mVerify.empty() && !mVerify(data[mName], flags))
|
||||
{
|
||||
LL_WARNS("SETTINGS") << "Setting '" << mName << "' fails validation." << LL_ENDL;
|
||||
return false;
|
||||
|
|
@ -543,17 +543,17 @@ bool LLSettingsBase::Validator::verify(LLSD &data, U32 flags)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool LLSettingsBase::Validator::verifyColor(LLSD &value)
|
||||
bool LLSettingsBase::Validator::verifyColor(LLSD &value, U32)
|
||||
{
|
||||
return (value.size() == 3 || value.size() == 4);
|
||||
}
|
||||
|
||||
bool LLSettingsBase::Validator::verifyVector(LLSD &value, S32 length)
|
||||
bool LLSettingsBase::Validator::verifyVector(LLSD &value, U32, S32 length)
|
||||
{
|
||||
return (value.size() == length);
|
||||
}
|
||||
|
||||
bool LLSettingsBase::Validator::verifyVectorNormalized(LLSD &value, S32 length)
|
||||
bool LLSettingsBase::Validator::verifyVectorNormalized(LLSD &value, U32, S32 length)
|
||||
{
|
||||
if (value.size() != length)
|
||||
return false;
|
||||
|
|
@ -596,7 +596,7 @@ bool LLSettingsBase::Validator::verifyVectorNormalized(LLSD &value, S32 length)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool LLSettingsBase::Validator::verifyVectorMinMax(LLSD &value, LLSD minvals, LLSD maxvals)
|
||||
bool LLSettingsBase::Validator::verifyVectorMinMax(LLSD &value, U32, LLSD minvals, LLSD maxvals)
|
||||
{
|
||||
for (S32 index = 0; index < value.size(); ++index)
|
||||
{
|
||||
|
|
@ -619,12 +619,12 @@ bool LLSettingsBase::Validator::verifyVectorMinMax(LLSD &value, LLSD minvals, LL
|
|||
return true;
|
||||
}
|
||||
|
||||
bool LLSettingsBase::Validator::verifyQuaternion(LLSD &value)
|
||||
bool LLSettingsBase::Validator::verifyQuaternion(LLSD &value, U32)
|
||||
{
|
||||
return (value.size() == 4);
|
||||
}
|
||||
|
||||
bool LLSettingsBase::Validator::verifyQuaternionNormal(LLSD &value)
|
||||
bool LLSettingsBase::Validator::verifyQuaternionNormal(LLSD &value, U32)
|
||||
{
|
||||
if (value.size() != 4)
|
||||
return false;
|
||||
|
|
@ -642,7 +642,7 @@ bool LLSettingsBase::Validator::verifyQuaternionNormal(LLSD &value)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool LLSettingsBase::Validator::verifyFloatRange(LLSD &value, LLSD range)
|
||||
bool LLSettingsBase::Validator::verifyFloatRange(LLSD &value, U32, LLSD range)
|
||||
{
|
||||
F64 real = value.asReal();
|
||||
|
||||
|
|
@ -655,7 +655,7 @@ bool LLSettingsBase::Validator::verifyFloatRange(LLSD &value, LLSD range)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool LLSettingsBase::Validator::verifyIntegerRange(LLSD &value, LLSD range)
|
||||
bool LLSettingsBase::Validator::verifyIntegerRange(LLSD &value, U32, LLSD range)
|
||||
{
|
||||
S32 ival = value.asInteger();
|
||||
|
||||
|
|
@ -668,7 +668,7 @@ bool LLSettingsBase::Validator::verifyIntegerRange(LLSD &value, LLSD range)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool LLSettingsBase::Validator::verifyStringLength(LLSD &value, S32 length)
|
||||
bool LLSettingsBase::Validator::verifyStringLength(LLSD &value, U32, S32 length)
|
||||
{
|
||||
std::string sval = value.asString();
|
||||
|
||||
|
|
|
|||
|
|
@ -270,7 +270,7 @@ public:
|
|||
public:
|
||||
static const U32 VALIDATION_PARTIAL;
|
||||
|
||||
typedef boost::function<bool(LLSD &)> verify_pr;
|
||||
typedef boost::function<bool(LLSD &, U32)> verify_pr;
|
||||
|
||||
Validator(std::string name, bool required, LLSD::Type type, verify_pr verify = verify_pr(), LLSD defval = LLSD()) :
|
||||
mName(name),
|
||||
|
|
@ -287,15 +287,15 @@ public:
|
|||
bool verify(LLSD &data, U32 flags);
|
||||
|
||||
// Some basic verifications
|
||||
static bool verifyColor(LLSD &value);
|
||||
static bool verifyVector(LLSD &value, S32 length);
|
||||
static bool verifyVectorMinMax(LLSD &value, LLSD minvals, LLSD maxvals);
|
||||
static bool verifyVectorNormalized(LLSD &value, S32 length);
|
||||
static bool verifyQuaternion(LLSD &value);
|
||||
static bool verifyQuaternionNormal(LLSD &value);
|
||||
static bool verifyFloatRange(LLSD &value, LLSD range);
|
||||
static bool verifyIntegerRange(LLSD &value, LLSD range);
|
||||
static bool verifyStringLength(LLSD &value, S32 length);
|
||||
static bool verifyColor(LLSD &value, U32 flags);
|
||||
static bool verifyVector(LLSD &value, U32 flags, S32 length);
|
||||
static bool verifyVectorMinMax(LLSD &value, U32 flags, LLSD minvals, LLSD maxvals);
|
||||
static bool verifyVectorNormalized(LLSD &value, U32 flags, S32 length);
|
||||
static bool verifyQuaternion(LLSD &value, U32 flags);
|
||||
static bool verifyQuaternionNormal(LLSD &value, U32 flags);
|
||||
static bool verifyFloatRange(LLSD &value, U32 flags, LLSD range);
|
||||
static bool verifyIntegerRange(LLSD &value, U32 flags, LLSD range);
|
||||
static bool verifyStringLength(LLSD &value, U32 flags, S32 length);
|
||||
|
||||
private:
|
||||
std::string mName;
|
||||
|
|
|
|||
|
|
@ -457,7 +457,7 @@ void LLSettingsDay::blend(const LLSettingsBase::ptr_t &other, F64 mix)
|
|||
|
||||
namespace
|
||||
{
|
||||
bool validateDayCycleTrack(LLSD &value)
|
||||
bool validateDayCycleTrack(LLSD &value, U32 flags)
|
||||
{
|
||||
// Trim extra tracks.
|
||||
while (value.size() > LLSettingsDay::TRACK_MAX)
|
||||
|
|
@ -528,7 +528,7 @@ namespace
|
|||
return true;
|
||||
}
|
||||
|
||||
bool validateDayCycleFrames(LLSD &value)
|
||||
bool validateDayCycleFrames(LLSD &value, U32 flags)
|
||||
{
|
||||
bool hasSky(false);
|
||||
bool hasWater(false);
|
||||
|
|
@ -541,7 +541,7 @@ namespace
|
|||
if (ftype == "sky")
|
||||
{
|
||||
LLSettingsSky::validation_list_t valid_sky = LLSettingsSky::validationList();
|
||||
LLSD res_sky = LLSettingsBase::settingValidation(frame, valid_sky);
|
||||
LLSD res_sky = LLSettingsBase::settingValidation(frame, valid_sky, flags);
|
||||
|
||||
if (res_sky["success"].asInteger() == 0)
|
||||
{
|
||||
|
|
@ -554,7 +554,7 @@ namespace
|
|||
else if (ftype == "water")
|
||||
{
|
||||
LLSettingsWater::validation_list_t valid_h2o = LLSettingsWater::validationList();
|
||||
LLSD res_h2o = LLSettingsBase::settingValidation(frame, valid_h2o);
|
||||
LLSD res_h2o = LLSettingsBase::settingValidation(frame, valid_h2o, flags);
|
||||
if (res_h2o["success"].asInteger() == 0)
|
||||
{
|
||||
LL_WARNS("SETTINGS") << "Water setting named '" << (*itf).first << "' validation failed!: " << res_h2o << LL_ENDL;
|
||||
|
|
@ -570,6 +570,8 @@ namespace
|
|||
}
|
||||
}
|
||||
|
||||
if ((flags & LLSettingsBase::Validator::VALIDATION_PARTIAL) == 0)
|
||||
{
|
||||
if (!hasSky)
|
||||
{
|
||||
LL_WARNS("SETTINGS") << "No skies defined." << LL_ENDL;
|
||||
|
|
@ -581,7 +583,7 @@ namespace
|
|||
LL_WARNS("SETTINGS") << "No waters defined." << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -151,25 +151,25 @@ LLSettingsSky::validation_list_t legacyHazeValidationList()
|
|||
if (legacyHazeValidation.empty())
|
||||
{
|
||||
legacyHazeValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_AMBIENT, false, LLSD::TypeArray,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyVectorMinMax, _1,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyVectorMinMax, _1, _2,
|
||||
LLSD(LLSDArray(0.0f)(0.0f)(0.0f)("*")),
|
||||
LLSD(LLSDArray(3.0f)(3.0f)(3.0f)("*")))));
|
||||
legacyHazeValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_BLUE_DENSITY, false, LLSD::TypeArray,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyVectorMinMax, _1,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyVectorMinMax, _1, _2,
|
||||
LLSD(LLSDArray(0.0f)(0.0f)(0.0f)("*")),
|
||||
LLSD(LLSDArray(3.0f)(3.0f)(3.0f)("*")))));
|
||||
legacyHazeValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_BLUE_HORIZON, false, LLSD::TypeArray,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyVectorMinMax, _1,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyVectorMinMax, _1, _2,
|
||||
LLSD(LLSDArray(0.0f)(0.0f)(0.0f)("*")),
|
||||
LLSD(LLSDArray(3.0f)(3.0f)(3.0f)("*")))));
|
||||
legacyHazeValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_HAZE_DENSITY, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(5.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(5.0f)))));
|
||||
legacyHazeValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_HAZE_HORIZON, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(5.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(5.0f)))));
|
||||
legacyHazeValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_MULTIPLIER, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0001f)(2.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0001f)(2.0f)))));
|
||||
legacyHazeValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DISTANCE_MULTIPLIER, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0001f)(1000.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0001f)(1000.0f)))));
|
||||
}
|
||||
return legacyHazeValidation;
|
||||
}
|
||||
|
|
@ -180,19 +180,19 @@ LLSettingsSky::validation_list_t rayleighValidationList()
|
|||
if (rayleighValidation.empty())
|
||||
{
|
||||
rayleighValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_WIDTH, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(32768.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(32768.0f)))));
|
||||
|
||||
rayleighValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(2.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(2.0f)))));
|
||||
|
||||
rayleighValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_SCALE_FACTOR, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(-1.0f)(1.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(-1.0f)(1.0f)))));
|
||||
|
||||
rayleighValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_LINEAR_TERM, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(2.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(2.0f)))));
|
||||
|
||||
rayleighValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_CONSTANT_TERM, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
}
|
||||
return rayleighValidation;
|
||||
}
|
||||
|
|
@ -203,19 +203,19 @@ LLSettingsSky::validation_list_t absorptionValidationList()
|
|||
if (absorptionValidation.empty())
|
||||
{
|
||||
absorptionValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_WIDTH, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(32768.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(32768.0f)))));
|
||||
|
||||
absorptionValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(2.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(2.0f)))));
|
||||
|
||||
absorptionValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_SCALE_FACTOR, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(-1.0f)(1.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(-1.0f)(1.0f)))));
|
||||
|
||||
absorptionValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_LINEAR_TERM, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(2.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(2.0f)))));
|
||||
|
||||
absorptionValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_CONSTANT_TERM, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
}
|
||||
return absorptionValidation;
|
||||
}
|
||||
|
|
@ -226,31 +226,31 @@ LLSettingsSky::validation_list_t mieValidationList()
|
|||
if (mieValidation.empty())
|
||||
{
|
||||
mieValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_WIDTH, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(32768.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(32768.0f)))));
|
||||
|
||||
mieValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(2.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(2.0f)))));
|
||||
|
||||
mieValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_SCALE_FACTOR, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(-1.0f)(1.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(-1.0f)(1.0f)))));
|
||||
|
||||
mieValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_LINEAR_TERM, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(2.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(2.0f)))));
|
||||
|
||||
mieValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_CONSTANT_TERM, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
|
||||
mieValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_MIE_ANISOTROPY_FACTOR, false, LLSD::TypeReal,
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
}
|
||||
return mieValidation;
|
||||
}
|
||||
|
||||
bool validateLegacyHaze(LLSD &value)
|
||||
bool validateLegacyHaze(LLSD &value, U32 flags)
|
||||
{
|
||||
LLSettingsSky::validation_list_t legacyHazeValidations = legacyHazeValidationList();
|
||||
llassert(value.type() == LLSD::TypeMap);
|
||||
LLSD result = LLSettingsBase::settingValidation(value, legacyHazeValidations);
|
||||
LLSD result = LLSettingsBase::settingValidation(value, legacyHazeValidations, flags);
|
||||
if (result["errors"].size() > 0)
|
||||
{
|
||||
LL_WARNS("SETTINGS") << "Legacy Haze Config Validation errors: " << result["errors"] << LL_ENDL;
|
||||
|
|
@ -264,7 +264,7 @@ bool validateLegacyHaze(LLSD &value)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool validateRayleighLayers(LLSD &value)
|
||||
bool validateRayleighLayers(LLSD &value, U32 flags)
|
||||
{
|
||||
LLSettingsSky::validation_list_t rayleighValidations = rayleighValidationList();
|
||||
if (value.isArray())
|
||||
|
|
@ -275,24 +275,24 @@ bool validateRayleighLayers(LLSD &value)
|
|||
LLSD& layerConfig = (*itf);
|
||||
if (layerConfig.type() == LLSD::TypeMap)
|
||||
{
|
||||
if (!validateRayleighLayers(layerConfig))
|
||||
if (!validateRayleighLayers(layerConfig, flags))
|
||||
{
|
||||
allGood = false;
|
||||
}
|
||||
}
|
||||
else if (layerConfig.type() == LLSD::TypeArray)
|
||||
{
|
||||
return validateRayleighLayers(layerConfig);
|
||||
return validateRayleighLayers(layerConfig, flags);
|
||||
}
|
||||
else
|
||||
{
|
||||
return LLSettingsBase::settingValidation(value, rayleighValidations);
|
||||
return LLSettingsBase::settingValidation(value, rayleighValidations, flags);
|
||||
}
|
||||
}
|
||||
return allGood;
|
||||
}
|
||||
llassert(value.type() == LLSD::TypeMap);
|
||||
LLSD result = LLSettingsBase::settingValidation(value, rayleighValidations);
|
||||
LLSD result = LLSettingsBase::settingValidation(value, rayleighValidations, flags);
|
||||
if (result["errors"].size() > 0)
|
||||
{
|
||||
LL_WARNS("SETTINGS") << "Rayleigh Config Validation errors: " << result["errors"] << LL_ENDL;
|
||||
|
|
@ -306,7 +306,7 @@ bool validateRayleighLayers(LLSD &value)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool validateAbsorptionLayers(LLSD &value)
|
||||
bool validateAbsorptionLayers(LLSD &value, U32 flags)
|
||||
{
|
||||
LLSettingsBase::validation_list_t absorptionValidations = absorptionValidationList();
|
||||
if (value.isArray())
|
||||
|
|
@ -317,24 +317,24 @@ bool validateAbsorptionLayers(LLSD &value)
|
|||
LLSD& layerConfig = (*itf);
|
||||
if (layerConfig.type() == LLSD::TypeMap)
|
||||
{
|
||||
if (!validateAbsorptionLayers(layerConfig))
|
||||
if (!validateAbsorptionLayers(layerConfig, flags))
|
||||
{
|
||||
allGood = false;
|
||||
}
|
||||
}
|
||||
else if (layerConfig.type() == LLSD::TypeArray)
|
||||
{
|
||||
return validateAbsorptionLayers(layerConfig);
|
||||
return validateAbsorptionLayers(layerConfig, flags);
|
||||
}
|
||||
else
|
||||
{
|
||||
return LLSettingsBase::settingValidation(value, absorptionValidations);
|
||||
return LLSettingsBase::settingValidation(value, absorptionValidations, flags);
|
||||
}
|
||||
}
|
||||
return allGood;
|
||||
}
|
||||
llassert(value.type() == LLSD::TypeMap);
|
||||
LLSD result = LLSettingsBase::settingValidation(value, absorptionValidations);
|
||||
LLSD result = LLSettingsBase::settingValidation(value, absorptionValidations, flags);
|
||||
if (result["errors"].size() > 0)
|
||||
{
|
||||
LL_WARNS("SETTINGS") << "Absorption Config Validation errors: " << result["errors"] << LL_ENDL;
|
||||
|
|
@ -348,7 +348,7 @@ bool validateAbsorptionLayers(LLSD &value)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool validateMieLayers(LLSD &value)
|
||||
bool validateMieLayers(LLSD &value, U32 flags)
|
||||
{
|
||||
LLSettingsBase::validation_list_t mieValidations = mieValidationList();
|
||||
if (value.isArray())
|
||||
|
|
@ -359,23 +359,23 @@ bool validateMieLayers(LLSD &value)
|
|||
LLSD& layerConfig = (*itf);
|
||||
if (layerConfig.type() == LLSD::TypeMap)
|
||||
{
|
||||
if (!validateMieLayers(layerConfig))
|
||||
if (!validateMieLayers(layerConfig, flags))
|
||||
{
|
||||
allGood = false;
|
||||
}
|
||||
}
|
||||
else if (layerConfig.type() == LLSD::TypeArray)
|
||||
{
|
||||
return validateMieLayers(layerConfig);
|
||||
return validateMieLayers(layerConfig, flags);
|
||||
}
|
||||
else
|
||||
{
|
||||
return LLSettingsBase::settingValidation(value, mieValidations);
|
||||
return LLSettingsBase::settingValidation(value, mieValidations, flags);
|
||||
}
|
||||
}
|
||||
return allGood;
|
||||
}
|
||||
LLSD result = LLSettingsBase::settingValidation(value, mieValidations);
|
||||
LLSD result = LLSettingsBase::settingValidation(value, mieValidations, flags);
|
||||
if (result["errors"].size() > 0)
|
||||
{
|
||||
LL_WARNS("SETTINGS") << "Mie Config Validation errors: " << result["errors"] << LL_ENDL;
|
||||
|
|
@ -555,80 +555,80 @@ LLSettingsSky::validation_list_t LLSettingsSky::validationList()
|
|||
validation.push_back(Validator(SETTING_HALO_TEXTUREID, false, LLSD::TypeUUID));
|
||||
|
||||
validation.push_back(Validator(SETTING_CLOUD_COLOR, true, LLSD::TypeArray,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1, _2,
|
||||
LLSD(LLSDArray(0.0f)(0.0f)(0.0f)("*")),
|
||||
LLSD(LLSDArray(1.0f)(1.0f)(1.0f)("*")))));
|
||||
validation.push_back(Validator(SETTING_CLOUD_POS_DENSITY1, true, LLSD::TypeArray,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1, _2,
|
||||
LLSD(LLSDArray(0.0f)(0.0f)(0.0f)("*")),
|
||||
LLSD(LLSDArray(1.0f)(1.0f)(3.0f)("*")))));
|
||||
validation.push_back(Validator(SETTING_CLOUD_POS_DENSITY2, true, LLSD::TypeArray,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1, _2,
|
||||
LLSD(LLSDArray(0.0f)(0.0f)(0.0f)("*")),
|
||||
LLSD(LLSDArray(1.0f)(1.0f)(1.0f)("*")))));
|
||||
validation.push_back(Validator(SETTING_CLOUD_SCALE, true, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.001f)(3.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.001f)(3.0f)))));
|
||||
validation.push_back(Validator(SETTING_CLOUD_SCROLL_RATE, true, LLSD::TypeArray,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1, _2,
|
||||
LLSD(LLSDArray(-50.0f)(-50.0f)),
|
||||
LLSD(LLSDArray(50.0f)(50.0f)))));
|
||||
validation.push_back(Validator(SETTING_CLOUD_SHADOW, true, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
validation.push_back(Validator(SETTING_CLOUD_TEXTUREID, false, LLSD::TypeUUID));
|
||||
validation.push_back(Validator(SETTING_CLOUD_VARIANCE, false, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
|
||||
validation.push_back(Validator(SETTING_DOME_OFFSET, false, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
validation.push_back(Validator(SETTING_DOME_RADIUS, false, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(1000.0f)(2000.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(1000.0f)(2000.0f)))));
|
||||
validation.push_back(Validator(SETTING_GAMMA, true, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(20.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(20.0f)))));
|
||||
validation.push_back(Validator(SETTING_GLOW, true, LLSD::TypeArray,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1, _2,
|
||||
LLSD(LLSDArray(0.2f)("*")(-10.0f)("*")),
|
||||
LLSD(LLSDArray(40.0f)("*")(10.0f)("*")))));
|
||||
|
||||
validation.push_back(Validator(SETTING_MAX_Y, true, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(10000.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(10000.0f)))));
|
||||
validation.push_back(Validator(SETTING_MOON_ROTATION, true, LLSD::TypeArray, &Validator::verifyQuaternionNormal));
|
||||
validation.push_back(Validator(SETTING_MOON_SCALE, false, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.25f)(20.0f))), LLSD::Real(1.0)));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.25f)(20.0f))), LLSD::Real(1.0)));
|
||||
validation.push_back(Validator(SETTING_MOON_TEXTUREID, false, LLSD::TypeUUID));
|
||||
validation.push_back(Validator(SETTING_MOON_BRIGHTNESS, false, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
|
||||
validation.push_back(Validator(SETTING_STAR_BRIGHTNESS, true, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(500.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(500.0f)))));
|
||||
validation.push_back(Validator(SETTING_SUNLIGHT_COLOR, true, LLSD::TypeArray,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1, _2,
|
||||
LLSD(LLSDArray(0.0f)(0.0f)(0.0f)("*")),
|
||||
LLSD(LLSDArray(3.0f)(3.0f)(3.0f)("*")))));
|
||||
validation.push_back(Validator(SETTING_SUN_ROTATION, true, LLSD::TypeArray, &Validator::verifyQuaternionNormal));
|
||||
validation.push_back(Validator(SETTING_SUN_SCALE, false, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.25f)(20.0f))), LLSD::Real(1.0)));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.25f)(20.0f))), LLSD::Real(1.0)));
|
||||
validation.push_back(Validator(SETTING_SUN_TEXTUREID, false, LLSD::TypeUUID));
|
||||
|
||||
validation.push_back(Validator(SETTING_PLANET_RADIUS, true, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(1000.0f)(32768.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(1000.0f)(32768.0f)))));
|
||||
|
||||
validation.push_back(Validator(SETTING_SKY_BOTTOM_RADIUS, true, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(1000.0f)(32768.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(1000.0f)(32768.0f)))));
|
||||
|
||||
validation.push_back(Validator(SETTING_SKY_TOP_RADIUS, true, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(1000.0f)(32768.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(1000.0f)(32768.0f)))));
|
||||
|
||||
validation.push_back(Validator(SETTING_SUN_ARC_RADIANS, true, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(0.1f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(0.1f)))));
|
||||
|
||||
validation.push_back(Validator(SETTING_SKY_MOISTURE_LEVEL, false, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
|
||||
validation.push_back(Validator(SETTING_SKY_DROPLET_RADIUS, false, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(5.0f)(1000.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(5.0f)(1000.0f)))));
|
||||
|
||||
validation.push_back(Validator(SETTING_SKY_ICE_LEVEL, false, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
|
||||
validation.push_back(Validator(SETTING_RAYLEIGH_CONFIG, true, LLSD::TypeArray, &validateRayleighLayers));
|
||||
validation.push_back(Validator(SETTING_ABSORPTION_CONFIG, true, LLSD::TypeArray, &validateAbsorptionLayers));
|
||||
|
|
|
|||
|
|
@ -228,34 +228,34 @@ LLSettingsWater::validation_list_t LLSettingsWater::validationList()
|
|||
// in deeply nested arrays like this [[[[[[[[[[v1,v2,v3]]]]]]]]]]
|
||||
|
||||
validation.push_back(Validator(SETTING_BLUR_MULTIPLIER, true, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(-0.5f)(0.5f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(-0.5f)(0.5f)))));
|
||||
validation.push_back(Validator(SETTING_FOG_COLOR, true, LLSD::TypeArray,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1, _2,
|
||||
LLSD(LLSDArray(0.0f)(0.0f)(0.0f)(1.0f)),
|
||||
LLSD(LLSDArray(1.0f)(1.0f)(1.0f)(1.0f)))));
|
||||
validation.push_back(Validator(SETTING_FOG_DENSITY, true, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(-10.0f)(10.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(-10.0f)(10.0f)))));
|
||||
validation.push_back(Validator(SETTING_FOG_MOD, true, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(20.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(20.0f)))));
|
||||
validation.push_back(Validator(SETTING_FRESNEL_OFFSET, true, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
validation.push_back(Validator(SETTING_FRESNEL_SCALE, true, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
|
||||
validation.push_back(Validator(SETTING_NORMAL_MAP, true, LLSD::TypeUUID));
|
||||
validation.push_back(Validator(SETTING_NORMAL_SCALE, true, LLSD::TypeArray,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1, _2,
|
||||
LLSD(LLSDArray(0.0f)(0.0f)(0.0f)),
|
||||
LLSD(LLSDArray(10.0f)(10.0f)(10.0f)))));
|
||||
validation.push_back(Validator(SETTING_SCALE_ABOVE, true, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(3.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(3.0f)))));
|
||||
validation.push_back(Validator(SETTING_SCALE_BELOW, true, LLSD::TypeReal,
|
||||
boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(3.0f)))));
|
||||
boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(3.0f)))));
|
||||
validation.push_back(Validator(SETTING_WAVE1_DIR, true, LLSD::TypeArray,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1, _2,
|
||||
LLSD(LLSDArray(-20.0f)(-20.0f)),
|
||||
LLSD(LLSDArray(20.0f)(20.0f)))));
|
||||
validation.push_back(Validator(SETTING_WAVE2_DIR, true, LLSD::TypeArray,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1,
|
||||
boost::bind(&Validator::verifyVectorMinMax, _1, _2,
|
||||
LLSD(LLSDArray(-20.0f)(-20.0f)),
|
||||
LLSD(LLSDArray(20.0f)(20.0f)))));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -173,6 +173,71 @@ BOOL LLDataPacker::unpackFixed(F32 &value, const char *name,
|
|||
return ok;
|
||||
}
|
||||
|
||||
BOOL LLDataPacker::unpackU16s(U16 *values, S32 count, const char *name)
|
||||
{
|
||||
for (S32 idx = 0; idx < count; ++idx)
|
||||
{
|
||||
if (!unpackU16(values[idx], name))
|
||||
{
|
||||
LL_WARNS("DATAPACKER") << "Buffer overflow reading Unsigned 16s \"" << name << "\" at index " << idx << "!" << LL_ENDL;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL LLDataPacker::unpackS16s(S16 *values, S32 count, const char *name)
|
||||
{
|
||||
for (S32 idx = 0; idx < count; ++idx)
|
||||
{
|
||||
if (!unpackS16(values[idx], name))
|
||||
{
|
||||
LL_WARNS("DATAPACKER") << "Buffer overflow reading Signed 16s \"" << name << "\" at index " << idx << "!" << LL_ENDL;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL LLDataPacker::unpackF32s(F32 *values, S32 count, const char *name)
|
||||
{
|
||||
for (S32 idx = 0; idx < count; ++idx)
|
||||
{
|
||||
if (!unpackF32(values[idx], name))
|
||||
{
|
||||
LL_WARNS("DATAPACKER") << "Buffer overflow reading Float 32s \"" << name << "\" at index " << idx << "!" << LL_ENDL;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL LLDataPacker::unpackColor4Us(LLColor4U *values, S32 count, const char *name)
|
||||
{
|
||||
for (S32 idx = 0; idx < count; ++idx)
|
||||
{
|
||||
if (!unpackColor4U(values[idx], name))
|
||||
{
|
||||
LL_WARNS("DATAPACKER") << "Buffer overflow reading Float 32s \"" << name << "\" at index " << idx << "!" << LL_ENDL;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL LLDataPacker::unpackUUIDs(LLUUID *values, S32 count, const char *name)
|
||||
{
|
||||
for (S32 idx = 0; idx < count; ++idx)
|
||||
{
|
||||
if (!unpackUUID(values[idx], name))
|
||||
{
|
||||
LL_WARNS("DATAPACKER") << "Buffer overflow reading UUIDs \"" << name << "\" at index " << idx << "!" << LL_ENDL;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// LLDataPackerBinaryBuffer implementation
|
||||
//---------------------------------------------------------------------------
|
||||
|
|
@ -319,6 +384,29 @@ BOOL LLDataPackerBinaryBuffer::unpackU16(U16 &value, const char *name)
|
|||
return success;
|
||||
}
|
||||
|
||||
BOOL LLDataPackerBinaryBuffer::packS16(const S16 value, const char *name)
|
||||
{
|
||||
BOOL success = verifyLength(sizeof(S16), name);
|
||||
|
||||
if (mWriteEnabled && success)
|
||||
{
|
||||
htolememcpy(mCurBufferp, &value, MVT_S16, 2);
|
||||
}
|
||||
mCurBufferp += 2;
|
||||
return success;
|
||||
}
|
||||
|
||||
BOOL LLDataPackerBinaryBuffer::unpackS16(S16 &value, const char *name)
|
||||
{
|
||||
BOOL success = verifyLength(sizeof(S16), name);
|
||||
|
||||
if (success)
|
||||
{
|
||||
htolememcpy(&value, mCurBufferp, MVT_S16, 2);
|
||||
}
|
||||
mCurBufferp += 2;
|
||||
return success;
|
||||
}
|
||||
|
||||
BOOL LLDataPackerBinaryBuffer::packU32(const U32 value, const char *name)
|
||||
{
|
||||
|
|
@ -884,6 +972,52 @@ BOOL LLDataPackerAsciiBuffer::unpackU16(U16 &value, const char *name)
|
|||
return success;
|
||||
}
|
||||
|
||||
BOOL LLDataPackerAsciiBuffer::packS16(const S16 value, const char *name)
|
||||
{
|
||||
BOOL success = TRUE;
|
||||
writeIndentedName(name);
|
||||
int numCopied = 0;
|
||||
if (mWriteEnabled)
|
||||
{
|
||||
numCopied = snprintf(mCurBufferp, getBufferSize() - getCurrentSize(), "%d\n", value); /* Flawfinder: ignore */
|
||||
}
|
||||
else
|
||||
{
|
||||
numCopied = snprintf(DUMMY_BUFFER, sizeof(DUMMY_BUFFER), "%d\n", value); /* Flawfinder: ignore */
|
||||
}
|
||||
|
||||
// snprintf returns number of bytes that would have been written
|
||||
// had the output not being truncated. In that case, it will
|
||||
// return either -1 or value >= passed in size value . So a check needs to be added
|
||||
// to detect truncation, and if there is any, only account for the
|
||||
// actual number of bytes written..and not what could have been
|
||||
// written.
|
||||
if(numCopied < 0 || numCopied > getBufferSize() - getCurrentSize())
|
||||
{
|
||||
numCopied = getBufferSize() - getCurrentSize();
|
||||
LL_WARNS() << "LLDataPackerAsciiBuffer::packS16: val truncated: " << LL_ENDL;
|
||||
}
|
||||
|
||||
mCurBufferp += numCopied;
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
|
||||
BOOL LLDataPackerAsciiBuffer::unpackS16(S16 &value, const char *name)
|
||||
{
|
||||
BOOL success = TRUE;
|
||||
char valuestr[DP_BUFSIZE]; /* Flawfinder: ignore */
|
||||
if (!getValueStr(name, valuestr, DP_BUFSIZE))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
S32 in_val;
|
||||
sscanf(valuestr, "%d", &in_val);
|
||||
value = in_val;
|
||||
return success;
|
||||
}
|
||||
|
||||
BOOL LLDataPackerAsciiBuffer::packU32(const U32 value, const char *name)
|
||||
{
|
||||
|
|
@ -1587,6 +1721,36 @@ BOOL LLDataPackerAsciiFile::unpackU16(U16 &value, const char *name)
|
|||
return success;
|
||||
}
|
||||
|
||||
BOOL LLDataPackerAsciiFile::packS16(const S16 value, const char *name)
|
||||
{
|
||||
BOOL success = TRUE;
|
||||
writeIndentedName(name);
|
||||
if (mFP)
|
||||
{
|
||||
fprintf(mFP, "%d\n", value);
|
||||
}
|
||||
else if (mOutputStream)
|
||||
{
|
||||
*mOutputStream << "" << value << "\n";
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
|
||||
BOOL LLDataPackerAsciiFile::unpackS16(S16 &value, const char *name)
|
||||
{
|
||||
BOOL success = TRUE;
|
||||
char valuestr[DP_BUFSIZE]; /*Flawfinder: ignore */
|
||||
if (!getValueStr(name, valuestr, DP_BUFSIZE))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
S32 in_val;
|
||||
sscanf(valuestr, "%d", &in_val);
|
||||
value = in_val;
|
||||
return success;
|
||||
}
|
||||
|
||||
BOOL LLDataPackerAsciiFile::packU32(const U32 value, const char *name)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -60,6 +60,11 @@ public:
|
|||
|
||||
virtual BOOL packU16(const U16 value, const char *name) = 0;
|
||||
virtual BOOL unpackU16(U16 &value, const char *name) = 0;
|
||||
BOOL unpackU16s(U16 *value, S32 count, const char *name);
|
||||
|
||||
virtual BOOL packS16(const S16 value, const char *name) = 0;
|
||||
virtual BOOL unpackS16(S16 &value, const char *name) = 0;
|
||||
BOOL unpackS16s(S16 *value, S32 count, const char *name);
|
||||
|
||||
virtual BOOL packU32(const U32 value, const char *name) = 0;
|
||||
virtual BOOL unpackU32(U32 &value, const char *name) = 0;
|
||||
|
|
@ -69,6 +74,7 @@ public:
|
|||
|
||||
virtual BOOL packF32(const F32 value, const char *name) = 0;
|
||||
virtual BOOL unpackF32(F32 &value, const char *name) = 0;
|
||||
BOOL unpackF32s(F32 *values, S32 count, const char *name);
|
||||
|
||||
// Packs a float into an integer, using the given size
|
||||
// and picks the right U* data type to pack into.
|
||||
|
|
@ -82,6 +88,7 @@ public:
|
|||
|
||||
virtual BOOL packColor4U(const LLColor4U &value, const char *name) = 0;
|
||||
virtual BOOL unpackColor4U(LLColor4U &value, const char *name) = 0;
|
||||
BOOL unpackColor4Us(LLColor4U *values, S32 count, const char *name);
|
||||
|
||||
virtual BOOL packVector2(const LLVector2 &value, const char *name) = 0;
|
||||
virtual BOOL unpackVector2(LLVector2 &value, const char *name) = 0;
|
||||
|
|
@ -94,6 +101,7 @@ public:
|
|||
|
||||
virtual BOOL packUUID(const LLUUID &value, const char *name) = 0;
|
||||
virtual BOOL unpackUUID(LLUUID &value, const char *name) = 0;
|
||||
BOOL unpackUUIDs(LLUUID *values, S32 count, const char *name);
|
||||
U32 getPassFlags() const { return mPassFlags; }
|
||||
void setPassFlags(U32 flags) { mPassFlags = flags; }
|
||||
protected:
|
||||
|
|
@ -139,6 +147,9 @@ public:
|
|||
/*virtual*/ BOOL packU16(const U16 value, const char *name);
|
||||
/*virtual*/ BOOL unpackU16(U16 &value, const char *name);
|
||||
|
||||
/*virtual*/ BOOL packS16(const S16 value, const char *name);
|
||||
/*virtual*/ BOOL unpackS16(S16 &value, const char *name);
|
||||
|
||||
/*virtual*/ BOOL packU32(const U32 value, const char *name);
|
||||
/*virtual*/ BOOL unpackU32(U32 &value, const char *name);
|
||||
|
||||
|
|
@ -247,6 +258,9 @@ public:
|
|||
/*virtual*/ BOOL packU16(const U16 value, const char *name);
|
||||
/*virtual*/ BOOL unpackU16(U16 &value, const char *name);
|
||||
|
||||
/*virtual*/ BOOL packS16(const S16 value, const char *name);
|
||||
/*virtual*/ BOOL unpackS16(S16 &value, const char *name);
|
||||
|
||||
/*virtual*/ BOOL packU32(const U32 value, const char *name);
|
||||
/*virtual*/ BOOL unpackU32(U32 &value, const char *name);
|
||||
|
||||
|
|
@ -375,6 +389,9 @@ public:
|
|||
/*virtual*/ BOOL packU16(const U16 value, const char *name);
|
||||
/*virtual*/ BOOL unpackU16(U16 &value, const char *name);
|
||||
|
||||
/*virtual*/ BOOL packS16(const S16 value, const char *name);
|
||||
/*virtual*/ BOOL unpackS16(S16 &value, const char *name);
|
||||
|
||||
/*virtual*/ BOOL packU32(const U32 value, const char *name);
|
||||
/*virtual*/ BOOL unpackU32(U32 &value, const char *name);
|
||||
|
||||
|
|
|
|||
|
|
@ -281,6 +281,13 @@ char const* const _PREHASH_PricePerMeter = LLMessageStringTable::getInstance()->
|
|||
char const* const _PREHASH_RegionFlags = LLMessageStringTable::getInstance()->getString("RegionFlags");
|
||||
char const* const _PREHASH_RegionFlagsExtended = LLMessageStringTable::getInstance()->getString("RegionFlagsExtended");
|
||||
char const* const _PREHASH_RegionProtocols = LLMessageStringTable::getInstance()->getString("RegionProtocols");
|
||||
char const* const _PREHASH_ChatWhisperRange = LLMessageStringTable::getInstance()->getString("ChatWhisperRange");
|
||||
char const* const _PREHASH_ChatNormalRange = LLMessageStringTable::getInstance()->getString("ChatNormalRange");
|
||||
char const* const _PREHASH_ChatShoutRange = LLMessageStringTable::getInstance()->getString("ChatShoutRange");
|
||||
char const* const _PREHASH_ChatWhisperOffset = LLMessageStringTable::getInstance()->getString("ChatWhisperOffset");
|
||||
char const* const _PREHASH_ChatNormalOffset = LLMessageStringTable::getInstance()->getString("ChatNormalOffset");
|
||||
char const* const _PREHASH_ChatShoutOffset = LLMessageStringTable::getInstance()->getString("ChatShoutOffset");
|
||||
char const* const _PREHASH_ChatFlags = LLMessageStringTable::getInstance()->getString("ChatFlags");
|
||||
char const* const _PREHASH_VoteResult = LLMessageStringTable::getInstance()->getString("VoteResult");
|
||||
char const* const _PREHASH_ParcelDirFeeEstimate = LLMessageStringTable::getInstance()->getString("ParcelDirFeeEstimate");
|
||||
char const* const _PREHASH_ModifyBlock = LLMessageStringTable::getInstance()->getString("ModifyBlock");
|
||||
|
|
@ -309,6 +316,7 @@ char const* const _PREHASH_DuplicateFlags = LLMessageStringTable::getInstance()-
|
|||
char const* const _PREHASH_RegionInfo2 = LLMessageStringTable::getInstance()->getString("RegionInfo2");
|
||||
char const* const _PREHASH_RegionInfo3 = LLMessageStringTable::getInstance()->getString("RegionInfo3");
|
||||
char const* const _PREHASH_RegionInfo4 = LLMessageStringTable::getInstance()->getString("RegionInfo4");
|
||||
char const* const _PREHASH_RegionInfo5 = LLMessageStringTable::getInstance()->getString("RegionInfo5");
|
||||
char const* const _PREHASH_TextColor = LLMessageStringTable::getInstance()->getString("TextColor");
|
||||
char const* const _PREHASH_SlaveID = LLMessageStringTable::getInstance()->getString("SlaveID");
|
||||
char const* const _PREHASH_Charter = LLMessageStringTable::getInstance()->getString("Charter");
|
||||
|
|
|
|||
|
|
@ -281,6 +281,13 @@ extern char const* const _PREHASH_PricePerMeter;
|
|||
extern char const* const _PREHASH_RegionFlags;
|
||||
extern char const* const _PREHASH_RegionFlagsExtended;
|
||||
extern char const* const _PREHASH_RegionProtocols;
|
||||
extern char const* const _PREHASH_ChatWhisperRange;
|
||||
extern char const* const _PREHASH_ChatNormalRange;
|
||||
extern char const* const _PREHASH_ChatShoutRange;
|
||||
extern char const* const _PREHASH_ChatWhisperOffset;
|
||||
extern char const* const _PREHASH_ChatNormalOffset;
|
||||
extern char const* const _PREHASH_ChatShoutOffset;
|
||||
extern char const* const _PREHASH_ChatFlags;
|
||||
extern char const* const _PREHASH_VoteResult;
|
||||
extern char const* const _PREHASH_ParcelDirFeeEstimate;
|
||||
extern char const* const _PREHASH_ModifyBlock;
|
||||
|
|
@ -309,6 +316,7 @@ extern char const* const _PREHASH_DuplicateFlags;
|
|||
extern char const* const _PREHASH_RegionInfo2;
|
||||
extern char const* const _PREHASH_RegionInfo3;
|
||||
extern char const* const _PREHASH_RegionInfo4;
|
||||
extern char const* const _PREHASH_RegionInfo5;
|
||||
extern char const* const _PREHASH_TextColor;
|
||||
extern char const* const _PREHASH_SlaveID;
|
||||
extern char const* const _PREHASH_Charter;
|
||||
|
|
|
|||
|
|
@ -690,6 +690,66 @@ bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers, LLSD
|
|||
return true;
|
||||
}
|
||||
|
||||
// This function injects a previously stored OpenID cookie into
|
||||
// each new media instance - see SL-15867 for details. It appears
|
||||
// that the way we use the cache, shared between multiple CEF
|
||||
// instances means that sometimes the OpenID cookie cannot be read
|
||||
// even though it appears to be there. The long term solution to
|
||||
// this is to create a separate cache directory for each instance
|
||||
// but that has its own set of problems. This short term approach
|
||||
// "forces" each new media instance to have a copy of the cookie
|
||||
// so that a page that needs it - e.g. Profiles - finds it and
|
||||
// can log in successfully.
|
||||
void LLPluginClassMedia::injectOpenIDCookie()
|
||||
{
|
||||
// can be called before we know who the user is at login
|
||||
// and there is no OpenID cookie at that point so no
|
||||
// need to try to set it (these values will all be empty)
|
||||
if (sOIDcookieName.length() && sOIDcookieValue.length())
|
||||
{
|
||||
setCookie(sOIDcookieUrl, sOIDcookieName,
|
||||
sOIDcookieValue, sOIDcookieHost, sOIDcookiePath, sOIDcookieHttpOnly, sOIDcookieSecure);
|
||||
}
|
||||
}
|
||||
|
||||
// We store each component of the OpenI cookie individuality here
|
||||
// because previously, there was some significant parsing to
|
||||
// break up the raw string into these components and we do not
|
||||
// want to have to do that again here. Stored as statics because
|
||||
// we want to share their value between all instances of this
|
||||
// class - the ones that receive it at login and any others
|
||||
// that open afterwards (e.g. the Profiles floater)
|
||||
std::string LLPluginClassMedia::sOIDcookieUrl = std::string();
|
||||
std::string LLPluginClassMedia::sOIDcookieName = std::string();
|
||||
std::string LLPluginClassMedia::sOIDcookieValue = std::string();
|
||||
std::string LLPluginClassMedia::sOIDcookieHost = std::string();
|
||||
std::string LLPluginClassMedia::sOIDcookiePath = std::string();
|
||||
bool LLPluginClassMedia::sOIDcookieHttpOnly = false;
|
||||
bool LLPluginClassMedia::sOIDcookieSecure = false;
|
||||
|
||||
// Once we receive the OpenID cookie, it is parsed/processed
|
||||
// in llViewerMedia::parseRawCookie() and then the component
|
||||
// values are stored here so that next time a new media
|
||||
// instance is created, we can use injectOpenIDCookie()
|
||||
// to "insist" that the cookie store remember its value.
|
||||
// One might ask why we need to go via LLViewerMedia (which
|
||||
// makes this call) - this is because the raw cookie arrives
|
||||
// here in this file but undergoes non-trivial processing
|
||||
// in LLViewerMedia.
|
||||
void LLPluginClassMedia::storeOpenIDCookie(const std::string url,
|
||||
const std::string name, const std::string value,
|
||||
const std::string host, const std::string path,
|
||||
bool httponly, bool secure)
|
||||
{
|
||||
sOIDcookieUrl = url;
|
||||
sOIDcookieName = name;
|
||||
sOIDcookieValue = value;
|
||||
sOIDcookieHost = host;
|
||||
sOIDcookiePath = path;
|
||||
sOIDcookieHttpOnly = httponly;
|
||||
sOIDcookieSecure = secure;
|
||||
}
|
||||
|
||||
void LLPluginClassMedia::setCookie(std::string uri, std::string name, std::string value, std::string domain, std::string path, bool httponly, bool secure)
|
||||
{
|
||||
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_cookie");
|
||||
|
|
|
|||
|
|
@ -135,6 +135,20 @@ public:
|
|||
// Text may be unicode (utf8 encoded)
|
||||
bool textInput(const std::string &text, MASK modifiers, LLSD native_key_data);
|
||||
|
||||
static std::string sOIDcookieUrl;
|
||||
static std::string sOIDcookieName;
|
||||
static std::string sOIDcookieValue;
|
||||
static std::string sOIDcookieHost;
|
||||
static std::string sOIDcookiePath;
|
||||
static bool sOIDcookieHttpOnly;
|
||||
static bool sOIDcookieSecure;
|
||||
void storeOpenIDCookie(const std::string url,
|
||||
const std::string name, const std::string value,
|
||||
const std::string host, const std::string path,
|
||||
bool httponly, bool secure);
|
||||
|
||||
void injectOpenIDCookie();
|
||||
|
||||
void setCookie(std::string uri, std::string name, std::string value, std::string domain, std::string path, bool httponly, bool secure);
|
||||
|
||||
void loadURI(const std::string &uri);
|
||||
|
|
|
|||
|
|
@ -559,6 +559,23 @@ LLUUID LLMaterialTable::getCollisionSoundUUID(U8 mcode, U8 mcode2)
|
|||
}
|
||||
}
|
||||
|
||||
bool LLMaterialTable::isCollisionSound(const LLUUID &uuid)
|
||||
{
|
||||
for (U8 i = 0; i < LL_MCODE_END; i++)
|
||||
{
|
||||
for (U8 j = 0; j < LL_MCODE_END; j++)
|
||||
{
|
||||
i &= LL_MCODE_MASK;
|
||||
j &= LL_MCODE_MASK;
|
||||
if (mCollisionSoundMatrix[i * LL_MCODE_END + j] == uuid)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
LLUUID LLMaterialTable::getSlidingSoundUUID(U8 mcode, U8 mcode2)
|
||||
{
|
||||
mcode &= LL_MCODE_MASK;
|
||||
|
|
|
|||
|
|
@ -128,6 +128,8 @@ public:
|
|||
F32 getDamageMod(U8 mcode);
|
||||
F32 getEPMod(U8 mcode);
|
||||
|
||||
bool isCollisionSound(const LLUUID &uuid);
|
||||
|
||||
LLUUID getCollisionSoundUUID(U8 mcode, U8 mcode2);
|
||||
LLUUID getSlidingSoundUUID(U8 mcode, U8 mcode2);
|
||||
LLUUID getRollingSoundUUID(U8 mcode, U8 mcode2);
|
||||
|
|
|
|||
|
|
@ -27,8 +27,7 @@
|
|||
#include "linden_common.h"
|
||||
#include "llmediaentry.h"
|
||||
#include "lllslconstants.h"
|
||||
|
||||
#include <boost/regex.hpp>
|
||||
#include "llregex.h"
|
||||
|
||||
// LLSD key defines
|
||||
// DO NOT REORDER OR REMOVE THESE!
|
||||
|
|
@ -456,7 +455,7 @@ static bool pattern_match(const std::string &candidate_str, const std::string &p
|
|||
|
||||
// case-insensitive matching:
|
||||
boost::regex regexp(expression, boost::regex::perl|boost::regex::icase);
|
||||
return boost::regex_match(candidate_str, regexp);
|
||||
return ll_regex_match(candidate_str, regexp);
|
||||
}
|
||||
|
||||
bool LLMediaEntry::checkCandidateUrl(const std::string& url) const
|
||||
|
|
|
|||
|
|
@ -114,6 +114,35 @@ const char *SCULPT_DEFAULT_TEXTURE = "be293869-d0d9-0a69-5989-ad27f1946fd4"; //
|
|||
// can't be divided by 2. See DEV-19108
|
||||
const F32 TEXTURE_ROTATION_PACK_FACTOR = ((F32) 0x08000);
|
||||
|
||||
struct material_id_type // originally from llrendermaterialtable
|
||||
{
|
||||
material_id_type()
|
||||
{
|
||||
memset((void*)m_value, 0, sizeof(m_value));
|
||||
}
|
||||
|
||||
bool operator==(const material_id_type& other) const
|
||||
{
|
||||
return (memcmp(m_value, other.m_value, sizeof(m_value)) == 0);
|
||||
}
|
||||
|
||||
bool operator!=(const material_id_type& other) const
|
||||
{
|
||||
return !operator==(other);
|
||||
}
|
||||
|
||||
bool isNull() const
|
||||
{
|
||||
return (memcmp(m_value, s_null_id, sizeof(m_value)) == 0);
|
||||
}
|
||||
|
||||
U8 m_value[MATERIAL_ID_SIZE]; // server side this is MD5RAW_BYTES
|
||||
|
||||
static const U8 s_null_id[MATERIAL_ID_SIZE];
|
||||
};
|
||||
|
||||
const U8 material_id_type::s_null_id[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
|
||||
|
||||
//static
|
||||
// LEGACY: by default we use the LLVolumeMgr::gVolumeMgr global
|
||||
// TODO -- eliminate this global from the codebase!
|
||||
|
|
@ -1079,48 +1108,83 @@ S32 LLPrimitive::packTEField(U8 *cur_ptr, U8 *data_ptr, U8 data_size, U8 last_fa
|
|||
return (S32)(cur_ptr - start_loc);
|
||||
}
|
||||
|
||||
S32 LLPrimitive::unpackTEField(U8 *cur_ptr, U8 *buffer_end, U8 *data_ptr, U8 data_size, U8 face_count, EMsgVariableType type)
|
||||
namespace
|
||||
{
|
||||
U8 *start_loc = cur_ptr;
|
||||
U64 i;
|
||||
htolememcpy(data_ptr,cur_ptr, type,data_size);
|
||||
cur_ptr += data_size;
|
||||
template< typename T >
|
||||
bool unpack_TEField(T dest[], U8 dest_count, U8 * &source, U8 *source_end, EMsgVariableType type)
|
||||
{
|
||||
const size_t size(sizeof(T));
|
||||
|
||||
for (i = 1; i < face_count; i++)
|
||||
LL_DEBUGS("TEXTUREENTRY") << "Request to read items of size " << size << " with swizzle " << type << " froum buffer sized " << (source_end - source) << LL_ENDL;
|
||||
|
||||
if ((source + size + 1) > source_end)
|
||||
{
|
||||
// Already unswizzled, don't need to unswizzle it again!
|
||||
memcpy(data_ptr+(i*data_size),data_ptr,data_size); /* Flawfinder: ignore */
|
||||
// we add 1 above to take into account the byte that we know must follow the value.
|
||||
LL_WARNS("TEXTUREENTRY") << "Buffer exhausted! Requires " << size << " + 1 bytes for default, " << (source_end - source) << " bytes remaning." << LL_ENDL;
|
||||
source = source_end;
|
||||
return false;
|
||||
}
|
||||
|
||||
while ((cur_ptr < buffer_end) && (*cur_ptr != 0))
|
||||
// Extract the default value and fill the array.
|
||||
htolememcpy(dest, source, type, size);
|
||||
source += size;
|
||||
for (S32 idx = 1; idx < dest_count; ++idx)
|
||||
{
|
||||
LL_DEBUGS("TEFieldDecode") << "TE exception" << LL_ENDL;
|
||||
i = 0;
|
||||
while (*cur_ptr & 0x80)
|
||||
{
|
||||
i |= ((*cur_ptr++) & 0x7F);
|
||||
i = i << 7;
|
||||
dest[idx] = dest[0];
|
||||
}
|
||||
|
||||
i |= *cur_ptr++;
|
||||
while (source < source_end)
|
||||
{
|
||||
U64 index_flags(0);
|
||||
U8 sbit(0);
|
||||
|
||||
for (S32 j = 0; j < face_count; j++)
|
||||
// Unpack the variable length bitfield. Each bit represents whether the following
|
||||
// value will be placed at the corresponding array index.
|
||||
do
|
||||
{
|
||||
if (i & 0x01)
|
||||
if (source >= source_end)
|
||||
{
|
||||
htolememcpy(data_ptr+(j*data_size),cur_ptr,type,data_size);
|
||||
LL_DEBUGS("TEFieldDecode") << "Assigning " ;
|
||||
char foo[64];
|
||||
sprintf(foo,"%x %x",*(data_ptr+(j*data_size)), *(data_ptr+(j*data_size)+1));
|
||||
LL_CONT << foo << " to face " << j << LL_ENDL;
|
||||
LL_WARNS("TEXTUREENTRY") << "Buffer exhausted! Reading index flags." << LL_ENDL;
|
||||
source = source_end;
|
||||
return false;
|
||||
}
|
||||
i = i >> 1;
|
||||
|
||||
sbit = *source++;
|
||||
index_flags <<= 7; // original code had this after?
|
||||
index_flags |= (sbit & 0x7F);
|
||||
} while (sbit & 0x80);
|
||||
|
||||
if (!index_flags)
|
||||
{ // We've hit the terminating 0 byte.
|
||||
break;
|
||||
}
|
||||
cur_ptr += data_size;
|
||||
|
||||
if ((source + size + 1) > source_end)
|
||||
{
|
||||
// we add 1 above to take into account the byte that we know must follow the value.
|
||||
LL_WARNS("TEXTUREENTRY") << "Buffer exhausted! Requires " << size << " + 1 bytes for default, " << (source_end - source) << " bytes remaning." << LL_ENDL;
|
||||
source = source_end;
|
||||
return false;
|
||||
}
|
||||
llassert(cur_ptr <= buffer_end); // buffer underrun
|
||||
return (S32)(cur_ptr - start_loc);
|
||||
|
||||
// get the value for the indexs.
|
||||
T value;
|
||||
htolememcpy(&value, source, type, size);
|
||||
source += size;
|
||||
|
||||
for (S32 idx = 0; idx < dest_count; idx++)
|
||||
{
|
||||
if (index_flags & 1ULL << idx)
|
||||
{
|
||||
dest[idx] = value;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Pack information about all texture entries into container:
|
||||
|
|
@ -1300,7 +1364,7 @@ S32 LLPrimitive::parseTEMessage(LLMessageSystem* mesgsys, char const* block_name
|
|||
S32 retval = 0;
|
||||
// temp buffer for material ID processing
|
||||
// data will end up in tec.material_id[]
|
||||
U8 material_data[LLTEContents::MAX_TES*16];
|
||||
material_id_type material_data[LLTEContents::MAX_TES];
|
||||
|
||||
if (block_num < 0)
|
||||
{
|
||||
|
|
@ -1316,54 +1380,49 @@ S32 LLPrimitive::parseTEMessage(LLMessageSystem* mesgsys, char const* block_name
|
|||
tec.face_count = 0;
|
||||
return retval;
|
||||
}
|
||||
|
||||
if (block_num < 0)
|
||||
else if (tec.size >= LLTEContents::MAX_TE_BUFFER)
|
||||
{
|
||||
mesgsys->getBinaryDataFast(block_name, _PREHASH_TextureEntry, tec.packed_buffer, 0, 0, LLTEContents::MAX_TE_BUFFER);
|
||||
}
|
||||
else
|
||||
{
|
||||
mesgsys->getBinaryDataFast(block_name, _PREHASH_TextureEntry, tec.packed_buffer, 0, block_num, LLTEContents::MAX_TE_BUFFER);
|
||||
LL_WARNS("TEXTUREENTRY") << "Excessive buffer size detected in Texture Entry! Truncating." << LL_ENDL;
|
||||
tec.size = LLTEContents::MAX_TE_BUFFER - 1;
|
||||
}
|
||||
|
||||
// if block_num < 0 ask for block 0
|
||||
mesgsys->getBinaryDataFast(block_name, _PREHASH_TextureEntry, tec.packed_buffer, 0, std::max(block_num, 0), LLTEContents::MAX_TE_BUFFER - 1);
|
||||
|
||||
// The last field is not zero terminated.
|
||||
// Rather than special case the upack functions. Just make it 0x00 terminated.
|
||||
tec.packed_buffer[tec.size] = 0x00;
|
||||
++tec.size;
|
||||
|
||||
tec.face_count = llmin((U32)getNumTEs(),(U32)LLTEContents::MAX_TES);
|
||||
|
||||
U8 *cur_ptr = tec.packed_buffer;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.image_data, 16, tec.face_count, MVT_LLUUID);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.colors, 4, tec.face_count, MVT_U8);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.scale_s, 4, tec.face_count, MVT_F32);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.scale_t, 4, tec.face_count, MVT_F32);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.offset_s, 2, tec.face_count, MVT_S16Array);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.offset_t, 2, tec.face_count, MVT_S16Array);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.image_rot, 2, tec.face_count, MVT_S16Array);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.bump, 1, tec.face_count, MVT_U8);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.media_flags, 1, tec.face_count, MVT_U8);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.glow, 1, tec.face_count, MVT_U8);
|
||||
LL_DEBUGS("TEXTUREENTRY") << "Texture Entry with buffere sized: " << tec.size << LL_ENDL;
|
||||
U8 *buffer_end = tec.packed_buffer + tec.size;
|
||||
|
||||
if (cur_ptr < tec.packed_buffer + tec.size)
|
||||
if (!( unpack_TEField<LLUUID>(tec.image_data, tec.face_count, cur_ptr, buffer_end, MVT_LLUUID) &&
|
||||
unpack_TEField<LLColor4U>(tec.colors, tec.face_count, cur_ptr, buffer_end, MVT_U8) &&
|
||||
unpack_TEField<F32>(tec.scale_s, tec.face_count, cur_ptr, buffer_end, MVT_F32) &&
|
||||
unpack_TEField<F32>(tec.scale_t, tec.face_count, cur_ptr, buffer_end, MVT_F32) &&
|
||||
unpack_TEField<S16>(tec.offset_s, tec.face_count, cur_ptr, buffer_end, MVT_S16) &&
|
||||
unpack_TEField<S16>(tec.offset_t, tec.face_count, cur_ptr, buffer_end, MVT_S16) &&
|
||||
unpack_TEField<S16>(tec.image_rot, tec.face_count, cur_ptr, buffer_end, MVT_S16) &&
|
||||
unpack_TEField<U8>(tec.bump, tec.face_count, cur_ptr, buffer_end, MVT_U8) &&
|
||||
unpack_TEField<U8>(tec.media_flags, tec.face_count, cur_ptr, buffer_end, MVT_U8) &&
|
||||
unpack_TEField<U8>(tec.glow, tec.face_count, cur_ptr, buffer_end, MVT_U8)))
|
||||
{
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)material_data, 16, tec.face_count, MVT_LLUUID);
|
||||
LL_WARNS("TEXTUREENTRY") << "Failure parsing Texture Entry Message due to malformed TE Field! Dropping changes on the floor. " << LL_ENDL;
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
|
||||
if (cur_ptr >= buffer_end || !unpack_TEField<material_id_type>(material_data, tec.face_count, cur_ptr, buffer_end, MVT_LLUUID))
|
||||
{
|
||||
memset(material_data, 0, sizeof(material_data));
|
||||
memset((void*)material_data, 0, sizeof(material_data));
|
||||
}
|
||||
|
||||
for (U32 i = 0; i < tec.face_count; i++)
|
||||
{
|
||||
tec.material_ids[i].set(&material_data[i * 16]);
|
||||
tec.material_ids[i].set(&(material_data[i]));
|
||||
}
|
||||
|
||||
retval = 1;
|
||||
|
|
@ -1375,7 +1434,6 @@ S32 LLPrimitive::applyParsedTEMessage(LLTEContents& tec)
|
|||
S32 retval = 0;
|
||||
|
||||
LLColor4 color;
|
||||
LLColor4U coloru;
|
||||
for (U32 i = 0; i < tec.face_count; i++)
|
||||
{
|
||||
LLUUID& req_id = ((LLUUID*)tec.image_data)[i];
|
||||
|
|
@ -1388,20 +1446,15 @@ S32 LLPrimitive::applyParsedTEMessage(LLTEContents& tec)
|
|||
retval |= setTEGlow(i, (F32)tec.glow[i] / (F32)0xFF);
|
||||
retval |= setTEMaterialID(i, tec.material_ids[i]);
|
||||
|
||||
coloru = LLColor4U(tec.colors + 4*i);
|
||||
|
||||
// Note: This is an optimization to send common colors (1.f, 1.f, 1.f, 1.f)
|
||||
// as all zeros. However, the subtraction and addition must be done in unsigned
|
||||
// byte space, not in float space, otherwise off-by-one errors occur. JC
|
||||
color.mV[VRED] = F32(255 - coloru.mV[VRED]) / 255.f;
|
||||
color.mV[VGREEN] = F32(255 - coloru.mV[VGREEN]) / 255.f;
|
||||
color.mV[VBLUE] = F32(255 - coloru.mV[VBLUE]) / 255.f;
|
||||
color.mV[VALPHA] = F32(255 - coloru.mV[VALPHA]) / 255.f;
|
||||
color.mV[VRED] = F32(255 - tec.colors[i].mV[VRED]) / 255.f;
|
||||
color.mV[VGREEN] = F32(255 - tec.colors[i].mV[VGREEN]) / 255.f;
|
||||
color.mV[VBLUE] = F32(255 - tec.colors[i].mV[VBLUE]) / 255.f;
|
||||
color.mV[VALPHA] = F32(255 - tec.colors[i].mV[VALPHA]) / 255.f;
|
||||
|
||||
retval |= setTEColor(i, color);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
return retval;
|
||||
|
|
@ -1423,11 +1476,14 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp)
|
|||
const U32 MAX_TES = 45;
|
||||
|
||||
// Avoid construction of 32 UUIDs per call
|
||||
static LLUUID image_ids[MAX_TES];
|
||||
static LLMaterialID material_ids[MAX_TES];
|
||||
|
||||
U8 image_data[MAX_TES*16];
|
||||
U8 colors[MAX_TES*4];
|
||||
const U32 MAX_TE_BUFFER = 4096;
|
||||
U8 packed_buffer[MAX_TE_BUFFER];
|
||||
memset((void*)packed_buffer, 0, MAX_TE_BUFFER);
|
||||
|
||||
LLUUID image_data[MAX_TES];
|
||||
LLColor4U colors[MAX_TES];
|
||||
F32 scale_s[MAX_TES];
|
||||
F32 scale_t[MAX_TES];
|
||||
S16 offset_s[MAX_TES];
|
||||
|
|
@ -1436,11 +1492,16 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp)
|
|||
U8 bump[MAX_TES];
|
||||
U8 media_flags[MAX_TES];
|
||||
U8 glow[MAX_TES];
|
||||
U8 material_data[MAX_TES*16];
|
||||
material_id_type material_data[MAX_TES];
|
||||
|
||||
const U32 MAX_TE_BUFFER = 4096;
|
||||
U8 packed_buffer[MAX_TE_BUFFER];
|
||||
U8 *cur_ptr = packed_buffer;
|
||||
memset((void*)scale_s, 0, sizeof(scale_s));
|
||||
memset((void*)scale_t, 0, sizeof(scale_t));
|
||||
memset((void*)offset_s, 0, sizeof(offset_s));
|
||||
memset((void*)offset_t, 0, sizeof(offset_t));
|
||||
memset((void*)image_rot, 0, sizeof(image_rot));
|
||||
memset((void*)bump, 0, sizeof(bump));
|
||||
memset((void*)media_flags, 0, sizeof(media_flags));
|
||||
memset((void*)glow, 0, sizeof(glow));
|
||||
|
||||
S32 size;
|
||||
U32 face_count = 0;
|
||||
|
|
@ -1456,50 +1517,52 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp)
|
|||
{
|
||||
return retval;
|
||||
}
|
||||
else if (size >= MAX_TE_BUFFER)
|
||||
{
|
||||
LL_WARNS("TEXTUREENTRY") << "Excessive buffer size detected in Texture Entry! Truncating." << LL_ENDL;
|
||||
size = MAX_TE_BUFFER - 1;
|
||||
}
|
||||
|
||||
// The last field is not zero terminated.
|
||||
// Rather than special case the upack functions. Just make it 0x00 terminated.
|
||||
packed_buffer[size] = 0x00;
|
||||
++size;
|
||||
face_count = llmin((U32) getNumTEs(), MAX_TES);
|
||||
U32 i;
|
||||
|
||||
cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)image_data, 16, face_count, MVT_LLUUID);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)colors, 4, face_count, MVT_U8);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)scale_s, 4, face_count, MVT_F32);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)scale_t, 4, face_count, MVT_F32);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)offset_s, 2, face_count, MVT_S16Array);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)offset_t, 2, face_count, MVT_S16Array);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)image_rot, 2, face_count, MVT_S16Array);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)bump, 1, face_count, MVT_U8);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)media_flags, 1, face_count, MVT_U8);
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)glow, 1, face_count, MVT_U8);
|
||||
if (cur_ptr < packed_buffer + size)
|
||||
U8 *cur_ptr = packed_buffer;
|
||||
LL_DEBUGS("TEXTUREENTRY") << "Texture Entry with buffer sized: " << size << LL_ENDL;
|
||||
U8 *buffer_end = packed_buffer + size;
|
||||
|
||||
if (!( unpack_TEField<LLUUID>(image_data, face_count, cur_ptr, buffer_end, MVT_LLUUID) &&
|
||||
unpack_TEField<LLColor4U>(colors, face_count, cur_ptr, buffer_end, MVT_U8) &&
|
||||
unpack_TEField<F32>(scale_s, face_count, cur_ptr, buffer_end, MVT_F32) &&
|
||||
unpack_TEField<F32>(scale_t, face_count, cur_ptr, buffer_end, MVT_F32) &&
|
||||
unpack_TEField<S16>(offset_s, face_count, cur_ptr, buffer_end, MVT_S16) &&
|
||||
unpack_TEField<S16>(offset_t, face_count, cur_ptr, buffer_end, MVT_S16) &&
|
||||
unpack_TEField<S16>(image_rot, face_count, cur_ptr, buffer_end, MVT_S16) &&
|
||||
unpack_TEField<U8>(bump, face_count, cur_ptr, buffer_end, MVT_U8) &&
|
||||
unpack_TEField<U8>(media_flags, face_count, cur_ptr, buffer_end, MVT_U8) &&
|
||||
unpack_TEField<U8>(glow, face_count, cur_ptr, buffer_end, MVT_U8)))
|
||||
{
|
||||
cur_ptr++;
|
||||
cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)material_data, 16, face_count, MVT_LLUUID);
|
||||
LL_WARNS("TEXTUREENTRY") << "Failure parsing Texture Entry Message due to malformed TE Field! Dropping changes on the floor. " << LL_ENDL;
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
|
||||
if (cur_ptr >= buffer_end || !unpack_TEField<material_id_type>(material_data, face_count, cur_ptr, buffer_end, MVT_LLUUID))
|
||||
{
|
||||
memset(material_data, 0, sizeof(material_data));
|
||||
memset((void*)material_data, 0, sizeof(material_data));
|
||||
}
|
||||
|
||||
for (i = 0; i < face_count; i++)
|
||||
{
|
||||
memcpy(image_ids[i].mData,&image_data[i*16],16); /* Flawfinder: ignore */
|
||||
material_ids[i].set(&material_data[i * 16]);
|
||||
material_ids[i].set(&(material_data[i]));
|
||||
}
|
||||
|
||||
LLColor4 color;
|
||||
LLColor4U coloru;
|
||||
for (i = 0; i < face_count; i++)
|
||||
{
|
||||
retval |= setTETexture(i, image_ids[i]);
|
||||
retval |= setTETexture(i, ((LLUUID*)image_data)[i]);
|
||||
retval |= setTEScale(i, scale_s[i], scale_t[i]);
|
||||
retval |= setTEOffset(i, (F32)offset_s[i] / (F32)0x7FFF, (F32) offset_t[i] / (F32) 0x7FFF);
|
||||
retval |= setTERotation(i, ((F32)image_rot[i] / TEXTURE_ROTATION_PACK_FACTOR) * F_TWO_PI);
|
||||
|
|
@ -1507,15 +1570,14 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp)
|
|||
retval |= setTEMediaTexGen(i, media_flags[i]);
|
||||
retval |= setTEGlow(i, (F32)glow[i] / (F32)0xFF);
|
||||
retval |= setTEMaterialID(i, material_ids[i]);
|
||||
coloru = LLColor4U(colors + 4*i);
|
||||
|
||||
// Note: This is an optimization to send common colors (1.f, 1.f, 1.f, 1.f)
|
||||
// as all zeros. However, the subtraction and addition must be done in unsigned
|
||||
// byte space, not in float space, otherwise off-by-one errors occur. JC
|
||||
color.mV[VRED] = F32(255 - coloru.mV[VRED]) / 255.f;
|
||||
color.mV[VGREEN] = F32(255 - coloru.mV[VGREEN]) / 255.f;
|
||||
color.mV[VBLUE] = F32(255 - coloru.mV[VBLUE]) / 255.f;
|
||||
color.mV[VALPHA] = F32(255 - coloru.mV[VALPHA]) / 255.f;
|
||||
color.mV[VRED] = F32(255 - colors[i].mV[VRED]) / 255.f;
|
||||
color.mV[VGREEN] = F32(255 - colors[i].mV[VGREEN]) / 255.f;
|
||||
color.mV[VBLUE] = F32(255 - colors[i].mV[VBLUE]) / 255.f;
|
||||
color.mV[VALPHA] = F32(255 - colors[i].mV[VALPHA]) / 255.f;
|
||||
|
||||
retval |= setTEColor(i, color);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -330,8 +330,8 @@ struct LLTEContents
|
|||
{
|
||||
static const U32 MAX_TES = 45;
|
||||
|
||||
U8 image_data[MAX_TES*16];
|
||||
U8 colors[MAX_TES*4];
|
||||
LLUUID image_data[MAX_TES];
|
||||
LLColor4U colors[MAX_TES];
|
||||
F32 scale_s[MAX_TES];
|
||||
F32 scale_t[MAX_TES];
|
||||
S16 offset_s[MAX_TES];
|
||||
|
|
@ -423,7 +423,6 @@ public:
|
|||
|
||||
void copyTEs(const LLPrimitive *primitive);
|
||||
S32 packTEField(U8 *cur_ptr, U8 *data_ptr, U8 data_size, U8 last_face_index, EMsgVariableType type) const;
|
||||
S32 unpackTEField(U8 *cur_ptr, U8 *buffer_end, U8 *data_ptr, U8 data_size, U8 face_count, EMsgVariableType type);
|
||||
BOOL packTEMessage(LLMessageSystem *mesgsys) const;
|
||||
BOOL packTEMessage(LLDataPacker &dp) const;
|
||||
S32 unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num); // Variable num of blocks
|
||||
|
|
|
|||
|
|
@ -1037,6 +1037,43 @@ void LLComboBox::prearrangeList(std::string filter)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
//============================================================================
|
||||
// ll::ui::SearchableControl functions
|
||||
|
||||
//virtual
|
||||
std::string LLComboBox::_getSearchText() const
|
||||
{
|
||||
std::string res;
|
||||
if (mList)
|
||||
{
|
||||
// getAllData returns a full copy of content, might be a
|
||||
// better option to implement an mList->getSearchText(column)
|
||||
std::vector<LLScrollListItem*> data = mList->getAllData();
|
||||
std::vector<LLScrollListItem*>::iterator iter = data.begin();
|
||||
while (iter != data.end())
|
||||
{
|
||||
LLScrollListCell* cell = (*iter)->getColumn(0);
|
||||
if (cell)
|
||||
{
|
||||
std::string whitelist_url = cell->getValue().asString();
|
||||
res += cell->getValue().asString();
|
||||
}
|
||||
iter++;
|
||||
}
|
||||
}
|
||||
return res + getToolTip();
|
||||
}
|
||||
|
||||
//virtual
|
||||
void LLComboBox::onSetHighlight() const
|
||||
{
|
||||
if (mButton)
|
||||
{
|
||||
mButton->ll::ui::SearchableControl::setHighlighted(ll::ui::SearchableControl::getHighlighted());
|
||||
}
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
// LLCtrlListInterface functions
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@ class LLFontGL;
|
|||
class LLViewBorder;
|
||||
|
||||
class LLComboBox
|
||||
: public LLUICtrl, public LLCtrlListInterface
|
||||
: public LLUICtrl
|
||||
, public LLCtrlListInterface
|
||||
, public ll::ui::SearchableControl
|
||||
{
|
||||
public:
|
||||
typedef enum e_preferred_position
|
||||
|
|
@ -100,6 +102,9 @@ protected:
|
|||
void initFromParams(const Params&);
|
||||
void prearrangeList(std::string filter = "");
|
||||
|
||||
virtual std::string _getSearchText() const;
|
||||
virtual void onSetHighlight() const;
|
||||
|
||||
public:
|
||||
// LLView interface
|
||||
virtual void onFocusLost();
|
||||
|
|
|
|||
|
|
@ -84,7 +84,6 @@
|
|||
#include <sstream>
|
||||
|
||||
#include <boost/utility.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/type_traits.hpp>
|
||||
#include <boost/signals2.hpp>
|
||||
#include <boost/range.hpp>
|
||||
|
|
@ -131,7 +130,7 @@ public:
|
|||
|
||||
typedef boost::function<void (const LLSD&, const LLSD&)> LLNotificationResponder;
|
||||
|
||||
typedef boost::shared_ptr<LLNotificationResponderInterface> LLNotificationResponderPtr;
|
||||
typedef std::shared_ptr<LLNotificationResponderInterface> LLNotificationResponderPtr;
|
||||
|
||||
typedef LLFunctorRegistry<LLNotificationResponder> LLNotificationFunctorRegistry;
|
||||
typedef LLFunctorRegistration<LLNotificationResponder> LLNotificationFunctorRegistration;
|
||||
|
|
@ -276,19 +275,19 @@ private:
|
|||
bool mInvertSetting;
|
||||
};
|
||||
|
||||
typedef boost::shared_ptr<LLNotificationForm> LLNotificationFormPtr;
|
||||
typedef std::shared_ptr<LLNotificationForm> LLNotificationFormPtr;
|
||||
|
||||
|
||||
struct LLNotificationTemplate;
|
||||
|
||||
// we want to keep a map of these by name, and it's best to manage them
|
||||
// with smart pointers
|
||||
typedef boost::shared_ptr<LLNotificationTemplate> LLNotificationTemplatePtr;
|
||||
typedef std::shared_ptr<LLNotificationTemplate> LLNotificationTemplatePtr;
|
||||
|
||||
|
||||
struct LLNotificationVisibilityRule;
|
||||
|
||||
typedef boost::shared_ptr<LLNotificationVisibilityRule> LLNotificationVisibilityRulePtr;
|
||||
typedef std::shared_ptr<LLNotificationVisibilityRule> LLNotificationVisibilityRulePtr;
|
||||
|
||||
/**
|
||||
* @class LLNotification
|
||||
|
|
@ -745,6 +744,10 @@ public:
|
|||
{}
|
||||
virtual ~LLNotificationChannelBase()
|
||||
{
|
||||
// explicit cleanup for easier issue detection
|
||||
mChanged.disconnect_all_slots();
|
||||
mPassedFilter.disconnect_all_slots();
|
||||
mFailedFilter.disconnect_all_slots();
|
||||
mItems.clear();
|
||||
}
|
||||
// you can also connect to a Channel, so you can be notified of
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@
|
|||
|
||||
#include "lleventapi.h"
|
||||
#include "llnotificationptr.h"
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
|
|
@ -61,7 +60,7 @@ private:
|
|||
static LLSD asLLSD(LLNotificationPtr);
|
||||
|
||||
class Forwarder;
|
||||
typedef std::map<std::string, boost::shared_ptr<Forwarder> > ForwarderMap;
|
||||
typedef std::map<std::string, std::shared_ptr<Forwarder> > ForwarderMap;
|
||||
ForwarderMap mForwarders;
|
||||
LLNotifications & mNotifications;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#include "llinitparam.h"
|
||||
#include "llnotifications.h"
|
||||
|
||||
typedef boost::shared_ptr<LLNotificationForm> LLNotificationFormPtr;
|
||||
typedef std::shared_ptr<LLNotificationForm> LLNotificationFormPtr;
|
||||
|
||||
// This is the class of object read from the XML file (notifications.xml,
|
||||
// from the appropriate local language directory).
|
||||
|
|
|
|||
|
|
@ -184,6 +184,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
|
|||
mFontShadow(p.font_shadow),
|
||||
mPopupMenuHandle(),
|
||||
mReadOnly(p.read_only),
|
||||
mSkipTripleClick(false),
|
||||
mSkipLinkUnderline(p.skip_link_underline),
|
||||
mSpellCheck(p.spellcheck),
|
||||
mSpellCheckStart(-1),
|
||||
|
|
@ -1017,6 +1018,11 @@ BOOL LLTextBase::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
// handle triple click
|
||||
if (!mTripleClickTimer.hasExpired())
|
||||
{
|
||||
if (mSkipTripleClick)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
S32 real_line = getLineNumFromDocIndex(mCursorPos, false);
|
||||
S32 line_start = -1;
|
||||
S32 line_end = -1;
|
||||
|
|
|
|||
|
|
@ -699,7 +699,7 @@ protected:
|
|||
bool mPlainText; // didn't use Image or Icon segments
|
||||
bool mAutoIndent;
|
||||
S32 mMaxTextByteLength; // Maximum length mText is allowed to be in bytes
|
||||
|
||||
bool mSkipTripleClick;
|
||||
bool mSkipLinkUnderline;
|
||||
|
||||
// support widgets
|
||||
|
|
|
|||
|
|
@ -45,7 +45,9 @@ LLTextBox::LLTextBox(const LLTextBox::Params& p)
|
|||
: LLTextBase(p),
|
||||
mClickedCallback(NULL),
|
||||
mShowCursorHand(true)
|
||||
{}
|
||||
{
|
||||
mSkipTripleClick = true;
|
||||
}
|
||||
|
||||
LLTextBox::~LLTextBox()
|
||||
{}
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
|
||||
#include "llavatarnamecache.h"
|
||||
#include "llcachename.h"
|
||||
#include "llregex.h"
|
||||
#include "lltrans.h"
|
||||
#include "lluicolortable.h"
|
||||
#include "message.h"
|
||||
|
|
@ -181,11 +182,51 @@ bool LLUrlEntryBase::isLinkDisabled() const
|
|||
return globally_disabled;
|
||||
}
|
||||
|
||||
bool LLUrlEntryBase::isWikiLinkCorrect(std::string url)
|
||||
bool LLUrlEntryBase::isWikiLinkCorrect(const std::string &labeled_url) const
|
||||
{
|
||||
LLWString label = utf8str_to_wstring(getLabelFromWikiLink(url));
|
||||
label.erase(std::remove(label.begin(), label.end(), L'\u200B'), label.end());
|
||||
return (LLUrlRegistry::instance().hasUrl(wstring_to_utf8str(label))) ? false : true;
|
||||
LLWString wlabel = utf8str_to_wstring(getLabelFromWikiLink(labeled_url));
|
||||
wlabel.erase(std::remove(wlabel.begin(), wlabel.end(), L'\u200B'), wlabel.end());
|
||||
|
||||
// Unicode URL validation, see SL-15243
|
||||
std::replace_if(wlabel.begin(),
|
||||
wlabel.end(),
|
||||
[](const llwchar &chr)
|
||||
{
|
||||
return (chr == L'\u2024') // "One Dot Leader"
|
||||
|| (chr == L'\uFE52') // "Small Full Stop"
|
||||
|| (chr == L'\uFF0E') // "Fullwidth Full Stop"
|
||||
// Not a decomposition, but suficiently similar
|
||||
|| (chr == L'\u05C5'); // "Hebrew Mark Lower Dot"
|
||||
},
|
||||
L'\u002E'); // Dot "Full Stop"
|
||||
|
||||
std::replace_if(wlabel.begin(),
|
||||
wlabel.end(),
|
||||
[](const llwchar &chr)
|
||||
{
|
||||
return (chr == L'\u02D0') // "Modifier Letter Colon"
|
||||
|| (chr == L'\uFF1A') // "Fullwidth Colon"
|
||||
|| (chr == L'\uFE55'); // "Small Colon"
|
||||
},
|
||||
L'\u003A'); // Colon
|
||||
|
||||
std::replace_if(wlabel.begin(),
|
||||
wlabel.end(),
|
||||
[](const llwchar &chr)
|
||||
{
|
||||
return (chr == L'\uFF0F'); // "Fullwidth Solidus"
|
||||
},
|
||||
L'\u002F'); // Solidus
|
||||
|
||||
std::string label = wstring_to_utf8str(wlabel);
|
||||
if ((label.find(".com") != std::string::npos
|
||||
|| label.find("www.") != std::string::npos)
|
||||
&& label.find("://") == std::string::npos)
|
||||
{
|
||||
label = "http://" + label;
|
||||
}
|
||||
|
||||
return (LLUrlRegistry::instance().hasUrl(label)) ? false : true;
|
||||
}
|
||||
|
||||
std::string LLUrlEntryBase::urlToLabelWithGreyQuery(const std::string &url) const
|
||||
|
|
@ -1416,7 +1457,7 @@ std::string LLUrlEntryIcon::getIcon(const std::string &url)
|
|||
// Grep icon info between <icon>...</icon> tags
|
||||
// matches[1] contains the icon name/path
|
||||
boost::match_results<std::string::const_iterator> matches;
|
||||
mIcon = (boost::regex_match(url, matches, mPattern) && matches[1].matched)
|
||||
mIcon = (ll_regex_match(url, matches, mPattern) && matches[1].matched)
|
||||
? matches[1]
|
||||
: LLStringUtil::null;
|
||||
LLStringUtil::trim(mIcon);
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ public:
|
|||
|
||||
bool isLinkDisabled() const;
|
||||
|
||||
bool isWikiLinkCorrect(std::string url);
|
||||
bool isWikiLinkCorrect(const std::string &url) const;
|
||||
|
||||
virtual bool isSLURLvalid(const std::string &url) const { return TRUE; };
|
||||
|
||||
|
|
|
|||
|
|
@ -26,10 +26,10 @@
|
|||
*/
|
||||
|
||||
#include "linden_common.h"
|
||||
#include "llregex.h"
|
||||
#include "llurlregistry.h"
|
||||
#include "lluriparser.h"
|
||||
|
||||
#include <boost/regex.hpp>
|
||||
|
||||
// default dummy callback that ignores any label updates from the server
|
||||
void LLUrlRegistryNullCallback(const std::string &url, const std::string &label, const std::string& icon)
|
||||
|
|
@ -108,15 +108,7 @@ static bool matchRegex(const char *text, boost::regex regex, U32 &start, U32 &en
|
|||
boost::cmatch result;
|
||||
bool found;
|
||||
|
||||
// regex_search can potentially throw an exception, so check for it
|
||||
try
|
||||
{
|
||||
found = boost::regex_search(text, result, regex);
|
||||
}
|
||||
catch (std::runtime_error &)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
found = ll_regex_search(text, result, regex);
|
||||
|
||||
if (! found)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -337,6 +337,11 @@ const std::string &LLDir::getDumpDir() const
|
|||
return LLDir::sDumpDir;
|
||||
}
|
||||
|
||||
bool LLDir::dumpDirExists() const
|
||||
{
|
||||
return !sDumpDir.empty();
|
||||
}
|
||||
|
||||
const std::string &LLDir::getPerAccountChatLogsDir() const
|
||||
{
|
||||
return mPerAccountChatLogsDir;
|
||||
|
|
@ -888,6 +893,11 @@ std::string LLDir::getScrubbedFileName(const std::string uncleanFileName)
|
|||
return name;
|
||||
}
|
||||
|
||||
std::string LLDir::getDumpLogsDirPath(const std::string &file_name)
|
||||
{
|
||||
return gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "dump_logs", file_name);
|
||||
}
|
||||
|
||||
// static
|
||||
std::string LLDir::getForbiddenFileChars()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -90,6 +90,7 @@ class LLDir
|
|||
const std::string &getLindenUserDir() const; // Location of the Linden user dir.
|
||||
const std::string &getChatLogsDir() const; // Location of the chat logs dir.
|
||||
const std::string &getDumpDir() const; // Location of the per-run dump dir.
|
||||
bool dumpDirExists() const;
|
||||
const std::string &getPerAccountChatLogsDir() const; // Location of the per account chat logs dir.
|
||||
const std::string &getTempDir() const; // Common temporary directory
|
||||
const std::string getCacheDir(bool get_default = false) const; // Location of the cache.
|
||||
|
|
@ -174,6 +175,8 @@ class LLDir
|
|||
// random filename in common temporary directory
|
||||
std::string getTempFilename() const;
|
||||
|
||||
static std::string getDumpLogsDirPath(const std::string &file_name = "");
|
||||
|
||||
// For producing safe download file names from potentially unsafe ones
|
||||
static std::string getScrubbedFileName(const std::string uncleanFileName);
|
||||
static std::string getForbiddenFileChars();
|
||||
|
|
|
|||
|
|
@ -27,8 +27,8 @@
|
|||
#include "lldiriterator.h"
|
||||
|
||||
#include "fix_macros.h"
|
||||
#include "llregex.h"
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <boost/regex.hpp>
|
||||
|
||||
namespace fs = boost::filesystem;
|
||||
|
||||
|
|
@ -131,7 +131,7 @@ bool LLDirIterator::Impl::next(std::string &fname)
|
|||
{
|
||||
boost::smatch match;
|
||||
std::string name = mIter->path().filename().string();
|
||||
found = boost::regex_match(name, match, mFilterExp);
|
||||
found = ll_regex_match(name, match, mFilterExp);
|
||||
if (found)
|
||||
{
|
||||
fname = name;
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
LLNonInlineTextView *inputView;
|
||||
NSTimer *frameTimer;
|
||||
NSString *currentInputLanguage;
|
||||
std::string secondLogPath;
|
||||
}
|
||||
|
||||
@property (assign) IBOutlet LLNSWindow *window;
|
||||
|
|
|
|||
|
|
@ -495,7 +495,8 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
// e.g. OS Window for upload something or Input Window...
|
||||
// mModifiers instance variable is for insertText: or insertText:replacementRange: (by Pell Smit)
|
||||
mModifiers = [theEvent modifierFlags];
|
||||
bool acceptsText = mHasMarkedText ? false : callKeyDown(&eventData, keycode, mModifiers);
|
||||
|
||||
bool acceptsText = mHasMarkedText ? false : callKeyDown(&eventData, keycode, mModifiers, [[theEvent characters] characterAtIndex:0]);
|
||||
unichar ch;
|
||||
if (acceptsText &&
|
||||
!mMarkedTextAllowed &&
|
||||
|
|
@ -538,7 +539,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
if (mModifiers & mask)
|
||||
{
|
||||
eventData.mKeyEvent = NativeKeyEventData::KEYDOWN;
|
||||
callKeyDown(&eventData, [theEvent keyCode], 0);
|
||||
callKeyDown(&eventData, [theEvent keyCode], 0, [[theEvent characters] characterAtIndex:0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ void setupInputWindow(NSWindowRef window, GLViewRef view);
|
|||
// These are all implemented in llwindowmacosx.cpp.
|
||||
// This is largely for easier interop between Obj-C and C++ (at least in the viewer's case due to the BOOL vs. BOOL conflict)
|
||||
bool callKeyUp(NSKeyEventRef event, unsigned short key, unsigned int mask);
|
||||
bool callKeyDown(NSKeyEventRef event, unsigned short key, unsigned int mask);
|
||||
bool callKeyDown(NSKeyEventRef event, unsigned short key, unsigned int mask, wchar_t character);
|
||||
void callResetKeys();
|
||||
bool callUnicodeCallback(wchar_t character, unsigned int mask);
|
||||
void callRightMouseDown(float *pos, unsigned int mask);
|
||||
|
|
|
|||
|
|
@ -208,8 +208,17 @@ bool callKeyUp(NSKeyEventRef event, unsigned short key, unsigned int mask)
|
|||
return retVal;
|
||||
}
|
||||
|
||||
bool callKeyDown(NSKeyEventRef event, unsigned short key, unsigned int mask)
|
||||
bool callKeyDown(NSKeyEventRef event, unsigned short key, unsigned int mask, wchar_t character)
|
||||
{
|
||||
if((key == gKeyboard->inverseTranslateKey('Z')) && (character == 'y'))
|
||||
{
|
||||
key = gKeyboard->inverseTranslateKey('Y');
|
||||
}
|
||||
else if ((key == gKeyboard->inverseTranslateKey('Y')) && (character == 'z'))
|
||||
{
|
||||
key = gKeyboard->inverseTranslateKey('Z');
|
||||
}
|
||||
|
||||
mRawKeyEvent = event;
|
||||
bool retVal = gKeyboard->handleKeyDown(key, mask);
|
||||
mRawKeyEvent = NULL;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ project(media_plugin_cef)
|
|||
include(Boost)
|
||||
include(00-Common)
|
||||
include(LLCommon)
|
||||
include(LLImage)
|
||||
include(LLPlugin)
|
||||
include(LLMath)
|
||||
include(LLRender)
|
||||
|
|
@ -13,7 +12,6 @@ include(LLWindow)
|
|||
include(Linking)
|
||||
include(PluginAPI)
|
||||
include(MediaPluginBase)
|
||||
include(OpenGL)
|
||||
|
||||
include(CEFPlugin)
|
||||
|
||||
|
|
@ -22,7 +20,6 @@ include_directories(
|
|||
${MEDIA_PLUGIN_BASE_INCLUDE_DIRS}
|
||||
${LLCOMMON_INCLUDE_DIRS}
|
||||
${LLMATH_INCLUDE_DIRS}
|
||||
${LLIMAGE_INCLUDE_DIRS}
|
||||
${LLRENDER_INCLUDE_DIRS}
|
||||
${LLWINDOW_INCLUDE_DIRS}
|
||||
${CEF_INCLUDE_DIR}
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
#include "linden_common.h"
|
||||
#include "indra_constants.h" // for indra keyboard codes
|
||||
|
||||
#include "llgl.h"
|
||||
#include "llglheaders.h" // for GL_* constants
|
||||
#include "llsdutil.h"
|
||||
#include "llplugininstance.h"
|
||||
#include "llpluginmessage.h"
|
||||
|
|
@ -37,9 +37,6 @@
|
|||
#include "volume_catcher.h"
|
||||
#include "media_plugin_base.h"
|
||||
|
||||
#include <functional>
|
||||
#include <chrono>
|
||||
|
||||
#include "dullahan.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -283,35 +283,16 @@ void MediaPluginLibVLC::playMedia()
|
|||
return;
|
||||
}
|
||||
|
||||
// A new call to play the media is received after the initial one. Typically
|
||||
// this is due to a size change request either as the media naturally resizes
|
||||
// to the size of the prim container, or else, as a 2D window is resized by the
|
||||
// user. Stopping the media, helps avoid a race condition where the media pixel
|
||||
// buffer size is out of sync with the declared size (width/height) for a frame
|
||||
// or two and the plugin crashes as VLC tries to decode a frame into unallocated
|
||||
// memory.
|
||||
if (mLibVLCMediaPlayer)
|
||||
{
|
||||
// stop listening to events while we reset things
|
||||
libvlc_event_manager_t* em = libvlc_media_player_event_manager(mLibVLCMediaPlayer);
|
||||
if (em)
|
||||
{
|
||||
libvlc_event_detach(em, libvlc_MediaPlayerOpening, eventCallbacks, NULL);
|
||||
libvlc_event_detach(em, libvlc_MediaPlayerPlaying, eventCallbacks, NULL);
|
||||
libvlc_event_detach(em, libvlc_MediaPlayerPaused, eventCallbacks, NULL);
|
||||
libvlc_event_detach(em, libvlc_MediaPlayerStopped, eventCallbacks, NULL);
|
||||
libvlc_event_detach(em, libvlc_MediaPlayerEndReached, eventCallbacks, NULL);
|
||||
libvlc_event_detach(em, libvlc_MediaPlayerEncounteredError, eventCallbacks, NULL);
|
||||
libvlc_event_detach(em, libvlc_MediaPlayerTimeChanged, eventCallbacks, NULL);
|
||||
libvlc_event_detach(em, libvlc_MediaPlayerPositionChanged, eventCallbacks, NULL);
|
||||
libvlc_event_detach(em, libvlc_MediaPlayerLengthChanged, eventCallbacks, NULL);
|
||||
libvlc_event_detach(em, libvlc_MediaPlayerTitleChanged, eventCallbacks, NULL);
|
||||
};
|
||||
|
||||
libvlc_media_player_stop(mLibVLCMediaPlayer);
|
||||
libvlc_media_player_release(mLibVLCMediaPlayer);
|
||||
|
||||
mLibVLCMediaPlayer = 0;
|
||||
}
|
||||
|
||||
if (mLibVLCMedia)
|
||||
{
|
||||
libvlc_media_release(mLibVLCMedia);
|
||||
|
||||
mLibVLCMedia = 0;
|
||||
}
|
||||
|
||||
mLibVLCMedia = libvlc_media_new_location(mLibVLC, mURL.c_str());
|
||||
|
|
@ -345,6 +326,9 @@ void MediaPluginLibVLC::playMedia()
|
|||
libvlc_event_attach(em, libvlc_MediaPlayerTitleChanged, eventCallbacks, this);
|
||||
}
|
||||
|
||||
libvlc_video_set_callbacks(mLibVLCMediaPlayer, lock, unlock, display, &mLibVLCCallbackContext);
|
||||
libvlc_video_set_format(mLibVLCMediaPlayer, "RV32", mWidth, mHeight, mWidth * mDepth);
|
||||
|
||||
mLibVLCCallbackContext.parent = this;
|
||||
mLibVLCCallbackContext.texture_pixels = mPixels;
|
||||
mLibVLCCallbackContext.mp = mLibVLCMediaPlayer;
|
||||
|
|
@ -366,14 +350,11 @@ void MediaPluginLibVLC::playMedia()
|
|||
|
||||
setStatus(STATUS_LOADED);
|
||||
|
||||
libvlc_video_set_callbacks(mLibVLCMediaPlayer, lock, unlock, display, &mLibVLCCallbackContext);
|
||||
libvlc_video_set_format(mLibVLCMediaPlayer, "RV32", mWidth, mHeight, mWidth * mDepth);
|
||||
|
||||
// note this relies on the "set_loop" message arriving before the "start" (play) one
|
||||
// but that appears to always be the case
|
||||
if (mIsLooping)
|
||||
{
|
||||
libvlc_media_add_option(mLibVLCMedia, "input-repeat=-1");
|
||||
libvlc_media_add_option(mLibVLCMedia, "input-repeat=65535");
|
||||
}
|
||||
|
||||
libvlc_media_player_play(mLibVLCMediaPlayer);
|
||||
|
|
|
|||
|
|
@ -2185,8 +2185,8 @@ if (DARWIN)
|
|||
# SIGH, as of 2018-05-24 (cmake 3.11.1) the INSTALL_RPATH property simply
|
||||
# does not work. Try this:
|
||||
LINK_FLAGS "-rpath @loader_path/../Frameworks"
|
||||
MACOSX_BUNDLE_INFO_PLIST
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Info-SecondLife.plist"
|
||||
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info-SecondLife.plist"
|
||||
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${MACOSX_BUNDLE_GUI_IDENTIFIER}"
|
||||
)
|
||||
|
||||
set(VIEWER_APP_BUNDLE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app")
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
<key>CFBundleIconFile</key>
|
||||
<string>${MACOSX_BUNDLE_ICON_FILE}</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleLongVersionString</key>
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
6.4.24
|
||||
6.5.1
|
||||
|
|
|
|||
|
|
@ -1573,10 +1573,11 @@
|
|||
<key>Value</key>
|
||||
<real>1.0</real>
|
||||
</map>
|
||||
<key>CameraPreset</key> <!-- deprecated (see SL-12429) -->
|
||||
<key>CameraPreset</key>
|
||||
<!-- deprecated (see SL-12429) -->
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Preset camera position - view (0 - rear, 1 - front, 2 - group)</string>
|
||||
<string>(Deprecated) Preset camera position - view (0 - rear, 1 - front, 2 - group)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -2483,10 +2484,11 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>DEPRECATED: DebugShowPrivateMem</key> <!-- deprecated (see MAINT-8091) -->
|
||||
<key>DebugShowPrivateMem</key>
|
||||
<!-- deprecated (see MAINT-8091) -->
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show Private Mem Info</string>
|
||||
<string>(Deprecated) Show Private Mem Info</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -3726,6 +3728,17 @@
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnableCollisionSounds</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Play sounds on collision</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnableMouselook</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -5786,7 +5799,7 @@
|
|||
<key>LoginSRVPump</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Name of the message pump that handles SRV request (deprecated)</string>
|
||||
<string>(Deprecated) Name of the message pump that handles SRV request)</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -6597,10 +6610,11 @@
|
|||
<key>Value</key>
|
||||
<real>600.0</real>
|
||||
</map>
|
||||
<key>MemoryPrivatePoolEnabled</key> <!-- deprecated (see MAINT-8091) -->
|
||||
<key>MemoryPrivatePoolEnabled</key>
|
||||
<!-- deprecated (see MAINT-8091) -->
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>DEPRECATED: Enable the private memory pool management</string>
|
||||
<string>(Deprecated) Enable the private memory pool management</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -6608,10 +6622,11 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>MemoryPrivatePoolSize</key> <!-- deprecated (see MAINT-8091) -->
|
||||
<key>MemoryPrivatePoolSize</key>
|
||||
<!-- deprecated (see MAINT-8091) -->
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>DEPRECATED: Size of the private memory pool in MB (min. value is 256)</string>
|
||||
<string>(Deprecated) Size of the private memory pool in MB (min. value is 256)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -8315,7 +8330,7 @@
|
|||
<key>QAModeEventHostPort</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>DEPRECATED: Port on which lleventhost should listen</string>
|
||||
<string>(Deprecated) Port on which lleventhost should listen</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -12663,6 +12678,17 @@
|
|||
<key>Value</key>
|
||||
<integer>50</integer>
|
||||
</map>
|
||||
<key>TextureSaveLocation</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Current location for bulk saving textures to disk</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string />
|
||||
</map>
|
||||
<key>ThrottleBandwidthKBPS</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -14049,10 +14075,11 @@
|
|||
<key>Value</key>
|
||||
<string>Default</string>
|
||||
</map>
|
||||
<key>UseExternalBrowser</key> <!-- deprecated (see MAINT-4127) -->
|
||||
<key>UseExternalBrowser</key>
|
||||
<!-- deprecated (see MAINT-4127) -->
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Use default browser when opening web pages instead of in-world browser.</string>
|
||||
<string>(Deprecated) Use default browser when opening web pages instead of in-world browser.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -14447,6 +14474,7 @@
|
|||
<integer>0</integer>
|
||||
</map>
|
||||
<key>VoiceCallsFriendsOnly</key>
|
||||
<!-- deprecated (see SL-12871) -->
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>(Deprecated) Only accept voice calls from residents on your friends list</string>
|
||||
|
|
|
|||
|
|
@ -43,13 +43,13 @@ void default_lighting()
|
|||
{
|
||||
vec4 color = texture2D(diffuseMap,vary_texcoord0.xy);
|
||||
|
||||
color *= vertex_color;
|
||||
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
color *= vertex_color;
|
||||
|
||||
color.rgb = atmosLighting(color.rgb);
|
||||
|
||||
color.rgb = scaleSoftClip(color.rgb);
|
||||
|
|
|
|||
|
|
@ -43,13 +43,13 @@ void fullbright_lighting_water()
|
|||
{
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy);
|
||||
|
||||
color.rgb *= vertex_color.rgb;
|
||||
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
color.rgb *= vertex_color.rgb;
|
||||
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
|
||||
frag_color = applyWaterFog(color);
|
||||
|
|
|
|||
|
|
@ -41,13 +41,15 @@ VARYING vec2 vary_texcoord0;
|
|||
|
||||
void fullbright_lighting_water()
|
||||
{
|
||||
vec4 color = texture2D(diffuseMap, vary_texcoord0.xy) * vertex_color;
|
||||
vec4 color = texture2D(diffuseMap, vary_texcoord0.xy);
|
||||
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
color.rgb *= vertex_color.rgb;
|
||||
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
|
||||
frag_color = applyWaterFog(color);
|
||||
|
|
|
|||
|
|
@ -41,13 +41,13 @@ void default_lighting_water()
|
|||
{
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy);
|
||||
|
||||
color.rgb *= vertex_color.rgb;
|
||||
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
color.rgb *= vertex_color.rgb;
|
||||
|
||||
color.rgb = atmosLighting(color.rgb);
|
||||
|
||||
frag_color = applyWaterFog(color);
|
||||
|
|
|
|||
|
|
@ -43,13 +43,13 @@ void default_lighting_water()
|
|||
{
|
||||
vec4 color = texture2D(diffuseMap,vary_texcoord0.xy);
|
||||
|
||||
color.rgb *= vertex_color.rgb;
|
||||
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
color.rgb *= vertex_color.rgb;
|
||||
|
||||
color.rgb = atmosLighting(color.rgb);
|
||||
|
||||
color = applyWaterFog(color);
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
<command name="destinations"/>
|
||||
<command name="people"/>
|
||||
<command name="profile"/>
|
||||
<command name="map"/>
|
||||
<command name="move"/>
|
||||
<command name="view"/>
|
||||
<command name="howto"/>
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -638,7 +638,7 @@ Vivox SDK License
|
|||
|
||||
RSA Data Security, Inc. MD5 Message-Digest Algorithm
|
||||
|
||||
Audio coding: Polycom¨ Siren14TM (ITU-T Rec. G.722.1 Annex C)
|
||||
Audio coding: Polycom(R) Siren14TM (ITU-T Rec. G.722.1 Annex C)
|
||||
|
||||
Open Source Software Licensing
|
||||
Each open source software component utilized by this product is subject to its own copyright and licensing terms, as listed below.
|
||||
|
|
|
|||
|
|
@ -522,7 +522,7 @@ Vivox SDK License
|
|||
|
||||
RSA Data Security, Inc. MD5 Message-Digest Algorithm
|
||||
|
||||
Audio coding: Polycom¨ Siren14TM (ITU-T Rec. G.722.1 Annex C)
|
||||
Audio coding: Polycom(R) Siren14TM (ITU-T Rec. G.722.1 Annex C)
|
||||
|
||||
Open Source Software Licensing
|
||||
Each open source software component utilized by this product is subject to its own copyright and licensing terms, as listed below.
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ Logitech License
|
|||
|
||||
End-User License Agreement for Logitech LCD SDK
|
||||
|
||||
This End-User License Agreement for Logitech LCD SDK ( “Agreement”) is a legal agreement between you, either an individual or legal entity (“You” or “you”) and Logitech Inc. (“Logitech”) for use of the Logitech LCD software development kit, which includes computer software and related media and documentation (hereinafter “LCD SDK”). By using this LCD SDK, you are agreeing to be bound by the terms and conditions of this Agreement. If you do not agree to the terms and conditions of this Agreement, promptly return the LCD SDK and other items that are part of this product in their original package with your sales receipt to your point of purchase for a full refund, or if you have downloaded this software from a Logitech web site, then you must stop using the software and destroy any copies of the software in your possession or control.
|
||||
This End-User License Agreement for Logitech LCD SDK ( "Agreement") is a legal agreement between you, either an individual or legal entity ("You" or "you") and Logitech Inc. ("Logitech") for use of the Logitech LCD software development kit, which includes computer software and related media and documentation (hereinafter "LCD SDK"). By using this LCD SDK, you are agreeing to be bound by the terms and conditions of this Agreement. If you do not agree to the terms and conditions of this Agreement, promptly return the LCD SDK and other items that are part of this product in their original package with your sales receipt to your point of purchase for a full refund, or if you have downloaded this software from a Logitech web site, then you must stop using the software and destroy any copies of the software in your possession or control.
|
||||
|
||||
1 Grant of License and Restrictions.
|
||||
This Agreement grants You the following rights provided that You comply with all terms and conditions of this Agreement.
|
||||
|
|
@ -14,7 +14,7 @@ This Agreement grants You the following rights provided that You comply with all
|
|||
(d) In the event Logitech, in its sole discretion, elects to provide copies of the LCD SDK to more than one individual employed by You (if You are not a single individual), each such individual shall be entitled to exercise the rights granted in this Agreement and shall be bound by the terms and conditions herein.
|
||||
|
||||
2 Updates.
|
||||
Logitech is not obligated to provide technical support or updates to You for the LCD SDK provided to You pursuant to this Agreement. However, Logitech may, in its sole discretion, provide further pre-release versions, technical support, updates and/or supplements (“Updates”) to You, in which case such Updates shall be deemed to be included in the “LCD SDK” and shall be governed by this Agreement, unless other terms of use are provided in writing by Logitech with such Updates.
|
||||
Logitech is not obligated to provide technical support or updates to You for the LCD SDK provided to You pursuant to this Agreement. However, Logitech may, in its sole discretion, provide further pre-release versions, technical support, updates and/or supplements ("Updates") to You, in which case such Updates shall be deemed to be included in the "LCD SDK" and shall be governed by this Agreement, unless other terms of use are provided in writing by Logitech with such Updates.
|
||||
|
||||
3 Intellectual Property Rights.
|
||||
The LCD SDK is licensed, not sold, to You for use only under the terms and conditions of this Agreement. Logitech and its suppliers retain title to the LCD SDK and all intellectual property rights therein. The LCD SDK is protected by intellectual property laws and international treaties, including U.S. copyright law and international copyright treaties. All rights not expressly granted by Logitech are reserved.
|
||||
|
|
@ -23,7 +23,7 @@ The LCD SDK is licensed, not sold, to You for use only under the terms and condi
|
|||
TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, LOGITECH AND ITS SUPPLIERS PROVIDE THE LCD SDK AND OTHER LOGITECH PRODUCTS AND SERVICES (IF ANY) AS IS AND WITHOUT WARRANTY OF ANY KIND. LOGITECH AND ITS SUPPLIERS EXPRESSLY DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD-PARTY RIGHTS WITH RESPECT TO THE LCD SDK AND ANY WARRANTIES OF NON-INTERFERENCE OR ACCURACY OF INFORMATIONAL CONTENT. NO LOGITECH DEALER, AGENT, OR EMPLOYEE IS AUTHORIZED TO MAKE ANY MODIFICATION, EXTENSION, OR ADDITION TO THIS WARRANTY. Some jurisdictions do not allow limitations on how long an implied warranty lasts, so the above limitation may not apply to you.
|
||||
|
||||
5 Limitation of Liability.
|
||||
IN NO EVENT WILL LOGITECH OR ITS SUPPLIERS BE LIABLE FOR ANY COSTS OF PROCUREMENT OF SUBSTITUTE PRODUCTS OR SERVICES, LOST PROFITS, LOSS OF INFORMATION OR DATA, OR ANY OTHER SPECIAL, INDIRECT, CONSEQUENTIAL, OR INCIDENTAL DAMAGES ARISING IN ANY WAY OUT OF THE SALE OF, USE OF, OR INABILITY TO USE THE LCD SDK OR ANY LOGITECH PRODUCT OR SERVICE, EVEN IF LOGITECH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN NO CASE SHALL LOGITECH'S AND ITS SUPPLIERS’ TOTAL LIABILITY EXCEED THE ACTUAL MONEY PAID FOR THE LOGITECH PRODUCT OR SERVICE GIVING RISE TO THE LIABILITY. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so the above limitation or exclusion may not apply to you. The above limitations will not apply in case of personal injury where and to the extent that applicable law requires such liability.
|
||||
IN NO EVENT WILL LOGITECH OR ITS SUPPLIERS BE LIABLE FOR ANY COSTS OF PROCUREMENT OF SUBSTITUTE PRODUCTS OR SERVICES, LOST PROFITS, LOSS OF INFORMATION OR DATA, OR ANY OTHER SPECIAL, INDIRECT, CONSEQUENTIAL, OR INCIDENTAL DAMAGES ARISING IN ANY WAY OUT OF THE SALE OF, USE OF, OR INABILITY TO USE THE LCD SDK OR ANY LOGITECH PRODUCT OR SERVICE, EVEN IF LOGITECH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN NO CASE SHALL LOGITECH'S AND ITS SUPPLIERS' TOTAL LIABILITY EXCEED THE ACTUAL MONEY PAID FOR THE LOGITECH PRODUCT OR SERVICE GIVING RISE TO THE LIABILITY. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so the above limitation or exclusion may not apply to you. The above limitations will not apply in case of personal injury where and to the extent that applicable law requires such liability.
|
||||
|
||||
6 U.S. Government Rights.
|
||||
Use, duplication, or disclosure of the software contained in the LCD SDK by the U.S. Government is subject to restrictions set forth in this Agreement and as provided in DFARS 227.7202-1(a) and 227.7202-3(a) (1995), DFARS 252.227-7013(c)(1)(ii) (OCT 1988) FAR 12.212(a) (1995), FAR 52.227-19, or FAR 52.227-14 (ALT III), as applicable. Logitech Inc. 6505 Kaiser Drive, Fremont, CA 94555.
|
||||
|
|
@ -564,7 +564,7 @@ Vivox SDK License
|
|||
|
||||
RSA Data Security, Inc. MD5 Message-Digest Algorithm
|
||||
|
||||
Audio coding: Polycom¨ Siren14TM (ITU-T Rec. G.722.1 Annex C)
|
||||
Audio coding: Polycom(R) Siren14TM (ITU-T Rec. G.722.1 Annex C)
|
||||
|
||||
Open Source Software Licensing
|
||||
Each open source software component utilized by this product is subject to its own copyright and licensing terms, as listed below.
|
||||
|
|
|
|||
|
|
@ -1049,13 +1049,14 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
|
|||
}
|
||||
|
||||
// updating inventory
|
||||
LLWearableType* wearable_type_inst = LLWearableType::getInstance();
|
||||
|
||||
// TODO: Removed check for ensuring that teens don't remove undershirt and underwear. Handle later
|
||||
// note: shirt is the first non-body part wearable item. Update if wearable order changes.
|
||||
// This loop should remove all clothing, but not any body parts
|
||||
for (S32 j = 0; j < (S32)LLWearableType::WT_COUNT; j++)
|
||||
{
|
||||
if (LLWearableType::getAssetType((LLWearableType::EType)j) == LLAssetType::AT_CLOTHING)
|
||||
if (wearable_type_inst->getAssetType((LLWearableType::EType)j) == LLAssetType::AT_CLOTHING)
|
||||
{
|
||||
removeWearable((LLWearableType::EType)j, true, 0);
|
||||
}
|
||||
|
|
@ -1075,7 +1076,7 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
|
|||
new_wearable->setName(new_item->getName());
|
||||
new_wearable->setItemID(new_item->getUUID());
|
||||
|
||||
if (LLWearableType::getAssetType(type) == LLAssetType::AT_BODYPART)
|
||||
if (wearable_type_inst->getAssetType(type) == LLAssetType::AT_BODYPART)
|
||||
{
|
||||
// exactly one wearable per body part
|
||||
setWearable(type,0,new_wearable);
|
||||
|
|
@ -1162,7 +1163,7 @@ void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLViewerWearab
|
|||
if ((old_wearable->getAssetID() == new_wearable->getAssetID()) &&
|
||||
(old_item_id == new_item->getUUID()))
|
||||
{
|
||||
LL_DEBUGS() << "No change to wearable asset and item: " << LLWearableType::getTypeName(type) << LL_ENDL;
|
||||
LL_DEBUGS() << "No change to wearable asset and item: " << LLWearableType::getInstance()->getTypeName(type) << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1594,7 +1595,7 @@ void LLAgentWearables::editWearable(const LLUUID& item_id)
|
|||
return;
|
||||
}
|
||||
|
||||
const BOOL disable_camera_switch = LLWearableType::getDisableCameraSwitch(wearable->getType());
|
||||
const BOOL disable_camera_switch = LLWearableType::getInstance()->getDisableCameraSwitch(wearable->getType());
|
||||
LLPanel* panel = LLFloaterSidePanelContainer::getPanel("appearance");
|
||||
LLSidepanelAppearance::editWearable(wearable, panel, disable_camera_switch);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -271,20 +271,13 @@ void LLAppCoreHttp::init()
|
|||
<< LL_ENDL;
|
||||
}
|
||||
|
||||
// Signal for global pipelining preference from settings
|
||||
// Global pipelining setting
|
||||
static const std::string http_pipelining("HttpPipelining");
|
||||
if (gSavedSettings.controlExists(http_pipelining))
|
||||
{
|
||||
LLPointer<LLControlVariable> cntrl_ptr = gSavedSettings.getControl(http_pipelining);
|
||||
if (cntrl_ptr.isNull())
|
||||
{
|
||||
LL_WARNS("Init") << "Unable to set signal on global setting '" << http_pipelining
|
||||
<< "'" << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
mPipelinedSignal = cntrl_ptr->getCommitSignal()->connect(boost::bind(&setting_changed));
|
||||
}
|
||||
// Default to true (in ctor) if absent.
|
||||
mPipelined = gSavedSettings.getBOOL(http_pipelining);
|
||||
LL_INFOS("Init") << "HTTP Pipelining " << (mPipelined ? "enabled" : "disabled") << "!" << LL_ENDL;
|
||||
}
|
||||
|
||||
// Register signals for settings and state changes
|
||||
|
|
@ -398,21 +391,6 @@ void LLAppCoreHttp::refreshSettings(bool initial)
|
|||
{
|
||||
LLCore::HttpStatus status;
|
||||
|
||||
// Global pipelining setting
|
||||
bool pipeline_changed(false);
|
||||
static const std::string http_pipelining("HttpPipelining");
|
||||
if (gSavedSettings.controlExists(http_pipelining))
|
||||
{
|
||||
// Default to true (in ctor) if absent.
|
||||
bool pipelined(gSavedSettings.getBOOL(http_pipelining));
|
||||
if (pipelined != mPipelined)
|
||||
{
|
||||
mPipelined = pipelined;
|
||||
pipeline_changed = true;
|
||||
}
|
||||
LL_INFOS("Init") << "HTTP Pipelining " << (mPipelined ? "enabled" : "disabled") << "!" << LL_ENDL;
|
||||
}
|
||||
|
||||
for (int i(0); i < LL_ARRAY_SIZE(init_data); ++i)
|
||||
{
|
||||
const EAppPolicy app_policy(static_cast<EAppPolicy>(i));
|
||||
|
|
@ -441,7 +419,7 @@ void LLAppCoreHttp::refreshSettings(bool initial)
|
|||
// Init- or run-time settings. Must use the queued request API.
|
||||
|
||||
// Pipelining changes
|
||||
if (initial || pipeline_changed)
|
||||
if (initial)
|
||||
{
|
||||
const bool to_pipeline(mPipelined && init_data[i].mPipelined);
|
||||
if (to_pipeline != mHttpClasses[app_policy].mPipelined)
|
||||
|
|
@ -484,7 +462,7 @@ void LLAppCoreHttp::refreshSettings(bool initial)
|
|||
}
|
||||
}
|
||||
|
||||
if (initial || setting != mHttpClasses[app_policy].mConnLimit || pipeline_changed)
|
||||
if (initial || setting != mHttpClasses[app_policy].mConnLimit)
|
||||
{
|
||||
// Set it and report. Strategies depend on pipelining:
|
||||
//
|
||||
|
|
|
|||
|
|
@ -301,6 +301,12 @@ struct AttachmentInfo
|
|||
AttachmentInfo(metadata.staticDebugPathname, "text/xml")
|
||||
};
|
||||
|
||||
secondLogPath = metadata.secondLogFilePathname;
|
||||
if(!secondLogPath.empty())
|
||||
{
|
||||
info.push_back(AttachmentInfo(secondLogPath, "text/xml"));
|
||||
}
|
||||
|
||||
// We "happen to know" that info[0].basename is "SecondLife.old" -- due to
|
||||
// the fact that BugsplatMac only notices a crash during the viewer run
|
||||
// following the crash.
|
||||
|
|
@ -339,6 +345,12 @@ struct AttachmentInfo
|
|||
- (void)bugsplatStartupManagerDidFinishSendingCrashReport:(BugsplatStartupManager *)bugsplatStartupManager
|
||||
{
|
||||
infos("Sent crash report to BugSplat");
|
||||
|
||||
if(!secondLogPath.empty())
|
||||
{
|
||||
boost::filesystem::remove(secondLogPath);
|
||||
}
|
||||
clearDumpLogsDir();
|
||||
}
|
||||
|
||||
- (void)bugsplatStartupManager:(BugsplatStartupManager *)bugsplatStartupManager didFailWithError:(NSError *)error
|
||||
|
|
|
|||
|
|
@ -957,7 +957,7 @@ void recovered_item_link_cb(const LLUUID& item_id, LLWearableType::EType type, L
|
|||
// runway skip here?
|
||||
}
|
||||
|
||||
LL_INFOS() << "HP " << holder->index() << " recovered item link for type " << type << LL_ENDL;
|
||||
LL_INFOS("Avatar") << "HP " << holder->index() << " recovered item link for type " << type << LL_ENDL;
|
||||
holder->eraseTypeToLink(type);
|
||||
// Add wearable to FoundData for actual wearing
|
||||
LLViewerInventoryItem *item = gInventory.getItem(item_id);
|
||||
|
|
@ -1021,8 +1021,8 @@ void LLWearableHoldingPattern::recoverMissingWearable(LLWearableType::EType type
|
|||
|
||||
// Try to recover by replacing missing wearable with a new one.
|
||||
LLNotificationsUtil::add("ReplacedMissingWearable");
|
||||
LL_DEBUGS() << "Wearable " << LLWearableType::getTypeLabel(type)
|
||||
<< " could not be downloaded. Replaced inventory item with default wearable." << LL_ENDL;
|
||||
LL_DEBUGS("Avatar") << "Wearable of type '" << LLWearableType::getInstance()->getTypeName(type)
|
||||
<< "' could not be downloaded. Replaced inventory item with default wearable." << LL_ENDL;
|
||||
LLViewerWearable* wearable = LLWearableList::instance().createNewWearable(type, gAgentAvatarp);
|
||||
|
||||
// Add a new one in the lost and found folder.
|
||||
|
|
@ -2347,6 +2347,52 @@ void LLAppearanceMgr::enforceCOFItemRestrictions(LLPointer<LLInventoryCallback>
|
|||
}
|
||||
}
|
||||
|
||||
bool sort_by_linked_uuid(const LLViewerInventoryItem* item1, const LLViewerInventoryItem* item2)
|
||||
{
|
||||
if (!item1 || !item2)
|
||||
{
|
||||
LL_WARNS() << "item1, item2 cannot be null, something is very wrong" << LL_ENDL;
|
||||
return true;
|
||||
}
|
||||
|
||||
return item1->getLinkedUUID() < item2->getLinkedUUID();
|
||||
}
|
||||
|
||||
void get_sorted_base_and_cof_items(LLInventoryModel::item_array_t& cof_item_array, LLInventoryModel::item_array_t& outfit_item_array)
|
||||
{
|
||||
LLUUID base_outfit_id = LLAppearanceMgr::instance().getBaseOutfitUUID();
|
||||
|
||||
if (base_outfit_id.notNull())
|
||||
{
|
||||
LLIsValidItemLink collector;
|
||||
LLInventoryModel::cat_array_t sub_cat_array;
|
||||
|
||||
gInventory.collectDescendents(base_outfit_id,
|
||||
sub_cat_array,
|
||||
outfit_item_array,
|
||||
LLInventoryModel::EXCLUDE_TRASH);
|
||||
|
||||
LLInventoryModel::cat_array_t cof_cats;
|
||||
|
||||
gInventory.collectDescendentsIf(LLAppearanceMgr::instance().getCOF(), cof_cats, cof_item_array,
|
||||
LLInventoryModel::EXCLUDE_TRASH, collector);
|
||||
|
||||
for (U32 i = 0; i < outfit_item_array.size(); ++i)
|
||||
{
|
||||
LLViewerInventoryItem* linked_item = outfit_item_array.at(i)->getLinkedItem();
|
||||
if (linked_item != NULL && linked_item->getActualType() == LLAssetType::AT_TEXTURE)
|
||||
{
|
||||
outfit_item_array.erase(outfit_item_array.begin() + i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
std::sort(cof_item_array.begin(), cof_item_array.end(), sort_by_linked_uuid);
|
||||
std::sort(outfit_item_array.begin(), outfit_item_array.end(), sort_by_linked_uuid);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LLAppearanceMgr::updateAppearanceFromCOF(bool enforce_item_restrictions,
|
||||
bool enforce_ordering,
|
||||
nullary_func_t post_update_func)
|
||||
|
|
@ -2388,7 +2434,30 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool enforce_item_restrictions,
|
|||
|
||||
if (!validateClothingOrderingInfo())
|
||||
{
|
||||
LL_WARNS() << "Clothing ordering error" << LL_ENDL;
|
||||
|
||||
LLInventoryModel::item_array_t outfit_item_array;
|
||||
LLInventoryModel::item_array_t cof_item_array;
|
||||
get_sorted_base_and_cof_items(cof_item_array, outfit_item_array);
|
||||
|
||||
if (outfit_item_array.size() == cof_item_array.size())
|
||||
{
|
||||
for (U32 i = 0; i < cof_item_array.size(); ++i)
|
||||
{
|
||||
LLViewerInventoryItem *cof_it = cof_item_array.at(i);
|
||||
LLViewerInventoryItem *base_it = outfit_item_array.at(i);
|
||||
|
||||
if (cof_it->getActualDescription() != base_it->getActualDescription())
|
||||
{
|
||||
if (cof_it->getLinkedUUID() == base_it->getLinkedUUID())
|
||||
{
|
||||
cof_it->setDescription(base_it->getActualDescription());
|
||||
gInventory.updateItem(cof_it);
|
||||
}
|
||||
}
|
||||
}
|
||||
LLAppearanceMgr::getInstance()->updateIsDirty();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
BoolSetter setIsInUpdateAppearanceFromCOF(mIsInUpdateAppearanceFromCOF);
|
||||
|
|
@ -3017,17 +3086,6 @@ void LLAppearanceMgr::removeCOFLinksOfType(LLWearableType::EType type, LLPointer
|
|||
}
|
||||
}
|
||||
|
||||
bool sort_by_linked_uuid(const LLViewerInventoryItem* item1, const LLViewerInventoryItem* item2)
|
||||
{
|
||||
if (!item1 || !item2)
|
||||
{
|
||||
LL_WARNS() << "item1, item2 cannot be null, something is very wrong" << LL_ENDL;
|
||||
return true;
|
||||
}
|
||||
|
||||
return item1->getLinkedUUID() < item2->getLinkedUUID();
|
||||
}
|
||||
|
||||
void LLAppearanceMgr::updateIsDirty()
|
||||
{
|
||||
LLUUID cof = getCOF();
|
||||
|
|
@ -4267,6 +4325,17 @@ public:
|
|||
}
|
||||
virtual void done()
|
||||
{
|
||||
if (mComplete.size() <= 0)
|
||||
{
|
||||
// Ex: timeout
|
||||
LL_WARNS() << "Failed to load data. Removing observer " << LL_ENDL;
|
||||
gInventory.removeObserver(this);
|
||||
doOnIdleOneTime(mCallable);
|
||||
|
||||
delete this;
|
||||
return;
|
||||
}
|
||||
|
||||
// What we do here is get the complete information on the
|
||||
// items in the requested category, and set up an observer
|
||||
// that will wait for that to happen.
|
||||
|
|
|
|||
|
|
@ -715,8 +715,6 @@ LLAppViewer::LLAppViewer()
|
|||
|
||||
gLoggedInTime.stop();
|
||||
|
||||
initLoggingAndGetLastDuration();
|
||||
|
||||
processMarkerFiles();
|
||||
//
|
||||
// OK to write stuff to logs now, we've now crash reported if necessary
|
||||
|
|
@ -769,10 +767,6 @@ bool LLAppViewer::init()
|
|||
// Start of the application
|
||||
//
|
||||
|
||||
// initialize LLWearableType translation bridge.
|
||||
// Memory will be cleaned up in ::cleanupClass()
|
||||
LLWearableType::initParamSingleton(new LLUITranslationBridge());
|
||||
|
||||
// initialize the LLSettingsType translation bridge.
|
||||
LLTranslationBridge::ptr_t trans = std::make_shared<LLUITranslationBridge>();
|
||||
LLSettingsType::initParamSingleton(trans);
|
||||
|
|
@ -794,6 +788,7 @@ bool LLAppViewer::init()
|
|||
//
|
||||
init_default_trans_args();
|
||||
|
||||
// inits from settings.xml and from strings.xml
|
||||
if (!initConfiguration())
|
||||
return false;
|
||||
|
||||
|
|
@ -860,6 +855,10 @@ bool LLAppViewer::init()
|
|||
// Setup LLTrans after LLUI::initClass has been called.
|
||||
initStrings();
|
||||
|
||||
// initialize LLWearableType translation bridge.
|
||||
// Will immediately use LLTranslationBridge to init LLWearableDictionary
|
||||
LLWearableType::initParamSingleton(trans);
|
||||
|
||||
// Setup notifications after LLUI::initClass() has been called.
|
||||
LLNotifications::instance();
|
||||
LL_INFOS("InitInfo") << "Notifications initialized." << LL_ENDL ;
|
||||
|
|
@ -1098,8 +1097,15 @@ bool LLAppViewer::init()
|
|||
if (count > 0 && v1 <= 10)
|
||||
{
|
||||
LL_INFOS("AppInit") << "Detected obsolete intel driver: " << driver << LL_ENDL;
|
||||
|
||||
if (!gViewerWindow->getInitAlert().empty() // graphic initialization crashed on last run
|
||||
|| LLVersionInfo::getInstance()->getChannelAndVersion() != gLastRunVersion // viewer was updated
|
||||
|| mNumSessions % 20 == 0 //periodically remind user to update driver
|
||||
)
|
||||
{
|
||||
LLUIString details = LLNotifications::instance().getGlobalString("UnsupportedIntelDriver");
|
||||
std::string gpu_name = ll_safe_string((const char *)glGetString(GL_RENDERER));
|
||||
LL_INFOS("AppInit") << "Notifying user about obsolete intel driver for " << gpu_name << LL_ENDL;
|
||||
details.setArg("[VERSION]", driver);
|
||||
details.setArg("[GPUNAME]", gpu_name);
|
||||
S32 button = OSMessageBox(details.getString(),
|
||||
|
|
@ -1116,6 +1122,7 @@ bool LLAppViewer::init()
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Obsolete? mExpectedGLVersion is always zero
|
||||
|
|
@ -1326,6 +1333,13 @@ bool LLAppViewer::init()
|
|||
LLSelectMgr::createInstance();
|
||||
LLViewerCamera::createInstance();
|
||||
|
||||
#if LL_WINDOWS
|
||||
if (!mSecondInstance)
|
||||
{
|
||||
gDirUtilp->deleteDirAndContents(gDirUtilp->getDumpLogsDirPath());
|
||||
}
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -1525,6 +1539,12 @@ bool LLAppViewer::doFrame()
|
|||
{
|
||||
pauseMainloopTimeout();
|
||||
saveFinalSnapshot();
|
||||
|
||||
if (LLVoiceClient::instanceExists())
|
||||
{
|
||||
LLVoiceClient::getInstance()->terminate();
|
||||
}
|
||||
|
||||
disconnectViewer();
|
||||
resumeMainloopTimeout();
|
||||
}
|
||||
|
|
@ -2286,6 +2306,17 @@ void LLAppViewer::initLoggingAndGetLastDuration()
|
|||
LLError::addGenericRecorder(&errorCallback);
|
||||
//LLError::setTimeFunction(getRuntime);
|
||||
|
||||
|
||||
if (mSecondInstance)
|
||||
{
|
||||
LLFile::mkdir(gDirUtilp->getDumpLogsDirPath());
|
||||
|
||||
LLUUID uid;
|
||||
uid.generate();
|
||||
LLError::logToFile(gDirUtilp->getDumpLogsDirPath(uid.asString() + ".log"));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Remove the last ".old" log file.
|
||||
std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
|
||||
"SecondLife.old");
|
||||
|
|
@ -2347,6 +2378,7 @@ void LLAppViewer::initLoggingAndGetLastDuration()
|
|||
LL_WARNS("MarkerFile") << duration_log_msg << LL_ENDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
|
||||
bool set_defaults)
|
||||
|
|
@ -3150,6 +3182,15 @@ bool LLAppViewer::initWindow()
|
|||
|
||||
void LLAppViewer::writeDebugInfo(bool isStatic)
|
||||
{
|
||||
#if LL_WINDOWS && LL_BUGSPLAT
|
||||
// bugsplat does not create dump folder and debug logs are written directly
|
||||
// to logs folder, so it conflicts with main instance
|
||||
if (mSecondInstance)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
//Try to do the minimum when writing data during a crash.
|
||||
std::string* debug_filename;
|
||||
debug_filename = ( isStatic
|
||||
|
|
@ -3478,7 +3519,7 @@ void LLAppViewer::writeSystemInfo()
|
|||
if (! gDebugInfo.has("Dynamic") )
|
||||
gDebugInfo["Dynamic"] = LLSD::emptyMap();
|
||||
|
||||
#if LL_WINDOWS
|
||||
#if LL_WINDOWS && !LL_BUGSPLAT
|
||||
gDebugInfo["SLLog"] = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,"SecondLife.log");
|
||||
#else
|
||||
//Not ideal but sufficient for good reporting.
|
||||
|
|
@ -3822,6 +3863,7 @@ void LLAppViewer::processMarkerFiles()
|
|||
// - Other Crash (SecondLife.error_marker present)
|
||||
// These checks should also remove these files for the last 2 cases if they currently exist
|
||||
|
||||
std::ostringstream marker_log_stream;
|
||||
bool marker_is_same_version = true;
|
||||
// first, look for the marker created at startup and deleted on a clean exit
|
||||
mMarkerFileName = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,MARKER_FILE_NAME);
|
||||
|
|
@ -3832,12 +3874,12 @@ void LLAppViewer::processMarkerFiles()
|
|||
marker_is_same_version = markerIsSameVersion(mMarkerFileName);
|
||||
|
||||
// now test to see if this file is locked by a running process (try to open for write)
|
||||
LL_DEBUGS("MarkerFile") << "Checking exec marker file for lock..." << LL_ENDL;
|
||||
marker_log_stream << "Checking exec marker file for lock...";
|
||||
mMarkerFile.open(mMarkerFileName, LL_APR_WB);
|
||||
apr_file_t* fMarker = mMarkerFile.getFileHandle() ;
|
||||
if (!fMarker)
|
||||
{
|
||||
LL_INFOS("MarkerFile") << "Exec marker file open failed - assume it is locked." << LL_ENDL;
|
||||
marker_log_stream << "Exec marker file open failed - assume it is locked.";
|
||||
mSecondInstance = true; // lock means that instance is running.
|
||||
}
|
||||
else
|
||||
|
|
@ -3845,16 +3887,20 @@ void LLAppViewer::processMarkerFiles()
|
|||
// We were able to open it, now try to lock it ourselves...
|
||||
if (apr_file_lock(fMarker, APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE) != APR_SUCCESS)
|
||||
{
|
||||
LL_WARNS_ONCE("MarkerFile") << "Locking exec marker failed." << LL_ENDL;
|
||||
marker_log_stream << "Locking exec marker failed.";
|
||||
mSecondInstance = true; // lost a race? be conservative
|
||||
}
|
||||
else
|
||||
{
|
||||
// No other instances; we've locked this file now, so record our version; delete on quit.
|
||||
recordMarkerVersion(mMarkerFile);
|
||||
LL_DEBUGS("MarkerFile") << "Exec marker file existed but was not locked; rewritten." << LL_ENDL;
|
||||
marker_log_stream << "Exec marker file existed but was not locked; rewritten.";
|
||||
}
|
||||
}
|
||||
initLoggingAndGetLastDuration();
|
||||
|
||||
std::string marker_log_msg(marker_log_stream.str());
|
||||
LL_INFOS("MarkerFile") << marker_log_msg << LL_ENDL;
|
||||
|
||||
if (mSecondInstance)
|
||||
{
|
||||
|
|
@ -3873,6 +3919,7 @@ void LLAppViewer::processMarkerFiles()
|
|||
}
|
||||
else // marker did not exist... last exec (if any) did not freeze
|
||||
{
|
||||
initLoggingAndGetLastDuration();
|
||||
// Create the marker file for this execution & lock it; it will be deleted on a clean exit
|
||||
apr_status_t s;
|
||||
s = mMarkerFile.open(mMarkerFileName, LL_APR_WB, TRUE);
|
||||
|
|
@ -3998,10 +4045,20 @@ void LLAppViewer::removeDumpDir()
|
|||
{
|
||||
//Call this routine only on clean exit. Crash reporter will clean up
|
||||
//its locking table for us.
|
||||
if (gDirUtilp->dumpDirExists()) // Check if dump dir was created this run
|
||||
{
|
||||
std::string dump_dir = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, "");
|
||||
gDirUtilp->deleteDirAndContents(dump_dir);
|
||||
}
|
||||
|
||||
if (mSecondInstance && !isError())
|
||||
{
|
||||
std::string log_filename = LLError::logFileName();
|
||||
LLError::logToFile("");
|
||||
LLFile::remove(log_filename);
|
||||
}
|
||||
}
|
||||
|
||||
void LLAppViewer::forceQuit()
|
||||
{
|
||||
LLApp::setQuitting();
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ bool pumpMainLoop();
|
|||
void handleQuit();
|
||||
void cleanupViewer();
|
||||
void infos(const std::string& message);
|
||||
void clearDumpLogsDir();
|
||||
|
||||
// This struct is malleable; it only serves as a way to convey a number of
|
||||
// fields from llappviewermacosx.cpp's CrashMetadata_instance() function to the
|
||||
|
|
@ -47,6 +48,7 @@ struct CrashMetadata
|
|||
std::string agentFullname;
|
||||
std::string regionName;
|
||||
std::string fatalMessage;
|
||||
std::string secondLogFilePathname;
|
||||
};
|
||||
|
||||
CrashMetadata& CrashMetadata_instance();
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@
|
|||
#include <fstream>
|
||||
|
||||
#include "lldir.h"
|
||||
#include "lldiriterator.h"
|
||||
#include <signal.h>
|
||||
#include <CoreAudio/CoreAudio.h> // for systemwide mute
|
||||
class LLMediaCtrl; // for LLURLDispatcher
|
||||
|
|
@ -136,6 +137,14 @@ void cleanupViewer()
|
|||
gViewerAppPtr = NULL;
|
||||
}
|
||||
|
||||
void clearDumpLogsDir()
|
||||
{
|
||||
if (!LLAppViewer::instance()->isSecondInstance())
|
||||
{
|
||||
gDirUtilp->deleteDirAndContents(gDirUtilp->getDumpLogsDirPath());
|
||||
}
|
||||
}
|
||||
|
||||
// The BugsplatMac API is structured as a number of different method
|
||||
// overrides, each returning a different piece of metadata. But since we
|
||||
// obtain such metadata by opening and parsing a file, it seems ridiculous to
|
||||
|
|
@ -190,6 +199,24 @@ CrashMetadataSingleton::CrashMetadataSingleton()
|
|||
LLStringUtil::replaceChar(agentFullname, '_', ' ');
|
||||
regionName = get_metadata(info, "CurrentRegion");
|
||||
fatalMessage = get_metadata(info, "FatalMessage");
|
||||
|
||||
if (gDirUtilp->fileExists(gDirUtilp->getDumpLogsDirPath()))
|
||||
{
|
||||
LLDirIterator file_iter(gDirUtilp->getDumpLogsDirPath(), "*.log");
|
||||
std::string file_name;
|
||||
bool found = true;
|
||||
while(found)
|
||||
{
|
||||
if((found = file_iter.next(file_name)))
|
||||
{
|
||||
std::string log_filename = gDirUtilp->getDumpLogsDirPath(file_name);
|
||||
if(LLError::logFileName() != log_filename)
|
||||
{
|
||||
secondLogFilePathname = log_filename;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -118,17 +118,23 @@ namespace
|
|||
{
|
||||
if (nCode == MDSCB_EXCEPTIONCODE)
|
||||
{
|
||||
// send the main viewer log file
|
||||
// send the main viewer log file, one per instance
|
||||
// widen to wstring, convert to __wchar_t, then pass c_str()
|
||||
sBugSplatSender->sendAdditionalFile(
|
||||
WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife.log")));
|
||||
WCSTR(LLError::logFileName()));
|
||||
|
||||
// second instance does not have some log files
|
||||
// TODO: This needs fixing, if each instance now has individual logs,
|
||||
// same should be made true for static debug files
|
||||
if (!LLAppViewer::instance()->isSecondInstance())
|
||||
{
|
||||
sBugSplatSender->sendAdditionalFile(
|
||||
WCSTR(*LLAppViewer::instance()->getStaticDebugFile()));
|
||||
}
|
||||
|
||||
sBugSplatSender->sendAdditionalFile(
|
||||
WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "settings.xml")));
|
||||
|
||||
sBugSplatSender->sendAdditionalFile(
|
||||
WCSTR(*LLAppViewer::instance()->getStaticDebugFile()));
|
||||
|
||||
// We don't have an email address for any user. Hijack this
|
||||
// metadata field for the platform identifier.
|
||||
sBugSplatSender->setDefaultUserEmail(
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ protected:
|
|||
}
|
||||
|
||||
// Set proper label for the "Create new <WEARABLE_TYPE>" menu item.
|
||||
std::string new_label = LLTrans::getString("create_new_" + LLWearableType::getTypeName(w_type));
|
||||
std::string new_label = LLTrans::getString("create_new_" + LLWearableType::getInstance()->getTypeName(w_type));
|
||||
menu_item->setLabel(new_label);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2103,7 +2103,15 @@ void LLEnvironment::coroUpdateEnvironment(S32 parcel_id, S32 track_no, UpdateInf
|
|||
LL_WARNS("ENVIRONMENT") << "Couldn't update Windlight settings for " << ((parcel_id == INVALID_PARCEL_ID) ? ("region!") : ("parcel!")) << LL_ENDL;
|
||||
|
||||
notify = LLSD::emptyMap();
|
||||
notify["FAIL_REASON"] = result["message"].asString();
|
||||
std::string reason = result["message"].asString();
|
||||
if (reason.empty())
|
||||
{
|
||||
notify["FAIL_REASON"] = status.toString();
|
||||
}
|
||||
else
|
||||
{
|
||||
notify["FAIL_REASON"] = reason;
|
||||
}
|
||||
}
|
||||
else if (LLApp::isExiting())
|
||||
{
|
||||
|
|
@ -2169,7 +2177,15 @@ void LLEnvironment::coroResetEnvironment(S32 parcel_id, S32 track_no, environmen
|
|||
LL_WARNS("ENVIRONMENT") << "Couldn't reset Windlight settings in " << ((parcel_id == INVALID_PARCEL_ID) ? ("region!") : ("parcel!")) << LL_ENDL;
|
||||
|
||||
notify = LLSD::emptyMap();
|
||||
notify["FAIL_REASON"] = result["message"].asString();
|
||||
std::string reason = result["message"].asString();
|
||||
if (reason.empty())
|
||||
{
|
||||
notify["FAIL_REASON"] = status.toString();
|
||||
}
|
||||
else
|
||||
{
|
||||
notify["FAIL_REASON"] = reason;
|
||||
}
|
||||
}
|
||||
else if (LLApp::isExiting())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ namespace LLEventPolling
|
|||
namespace Details
|
||||
{
|
||||
|
||||
class LLEventPollImpl: public boost::enable_shared_from_this<LLEventPollImpl>
|
||||
class LLEventPollImpl: public std::enable_shared_from_this<LLEventPollImpl>
|
||||
{
|
||||
public:
|
||||
LLEventPollImpl(const LLHost &sender);
|
||||
|
|
@ -284,7 +284,7 @@ namespace Details
|
|||
LLEventPoll::LLEventPoll(const std::string& poll_url, const LLHost& sender):
|
||||
mImpl()
|
||||
{
|
||||
mImpl = boost::make_shared<LLEventPolling::Details::LLEventPollImpl>(sender);
|
||||
mImpl = std::make_shared<LLEventPolling::Details::LLEventPollImpl>(sender);
|
||||
mImpl->start(poll_url);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ public:
|
|||
|
||||
|
||||
private:
|
||||
boost::shared_ptr<LLEventPolling::Details::LLEventPollImpl> mImpl;
|
||||
std::shared_ptr<LLEventPolling::Details::LLEventPollImpl> mImpl;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -682,8 +682,12 @@ void LLFavoritesBarCtrl::changed(U32 mask)
|
|||
//virtual
|
||||
void LLFavoritesBarCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
|
||||
{
|
||||
S32 delta_width = width - getRect().getWidth();
|
||||
S32 delta_height = height - getRect().getHeight();
|
||||
|
||||
bool force_update = delta_width || delta_height || sForceReshape;
|
||||
LLUICtrl::reshape(width, height, called_from_parent);
|
||||
updateButtons();
|
||||
updateButtons(force_update);
|
||||
}
|
||||
|
||||
void LLFavoritesBarCtrl::draw()
|
||||
|
|
@ -746,8 +750,13 @@ const LLButton::Params& LLFavoritesBarCtrl::getButtonParams()
|
|||
return button_params;
|
||||
}
|
||||
|
||||
void LLFavoritesBarCtrl::updateButtons()
|
||||
void LLFavoritesBarCtrl::updateButtons(bool force_update)
|
||||
{
|
||||
if (LLApp::isExiting())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
mItems.clear();
|
||||
|
||||
if (!collectFavoriteItems(mItems))
|
||||
|
|
@ -778,7 +787,8 @@ void LLFavoritesBarCtrl::updateButtons()
|
|||
const child_list_t* childs = getChildList();
|
||||
child_list_const_iter_t child_it = childs->begin();
|
||||
int first_changed_item_index = 0;
|
||||
int rightest_point = getRect().mRight - mMoreTextBox->getRect().getWidth();
|
||||
if (!force_update)
|
||||
{
|
||||
//lets find first changed button
|
||||
while (child_it != childs->end() && first_changed_item_index < mItems.size())
|
||||
{
|
||||
|
|
@ -790,8 +800,7 @@ void LLFavoritesBarCtrl::updateButtons()
|
|||
{
|
||||
// an child's order and mItems should be same
|
||||
if (button->getLandmarkId() != item->getUUID() // sort order has been changed
|
||||
|| button->getLabelSelected() != item->getName() // favorite's name has been changed
|
||||
|| button->getRect().mRight < rightest_point) // favbar's width has been changed
|
||||
|| button->getLabelSelected() != item->getName()) // favorite's name has been changed
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
|
@ -800,6 +809,7 @@ void LLFavoritesBarCtrl::updateButtons()
|
|||
}
|
||||
child_it++;
|
||||
}
|
||||
}
|
||||
// now first_changed_item_index should contains a number of button that need to change
|
||||
|
||||
if (first_changed_item_index <= mItems.size())
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ public:
|
|||
void setLandingTab(LLUICtrl* tab) { mLandingTab = tab; }
|
||||
|
||||
protected:
|
||||
void updateButtons();
|
||||
void updateButtons(bool force_update = false);
|
||||
LLButton* createButton(const LLPointer<LLViewerInventoryItem> item, const LLButton::Params& button_params, S32 x_offset );
|
||||
const LLButton::Params& getButtonParams();
|
||||
BOOL collectFavoriteItems(LLInventoryModel::item_array_t &items);
|
||||
|
|
|
|||
|
|
@ -996,7 +996,8 @@ void LLFloaterBuyLandUI::draw()
|
|||
// virtual
|
||||
BOOL LLFloaterBuyLandUI::canClose()
|
||||
{
|
||||
bool can_close = (mTransaction ? FALSE : TRUE) && mCurrency.canCancel();
|
||||
// mTransactionType check for pre-buy estimation stage and mCurrency to allow exit after transaction
|
||||
bool can_close = !mTransaction && (mTransactionType != TransactionBuy || mCurrency.canCancel());
|
||||
if (!can_close)
|
||||
{
|
||||
// explain to user why they can't do this, see DEV-9605
|
||||
|
|
|
|||
|
|
@ -1457,15 +1457,23 @@ void LLFloaterEditExtDayCycle::reblendSettings()
|
|||
{
|
||||
F64 position = mTimeSlider->getCurSliderValue();
|
||||
|
||||
if (mSkyBlender)
|
||||
{
|
||||
if ((mSkyBlender->getTrack() != mCurrentTrack) && (mCurrentTrack != LLSettingsDay::TRACK_WATER))
|
||||
{
|
||||
mSkyBlender->switchTrack(mCurrentTrack, position);
|
||||
}
|
||||
else
|
||||
{
|
||||
mSkyBlender->setPosition(position);
|
||||
}
|
||||
}
|
||||
|
||||
if (mWaterBlender)
|
||||
{
|
||||
mWaterBlender->setPosition(position);
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterEditExtDayCycle::doApplyCommit(LLSettingsDay::ptr_t day)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -248,6 +248,29 @@ void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg)
|
|||
region_flags = flags;
|
||||
}
|
||||
|
||||
if (msg->has(_PREHASH_RegionInfo5))
|
||||
{
|
||||
F32 chat_whisper_range;
|
||||
F32 chat_normal_range;
|
||||
F32 chat_shout_range;
|
||||
F32 chat_whisper_offset;
|
||||
F32 chat_normal_offset;
|
||||
F32 chat_shout_offset;
|
||||
U32 chat_flags;
|
||||
|
||||
msg->getF32Fast(_PREHASH_RegionInfo5, _PREHASH_ChatWhisperRange, chat_whisper_range);
|
||||
msg->getF32Fast(_PREHASH_RegionInfo5, _PREHASH_ChatNormalRange, chat_normal_range);
|
||||
msg->getF32Fast(_PREHASH_RegionInfo5, _PREHASH_ChatShoutRange, chat_shout_range);
|
||||
msg->getF32Fast(_PREHASH_RegionInfo5, _PREHASH_ChatWhisperOffset, chat_whisper_offset);
|
||||
msg->getF32Fast(_PREHASH_RegionInfo5, _PREHASH_ChatNormalOffset, chat_normal_offset);
|
||||
msg->getF32Fast(_PREHASH_RegionInfo5, _PREHASH_ChatShoutOffset, chat_shout_offset);
|
||||
msg->getU32Fast(_PREHASH_RegionInfo5, _PREHASH_ChatFlags, chat_flags);
|
||||
|
||||
LL_INFOS() << "Whisper range: " << chat_whisper_range << " normal range: " << chat_normal_range << " shout range: " << chat_shout_range
|
||||
<< " whisper offset: " << chat_whisper_offset << " normal offset: " << chat_normal_offset << " shout offset: " << chat_shout_offset
|
||||
<< " chat flags: " << chat_flags << LL_ENDL;
|
||||
}
|
||||
|
||||
if (host != gAgent.getRegionHost())
|
||||
{
|
||||
// Update is for a different region than the one we're in.
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue