Compare commits
753 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e321306517 | ||
|
|
acfe7e555e | ||
|
|
5023cc86f0 | ||
|
|
4455140f30 | ||
|
|
71e484516a | ||
|
|
38f878952c | ||
|
|
d80422eba7 | ||
|
|
ee078f717a | ||
|
|
73f34de1f9 | ||
|
|
b3d152f3ba | ||
|
|
a7dc7e636e | ||
|
|
44d84bc277 | ||
|
|
215acbcc96 | ||
|
|
7273e05995 | ||
|
|
ddca5347c3 | ||
|
|
e8cc1bd329 | ||
|
|
9c84a8162f | ||
|
|
16c4636048 | ||
|
|
7c888f6af1 | ||
|
|
dbe32a1f6d | ||
|
|
3fa61c4a39 | ||
|
|
dfa19e23f0 | ||
|
|
9c6ba8d18f | ||
|
|
d5c08c44bf | ||
|
|
bef2a368f4 | ||
|
|
236e1c45f2 | ||
|
|
a4367e75d3 | ||
|
|
c87751a822 | ||
|
|
1f402fdf5e | ||
|
|
bd928218dd | ||
|
|
773994723a | ||
|
|
7583768b9e | ||
|
|
de255321f1 | ||
|
|
37049180f6 | ||
|
|
c22970448f | ||
|
|
038d1bf742 | ||
|
|
a829f20828 | ||
|
|
54fc78013d | ||
|
|
130b1c0665 | ||
|
|
a5fcdde179 | ||
|
|
0904772a6f | ||
|
|
4e11983c7c | ||
|
|
8923ad755d | ||
|
|
35f14a262d | ||
|
|
13999dfc1d | ||
|
|
36ed0dcdaa | ||
|
|
44badf452e | ||
|
|
df07b97abd | ||
|
|
43b4e4cfc3 | ||
|
|
ce5e900721 | ||
|
|
6034e5d112 | ||
|
|
8779ff3c8f | ||
|
|
edc11a1d39 | ||
|
|
09d6521361 | ||
|
|
6c252a0fa1 | ||
|
|
9b762a5a84 | ||
|
|
2b6c5fcb31 | ||
|
|
312e1457dd | ||
|
|
bd9d7484f0 | ||
|
|
4f8f44d9c3 | ||
|
|
ea19e50919 | ||
|
|
0742630d81 | ||
|
|
107cef2b0e | ||
|
|
ce34b359ad | ||
|
|
5c545d1d2e | ||
|
|
83ef13a79a | ||
|
|
6234264211 | ||
|
|
f17066b7bf | ||
|
|
1a18948935 | ||
|
|
0dbfa70443 | ||
|
|
61adf36339 | ||
|
|
ed846f11f1 | ||
|
|
3257dbe76d | ||
|
|
146d78edfa | ||
|
|
ee2b2aadc3 | ||
|
|
bce5dfe711 | ||
|
|
76a658324c | ||
|
|
573a64ad24 | ||
|
|
574c240202 | ||
|
|
bdc31bddfc | ||
|
|
447a66d660 | ||
|
|
54d473e200 | ||
|
|
264c83aec4 | ||
|
|
8f8b5f9a4d | ||
|
|
07c487a28f | ||
|
|
17df4185ce | ||
|
|
dbf6381e34 | ||
|
|
fd7e82ee72 | ||
|
|
857d4e60cc | ||
|
|
567f4c51f8 | ||
|
|
6fe4b6fbe8 | ||
|
|
dbc3f1ff92 | ||
|
|
0ce9ad4a56 | ||
|
|
c10193c72b | ||
|
|
45ad9e39a6 | ||
|
|
e5ae84b42b | ||
|
|
16aa00e944 | ||
|
|
003bd9f1b3 | ||
|
|
cc1476fc36 | ||
|
|
241ddd031f | ||
|
|
c08d6df7e1 | ||
|
|
fcc1fa2c32 | ||
|
|
3d7b5e5e93 | ||
|
|
99e71222f0 | ||
|
|
e3680f216e | ||
|
|
8b3da1bff4 | ||
|
|
437de6743c | ||
|
|
f028dca711 | ||
|
|
996cc6097e | ||
|
|
ac7cded080 | ||
|
|
ab89adfaef | ||
|
|
647b326edc | ||
|
|
77b032549e | ||
|
|
e3e38e34c5 | ||
|
|
9bd02b5da1 | ||
|
|
727ddffb71 | ||
|
|
2f84d5397b | ||
|
|
1505c22995 | ||
|
|
d76ca9cd93 | ||
|
|
1b63b21a4d | ||
|
|
10b9348071 | ||
|
|
f3780b9eae | ||
|
|
a98a146c50 | ||
|
|
c305b55012 | ||
|
|
d2dfa4cfe7 | ||
|
|
71012ef883 | ||
|
|
fe0975dc24 | ||
|
|
2b84b6d8b1 | ||
|
|
dbc039783b | ||
|
|
a0206e5a17 | ||
|
|
0f181fe5d0 | ||
|
|
cfe924e4a8 | ||
|
|
e1cad4c34f | ||
|
|
9dbb58ee8b | ||
|
|
53c3faac5d | ||
|
|
c4cc626dff | ||
|
|
bde2ff5e78 | ||
|
|
ea16c9f858 | ||
|
|
df9c35bc0f | ||
|
|
9d93c4808e | ||
|
|
54e6b2402c | ||
|
|
00d1c88c59 | ||
|
|
ad02e01e77 | ||
|
|
1b600e7803 | ||
|
|
3de534896e | ||
|
|
9a86a713d3 | ||
|
|
5e60afe5ed | ||
|
|
e8b688b61f | ||
|
|
7c824f02b4 | ||
|
|
498fe1afe7 | ||
|
|
dac826da4e | ||
|
|
f7c237c0e1 | ||
|
|
ae057a7589 | ||
|
|
1a20b60d82 | ||
|
|
2e31f12cf4 | ||
|
|
2ef9fd05fa | ||
|
|
6fbc48ee9c | ||
|
|
6db9109b3f | ||
|
|
abffda269f | ||
|
|
154ba0124a | ||
|
|
fbe324cc5e | ||
|
|
090164ff7a | ||
|
|
428407c5e4 | ||
|
|
088f1213b4 | ||
|
|
e391d6390c | ||
|
|
deeb7287a2 | ||
|
|
7352aea9ac | ||
|
|
7837c611fb | ||
|
|
26a4e8a161 | ||
|
|
31b87ff07b | ||
|
|
7c1d075a5a | ||
|
|
abf0dd4250 | ||
|
|
9939f94f08 | ||
|
|
86b9e6fbed | ||
|
|
91ac21b9ec | ||
|
|
9d60b84f78 | ||
|
|
6da82d9805 | ||
|
|
616373db16 | ||
|
|
7229f6e64b | ||
|
|
da720ce9be | ||
|
|
a537f7e1a3 | ||
|
|
a6abecf5fa | ||
|
|
093469c33c | ||
|
|
36e6edfc65 | ||
|
|
13d9b64b1d | ||
|
|
4ce42762ee | ||
|
|
55c6cbabfd | ||
|
|
8e5502fdc2 | ||
|
|
2de3a1b9da | ||
|
|
d053625663 | ||
|
|
e9de7e7107 | ||
|
|
2e7c1bcfd9 | ||
|
|
8f53c768f5 | ||
|
|
82c3d0cf89 | ||
|
|
e20cf3789b | ||
|
|
7444f3bfad | ||
|
|
f84b69cad1 | ||
|
|
b996517c94 | ||
|
|
24862eaf15 | ||
|
|
2ca80add14 | ||
|
|
959bcfa7f8 | ||
|
|
7c514fe155 | ||
|
|
3d1f43046d | ||
|
|
427ab55058 | ||
|
|
2d0412d366 | ||
|
|
8e0eaa980f | ||
|
|
09baa3e679 | ||
|
|
3ae6345f1b | ||
|
|
dc329202ef | ||
|
|
5e445aaf7b | ||
|
|
ab8956d58f | ||
|
|
e8f1e7e96e | ||
|
|
488fe0ae9c | ||
|
|
7e76397a26 | ||
|
|
a704d444f2 | ||
|
|
8b035dc3c7 | ||
|
|
18fd36cba4 | ||
|
|
855d3a3ba5 | ||
|
|
a4977bbe19 | ||
|
|
6581849d24 | ||
|
|
ef6d6d20b9 | ||
|
|
f10288ceae | ||
|
|
0369d21917 | ||
|
|
0d2e02efb1 | ||
|
|
c0e1784e86 | ||
|
|
cc02f78d4e | ||
|
|
d51ae0ecac | ||
|
|
696fbdfa24 | ||
|
|
69e4debc42 | ||
|
|
090bf7acca | ||
|
|
8fcb9bf418 | ||
|
|
7a87be5015 | ||
|
|
616f2b5861 | ||
|
|
7bb01a17ee | ||
|
|
07ad821157 | ||
|
|
87799c1f3d | ||
|
|
c36c916342 | ||
|
|
48379e6442 | ||
|
|
8db64dc77f | ||
|
|
6a85abbd14 | ||
|
|
c1f6478a37 | ||
|
|
0037577814 | ||
|
|
9cfc43005d | ||
|
|
39c9b656c8 | ||
|
|
22ae9331bb | ||
|
|
4e0bb49394 | ||
|
|
cd2bf64b87 | ||
|
|
f7bd7c5901 | ||
|
|
7c404375c7 | ||
|
|
d1ef7ee5ca | ||
|
|
74c1ed77a4 | ||
|
|
1cd26ba85e | ||
|
|
02572ab1d3 | ||
|
|
24b20f6e4b | ||
|
|
68365c20c0 | ||
|
|
32d58d6e3e | ||
|
|
ba3b0c69f1 | ||
|
|
590f707c42 | ||
|
|
b6f3de5028 | ||
|
|
a0fb1e1788 | ||
|
|
ea72428c9d | ||
|
|
d38e2c0c91 | ||
|
|
503faaea62 | ||
|
|
381f74276b | ||
|
|
c92a9a6640 | ||
|
|
d75899f2d1 | ||
|
|
8f871cca10 | ||
|
|
9356963bd3 | ||
|
|
edb2e4c5b3 | ||
|
|
bf9ce4709f | ||
|
|
e41f23dead | ||
|
|
5ced49aaa8 | ||
|
|
2c6272d11a | ||
|
|
f8079bcd72 | ||
|
|
eea726d74e | ||
|
|
e7619f7518 | ||
|
|
ba7d8cedec | ||
|
|
717656c453 | ||
|
|
9ed9720861 | ||
|
|
939d60da59 | ||
|
|
ef5575be1b | ||
|
|
4eef6725f4 | ||
|
|
08b6b3bb48 | ||
|
|
5afb70b9fe | ||
|
|
747c25e920 | ||
|
|
7549836986 | ||
|
|
e13a17cc0c | ||
|
|
b14a6acd2f | ||
|
|
59a0c50d48 | ||
|
|
82ad9d4e04 | ||
|
|
d6b9504c84 | ||
|
|
35911d2362 | ||
|
|
9447b6d15f | ||
|
|
068b8e1f9b | ||
|
|
2e4fbe6b17 | ||
|
|
43173f1b0d | ||
|
|
ec299bfa87 | ||
|
|
4cbf8d728e | ||
|
|
43128c9016 | ||
|
|
72247bdaef | ||
|
|
82f0e19349 | ||
|
|
b5bb559cc0 | ||
|
|
a30a02e7ae | ||
|
|
e1a2c44ebe | ||
|
|
cde80125ad | ||
|
|
02d6b033d0 | ||
|
|
adea92f8b7 | ||
|
|
57ba9ef5ad | ||
|
|
982f3d58a9 | ||
|
|
9dc7fef4f6 | ||
|
|
c5594e839e | ||
|
|
acbff305f5 | ||
|
|
d40ec1c346 | ||
|
|
3b59af2225 | ||
|
|
6e7154d55c | ||
|
|
47377f17c6 | ||
|
|
beab155434 | ||
|
|
c7757d1038 | ||
|
|
aa2cde2493 | ||
|
|
cf166d3f1e | ||
|
|
caa207f59f | ||
|
|
1ac5aa6808 | ||
|
|
c4972e7734 | ||
|
|
d27dd3714f | ||
|
|
ba3491c76e | ||
|
|
0a1d61950b | ||
|
|
cadd645076 | ||
|
|
b47c0d7e51 | ||
|
|
8bdd80abfa | ||
|
|
4492bc1bcd | ||
|
|
6214e6a217 | ||
|
|
34137ed4ea | ||
|
|
5d9e135b5c | ||
|
|
1a3a1e6665 | ||
|
|
38db874755 | ||
|
|
5f7e392c7c | ||
|
|
53fb20880c | ||
|
|
5002f06d24 | ||
|
|
ef074deb52 | ||
|
|
8fa1108b72 | ||
|
|
a4c2e7f599 | ||
|
|
a2fe3e2081 | ||
|
|
ce44f56af9 | ||
|
|
7b84942f86 | ||
|
|
18497cef73 | ||
|
|
a3bb1a81de | ||
|
|
66783398d0 | ||
|
|
d67e9916b8 | ||
|
|
3deb52d399 | ||
|
|
d67e8291c8 | ||
|
|
1cc685e820 | ||
|
|
a22d0dcab9 | ||
|
|
707c8c6f2b | ||
|
|
b3a12167d6 | ||
|
|
95345521f0 | ||
|
|
3640afdd95 | ||
|
|
bc08cc201b | ||
|
|
43145c7f67 | ||
|
|
520b8b342e | ||
|
|
34c42cdab0 | ||
|
|
0e855fea7c | ||
|
|
1ebd79e413 | ||
|
|
0cf59534ff | ||
|
|
d5c5bbe0a1 | ||
|
|
44cde8d5c6 | ||
|
|
37fc19fae0 | ||
|
|
fb16d49511 | ||
|
|
266167f5a3 | ||
|
|
4bf2e19898 | ||
|
|
32eb7ddc37 | ||
|
|
6f19e231b6 | ||
|
|
94fa6cb071 | ||
|
|
efe51fd5cb | ||
|
|
69c0f252a4 | ||
|
|
58cb7cd084 | ||
|
|
38ae479249 | ||
|
|
f4231f0628 | ||
|
|
ba163ab05b | ||
|
|
c5c079f6aa | ||
|
|
679d155a39 | ||
|
|
9668992493 | ||
|
|
1cffd8fa03 | ||
|
|
7518b075b7 | ||
|
|
3073370d0e | ||
|
|
9bab43b4d1 | ||
|
|
70157a4ec5 | ||
|
|
a47aa46962 | ||
|
|
a34278cfc3 | ||
|
|
5f682b51ec | ||
|
|
ff5a83d192 | ||
|
|
8c445dac67 | ||
|
|
eb9bf71726 | ||
|
|
7661a0b2a9 | ||
|
|
de9d6096a5 | ||
|
|
11c48ac807 | ||
|
|
e9b9eb6a4c | ||
|
|
f1846045a6 | ||
|
|
2304420f6d | ||
|
|
f8c15d38a6 | ||
|
|
3003133a66 | ||
|
|
81cf774fe8 | ||
|
|
fbb2a7e90d | ||
|
|
31dc5aa728 | ||
|
|
db482cb7dd | ||
|
|
b06d878790 | ||
|
|
23ce1dfc27 | ||
|
|
fdfc4ab2a8 | ||
|
|
f252161941 | ||
|
|
b86e7715a8 | ||
|
|
e393b47da8 | ||
|
|
2b4edd659f | ||
|
|
5ea9740f1b | ||
|
|
da0fc3c8f5 | ||
|
|
f06acc0a85 | ||
|
|
5b160f5b7b | ||
|
|
7319ba62dd | ||
|
|
f2ff6d5186 | ||
|
|
50e459d265 | ||
|
|
c201b54b85 | ||
|
|
da6c816204 | ||
|
|
2c401b7359 | ||
|
|
97ba3c9346 | ||
|
|
e9296721c7 | ||
|
|
85d82c8140 | ||
|
|
1ebc9d04aa | ||
|
|
045f3b8b11 | ||
|
|
32b8fa4a77 | ||
|
|
8fb70a2058 | ||
|
|
0634c38505 | ||
|
|
7e6c84c334 | ||
|
|
3a64522267 | ||
|
|
3a2ac0e2ee | ||
|
|
fc391d4b10 | ||
|
|
aa625da6a6 | ||
|
|
82df5de5cf | ||
|
|
ecf9824b63 | ||
|
|
0ab2289cdc | ||
|
|
6166a40440 | ||
|
|
983b49c0c8 | ||
|
|
01eacd3a31 | ||
|
|
e78a3913e0 | ||
|
|
2c8e72217e | ||
|
|
6941058824 | ||
|
|
fa79588a20 | ||
|
|
a6e305063e | ||
|
|
fac8c25851 | ||
|
|
014a86c26b | ||
|
|
87374274b9 | ||
|
|
56dbcae402 | ||
|
|
5d8ed077bc | ||
|
|
5aad1f7afe | ||
|
|
967ea51980 | ||
|
|
571efeddb2 | ||
|
|
42f5394677 | ||
|
|
98ab3dffa3 | ||
|
|
ef4d989f37 | ||
|
|
6974596e83 | ||
|
|
b756077269 | ||
|
|
70e36ee2b4 | ||
|
|
bde004c08e | ||
|
|
5b52440e61 | ||
|
|
bf4d727cd5 | ||
|
|
ad1c6442cd | ||
|
|
f36fe45fa7 | ||
|
|
b6cfe15c7c | ||
|
|
41f6d6a5ff | ||
|
|
2e07d24199 | ||
|
|
c4e16b26bb | ||
|
|
c9dbcfbb31 | ||
|
|
f2855d3668 | ||
|
|
5b28e29530 | ||
|
|
04806e02ed | ||
|
|
f9a1fd5748 | ||
|
|
d38b8caf2b | ||
|
|
26bb95fe3d | ||
|
|
c6ce464dbc | ||
|
|
b8a914b15b | ||
|
|
456c89a7a3 | ||
|
|
f394cb2e8f | ||
|
|
6b08c051a3 | ||
|
|
790ca65c84 | ||
|
|
7ccd8f8f1d | ||
|
|
eef6f92029 | ||
|
|
f7dbdba447 | ||
|
|
48113f0fc8 | ||
|
|
a15a58a7c1 | ||
|
|
469955889e | ||
|
|
b72dd852b7 | ||
|
|
7f527814d5 | ||
|
|
66a0471efa | ||
|
|
6412349dec | ||
|
|
c63d5f8e0c | ||
|
|
2347593dac | ||
|
|
b970d4f976 | ||
|
|
219ec7ef20 | ||
|
|
bb0c6a498b | ||
|
|
ddff2f246c | ||
|
|
651f9f47d0 | ||
|
|
7693e6a3a8 | ||
|
|
41b02a7208 | ||
|
|
ca6113a4d5 | ||
|
|
a1dc4e830d | ||
|
|
fa0a71253f | ||
|
|
dd69c9fd20 | ||
|
|
25cbba9bca | ||
|
|
2b4ebe657c | ||
|
|
87a2d8d51b | ||
|
|
efa4284391 | ||
|
|
92039f295d | ||
|
|
2899de1a5c | ||
|
|
e8fbeeba5f | ||
|
|
fc9400db07 | ||
|
|
0b91ec8dd2 | ||
|
|
6baee2e10b | ||
|
|
759f1d2dbe | ||
|
|
c4f1906b0a | ||
|
|
8a9a8ed5c9 | ||
|
|
4d065f0453 | ||
|
|
684482352c | ||
|
|
f9137c923b | ||
|
|
964ec57ffe | ||
|
|
99623894c7 | ||
|
|
9b56cc69c1 | ||
|
|
7f019cc196 | ||
|
|
4f628849f3 | ||
|
|
1bf05fbb1f | ||
|
|
a3a17e929e | ||
|
|
5c4056660f | ||
|
|
5d79f857b0 | ||
|
|
a9b39d6e5d | ||
|
|
8300bb651e | ||
|
|
3bf699ad36 | ||
|
|
7e4a2d69d5 | ||
|
|
8013c0d2f5 | ||
|
|
c0ba99e5ad | ||
|
|
99570d8ebb | ||
|
|
937c06db54 | ||
|
|
58ba81ae4e | ||
|
|
6f2d80cc93 | ||
|
|
69f29cb53e | ||
|
|
e830a77860 | ||
|
|
a110a7bd6a | ||
|
|
cec88872ae | ||
|
|
84023c8162 | ||
|
|
898549d13e | ||
|
|
f43e5f92fd | ||
|
|
39736e52d8 | ||
|
|
b242ceda1e | ||
|
|
df65245671 | ||
|
|
6d1d1c0dbf | ||
|
|
d18a9f22e7 | ||
|
|
3a06640730 | ||
|
|
4dfd2c7d47 | ||
|
|
e9b59e7627 | ||
|
|
8418288e26 | ||
|
|
afab4b276e | ||
|
|
c34ab0ee66 | ||
|
|
95d533ce8a | ||
|
|
52a4dbccbe | ||
|
|
943b37b8e6 | ||
|
|
3c55d2e776 | ||
|
|
db8fd1eb9f | ||
|
|
8ae824ff09 | ||
|
|
3a91085ac2 | ||
|
|
323ffd7a89 | ||
|
|
db98698bbe | ||
|
|
6b080d57cb | ||
|
|
3f42183797 | ||
|
|
e88ad5aab9 | ||
|
|
5f276c3212 | ||
|
|
0daa5d8b4d | ||
|
|
f24898d049 | ||
|
|
13b1c8c173 | ||
|
|
af3cd00048 | ||
|
|
5f6a4c4111 | ||
|
|
fc27806e90 | ||
|
|
cb0da425d5 | ||
|
|
94c242f792 | ||
|
|
4e9f50b878 | ||
|
|
00b36eb0fe | ||
|
|
f025387f10 | ||
|
|
07c26111af | ||
|
|
cf97809ff1 | ||
|
|
4eb3622bfe | ||
|
|
96b3eed1b0 | ||
|
|
d913303875 | ||
|
|
63fe673af1 | ||
|
|
50eebb5cba | ||
|
|
32d0ef89c6 | ||
|
|
14e407aff3 | ||
|
|
bc13855e64 | ||
|
|
0e265889dd | ||
|
|
55de189752 | ||
|
|
54360dd20e | ||
|
|
f61e54892f | ||
|
|
3b991a2222 | ||
|
|
96539ffc79 | ||
|
|
355cde464a | ||
|
|
8d7c353500 | ||
|
|
43732794dd | ||
|
|
3217bccfcd | ||
|
|
1e4842eaba | ||
|
|
7c7dd6269a | ||
|
|
ea1f5fb08d | ||
|
|
603ad905e1 | ||
|
|
ac82fc60f9 | ||
|
|
50aa89dae6 | ||
|
|
b459239833 | ||
|
|
dae58e0937 | ||
|
|
2b4de8f881 | ||
|
|
fb2f4f158c | ||
|
|
eda770e978 | ||
|
|
3d95015686 | ||
|
|
2b02d3dc84 | ||
|
|
415b7b7ec4 | ||
|
|
33c6067098 | ||
|
|
0fcd55aff3 | ||
|
|
fd023b317a | ||
|
|
a8ed185c00 | ||
|
|
6ec59ee892 | ||
|
|
e6272b8d56 | ||
|
|
ccba04f345 | ||
|
|
f317953290 | ||
|
|
d6486fe14a | ||
|
|
62d0a0cdbf | ||
|
|
8e542cfa03 | ||
|
|
5490a3e549 | ||
|
|
28da235888 | ||
|
|
8721841fc3 | ||
|
|
136a6a6e0f | ||
|
|
b9a461c5ad | ||
|
|
ec4f217af8 | ||
|
|
1b9eb52850 | ||
|
|
4be85eeaa5 | ||
|
|
d33d12ba83 | ||
|
|
319507f521 | ||
|
|
af9ccfa15c | ||
|
|
4567555c49 | ||
|
|
2d3dda6db3 | ||
|
|
09c043fe52 | ||
|
|
5b07370ec4 | ||
|
|
bc17e2e9cf | ||
|
|
47d0a50a19 | ||
|
|
e7cb63fcf7 | ||
|
|
66f4ce354f | ||
|
|
37889eb3fa | ||
|
|
6362df1202 | ||
|
|
1ece4feccd | ||
|
|
6541fc08d4 | ||
|
|
f144baa9a8 | ||
|
|
b94ab10922 | ||
|
|
21f4ee8a3d | ||
|
|
e7930b1d0f | ||
|
|
3e97b3ae33 | ||
|
|
8e137e31cd | ||
|
|
81186e76b6 | ||
|
|
3057974f31 | ||
|
|
bfd883f533 | ||
|
|
da5b7e199a | ||
|
|
64cc76bd79 | ||
|
|
bf374705c6 | ||
|
|
9ce2f95f37 | ||
|
|
316854dc13 | ||
|
|
9136e02ed3 | ||
|
|
1d6735f0ec | ||
|
|
373ac90156 | ||
|
|
6f591376dd | ||
|
|
95d9c773d9 | ||
|
|
4ae04dd0a8 | ||
|
|
61f9b3c2cf | ||
|
|
b2ef5658b1 | ||
|
|
a7f0af41ab | ||
|
|
c7a2e1b2d4 | ||
|
|
0116b80795 | ||
|
|
d743a221e8 | ||
|
|
92edbd3e47 | ||
|
|
cabb70d90a | ||
|
|
ae24548216 | ||
|
|
85c20e1493 | ||
|
|
821b8a5517 | ||
|
|
491d898db8 | ||
|
|
5f60eb136e | ||
|
|
8b3b89ecf4 | ||
|
|
0524458069 | ||
|
|
a160b44e07 | ||
|
|
255e05beb5 | ||
|
|
912f0c7fde | ||
|
|
693b5d0838 | ||
|
|
50ddb20204 | ||
|
|
cc2622660b | ||
|
|
bdeda18b52 | ||
|
|
8eb70f9719 | ||
|
|
2f6d401db1 | ||
|
|
82d0d1c092 | ||
|
|
f831a1778b | ||
|
|
20e6b7a320 | ||
|
|
c38f7c96e7 | ||
|
|
698066d7e3 | ||
|
|
c5cfae7bac | ||
|
|
241ed5734e | ||
|
|
0209033dd9 | ||
|
|
f5ca701273 | ||
|
|
0526a91206 | ||
|
|
4be13b1a42 | ||
|
|
992efdc283 | ||
|
|
c7d812802f | ||
|
|
5074d290e4 | ||
|
|
d6e1333810 | ||
|
|
66a833796c | ||
|
|
32c43bf59a | ||
|
|
a6c7995b71 | ||
|
|
8048a8a39d | ||
|
|
2603f9a134 | ||
|
|
3bd2ec7b2e | ||
|
|
e589a31bc4 | ||
|
|
e4114799c3 | ||
|
|
59546a348a | ||
|
|
427ae1087f | ||
|
|
1c63f6cd85 | ||
|
|
3b38cc10de | ||
|
|
d446b19e72 | ||
|
|
e9bac02fec | ||
|
|
8b5d012200 | ||
|
|
fa8def5e70 | ||
|
|
5fc990d9e7 | ||
|
|
8d832e3231 | ||
|
|
1ed7b591b2 | ||
|
|
76238715e3 | ||
|
|
009b15c436 | ||
|
|
dd1b99cd0d | ||
|
|
25bb80da77 | ||
|
|
3a8128d309 | ||
|
|
2c8d25a110 | ||
|
|
12ee3a3c93 | ||
|
|
e79eac238e | ||
|
|
2f6bb01370 | ||
|
|
9209657f93 | ||
|
|
547e027899 | ||
|
|
087f475893 | ||
|
|
a69cb5e390 | ||
|
|
8938fac4fd | ||
|
|
139f425f4c | ||
|
|
8966ed9c82 | ||
|
|
0b8b302aa0 | ||
|
|
d8b604b550 | ||
|
|
56fe4c24b8 | ||
|
|
955db6e4be | ||
|
|
705b675d28 | ||
|
|
b46380e373 | ||
|
|
a90054aa16 | ||
|
|
362007e5d3 | ||
|
|
7ce0ec874a | ||
|
|
959cd60225 |
@@ -38,52 +38,8 @@
|
||||
<include name=".hgignore"/>
|
||||
</fileset>
|
||||
</delete>
|
||||
|
||||
</target>
|
||||
|
||||
<!-- I don't think these targets are being actively used. But just in case, we'll just comment them out for now - justincc -->
|
||||
<!--
|
||||
<property name="projectdir" value="opensim-0.6.9" />
|
||||
<target name="dist" depends="distdir">
|
||||
<zip zipfile="${projectdir}.zip">
|
||||
<fileset basedir=".">
|
||||
<include name="${projectdir}/**" />
|
||||
</fileset>
|
||||
</zip>
|
||||
<tar destfile="${projectdir}.tar.gz" compression="GZip">
|
||||
<fileset basedir=".">
|
||||
<include name="${projectdir}/**" />
|
||||
</fileset>
|
||||
</tar>
|
||||
</target>
|
||||
|
||||
<target name="distdir">
|
||||
<delete dir="${projectdir}" />
|
||||
<copy todir="${projectdir}">
|
||||
<fileset basedir=".">
|
||||
<include name="ThirdPartyLicenses/**" />
|
||||
<include name="CONTRIBUTORS.txt" />
|
||||
<include name="README" />
|
||||
<include name="OpenSim/**/*.cs" />
|
||||
<include name="**/*.build" />
|
||||
<include name="**/*.csproj" />
|
||||
<include name="**/*.csproj.user" />
|
||||
<include name="**/*.sln" />
|
||||
<include name="bin/*.dll" />
|
||||
<include name="bin/*.so" />
|
||||
<include name="bin/*.config" />
|
||||
<include name="bin/assets/**" />
|
||||
<include name="bin/data/**" />
|
||||
<include name="bin/OpenSim*xml" />
|
||||
<include name="bin/OpenSim.ini" />
|
||||
<include name="bin/defaultstripe.png" />
|
||||
<exclude name="bin/OpenSim.*dll" />
|
||||
</fileset>
|
||||
</copy>
|
||||
<touch file="${projectdir}/bin/startup_commands.txt" />
|
||||
</target>
|
||||
-->
|
||||
|
||||
<target name="test" depends="build, find-nunit">
|
||||
<setenv name="MONO_THREADS_PER_CPU" value="100" />
|
||||
|
||||
@@ -117,12 +73,10 @@
|
||||
</exec>
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.region.clientstack.lindencaps.tests)==0}" />
|
||||
|
||||
<!--
|
||||
<exec program="${nunitcmd}" failonerror="true" resultproperty="testresult.opensim.region.clientstack.lindenudp.tests">
|
||||
<arg value="./bin/OpenSim.Region.ClientStack.LindenUDP.Tests.dll" />
|
||||
</exec>
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.region.clientstack.lindenudp.tests)==0}" />
|
||||
-->
|
||||
|
||||
<exec program="${nunitcmd}" failonerror="true" resultproperty="testresult.opensim.region.scriptengine.tests">
|
||||
<arg value="./bin/OpenSim.Region.ScriptEngine.Tests.dll" />
|
||||
@@ -149,117 +103,23 @@
|
||||
</exec>
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.data.tests)==0}" />
|
||||
|
||||
<delete dir="%temp%"/>
|
||||
<exec program="${nunitcmd}" failonerror="true" resultproperty="testresult.opensim.capabilities.handlers.tests">
|
||||
<arg value="./bin/OpenSim.Capabilities.Handlers.Tests.dll" />
|
||||
</exec>
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.capabilities.handlers.tests)==0}" />
|
||||
|
||||
<delete dir="%temp%"/>
|
||||
</target>
|
||||
|
||||
<target name="test-cov" depends="build">
|
||||
<!-- Code Coverage Test. Prototype, only works with mono 1.2. Instructions in http://opensimulator.org/wiki/Automated_Testing -->
|
||||
<mkdir dir="cov" failonerror="false" />
|
||||
<exec program="mono">
|
||||
<arg value="--debug" />
|
||||
<arg value="--profile=monocov:outfile=./cov/OpenSim.Framework.Servers.cov,+[OpenSim.Framework.Servers]" />
|
||||
<arg value="/usr/lib/nunit/nunit-console.exe" />
|
||||
<arg value="./bin/OpenSim.Framework.Servers.Tests.dll" />
|
||||
</exec>
|
||||
<delete dir="./cov/OpenSim.Framework.Servers" />
|
||||
<exec program="monocov">
|
||||
<arg value="--export-html=./cov/OpenSim.Framework.Servers ./cov/OpenSim.Framework.Servers.cov" />
|
||||
</exec>
|
||||
<target name="torture" depends="build, find-nunit">
|
||||
<setenv name="MONO_THREADS_PER_CPU" value="100" />
|
||||
|
||||
<!--
|
||||
<exec program="mono">
|
||||
<arg value="--debug" />
|
||||
<arg value="--profile=monocov:outfile=./cov/OpenSim.Region.ClientStack.LindenUDP.cov,+[OpenSim.Region.ClientStack.LindenUDP]" />
|
||||
<arg value="/usr/lib/nunit/nunit-console.exe" />
|
||||
<arg value="./bin/OpenSim.Region.ClientStack.LindenUDP.Tests.dll" />
|
||||
</exec>
|
||||
<delete dir="./cov/OpenSim.Region.ClientStack.LindenUDP" />
|
||||
<exec program="monocov">
|
||||
<arg value="--export-html=./cov/OpenSim.Region.ClientStack.LindenUDP ./cov/OpenSim.Region.ClientStack.LindenUDP.cov" />
|
||||
</exec>
|
||||
-->
|
||||
|
||||
<exec program="mono">
|
||||
<arg value="--debug" />
|
||||
<arg value="--profile=monocov:outfile=./cov/OpenSim.Region.ScriptEngine.Shared.cov,+[OpenSim.Region.ScriptEngine.Shared]" />
|
||||
<arg value="/usr/lib/nunit/nunit-console.exe" />
|
||||
<arg value="./bin/OpenSim.Region.ScriptEngine.Shared.Tests.dll" />
|
||||
</exec>
|
||||
<delete dir="./cov/OpenSim.Region.ScriptEngine.Shared" />
|
||||
<exec program="monocov">
|
||||
<arg value="--export-html=./cov/OpenSim.Region.ScriptEngine.Shared ./cov/OpenSim.Region.ScriptEngine.Shared.cov" />
|
||||
</exec>
|
||||
|
||||
<exec program="mono">
|
||||
<arg value="--debug" />
|
||||
<arg value="--profile=monocov:outfile=./cov/OpenSim.Region.ScriptEngine.Shared.CodeTools.cov,+[OpenSim.Region.ScriptEngine.Shared.CodeTools]" />
|
||||
<arg value="/usr/lib/nunit/nunit-console.exe" />
|
||||
<arg value="./bin/OpenSim.Region.ScriptEngine.Shared.CodeTools.Tests.dll" />
|
||||
</exec>
|
||||
<delete dir="./cov/OpenSim.Region.ScriptEngine.Shared.CodeTools" />
|
||||
<exec program="monocov">
|
||||
<arg value="--export-html=./cov/OpenSim.Region.ScriptEngine.Shared.CodeTools ./cov/OpenSim.Region.ScriptEngine.Shared.CodeTools.cov" />
|
||||
</exec>
|
||||
|
||||
<exec program="mono">
|
||||
<arg value="--debug" />
|
||||
<arg value="--profile=monocov:outfile=./cov/OpenSim.Region.CoreModules.cov,+[OpenSim.Region.CoreModules]" />
|
||||
<arg value="/usr/lib/nunit/nunit-console.exe" />
|
||||
<arg value="./bin/OpenSim.Region.CoreModules.Tests.dll" />
|
||||
</exec>
|
||||
<delete dir="./cov/OpenSim.Region.CoreModules" />
|
||||
<exec program="monocov">
|
||||
<arg value="--export-html=./cov/OpenSim.Region.CoreModules ./cov/OpenSim.Region.CoreModules.cov" />
|
||||
</exec>
|
||||
|
||||
<exec program="mono">
|
||||
<arg value="--debug" />
|
||||
<arg value="--profile=monocov:outfile=./cov/OpenSim.Region.OptionalModules.cov,+[OpenSim.Region.OptionalModules]" />
|
||||
<arg value="/usr/lib/nunit/nunit-console.exe" />
|
||||
<arg value="./bin/OpenSim.Region.OptionalModules.Tests.dll" />
|
||||
</exec>
|
||||
<delete dir="./cov/OpenSim.Region.OptionalModules" />
|
||||
<exec program="monocov">
|
||||
<arg value="--export-html=./cov/OpenSim.Region.OptionalModules ./cov/OpenSim.Region.OptionalModules.cov" />
|
||||
</exec>
|
||||
|
||||
<exec program="mono">
|
||||
<arg value="--debug" />
|
||||
<arg value="--profile=monocov:outfile=./cov/OpenSim.Region.Framework.cov,+[OpenSim.Region.Framework]" />
|
||||
<arg value="/usr/lib/nunit/nunit-console.exe" />
|
||||
<arg value="./bin/OpenSim.Region.Framework.Tests.dll" />
|
||||
</exec>
|
||||
<delete dir="./cov/OpenSim.Region.Framework" />
|
||||
<exec program="monocov">
|
||||
<arg value="--export-html=./cov/OpenSim.Region.Framework ./cov/OpenSim.Region.Framework.cov" />
|
||||
</exec>
|
||||
|
||||
<exec program="mono">
|
||||
<arg value="--debug" />
|
||||
<arg value="--profile=monocov:outfile=./cov/OpenSim.Data.SQLite.cov,+[OpenSim.Data.SQLite]" />
|
||||
<arg value="/usr/lib/nunit/nunit-console.exe" />
|
||||
<arg value="./bin/OpenSim.Data.SQLite.Tests.dll" />
|
||||
</exec>
|
||||
<delete dir="./cov/OpenSim.Data.SQLite" />
|
||||
<exec program="monocov">
|
||||
<arg value="--export-html=./cov/OpenSim.Data.SQLite ./cov/OpenSim.Data.SQLite.cov" />
|
||||
</exec>
|
||||
|
||||
<exec program="mono">
|
||||
<arg value="--debug" />
|
||||
<arg value="--profile=monocov:outfile=./cov/OpenSim.Data.MySQL.cov,+[OpenSim.Data.MySQL.Tests]" />
|
||||
<arg value="/usr/lib/nunit/nunit-console.exe" />
|
||||
<arg value="./bin/OpenSim.Data.MySQL.Tests.dll" />
|
||||
</exec>
|
||||
<delete dir="./cov/OpenSim.Data.MySQL" />
|
||||
<exec program="monocov">
|
||||
<arg value="--export-html=./cov/OpenSim.Data.MySQL ./cov/OpenSim.Data.MySQL.cov" />
|
||||
</exec>
|
||||
|
||||
<delete file="C:\NUnitPrimaryTrace.txt" failonerror="false" />
|
||||
<delete file="TestResult.xml" failonerror="false" />
|
||||
<exec program="${nunitcmd}" failonerror="true" resultproperty="testresult.opensim.tests.torture">
|
||||
<arg value="./bin/OpenSim.Tests.Torture.dll" />
|
||||
</exec>
|
||||
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.tests.torture)==0}" />
|
||||
<delete dir="%temp%"/>
|
||||
</target>
|
||||
|
||||
<target name="find-nunit">
|
||||
@@ -272,15 +132,12 @@
|
||||
if="${int::parse(hasnunit2)==0}" />
|
||||
<property name="nunitcmd" value="nunit-console"
|
||||
if="${int::parse(hasnunit2)==1}" />
|
||||
|
||||
</target>
|
||||
|
||||
<!-- this is used for panda test execution -->
|
||||
<!-- work in progress -->
|
||||
|
||||
<target name="test-xml" depends="build, find-nunit">
|
||||
|
||||
|
||||
<mkdir dir="test-results" failonerror="false" />
|
||||
<!-- Unit Test Assembly -->
|
||||
<exec program="${nunitcmd}" failonerror="false" resultproperty="testresult.opensim.tests">
|
||||
@@ -338,45 +195,22 @@
|
||||
<arg value="-xml=test-results/OpenSim.Data.Tests.dll-Results.xml" />
|
||||
</exec>
|
||||
|
||||
<exec program="${nunitcmd}" failonerror="false" resultproperty="testresult.opensim.capabilities.handlers.tests">
|
||||
<arg value="./bin/OpenSim.Capabilities.Handlers.Tests.dll" />
|
||||
<arg value="-xml=test-results/OpenSim.Capabilities.Handlers.Tests.dll-Results.xml" />
|
||||
</exec>
|
||||
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.tests)==0}" />
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.framework.tests)==0}" />
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.framework.servers.tests)==0}" />
|
||||
<!-- <fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.region.clientstack.lindenudp.tests)==0}" /> -->
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.region.clientstack.lindenudp.tests)==0}" />
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.region.scriptengine.tests)==0}" />
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.region.coremodules.tests)==0}" />
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.region.optionalmodules.tests)==0}" />
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.region.framework.tests)==0}" />
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.data.tests)==0}" />
|
||||
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.capabilities.handlers.tests)==0}" />
|
||||
</target>
|
||||
<!-- <exec program="nunit-console.exe" failonerror="false" resultproperty="testresult.acceptancetestassembly"> -->
|
||||
<!-- <arg value="AcceptanceTestAssembly.dll" /> -->
|
||||
<!-- <arg value="/xml=AcceptanceTestAssembly-Results.xml" /> -->
|
||||
<!-- </exec> -->
|
||||
|
||||
<!-- <fail message="Failures reported in unit tests." unless="${int::parse(testresult.unittestassembly)==0}" /> -->
|
||||
<!-- <fail message="Failures reported in acceptance tests." unless="${int::parse(testresult.acceptancetestassembly)==0}" /> -->
|
||||
<!-- </target> -->
|
||||
|
||||
|
||||
|
||||
<!-- <nunit2 failonerror="true" verbose="true"> -->
|
||||
<!-- <formatter type="Xml" usefile="true" extension=".xml" outputdir="./test-results" /> -->
|
||||
<!-- <test> -->
|
||||
<!-- <assemblies> -->
|
||||
<!-- <include name="./bin/OpenSim.Framework.Tests.dll" /> -->
|
||||
<!-- <include name="./bin/OpenSim.Framework.Servers.Tests.dll" /> -->
|
||||
<!-- <include name="./bin/OpenSim.Region.ClientStack.LindenUDP.Tests.dll" /> -->
|
||||
<!-- <include name="./bin/OpenSim.Region.ScriptEngine.Tests.dll" /> -->
|
||||
<!-- <include name="./bin/OpenSim.Region.CoreModules.Tests.dll" /> -->
|
||||
<!-- <include name="./bin/OpenSim.Region.OptionalModules.Tests.dll" /> -->
|
||||
<!-- <include name="./bin/OpenSim.Region.Framework.Tests.dll" /> -->
|
||||
<!-- <include name="./bin/OpenSim.Data.SQLite.Tests.dll" /> -->
|
||||
<!-- <include name="./bin/OpenSim.Data.MySQL.Tests.dll" /> -->
|
||||
<!-- </assemblies> -->
|
||||
<!-- </test> -->
|
||||
<!-- </nunit2> -->
|
||||
<!-- </target> -->
|
||||
|
||||
<target name="doxygen">
|
||||
<exec program="doxygen" workingdir="doc" commandline="doxygen.conf" />
|
||||
|
||||
11
BUILDING.txt
11
BUILDING.txt
@@ -17,13 +17,22 @@ Prereqs:
|
||||
* On some Linux distributions you may need to install additional packages.
|
||||
See http://opensimulator.org/wiki/Dependencies for more information.
|
||||
|
||||
* May also use xbuild (included in mono distributions)
|
||||
* May use Monodevelop, a cross-platform IDE
|
||||
|
||||
From the distribution type:
|
||||
* ./runprebuild.sh
|
||||
* nant
|
||||
* nant (or xbuild)
|
||||
* cd bin
|
||||
* copy OpenSim.ini.example to OpenSim.ini and other appropriate files in bin/config-include
|
||||
* run mono OpenSim.exe
|
||||
|
||||
=== Using Monodevelop ===
|
||||
|
||||
From the distribution type:
|
||||
* ./runprebuild.sh
|
||||
* type monodevelop OpenSim.sln
|
||||
|
||||
=== References ===
|
||||
|
||||
Helpful resources:
|
||||
|
||||
@@ -80,6 +80,7 @@ what it is today.
|
||||
* dmiles (Daxtron Labs)
|
||||
* dslake (Intel)
|
||||
* FredoChaplin
|
||||
* Garmin Kawaguichi
|
||||
* Gerhard
|
||||
* Godfrey
|
||||
* Grumly57
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -41,7 +41,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Regions
|
||||
{
|
||||
#region GET methods
|
||||
public string GetHandler(string request, string path, string param,
|
||||
OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
// foreach (string h in httpRequest.Headers.AllKeys)
|
||||
// foreach (string v in httpRequest.Headers.GetValues(h))
|
||||
@@ -64,7 +64,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Regions
|
||||
}
|
||||
}
|
||||
|
||||
public string GetHandlerRegions(OSHttpResponse httpResponse)
|
||||
public string GetHandlerRegions(IOSHttpResponse httpResponse)
|
||||
{
|
||||
RestXmlWriter rxw = new RestXmlWriter(new StringWriter());
|
||||
|
||||
@@ -95,7 +95,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Regions
|
||||
return rxw.ToString();
|
||||
}
|
||||
|
||||
public string GetHandlerRegion(OSHttpResponse httpResponse, string param)
|
||||
public string GetHandlerRegion(IOSHttpResponse httpResponse, string param)
|
||||
{
|
||||
// be resilient and don't get confused by a terminating '/'
|
||||
param = param.TrimEnd(new char[]{'/'});
|
||||
@@ -180,7 +180,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Regions
|
||||
}
|
||||
#endregion GET methods
|
||||
|
||||
protected string RegionTerrain(OSHttpResponse httpResponse, Scene scene)
|
||||
protected string RegionTerrain(IOSHttpResponse httpResponse, Scene scene)
|
||||
{
|
||||
httpResponse.SendChunked = true;
|
||||
httpResponse.ContentType = "text/xml";
|
||||
@@ -190,7 +190,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Regions
|
||||
// "GET", "terrain not implemented");
|
||||
}
|
||||
|
||||
protected string RegionStats(OSHttpResponse httpResponse, Scene scene)
|
||||
protected string RegionStats(IOSHttpResponse httpResponse, Scene scene)
|
||||
{
|
||||
int users = scene.GetRootAgentCount();
|
||||
int objects = scene.Entities.Count - users;
|
||||
@@ -213,7 +213,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Regions
|
||||
return rxw.ToString();
|
||||
}
|
||||
|
||||
protected string RegionPrims(OSHttpResponse httpResponse, Scene scene, Vector3 min, Vector3 max)
|
||||
protected string RegionPrims(IOSHttpResponse httpResponse, Scene scene, Vector3 min, Vector3 max)
|
||||
{
|
||||
httpResponse.SendChunked = true;
|
||||
httpResponse.ContentType = "text/xml";
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Regions
|
||||
{
|
||||
#region GET methods
|
||||
public string GetRegionInfoHandler(string request, string path, string param,
|
||||
OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
// foreach (string h in httpRequest.Headers.AllKeys)
|
||||
// foreach (string v in httpRequest.Headers.GetValues(h))
|
||||
@@ -64,7 +64,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Regions
|
||||
}
|
||||
}
|
||||
|
||||
public string GetRegionInfoHandlerRegions(OSHttpResponse httpResponse)
|
||||
public string GetRegionInfoHandlerRegions(IOSHttpResponse httpResponse)
|
||||
{
|
||||
RestXmlWriter rxw = new RestXmlWriter(new StringWriter());
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Regions
|
||||
#region POST methods
|
||||
|
||||
public string PostHandler(string request, string path, string param,
|
||||
OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
// foreach (string h in httpRequest.Headers.AllKeys)
|
||||
// foreach (string v in httpRequest.Headers.GetValues(h))
|
||||
@@ -92,7 +92,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Regions
|
||||
}
|
||||
}
|
||||
|
||||
public string CreateRegion(OSHttpRequest request, OSHttpResponse response)
|
||||
public string CreateRegion(IOSHttpRequest request, IOSHttpResponse response)
|
||||
{
|
||||
RestXmlWriter rxw = new RestXmlWriter(new StringWriter());
|
||||
|
||||
@@ -108,7 +108,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Regions
|
||||
return rxw.ToString();
|
||||
}
|
||||
|
||||
public string LoadPrims(string requestBody, OSHttpRequest request, OSHttpResponse response, Scene scene)
|
||||
public string LoadPrims(string requestBody, IOSHttpRequest request, IOSHttpResponse response, Scene scene)
|
||||
{
|
||||
IRegionSerialiserModule serialiser = scene.RequestModuleInterface<IRegionSerialiserModule>();
|
||||
if (serialiser != null)
|
||||
|
||||
@@ -328,7 +328,7 @@ namespace OpenSim.ApplicationPlugins.Rest
|
||||
/// </summary>
|
||||
/// <param name="request">HTTP request header</param>
|
||||
/// <returns>true when the HTTP request came from god.</returns>
|
||||
protected bool IsGod(OSHttpRequest request)
|
||||
protected bool IsGod(IOSHttpRequest request)
|
||||
{
|
||||
string[] keys = request.Headers.GetValues("X-OpenSim-Godkey");
|
||||
if (null == keys) return false;
|
||||
@@ -342,7 +342,7 @@ namespace OpenSim.ApplicationPlugins.Rest
|
||||
/// HTTP header is indeed the password on file for the avatar
|
||||
/// specified by the UUID
|
||||
/// </summary>
|
||||
protected bool IsVerifiedUser(OSHttpRequest request, UUID uuid)
|
||||
protected bool IsVerifiedUser(IOSHttpRequest request, UUID uuid)
|
||||
{
|
||||
// XXX under construction
|
||||
return false;
|
||||
@@ -377,7 +377,7 @@ namespace OpenSim.ApplicationPlugins.Rest
|
||||
/// <param name="message">failure message</param>
|
||||
/// <remarks>This should probably set a return code as
|
||||
/// well. (?)</remarks>
|
||||
protected string Failure(OSHttpResponse response, OSHttpStatusCode status,
|
||||
protected string Failure(IOSHttpResponse response, OSHttpStatusCode status,
|
||||
string method, string format, params string[] msg)
|
||||
{
|
||||
string m = String.Format(format, msg);
|
||||
@@ -396,7 +396,7 @@ namespace OpenSim.ApplicationPlugins.Rest
|
||||
/// <param name="e">exception causing the failure message</param>
|
||||
/// <remarks>This should probably set a return code as
|
||||
/// well. (?)</remarks>
|
||||
public string Failure(OSHttpResponse response, OSHttpStatusCode status,
|
||||
public string Failure(IOSHttpResponse response, OSHttpStatusCode status,
|
||||
string method, Exception e)
|
||||
{
|
||||
string m = String.Format("exception occurred: {0}", e.Message);
|
||||
|
||||
@@ -51,11 +51,10 @@ namespace OpenSim.Framework.Capabilities
|
||||
/// supplied BaseHttpServer.
|
||||
/// </summary>
|
||||
/// <param name="httpListener">base HTTP server</param>
|
||||
/// <param name="httpListenerHostname">host name of the HTTP
|
||||
/// server</param>
|
||||
/// <param name="httpListenerHostname">host name of the HTTP server</param>
|
||||
/// <param name="httpListenerPort">HTTP port</param>
|
||||
public CapsHandlers(BaseHttpServer httpListener, string httpListenerHostname, uint httpListenerPort)
|
||||
: this (httpListener,httpListenerHostname,httpListenerPort, false)
|
||||
: this(httpListener,httpListenerHostname,httpListenerPort, false)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -88,44 +87,52 @@ namespace OpenSim.Framework.Capabilities
|
||||
/// handler to be removed</param>
|
||||
public void Remove(string capsName)
|
||||
{
|
||||
m_httpListener.RemoveStreamHandler("POST", m_capsHandlers[capsName].Path);
|
||||
m_httpListener.RemoveStreamHandler("GET", m_capsHandlers[capsName].Path);
|
||||
m_capsHandlers.Remove(capsName);
|
||||
lock (m_capsHandlers)
|
||||
{
|
||||
m_httpListener.RemoveStreamHandler("POST", m_capsHandlers[capsName].Path);
|
||||
m_httpListener.RemoveStreamHandler("GET", m_capsHandlers[capsName].Path);
|
||||
m_capsHandlers.Remove(capsName);
|
||||
}
|
||||
}
|
||||
|
||||
public bool ContainsCap(string cap)
|
||||
{
|
||||
return m_capsHandlers.ContainsKey(cap);
|
||||
lock (m_capsHandlers)
|
||||
return m_capsHandlers.ContainsKey(cap);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The indexer allows us to treat the CapsHandlers object
|
||||
/// in an intuitive dictionary like way.
|
||||
/// </summary>
|
||||
/// <Remarks>
|
||||
/// <remarks>
|
||||
/// The indexer will throw an exception when you try to
|
||||
/// retrieve a cap handler for a cap that is not contained in
|
||||
/// CapsHandlers.
|
||||
/// </Remarks>
|
||||
/// </remarks>
|
||||
public IRequestHandler this[string idx]
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_capsHandlers[idx];
|
||||
lock (m_capsHandlers)
|
||||
return m_capsHandlers[idx];
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
if (m_capsHandlers.ContainsKey(idx))
|
||||
lock (m_capsHandlers)
|
||||
{
|
||||
m_httpListener.RemoveStreamHandler("POST", m_capsHandlers[idx].Path);
|
||||
m_capsHandlers.Remove(idx);
|
||||
if (m_capsHandlers.ContainsKey(idx))
|
||||
{
|
||||
m_httpListener.RemoveStreamHandler("POST", m_capsHandlers[idx].Path);
|
||||
m_capsHandlers.Remove(idx);
|
||||
}
|
||||
|
||||
if (null == value) return;
|
||||
|
||||
m_capsHandlers[idx] = value;
|
||||
m_httpListener.AddStreamHandler(value);
|
||||
}
|
||||
|
||||
if (null == value) return;
|
||||
|
||||
m_capsHandlers[idx] = value;
|
||||
m_httpListener.AddStreamHandler(value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,9 +144,12 @@ namespace OpenSim.Framework.Capabilities
|
||||
{
|
||||
get
|
||||
{
|
||||
string[] __keys = new string[m_capsHandlers.Keys.Count];
|
||||
m_capsHandlers.Keys.CopyTo(__keys, 0);
|
||||
return __keys;
|
||||
lock (m_capsHandlers)
|
||||
{
|
||||
string[] __keys = new string[m_capsHandlers.Keys.Count];
|
||||
m_capsHandlers.Keys.CopyTo(__keys, 0);
|
||||
return __keys;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,15 +167,19 @@ namespace OpenSim.Framework.Capabilities
|
||||
protocol = "https://";
|
||||
|
||||
string baseUrl = protocol + m_httpListenerHostName + ":" + m_httpListenerPort.ToString();
|
||||
foreach (string capsName in m_capsHandlers.Keys)
|
||||
{
|
||||
if (excludeSeed && "SEED" == capsName)
|
||||
continue;
|
||||
|
||||
caps[capsName] = baseUrl + m_capsHandlers[capsName].Path;
|
||||
lock (m_capsHandlers)
|
||||
{
|
||||
foreach (string capsName in m_capsHandlers.Keys)
|
||||
{
|
||||
if (excludeSeed && "SEED" == capsName)
|
||||
continue;
|
||||
|
||||
caps[capsName] = baseUrl + m_capsHandlers[capsName].Path;
|
||||
}
|
||||
}
|
||||
|
||||
return caps;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.StructuredData;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Capabilities;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using Caps = OpenSim.Framework.Capabilities.Caps;
|
||||
using OSDArray = OpenMetaverse.StructuredData.OSDArray;
|
||||
using OSDMap = OpenMetaverse.StructuredData.OSDMap;
|
||||
|
||||
namespace OpenSim.Capabilities.Handlers
|
||||
{
|
||||
public class FetchInventory2Handler
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private IInventoryService m_inventoryService;
|
||||
|
||||
public FetchInventory2Handler(IInventoryService invService)
|
||||
{
|
||||
m_inventoryService = invService;
|
||||
}
|
||||
|
||||
public string FetchInventoryRequest(string request, string path, string param, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
// m_log.DebugFormat("[FETCH INVENTORY HANDLER]: Received FetchInventory capabilty request");
|
||||
|
||||
OSDMap requestmap = (OSDMap)OSDParser.DeserializeLLSDXml(Utils.StringToBytes(request));
|
||||
OSDArray itemsRequested = (OSDArray)requestmap["items"];
|
||||
|
||||
string reply;
|
||||
LLSDFetchInventory llsdReply = new LLSDFetchInventory();
|
||||
|
||||
foreach (OSDMap osdItemId in itemsRequested)
|
||||
{
|
||||
UUID itemId = osdItemId["item_id"].AsUUID();
|
||||
|
||||
InventoryItemBase item = m_inventoryService.GetItem(new InventoryItemBase(itemId));
|
||||
|
||||
if (item != null)
|
||||
{
|
||||
// We don't know the agent that this request belongs to so we'll use the agent id of the item
|
||||
// which will be the same for all items.
|
||||
llsdReply.agent_id = item.Owner;
|
||||
|
||||
llsdReply.items.Array.Add(ConvertInventoryItem(item));
|
||||
}
|
||||
}
|
||||
|
||||
reply = LLSDHelpers.SerialiseLLSDReply(llsdReply);
|
||||
|
||||
return reply;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert an internal inventory item object into an LLSD object.
|
||||
/// </summary>
|
||||
/// <param name="invItem"></param>
|
||||
/// <returns></returns>
|
||||
private LLSDInventoryItem ConvertInventoryItem(InventoryItemBase invItem)
|
||||
{
|
||||
LLSDInventoryItem llsdItem = new LLSDInventoryItem();
|
||||
llsdItem.asset_id = invItem.AssetID;
|
||||
llsdItem.created_at = invItem.CreationDate;
|
||||
llsdItem.desc = invItem.Description;
|
||||
llsdItem.flags = (int)invItem.Flags;
|
||||
llsdItem.item_id = invItem.ID;
|
||||
llsdItem.name = invItem.Name;
|
||||
llsdItem.parent_id = invItem.Folder;
|
||||
|
||||
try
|
||||
{
|
||||
llsdItem.type = Utils.AssetTypeToString((AssetType)invItem.AssetType);
|
||||
llsdItem.inv_type = Utils.InventoryTypeToString((InventoryType)invItem.InvType);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[WEB FETCH INV DESC HANDLER]: Problem setting asset {0} inventory {1} types while converting inventory item {2}: {3}",
|
||||
invItem.AssetType, invItem.InvType, invItem.Name, e.Message);
|
||||
}
|
||||
|
||||
llsdItem.permissions = new LLSDPermissions();
|
||||
llsdItem.permissions.creator_id = invItem.CreatorIdAsUuid;
|
||||
llsdItem.permissions.base_mask = (int)invItem.CurrentPermissions;
|
||||
llsdItem.permissions.everyone_mask = (int)invItem.EveryOnePermissions;
|
||||
llsdItem.permissions.group_id = invItem.GroupID;
|
||||
llsdItem.permissions.group_mask = (int)invItem.GroupPermissions;
|
||||
llsdItem.permissions.is_owner_group = invItem.GroupOwned;
|
||||
llsdItem.permissions.next_owner_mask = (int)invItem.NextPermissions;
|
||||
llsdItem.permissions.owner_id = invItem.Owner;
|
||||
llsdItem.permissions.owner_mask = (int)invItem.CurrentPermissions;
|
||||
llsdItem.sale_info = new LLSDSaleInfo();
|
||||
llsdItem.sale_info.sale_price = invItem.SalePrice;
|
||||
switch (invItem.SaleType)
|
||||
{
|
||||
default:
|
||||
llsdItem.sale_info.sale_type = "not";
|
||||
break;
|
||||
case 1:
|
||||
llsdItem.sale_info.sale_type = "original";
|
||||
break;
|
||||
case 2:
|
||||
llsdItem.sale_info.sale_type = "copy";
|
||||
break;
|
||||
case 3:
|
||||
llsdItem.sale_info.sale_type = "contents";
|
||||
break;
|
||||
}
|
||||
|
||||
return llsdItem;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using Nini.Config;
|
||||
using OpenSim.Server.Base;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using OpenSim.Server.Handlers.Base;
|
||||
using OpenMetaverse;
|
||||
|
||||
namespace OpenSim.Capabilities.Handlers
|
||||
{
|
||||
public class FetchInventory2ServerConnector : ServiceConnector
|
||||
{
|
||||
private IInventoryService m_InventoryService;
|
||||
private string m_ConfigName = "CapsService";
|
||||
|
||||
public FetchInventory2ServerConnector(IConfigSource config, IHttpServer server, string configName)
|
||||
: base(config, server, configName)
|
||||
{
|
||||
if (configName != String.Empty)
|
||||
m_ConfigName = configName;
|
||||
|
||||
IConfig serverConfig = config.Configs[m_ConfigName];
|
||||
if (serverConfig == null)
|
||||
throw new Exception(String.Format("No section '{0}' in config file", m_ConfigName));
|
||||
|
||||
string invService = serverConfig.GetString("InventoryService", String.Empty);
|
||||
|
||||
if (invService == String.Empty)
|
||||
throw new Exception("No InventoryService in config file");
|
||||
|
||||
Object[] args = new Object[] { config };
|
||||
m_InventoryService = ServerUtils.LoadPlugin<IInventoryService>(invService, args);
|
||||
|
||||
if (m_InventoryService == null)
|
||||
throw new Exception(String.Format("Failed to load InventoryService from {0}; config is {1}", invService, m_ConfigName));
|
||||
|
||||
FetchInventory2Handler fiHandler = new FetchInventory2Handler(m_InventoryService);
|
||||
IRequestHandler reqHandler
|
||||
= new RestStreamHandler("POST", "/CAPS/FetchInventory/", fiHandler.FetchInventoryRequest);
|
||||
server.AddStreamHandler(reqHandler);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -64,7 +64,7 @@ namespace OpenSim.Capabilities.Handlers
|
||||
m_assetService = assService;
|
||||
}
|
||||
|
||||
public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
public override byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
// Try to parse the texture ID from the request URL
|
||||
NameValueCollection query = HttpUtility.ParseQueryString(httpRequest.Url.Query);
|
||||
@@ -111,6 +111,10 @@ namespace OpenSim.Capabilities.Handlers
|
||||
m_log.Warn("[GETTEXTURE]: Failed to parse a texture_id from GetTexture request: " + httpRequest.Url);
|
||||
}
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[GETTEXTURE]: For texture {0} sending back response {1}, data length {2}",
|
||||
// textureID, httpResponse.StatusCode, httpResponse.ContentLength);
|
||||
|
||||
httpResponse.Send();
|
||||
return null;
|
||||
}
|
||||
@@ -123,7 +127,7 @@ namespace OpenSim.Capabilities.Handlers
|
||||
/// <param name="textureID"></param>
|
||||
/// <param name="format"></param>
|
||||
/// <returns>False for "caller try another codec"; true otherwise</returns>
|
||||
private bool FetchTexture(OSHttpRequest httpRequest, OSHttpResponse httpResponse, UUID textureID, string format)
|
||||
private bool FetchTexture(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, UUID textureID, string format)
|
||||
{
|
||||
// m_log.DebugFormat("[GETTEXTURE]: {0} with requested format {1}", textureID, format);
|
||||
AssetBase texture;
|
||||
@@ -207,38 +211,43 @@ namespace OpenSim.Capabilities.Handlers
|
||||
return true;
|
||||
}
|
||||
|
||||
private void WriteTextureData(OSHttpRequest request, OSHttpResponse response, AssetBase texture, string format)
|
||||
private void WriteTextureData(IOSHttpRequest request, IOSHttpResponse response, AssetBase texture, string format)
|
||||
{
|
||||
string range = request.Headers.GetOne("Range");
|
||||
//m_log.DebugFormat("[GETTEXTURE]: Range {0}", range);
|
||||
|
||||
if (!String.IsNullOrEmpty(range)) // JP2's only
|
||||
{
|
||||
// Range request
|
||||
int start, end;
|
||||
if (TryParseRange(range, out start, out end))
|
||||
{
|
||||
|
||||
// Before clamping start make sure we can satisfy it in order to avoid
|
||||
// sending back the last byte instead of an error status
|
||||
if (start >= texture.Data.Length)
|
||||
{
|
||||
response.StatusCode = (int)System.Net.HttpStatusCode.RequestedRangeNotSatisfiable;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
end = Utils.Clamp(end, 0, texture.Data.Length - 1);
|
||||
start = Utils.Clamp(start, 0, end);
|
||||
int len = end - start + 1;
|
||||
|
||||
end = Utils.Clamp(end, 0, texture.Data.Length - 1);
|
||||
start = Utils.Clamp(start, 0, end);
|
||||
int len = end - start + 1;
|
||||
//m_log.Debug("Serving " + start + " to " + end + " of " + texture.Data.Length + " bytes for texture " + texture.ID);
|
||||
|
||||
//m_log.Debug("Serving " + start + " to " + end + " of " + texture.Data.Length + " bytes for texture " + texture.ID);
|
||||
|
||||
if (len < texture.Data.Length)
|
||||
// Always return PartialContent, even if the range covered the entire data length
|
||||
// We were accidentally sending back 404 before in this situation
|
||||
// https://issues.apache.org/bugzilla/show_bug.cgi?id=51878 supports sending 206 even if the
|
||||
// entire range is requested, and viewer 3.2.2 (and very probably earlier) seems fine with this.
|
||||
response.StatusCode = (int)System.Net.HttpStatusCode.PartialContent;
|
||||
|
||||
response.ContentLength = len;
|
||||
response.ContentType = texture.Metadata.ContentType;
|
||||
response.AddHeader("Content-Range", String.Format("bytes {0}-{1}/{2}", start, end, texture.Data.Length));
|
||||
|
||||
response.Body.Write(texture.Data, start, len);
|
||||
response.ContentLength = len;
|
||||
response.ContentType = texture.Metadata.ContentType;
|
||||
response.AddHeader("Content-Range", String.Format("bytes {0}-{1}/{2}", start, end, texture.Data.Length));
|
||||
|
||||
response.Body.Write(texture.Data, start, len);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -257,6 +266,15 @@ namespace OpenSim.Capabilities.Handlers
|
||||
response.ContentType = "image/" + format;
|
||||
response.Body.Write(texture.Data, 0, texture.Data.Length);
|
||||
}
|
||||
|
||||
// if (response.StatusCode < 200 || response.StatusCode > 299)
|
||||
// m_log.WarnFormat(
|
||||
// "[GETTEXTURE]: For texture {0} requested range {1} responded {2} with content length {3} (actual {4})",
|
||||
// texture.FullID, range, response.StatusCode, response.ContentLength, texture.Data.Length);
|
||||
// else
|
||||
// m_log.DebugFormat(
|
||||
// "[GETTEXTURE]: For texture {0} requested range {1} responded {2} with content length {3} (actual {4})",
|
||||
// texture.FullID, range, response.StatusCode, response.ContentLength, texture.Data.Length);
|
||||
}
|
||||
|
||||
private bool TryParseRange(string header, out int start, out int end)
|
||||
@@ -275,7 +293,6 @@ namespace OpenSim.Capabilities.Handlers
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
private byte[] ConvertTextureData(AssetBase texture, string format)
|
||||
{
|
||||
m_log.DebugFormat("[GETTEXTURE]: Converting texture {0} to {1}", texture.ID, format);
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
using log4net;
|
||||
using log4net.Config;
|
||||
using NUnit.Framework;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Capabilities.Handlers;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Tests.Common;
|
||||
using OpenSim.Tests.Common.Mock;
|
||||
|
||||
namespace OpenSim.Capabilities.Handlers.GetTexture.Tests
|
||||
{
|
||||
[TestFixture]
|
||||
public class GetTextureHandlerTests
|
||||
{
|
||||
[Test]
|
||||
public void TestTextureNotFound()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
|
||||
// Overkill - we only really need the asset service, not a whole scene.
|
||||
Scene scene = SceneHelpers.SetupScene();
|
||||
|
||||
GetTextureHandler handler = new GetTextureHandler(null, scene.AssetService);
|
||||
TestOSHttpRequest req = new TestOSHttpRequest();
|
||||
TestOSHttpResponse resp = new TestOSHttpResponse();
|
||||
req.Url = new Uri("http://localhost/?texture_id=00000000-0000-1111-9999-000000000012");
|
||||
handler.Handle(null, null, req, resp);
|
||||
Assert.That(resp.StatusCode, Is.EqualTo((int)System.Net.HttpStatusCode.NotFound));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -73,12 +73,10 @@ namespace OpenSim.Capabilities.Handlers
|
||||
/// <param name="httpResponse"></param>
|
||||
/// <returns>The upload response if the request is successful, null otherwise.</returns>
|
||||
public string UploadBakedTexture(
|
||||
string request, string path, string param, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
string request, string path, string param, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
try
|
||||
{
|
||||
// m_log.Debug("[CAPS]: UploadBakedTexture Request in region: " + m_regionName);
|
||||
|
||||
string capsBase = "/CAPS/" + m_HostCapsObj.CapsObjectPath;
|
||||
string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000");
|
||||
|
||||
@@ -106,7 +104,7 @@ namespace OpenSim.Capabilities.Handlers
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.Error("[UPLOAD BAKED TEXTURE HANDLER]: " + e.ToString());
|
||||
m_log.ErrorFormat("[UPLOAD BAKED TEXTURE HANDLER]: {0}{1}", e.Message, e.StackTrace);
|
||||
}
|
||||
|
||||
return null;
|
||||
@@ -119,7 +117,7 @@ namespace OpenSim.Capabilities.Handlers
|
||||
/// <param name="data"></param>
|
||||
private void BakedTextureUploaded(UUID assetID, byte[] data)
|
||||
{
|
||||
// m_log.WarnFormat("[CAPS]: Received baked texture {0}", assetID.ToString());
|
||||
// m_log.DebugFormat("[UPLOAD BAKED TEXTURE HANDLER]: Received baked texture {0}", assetID.ToString());
|
||||
|
||||
AssetBase asset;
|
||||
asset = new AssetBase(assetID, "Baked Texture", (sbyte)AssetType.Texture, m_HostCapsObj.AgentID.ToString());
|
||||
|
||||
@@ -57,7 +57,7 @@ namespace OpenSim.Capabilities.Handlers
|
||||
m_LibraryService = libService;
|
||||
}
|
||||
|
||||
public string FetchInventoryDescendentsRequest(string request, string path, string param, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
public string FetchInventoryDescendentsRequest(string request, string path, string param, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
// lock (m_fetchLock)
|
||||
// {
|
||||
@@ -181,6 +181,15 @@ namespace OpenSim.Capabilities.Handlers
|
||||
contents.descendents = contents.items.Array.Count + contents.categories.Array.Count;
|
||||
contents.version = version;
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[WEB FETCH INV DESC HANDLER]: Replying to request for folder {0} (fetch items {1}, fetch folders {2}) with {3} items and {4} folders for agent {5}",
|
||||
// invFetch.folder_id,
|
||||
// invFetch.fetch_items,
|
||||
// invFetch.fetch_folders,
|
||||
// contents.items.Array.Count,
|
||||
// contents.categories.Array.Count,
|
||||
// invFetch.owner_id);
|
||||
|
||||
return reply;
|
||||
}
|
||||
|
||||
@@ -195,7 +204,7 @@ namespace OpenSim.Capabilities.Handlers
|
||||
/// <param name="sortOrder"></param>
|
||||
/// <param name="version"></param>
|
||||
/// <returns>An empty InventoryCollection if the inventory look up failed</returns>
|
||||
public InventoryCollection Fetch(
|
||||
private InventoryCollection Fetch(
|
||||
UUID agentID, UUID folderID, UUID ownerID,
|
||||
bool fetchFolders, bool fetchItems, int sortOrder, out int version)
|
||||
{
|
||||
@@ -228,8 +237,88 @@ namespace OpenSim.Capabilities.Handlers
|
||||
containingFolder.ID = folderID;
|
||||
containingFolder.Owner = agentID;
|
||||
containingFolder = m_InventoryService.GetFolder(containingFolder);
|
||||
|
||||
if (containingFolder != null)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[WEB FETCH INV DESC HANDLER]: Retrieved folder {0} {1} for agent id {2}",
|
||||
// containingFolder.Name, containingFolder.ID, agentID);
|
||||
|
||||
version = containingFolder.Version;
|
||||
|
||||
// if (fetchItems)
|
||||
// {
|
||||
// List<InventoryItemBase> linkedItemsToAdd = new List<InventoryItemBase>();
|
||||
//
|
||||
// foreach (InventoryItemBase item in contents.Items)
|
||||
// {
|
||||
// if (item.AssetType == (int)AssetType.Link)
|
||||
// {
|
||||
// InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID));
|
||||
//
|
||||
// // Take care of genuinely broken links where the target doesn't exist
|
||||
// // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate,
|
||||
// // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles
|
||||
// // rather than having to keep track of every folder requested in the recursion.
|
||||
// if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link)
|
||||
// linkedItemsToAdd.Insert(0, linkedItem);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// foreach (InventoryItemBase linkedItem in linkedItemsToAdd)
|
||||
// {
|
||||
// m_log.DebugFormat(
|
||||
// "[WEB FETCH INV DESC HANDLER]: Inserted linked item {0} for link in folder {1} for agent {2}",
|
||||
// linkedItem.Name, folderID, agentID);
|
||||
//
|
||||
// contents.Items.Add(linkedItem);
|
||||
// }
|
||||
//
|
||||
// // If the folder requested contains links, then we need to send those folders first, otherwise the links
|
||||
// // will be broken in the viewer.
|
||||
// HashSet<UUID> linkedItemFolderIdsToSend = new HashSet<UUID>();
|
||||
// foreach (InventoryItemBase item in contents.Items)
|
||||
// {
|
||||
// if (item.AssetType == (int)AssetType.Link)
|
||||
// {
|
||||
// InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID));
|
||||
//
|
||||
// // Take care of genuinely broken links where the target doesn't exist
|
||||
// // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate,
|
||||
// // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles
|
||||
// // rather than having to keep track of every folder requested in the recursion.
|
||||
// if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link)
|
||||
// {
|
||||
// // We don't need to send the folder if source and destination of the link are in the same
|
||||
// // folder.
|
||||
// if (linkedItem.Folder != containingFolder.ID)
|
||||
// linkedItemFolderIdsToSend.Add(linkedItem.Folder);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// foreach (UUID linkedItemFolderId in linkedItemFolderIdsToSend)
|
||||
// {
|
||||
// m_log.DebugFormat(
|
||||
// "[WEB FETCH INV DESC HANDLER]: Recursively fetching folder {0} linked by item in folder {1} for agent {2}",
|
||||
// linkedItemFolderId, folderID, agentID);
|
||||
//
|
||||
// int dummyVersion;
|
||||
// InventoryCollection linkedCollection
|
||||
// = Fetch(
|
||||
// agentID, linkedItemFolderId, ownerID, fetchFolders, fetchItems, sortOrder, out dummyVersion);
|
||||
//
|
||||
// InventoryFolderBase linkedFolder = new InventoryFolderBase(linkedItemFolderId);
|
||||
// linkedFolder.Owner = agentID;
|
||||
// linkedFolder = m_InventoryService.GetFolder(linkedFolder);
|
||||
//
|
||||
//// contents.Folders.AddRange(linkedCollection.Folders);
|
||||
//
|
||||
// contents.Folders.Add(linkedFolder);
|
||||
// contents.Items.AddRange(linkedCollection.Items);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -95,4 +95,11 @@ namespace OpenSim.Framework.Capabilities
|
||||
public UUID owner_id;
|
||||
public int version;
|
||||
}
|
||||
}
|
||||
|
||||
[OSDMap]
|
||||
public class LLSDFetchInventory
|
||||
{
|
||||
public UUID agent_id;
|
||||
public OSDArray items = new OSDArray();
|
||||
}
|
||||
}
|
||||
@@ -45,7 +45,7 @@ namespace OpenSim.Framework.Capabilities
|
||||
}
|
||||
|
||||
public override byte[] Handle(string path, Stream request,
|
||||
OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
//Encoding encoding = Util.UTF8;
|
||||
//StreamReader streamReader = new StreamReader(request, false);
|
||||
|
||||
@@ -681,7 +681,7 @@ VALUES
|
||||
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||
{
|
||||
conn.Open();
|
||||
foreach (ParcelManager.ParcelAccessEntry parcelAccessEntry in parcel.LandData.ParcelAccessList)
|
||||
foreach (LandAccessEntry parcelAccessEntry in parcel.LandData.ParcelAccessList)
|
||||
{
|
||||
cmd.Parameters.AddRange(CreateLandAccessParameters(parcelAccessEntry, parcel.RegionUUID));
|
||||
|
||||
@@ -1252,7 +1252,7 @@ VALUES
|
||||
,[elevation_1_ne] = @elevation_1_ne ,[elevation_2_ne] = @elevation_2_ne ,[elevation_1_se] = @elevation_1_se ,[elevation_2_se] = @elevation_2_se
|
||||
,[elevation_1_sw] = @elevation_1_sw ,[elevation_2_sw] = @elevation_2_sw ,[water_height] = @water_height ,[terrain_raise_limit] = @terrain_raise_limit
|
||||
,[terrain_lower_limit] = @terrain_lower_limit ,[use_estate_sun] = @use_estate_sun ,[fixed_sun] = @fixed_sun ,[sun_position] = @sun_position
|
||||
,[covenant] = @covenant , [sunvectorx] = @sunvectorx, [sunvectory] = @sunvectory, [sunvectorz] = @sunvectorz, [Sandbox] = @Sandbox, [loaded_creation_datetime] = @loaded_creation_datetime, [loaded_creation_id] = @loaded_creation_id
|
||||
,[covenant] = @covenant ,[covenant_datetime] = @covenant_datetime, [sunvectorx] = @sunvectorx, [sunvectory] = @sunvectory, [sunvectorz] = @sunvectorz, [Sandbox] = @Sandbox, [loaded_creation_datetime] = @loaded_creation_datetime, [loaded_creation_id] = @loaded_creation_id
|
||||
WHERE [regionUUID] = @regionUUID";
|
||||
|
||||
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||
@@ -1307,14 +1307,14 @@ VALUES
|
||||
[block_show_in_search],[agent_limit],[object_bonus],[maturity],[disable_scripts],[disable_collisions],[disable_physics],
|
||||
[terrain_texture_1],[terrain_texture_2],[terrain_texture_3],[terrain_texture_4],[elevation_1_nw],[elevation_2_nw],[elevation_1_ne],
|
||||
[elevation_2_ne],[elevation_1_se],[elevation_2_se],[elevation_1_sw],[elevation_2_sw],[water_height],[terrain_raise_limit],
|
||||
[terrain_lower_limit],[use_estate_sun],[fixed_sun],[sun_position],[covenant],[sunvectorx], [sunvectory], [sunvectorz],[Sandbox], [loaded_creation_datetime], [loaded_creation_id]
|
||||
[terrain_lower_limit],[use_estate_sun],[fixed_sun],[sun_position],[covenant],[covenant_datetime],[sunvectorx], [sunvectory], [sunvectorz],[Sandbox], [loaded_creation_datetime], [loaded_creation_id]
|
||||
)
|
||||
VALUES
|
||||
(@regionUUID,@block_terraform,@block_fly,@allow_damage,@restrict_pushing,@allow_land_resell,@allow_land_join_divide,
|
||||
@block_show_in_search,@agent_limit,@object_bonus,@maturity,@disable_scripts,@disable_collisions,@disable_physics,
|
||||
@terrain_texture_1,@terrain_texture_2,@terrain_texture_3,@terrain_texture_4,@elevation_1_nw,@elevation_2_nw,@elevation_1_ne,
|
||||
@elevation_2_ne,@elevation_1_se,@elevation_2_se,@elevation_1_sw,@elevation_2_sw,@water_height,@terrain_raise_limit,
|
||||
@terrain_lower_limit,@use_estate_sun,@fixed_sun,@sun_position,@covenant,@sunvectorx,@sunvectory, @sunvectorz, @Sandbox, @loaded_creation_datetime, @loaded_creation_id)";
|
||||
@terrain_lower_limit,@use_estate_sun,@fixed_sun,@sun_position,@covenant, @covenant_datetime, @sunvectorx,@sunvectory, @sunvectorz, @Sandbox, @loaded_creation_datetime, @loaded_creation_id)";
|
||||
|
||||
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||
@@ -1376,7 +1376,7 @@ VALUES
|
||||
Convert.ToSingle(row["sunvectorz"])
|
||||
);
|
||||
newSettings.Covenant = new UUID((Guid)row["covenant"]);
|
||||
|
||||
newSettings.CovenantChangedDateTime = Convert.ToInt32(row["covenant_datetime"]);
|
||||
newSettings.LoadedCreationDateTime = Convert.ToInt32(row["loaded_creation_datetime"]);
|
||||
|
||||
if (row["loaded_creation_id"] is DBNull)
|
||||
@@ -1453,7 +1453,7 @@ VALUES
|
||||
_Log.ErrorFormat("[PARCEL]: unable to get parcel telehub settings for {1}", newData.Name);
|
||||
}
|
||||
|
||||
newData.ParcelAccessList = new List<ParcelManager.ParcelAccessEntry>();
|
||||
newData.ParcelAccessList = new List<LandAccessEntry>();
|
||||
|
||||
return newData;
|
||||
}
|
||||
@@ -1463,12 +1463,12 @@ VALUES
|
||||
/// </summary>
|
||||
/// <param name="row">datarecord with landaccess data</param>
|
||||
/// <returns></returns>
|
||||
private static ParcelManager.ParcelAccessEntry BuildLandAccessData(IDataRecord row)
|
||||
private static LandAccessEntry BuildLandAccessData(IDataRecord row)
|
||||
{
|
||||
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
|
||||
LandAccessEntry entry = new LandAccessEntry();
|
||||
entry.AgentID = new UUID((Guid)row["AccessUUID"]);
|
||||
entry.Flags = (AccessList)Convert.ToInt32(row["Flags"]);
|
||||
entry.Time = new DateTime();
|
||||
entry.Expires = 0;
|
||||
return entry;
|
||||
}
|
||||
|
||||
@@ -1789,6 +1789,7 @@ VALUES
|
||||
parameters.Add(_Database.CreateParameter("sunvectory", settings.SunVector.Y));
|
||||
parameters.Add(_Database.CreateParameter("sunvectorz", settings.SunVector.Z));
|
||||
parameters.Add(_Database.CreateParameter("covenant", settings.Covenant));
|
||||
parameters.Add(_Database.CreateParameter("covenant_datetime", settings.CovenantChangedDateTime));
|
||||
parameters.Add(_Database.CreateParameter("Loaded_Creation_DateTime", settings.LoadedCreationDateTime));
|
||||
parameters.Add(_Database.CreateParameter("Loaded_Creation_ID", settings.LoadedCreationID));
|
||||
|
||||
@@ -1851,7 +1852,7 @@ VALUES
|
||||
/// <param name="parcelAccessEntry">parcel access entry.</param>
|
||||
/// <param name="parcelID">parcel ID.</param>
|
||||
/// <returns></returns>
|
||||
private SqlParameter[] CreateLandAccessParameters(ParcelManager.ParcelAccessEntry parcelAccessEntry, UUID parcelID)
|
||||
private SqlParameter[] CreateLandAccessParameters(LandAccessEntry parcelAccessEntry, UUID parcelID)
|
||||
{
|
||||
List<SqlParameter> parameters = new List<SqlParameter>();
|
||||
|
||||
|
||||
@@ -1043,3 +1043,11 @@ FOR CreatorID
|
||||
ALTER TABLE primitems ALTER COLUMN CreatorID uniqueidentifier NOT NULL
|
||||
|
||||
COMMIT
|
||||
|
||||
:VERSION 29 #---------------------
|
||||
|
||||
BEGIN TRANSACTION
|
||||
|
||||
ALTER TABLE regionsettings ADD covenant_datetime int NOT NULL default 0
|
||||
|
||||
COMMIT
|
||||
|
||||
@@ -210,7 +210,6 @@ namespace OpenSim.Data.MySQL
|
||||
}
|
||||
|
||||
LoadBanList(es);
|
||||
|
||||
es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
|
||||
es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
|
||||
es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
|
||||
|
||||
@@ -173,6 +173,11 @@ namespace OpenSim.Data.MySQL
|
||||
int v = Convert.ToInt32(reader[name]);
|
||||
m_Fields[name].SetValue(row, v);
|
||||
}
|
||||
else if (m_Fields[name].FieldType == typeof(uint))
|
||||
{
|
||||
uint v = Convert.ToUInt32(reader[name]);
|
||||
m_Fields[name].SetValue(row, v);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Fields[name].SetValue(row, reader[name]);
|
||||
@@ -294,4 +299,4 @@ namespace OpenSim.Data.MySQL
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -561,45 +561,46 @@ namespace OpenSim.Data.MySQL
|
||||
|
||||
public virtual void StoreTerrain(double[,] ter, UUID regionID)
|
||||
{
|
||||
m_log.Info("[REGION DB]: Storing terrain");
|
||||
|
||||
lock (m_dbLock)
|
||||
Util.FireAndForget(delegate(object x)
|
||||
{
|
||||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
double[,] oldTerrain = LoadTerrain(regionID);
|
||||
|
||||
m_log.Info("[REGION DB]: Storing terrain");
|
||||
|
||||
lock (m_dbLock)
|
||||
{
|
||||
dbcon.Open();
|
||||
|
||||
using (MySqlCommand cmd = dbcon.CreateCommand())
|
||||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
{
|
||||
cmd.CommandText = "delete from terrain where RegionUUID = ?RegionUUID";
|
||||
cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString());
|
||||
dbcon.Open();
|
||||
|
||||
using (MySqlCommand cmd2 = dbcon.CreateCommand())
|
||||
using (MySqlCommand cmd = dbcon.CreateCommand())
|
||||
{
|
||||
try
|
||||
{
|
||||
cmd2.CommandText = "insert into terrain (RegionUUID, " +
|
||||
"Revision, Heightfield) values (?RegionUUID, " +
|
||||
"1, ?Heightfield)";
|
||||
cmd.CommandText = "delete from terrain where RegionUUID = ?RegionUUID";
|
||||
cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString());
|
||||
|
||||
cmd2.Parameters.AddWithValue("RegionUUID", regionID.ToString());
|
||||
cmd2.Parameters.AddWithValue("Heightfield", SerializeTerrain(ter));
|
||||
|
||||
ExecuteNonQuery(cmd);
|
||||
ExecuteNonQuery(cmd2);
|
||||
}
|
||||
catch
|
||||
using (MySqlCommand cmd2 = dbcon.CreateCommand())
|
||||
{
|
||||
// If we get here there is a NaN in the terrain
|
||||
// and the terrain can't be saved. A crash here
|
||||
// is much better than losing all the work
|
||||
m_log.ErrorFormat("[DATA]: Unable to save terrain. Stopping simulator to prevent data loss");
|
||||
Environment.Exit(1);
|
||||
try
|
||||
{
|
||||
cmd2.CommandText = "insert into terrain (RegionUUID, " +
|
||||
"Revision, Heightfield) values (?RegionUUID, " +
|
||||
"1, ?Heightfield)";
|
||||
|
||||
cmd2.Parameters.AddWithValue("RegionUUID", regionID.ToString());
|
||||
cmd2.Parameters.AddWithValue("Heightfield", SerializeTerrain(ter, oldTerrain));
|
||||
|
||||
ExecuteNonQuery(cmd);
|
||||
ExecuteNonQuery(cmd2);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat(e.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public virtual double[,] LoadTerrain(UUID regionID)
|
||||
@@ -714,10 +715,10 @@ namespace OpenSim.Data.MySQL
|
||||
|
||||
cmd.Parameters.Clear();
|
||||
cmd.CommandText = "insert into landaccesslist (LandUUID, " +
|
||||
"AccessUUID, Flags) values (?LandUUID, ?AccessUUID, " +
|
||||
"?Flags)";
|
||||
"AccessUUID, Flags, Expires) values (?LandUUID, ?AccessUUID, " +
|
||||
"?Flags, ?Expires)";
|
||||
|
||||
foreach (ParcelManager.ParcelAccessEntry entry in parcel.LandData.ParcelAccessList)
|
||||
foreach (LandAccessEntry entry in parcel.LandData.ParcelAccessList)
|
||||
{
|
||||
FillLandAccessCommand(cmd, entry, parcel.LandData.GlobalID);
|
||||
ExecuteNonQuery(cmd);
|
||||
@@ -860,6 +861,8 @@ namespace OpenSim.Data.MySQL
|
||||
}
|
||||
}
|
||||
|
||||
LoadSpawnPoints(rs);
|
||||
|
||||
return rs;
|
||||
}
|
||||
|
||||
@@ -1006,9 +1009,11 @@ namespace OpenSim.Data.MySQL
|
||||
"elevation_2_sw, water_height, " +
|
||||
"terrain_raise_limit, terrain_lower_limit, " +
|
||||
"use_estate_sun, fixed_sun, sun_position, " +
|
||||
"covenant, Sandbox, sunvectorx, sunvectory, " +
|
||||
"covenant, covenant_datetime, Sandbox, sunvectorx, sunvectory, " +
|
||||
"sunvectorz, loaded_creation_datetime, " +
|
||||
"loaded_creation_id, map_tile_ID, block_search, casino) values (?RegionUUID, ?BlockTerraform, " +
|
||||
"loaded_creation_id, map_tile_ID, block_search, casino, " +
|
||||
"TelehubObject, parcel_tile_ID) " +
|
||||
"values (?RegionUUID, ?BlockTerraform, " +
|
||||
"?BlockFly, ?AllowDamage, ?RestrictPushing, " +
|
||||
"?AllowLandResell, ?AllowLandJoinDivide, " +
|
||||
"?BlockShowInSearch, ?AgentLimit, ?ObjectBonus, " +
|
||||
@@ -1020,10 +1025,11 @@ namespace OpenSim.Data.MySQL
|
||||
"?Elevation2SE, ?Elevation1SW, ?Elevation2SW, " +
|
||||
"?WaterHeight, ?TerrainRaiseLimit, " +
|
||||
"?TerrainLowerLimit, ?UseEstateSun, ?FixedSun, " +
|
||||
"?SunPosition, ?Covenant, ?Sandbox, " +
|
||||
"?SunPosition, ?Covenant, ?CovenantChangedDateTime, ?Sandbox, " +
|
||||
"?SunVectorX, ?SunVectorY, ?SunVectorZ, " +
|
||||
"?LoadedCreationDateTime, ?LoadedCreationID, " +
|
||||
"?TerrainImageID, ?block_search, ?casino)";
|
||||
"?TerrainImageID, ?block_search, ?casino, " +
|
||||
"?TelehubObject, ?ParcelImageID)";
|
||||
|
||||
FillRegionSettingsCommand(cmd, rs);
|
||||
|
||||
@@ -1031,6 +1037,7 @@ namespace OpenSim.Data.MySQL
|
||||
}
|
||||
}
|
||||
}
|
||||
SaveSpawnPoints(rs);
|
||||
}
|
||||
|
||||
public virtual List<LandData> LoadLandObjects(UUID regionUUID)
|
||||
@@ -1301,7 +1308,7 @@ namespace OpenSim.Data.MySQL
|
||||
newSettings.FixedSun = Convert.ToBoolean(row["fixed_sun"]);
|
||||
newSettings.SunPosition = Convert.ToDouble(row["sun_position"]);
|
||||
newSettings.Covenant = DBGuid.FromDB(row["covenant"]);
|
||||
|
||||
newSettings.CovenantChangedDateTime = Convert.ToInt32(row["covenant_datetime"]);
|
||||
newSettings.LoadedCreationDateTime = Convert.ToInt32(row["loaded_creation_datetime"]);
|
||||
|
||||
if (row["loaded_creation_id"] is DBNull)
|
||||
@@ -1310,6 +1317,8 @@ namespace OpenSim.Data.MySQL
|
||||
newSettings.LoadedCreationID = (String) row["loaded_creation_id"];
|
||||
|
||||
newSettings.TerrainImageID = DBGuid.FromDB(row["map_tile_ID"]);
|
||||
newSettings.ParcelImageID = DBGuid.FromDB(row["parcel_tile_ID"]);
|
||||
newSettings.TelehubObject = DBGuid.FromDB(row["TelehubObject"]);
|
||||
|
||||
newSettings.GodBlockSearch = Convert.ToBoolean(row["block_search"]);
|
||||
newSettings.Casino = Convert.ToBoolean(row["casino"]);
|
||||
@@ -1387,7 +1396,7 @@ namespace OpenSim.Data.MySQL
|
||||
newData.ObscureMusic = Convert.ToBoolean(row["ObscureMusic"]);
|
||||
newData.ObscureMedia = Convert.ToBoolean(row["ObscureMedia"]);
|
||||
|
||||
newData.ParcelAccessList = new List<ParcelManager.ParcelAccessEntry>();
|
||||
newData.ParcelAccessList = new List<LandAccessEntry>();
|
||||
|
||||
return newData;
|
||||
}
|
||||
@@ -1397,12 +1406,12 @@ namespace OpenSim.Data.MySQL
|
||||
/// </summary>
|
||||
/// <param name="row"></param>
|
||||
/// <returns></returns>
|
||||
private static ParcelManager.ParcelAccessEntry BuildLandAccessData(IDataReader row)
|
||||
private static LandAccessEntry BuildLandAccessData(IDataReader row)
|
||||
{
|
||||
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
|
||||
LandAccessEntry entry = new LandAccessEntry();
|
||||
entry.AgentID = DBGuid.FromDB(row["AccessUUID"]);
|
||||
entry.Flags = (AccessList) Convert.ToInt32(row["Flags"]);
|
||||
entry.Time = new DateTime();
|
||||
entry.Expires = Convert.ToInt32(row["Expires"]);
|
||||
return entry;
|
||||
}
|
||||
|
||||
@@ -1411,7 +1420,7 @@ namespace OpenSim.Data.MySQL
|
||||
/// </summary>
|
||||
/// <param name="val"></param>
|
||||
/// <returns></returns>
|
||||
private static Array SerializeTerrain(double[,] val)
|
||||
private static Array SerializeTerrain(double[,] val, double[,] oldTerrain)
|
||||
{
|
||||
MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize) *sizeof (double));
|
||||
BinaryWriter bw = new BinaryWriter(str);
|
||||
@@ -1420,7 +1429,11 @@ namespace OpenSim.Data.MySQL
|
||||
for (int x = 0; x < (int)Constants.RegionSize; x++)
|
||||
for (int y = 0; y < (int)Constants.RegionSize; y++)
|
||||
{
|
||||
double height = val[x, y];
|
||||
double height = 20.0;
|
||||
if (oldTerrain != null)
|
||||
height = oldTerrain[x, y];
|
||||
if (!double.IsNaN(val[x, y]))
|
||||
height = val[x, y];
|
||||
if (height == 0.0)
|
||||
height = double.Epsilon;
|
||||
|
||||
@@ -1640,12 +1653,15 @@ namespace OpenSim.Data.MySQL
|
||||
cmd.Parameters.AddWithValue("FixedSun", settings.FixedSun);
|
||||
cmd.Parameters.AddWithValue("SunPosition", settings.SunPosition);
|
||||
cmd.Parameters.AddWithValue("Covenant", settings.Covenant.ToString());
|
||||
cmd.Parameters.AddWithValue("CovenantChangedDateTime", settings.CovenantChangedDateTime);
|
||||
cmd.Parameters.AddWithValue("LoadedCreationDateTime", settings.LoadedCreationDateTime);
|
||||
cmd.Parameters.AddWithValue("LoadedCreationID", settings.LoadedCreationID);
|
||||
cmd.Parameters.AddWithValue("TerrainImageID", settings.TerrainImageID);
|
||||
cmd.Parameters.AddWithValue("block_search", settings.GodBlockSearch);
|
||||
cmd.Parameters.AddWithValue("casino", settings.Casino);
|
||||
|
||||
cmd.Parameters.AddWithValue("ParcelImageID", settings.ParcelImageID);
|
||||
cmd.Parameters.AddWithValue("TelehubObject", settings.TelehubObject);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -1708,11 +1724,12 @@ namespace OpenSim.Data.MySQL
|
||||
/// <param name="row"></param>
|
||||
/// <param name="entry"></param>
|
||||
/// <param name="parcelID"></param>
|
||||
private static void FillLandAccessCommand(MySqlCommand cmd, ParcelManager.ParcelAccessEntry entry, UUID parcelID)
|
||||
private static void FillLandAccessCommand(MySqlCommand cmd, LandAccessEntry entry, UUID parcelID)
|
||||
{
|
||||
cmd.Parameters.AddWithValue("LandUUID", parcelID.ToString());
|
||||
cmd.Parameters.AddWithValue("AccessUUID", entry.AgentID.ToString());
|
||||
cmd.Parameters.AddWithValue("Flags", entry.Flags);
|
||||
cmd.Parameters.AddWithValue("Expires", entry.Expires.ToString());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -1847,5 +1864,72 @@ namespace OpenSim.Data.MySQL
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadSpawnPoints(RegionSettings rs)
|
||||
{
|
||||
rs.ClearSpawnPoints();
|
||||
|
||||
lock (m_dbLock)
|
||||
{
|
||||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
{
|
||||
dbcon.Open();
|
||||
|
||||
using (MySqlCommand cmd = dbcon.CreateCommand())
|
||||
{
|
||||
cmd.CommandText = "select Yaw, Pitch, Distance from spawn_points where RegionID = ?RegionID";
|
||||
cmd.Parameters.AddWithValue("?RegionID", rs.RegionUUID.ToString());
|
||||
|
||||
using (IDataReader r = cmd.ExecuteReader())
|
||||
{
|
||||
while (r.Read())
|
||||
{
|
||||
SpawnPoint sp = new SpawnPoint();
|
||||
|
||||
sp.Yaw = (float)r["Yaw"];
|
||||
sp.Pitch = (float)r["Pitch"];
|
||||
sp.Distance = (float)r["Distance"];
|
||||
|
||||
rs.AddSpawnPoint(sp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SaveSpawnPoints(RegionSettings rs)
|
||||
{
|
||||
lock (m_dbLock)
|
||||
{
|
||||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
{
|
||||
dbcon.Open();
|
||||
|
||||
using (MySqlCommand cmd = dbcon.CreateCommand())
|
||||
{
|
||||
cmd.CommandText = "delete from spawn_points where RegionID = ?RegionID";
|
||||
cmd.Parameters.AddWithValue("?RegionID", rs.RegionUUID.ToString());
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
|
||||
cmd.Parameters.Clear();
|
||||
|
||||
cmd.CommandText = "insert into spawn_points (RegionID, Yaw, Pitch, Distance) values ( ?RegionID, ?Yaw, ?Pitch, ?Distance)";
|
||||
|
||||
foreach (SpawnPoint p in rs.SpawnPoints())
|
||||
{
|
||||
cmd.Parameters.AddWithValue("?RegionID", rs.RegionUUID.ToString());
|
||||
cmd.Parameters.AddWithValue("?Yaw", p.Yaw);
|
||||
cmd.Parameters.AddWithValue("?Pitch", p.Pitch);
|
||||
cmd.Parameters.AddWithValue("?Distance", p.Distance);
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
cmd.Parameters.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,3 +94,12 @@ BEGIN;
|
||||
alter table regions modify column regionName varchar(128) default NULL;
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 9 # ------------
|
||||
|
||||
BEGIN;
|
||||
|
||||
alter table regions add column `parcelMapTexture` varchar(36) default NULL;
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
@@ -841,4 +841,45 @@ alter table regionban ENGINE = MyISAM;
|
||||
alter table regionsettings ENGINE = MyISAM;
|
||||
alter table terrain ENGINE = MyISAM;
|
||||
|
||||
COMMIT;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 39 #--------------- Telehub support
|
||||
|
||||
BEGIN;
|
||||
CREATE TABLE IF NOT EXISTS `spawn_points` (
|
||||
`RegionID` varchar(36) COLLATE utf8_unicode_ci NOT NULL,
|
||||
`Yaw` float NOT NULL,
|
||||
`Pitch` float NOT NULL,
|
||||
`Distance` float NOT NULL,
|
||||
KEY `RegionID` (`RegionID`)
|
||||
) ENGINE=Innodb;
|
||||
|
||||
ALTER TABLE `regionsettings` ADD COLUMN `TelehubObject` varchar(36) NOT NULL;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 40 #---------------- Parcels for sale
|
||||
|
||||
BEGIN;
|
||||
ALTER TABLE `regionsettings` ADD COLUMN `parcel_tile_ID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
|
||||
COMMIT;
|
||||
|
||||
:VERSION 41 #---------------- Timed bans/access
|
||||
|
||||
BEGIN;
|
||||
ALTER TABLE `landaccesslist` ADD COLUMN `Expires` INTEGER NOT NULL DEFAULT 0;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 42 #--------------------- Region Covenant changed time
|
||||
|
||||
BEGIN;
|
||||
ALTER TABLE regionsettings ADD COLUMN covenant_datetime int unsigned NOT NULL DEFAULT '0';
|
||||
COMMIT;
|
||||
|
||||
:VERSION 43 #---------------------
|
||||
|
||||
BEGIN;
|
||||
|
||||
ALTER TABLE `regionsettings` MODIFY COLUMN `TelehubObject` VARCHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
@@ -466,4 +466,9 @@ ALTER TABLE `land` ADD COLUMN `MediaSize` VARCHAR(16) NOT NULL DEFAULT '0,0';
|
||||
ALTER TABLE `land` ADD COLUMN `MediaLoop` BOOLEAN NOT NULL DEFAULT FALSE;
|
||||
ALTER TABLE `land` ADD COLUMN `ObscureMusic` BOOLEAN NOT NULL DEFAULT FALSE;
|
||||
ALTER TABLE `land` ADD COLUMN `ObscureMedia` BOOLEAN NOT NULL DEFAULT FALSE;
|
||||
COMMIT;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 22
|
||||
BEGIN;
|
||||
ALTER TABLE regionsettings ADD COLUMN covenant_datetime INTEGER NOT NULL default 0;
|
||||
COMMIT;
|
||||
|
||||
@@ -75,7 +75,7 @@ namespace OpenSim.Data.SQLite
|
||||
cmd.Parameters.AddWithValue(":PrincipalID", principalID.ToString());
|
||||
cmd.Parameters.AddWithValue(":Friend", friend);
|
||||
|
||||
ExecuteNonQuery(cmd, cmd.Connection);
|
||||
ExecuteNonQuery(cmd, m_Connection);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -759,7 +759,7 @@ namespace OpenSim.Data.SQLite
|
||||
landaccesslist.Rows.Remove(rowsToDelete[iter]);
|
||||
}
|
||||
rowsToDelete.Clear();
|
||||
foreach (ParcelManager.ParcelAccessEntry entry in parcel.LandData.ParcelAccessList)
|
||||
foreach (LandAccessEntry entry in parcel.LandData.ParcelAccessList)
|
||||
{
|
||||
DataRow newAccessRow = landaccesslist.NewRow();
|
||||
fillLandAccessRow(newAccessRow, entry, parcel.LandData.GlobalID);
|
||||
@@ -1185,6 +1185,7 @@ namespace OpenSim.Data.SQLite
|
||||
createCol(regionsettings, "fixed_sun", typeof (Int32));
|
||||
createCol(regionsettings, "sun_position", typeof (Double));
|
||||
createCol(regionsettings, "covenant", typeof(String));
|
||||
createCol(regionsettings, "covenant_datetime", typeof(Int32));
|
||||
createCol(regionsettings, "map_tile_ID", typeof(String));
|
||||
regionsettings.PrimaryKey = new DataColumn[] { regionsettings.Columns["regionUUID"] };
|
||||
return regionsettings;
|
||||
@@ -1456,7 +1457,7 @@ namespace OpenSim.Data.SQLite
|
||||
newData.UserLocation = Vector3.Zero;
|
||||
newData.UserLookAt = Vector3.Zero;
|
||||
}
|
||||
newData.ParcelAccessList = new List<ParcelManager.ParcelAccessEntry>();
|
||||
newData.ParcelAccessList = new List<LandAccessEntry>();
|
||||
UUID authBuyerID = UUID.Zero;
|
||||
|
||||
UUID.TryParse((string)row["AuthbuyerID"], out authBuyerID);
|
||||
@@ -1509,6 +1510,7 @@ namespace OpenSim.Data.SQLite
|
||||
newSettings.FixedSun = Convert.ToBoolean(row["fixed_sun"]);
|
||||
newSettings.SunPosition = Convert.ToDouble(row["sun_position"]);
|
||||
newSettings.Covenant = new UUID((String) row["covenant"]);
|
||||
newSettings.CovenantChangedDateTime = Convert.ToInt32(row["covenant_datetime"]);
|
||||
newSettings.TerrainImageID = new UUID((String)row["map_tile_ID"]);
|
||||
|
||||
return newSettings;
|
||||
@@ -1519,12 +1521,12 @@ namespace OpenSim.Data.SQLite
|
||||
/// </summary>
|
||||
/// <param name="row"></param>
|
||||
/// <returns></returns>
|
||||
private static ParcelManager.ParcelAccessEntry buildLandAccessData(DataRow row)
|
||||
private static LandAccessEntry buildLandAccessData(DataRow row)
|
||||
{
|
||||
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
|
||||
LandAccessEntry entry = new LandAccessEntry();
|
||||
entry.AgentID = new UUID((string) row["AccessUUID"]);
|
||||
entry.Flags = (AccessList) row["Flags"];
|
||||
entry.Time = new DateTime();
|
||||
entry.Expires = 0;
|
||||
return entry;
|
||||
}
|
||||
|
||||
@@ -1787,7 +1789,7 @@ namespace OpenSim.Data.SQLite
|
||||
/// <param name="row"></param>
|
||||
/// <param name="entry"></param>
|
||||
/// <param name="parcelID"></param>
|
||||
private static void fillLandAccessRow(DataRow row, ParcelManager.ParcelAccessEntry entry, UUID parcelID)
|
||||
private static void fillLandAccessRow(DataRow row, LandAccessEntry entry, UUID parcelID)
|
||||
{
|
||||
row["LandUUID"] = parcelID.ToString();
|
||||
row["AccessUUID"] = entry.AgentID.ToString();
|
||||
@@ -1833,6 +1835,7 @@ namespace OpenSim.Data.SQLite
|
||||
row["fixed_sun"] = settings.FixedSun;
|
||||
row["sun_position"] = settings.SunPosition;
|
||||
row["covenant"] = settings.Covenant.ToString();
|
||||
row["covenant_datetime"] = settings.CovenantChangedDateTime;
|
||||
row["map_tile_ID"] = settings.TerrainImageID.ToString();
|
||||
}
|
||||
|
||||
|
||||
@@ -685,7 +685,7 @@ namespace OpenSim.Data.Tests
|
||||
SceneObjectGroup sog = GetMySOG("object1");
|
||||
InventoryItemBase i = NewItem(item1, zero, zero, itemname1, zero);
|
||||
|
||||
Assert.That(sog.AddInventoryItem(null, sog.RootPart.LocalId, i, zero), Is.True);
|
||||
Assert.That(sog.AddInventoryItem(zero, sog.RootPart.LocalId, i, zero), Is.True);
|
||||
TaskInventoryItem t = sog.GetInventoryItem(sog.RootPart.LocalId, item1);
|
||||
Assert.That(t.Name, Is.EqualTo(itemname1), "Assert.That(t.Name, Is.EqualTo(itemname1))");
|
||||
|
||||
@@ -762,7 +762,7 @@ namespace OpenSim.Data.Tests
|
||||
i.CreationDate = creationd;
|
||||
|
||||
SceneObjectGroup sog = GetMySOG("object1");
|
||||
Assert.That(sog.AddInventoryItem(null, sog.RootPart.LocalId, i, zero), Is.True);
|
||||
Assert.That(sog.AddInventoryItem(zero, sog.RootPart.LocalId, i, zero), Is.True);
|
||||
TaskInventoryItem t = sog.GetInventoryItem(sog.RootPart.LocalId, id);
|
||||
|
||||
Assert.That(t.Name, Is.EqualTo(name), "Assert.That(t.Name, Is.EqualTo(name))");
|
||||
@@ -807,10 +807,10 @@ namespace OpenSim.Data.Tests
|
||||
|
||||
SceneObjectGroup sog = FindSOG("object1", region1);
|
||||
|
||||
Assert.That(sog.AddInventoryItem(null, sog.RootPart.LocalId, ib1, zero), Is.True);
|
||||
Assert.That(sog.AddInventoryItem(null, sog.RootPart.LocalId, ib2, zero), Is.True);
|
||||
Assert.That(sog.AddInventoryItem(null, sog.RootPart.LocalId, ib3, zero), Is.True);
|
||||
Assert.That(sog.AddInventoryItem(null, sog.RootPart.LocalId, ib4, zero), Is.True);
|
||||
Assert.That(sog.AddInventoryItem(zero, sog.RootPart.LocalId, ib1, zero), Is.True);
|
||||
Assert.That(sog.AddInventoryItem(zero, sog.RootPart.LocalId, ib2, zero), Is.True);
|
||||
Assert.That(sog.AddInventoryItem(zero, sog.RootPart.LocalId, ib3, zero), Is.True);
|
||||
Assert.That(sog.AddInventoryItem(zero, sog.RootPart.LocalId, ib4, zero), Is.True);
|
||||
|
||||
TaskInventoryItem t1 = sog.GetInventoryItem(sog.RootPart.LocalId, i1);
|
||||
Assert.That(t1.Name, Is.EqualTo(ib1.Name), "Assert.That(t1.Name, Is.EqualTo(ib1.Name))");
|
||||
|
||||
@@ -296,7 +296,7 @@ namespace OpenSim.Framework
|
||||
if (args["start_pos"] != null)
|
||||
Vector3.TryParse(args["start_pos"].AsString(), out startpos);
|
||||
|
||||
m_log.InfoFormat("[AGENTCIRCUITDATA]: agentid={0}, child={1}, startpos={2}", AgentID, child, startpos);
|
||||
//m_log.InfoFormat("[AGENTCIRCUITDATA]: agentid={0}, child={1}, startpos={2}", AgentID, child, startpos);
|
||||
|
||||
try
|
||||
{
|
||||
@@ -311,7 +311,7 @@ namespace OpenSim.Framework
|
||||
if (args.ContainsKey("packed_appearance") && (args["packed_appearance"].Type == OSDType.Map))
|
||||
{
|
||||
Appearance.Unpack((OSDMap)args["packed_appearance"]);
|
||||
m_log.InfoFormat("[AGENTCIRCUITDATA] unpacked appearance");
|
||||
// m_log.InfoFormat("[AGENTCIRCUITDATA] unpacked appearance");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -264,10 +264,12 @@ namespace OpenSim.Framework
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set up appearance textures.
|
||||
/// Returns boolean that indicates whether the new entries actually change the
|
||||
/// existing values.
|
||||
/// Set up appearance texture ids.
|
||||
/// </summary>
|
||||
/// <returns>
|
||||
/// True if any existing texture id was changed by the new data.
|
||||
/// False if there were no changes or no existing texture ids.
|
||||
/// </returns>
|
||||
public virtual bool SetTextureEntries(Primitive.TextureEntry textureEntry)
|
||||
{
|
||||
if (textureEntry == null)
|
||||
@@ -284,25 +286,30 @@ namespace OpenSim.Framework
|
||||
|
||||
if (newface == null)
|
||||
{
|
||||
if (oldface == null) continue;
|
||||
if (oldface == null)
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (oldface != null && oldface.TextureID == newface.TextureID) continue;
|
||||
if (oldface != null && oldface.TextureID == newface.TextureID)
|
||||
continue;
|
||||
}
|
||||
|
||||
changed = true;
|
||||
}
|
||||
|
||||
m_texture = textureEntry;
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set up visual parameters for the avatar and refresh the avatar height
|
||||
/// Returns boolean that indicates whether the new entries actually change the
|
||||
/// existing values.
|
||||
/// </summary>
|
||||
/// <returns>
|
||||
/// True if any existing visual parameter was changed by the new data.
|
||||
/// False if there were no changes or no existing visual parameters.
|
||||
/// </returns>
|
||||
public virtual bool SetVisualParams(byte[] visualParams)
|
||||
{
|
||||
if (visualParams == null)
|
||||
|
||||
@@ -335,7 +335,7 @@ namespace OpenSim.Framework
|
||||
|
||||
public virtual OSDMap Pack()
|
||||
{
|
||||
m_log.InfoFormat("[CHILDAGENTDATAUPDATE] Pack data");
|
||||
// m_log.InfoFormat("[CHILDAGENTDATAUPDATE] Pack data");
|
||||
|
||||
OSDMap args = new OSDMap();
|
||||
args["message_type"] = OSD.FromString("AgentData");
|
||||
@@ -478,7 +478,7 @@ namespace OpenSim.Framework
|
||||
/// <param name="hash"></param>
|
||||
public virtual void Unpack(OSDMap args, IScene scene)
|
||||
{
|
||||
m_log.InfoFormat("[CHILDAGENTDATAUPDATE] Unpack data");
|
||||
//m_log.InfoFormat("[CHILDAGENTDATAUPDATE] Unpack data");
|
||||
|
||||
if (args.ContainsKey("region_id"))
|
||||
UUID.TryParse(args["region_id"].AsString(), out RegionID);
|
||||
|
||||
@@ -31,6 +31,7 @@ using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
using log4net;
|
||||
using OpenSim.Framework;
|
||||
@@ -531,6 +532,11 @@ namespace OpenSim.Framework.Console
|
||||
|
||||
public class Parser
|
||||
{
|
||||
// If an unquoted portion ends with an element matching this regex
|
||||
// and the next element contains a space, then we have stripped
|
||||
// embedded quotes that should not have been stripped
|
||||
private static Regex optionRegex = new Regex("^--[a-zA-Z0-9-]+=$");
|
||||
|
||||
public static string[] Parse(string text)
|
||||
{
|
||||
List<string> result = new List<string>();
|
||||
@@ -544,10 +550,38 @@ namespace OpenSim.Framework.Console
|
||||
if (index % 2 == 0)
|
||||
{
|
||||
string[] words = unquoted[index].Split(new char[] {' '});
|
||||
|
||||
bool option = false;
|
||||
foreach (string w in words)
|
||||
{
|
||||
if (w != String.Empty)
|
||||
{
|
||||
if (optionRegex.Match(w) == Match.Empty)
|
||||
option = false;
|
||||
else
|
||||
option = true;
|
||||
result.Add(w);
|
||||
}
|
||||
}
|
||||
// The last item matched the regex, put the quotes back
|
||||
if (option)
|
||||
{
|
||||
// If the line ended with it, don't do anything
|
||||
if (index < (unquoted.Length - 1))
|
||||
{
|
||||
// Get and remove the option name
|
||||
string optionText = result[result.Count - 1];
|
||||
result.RemoveAt(result.Count - 1);
|
||||
|
||||
// Add the quoted value back
|
||||
optionText += "\"" + unquoted[index + 1] + "\"";
|
||||
|
||||
// Push the result into our return array
|
||||
result.Add(optionText);
|
||||
|
||||
// Skip the already used value
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@@ -232,9 +232,8 @@ namespace OpenSim.Framework.Console
|
||||
|
||||
string uri = "/ReadResponses/" + sessionID.ToString() + "/";
|
||||
|
||||
m_Server.AddPollServiceHTTPHandler(uri, HandleHttpPoll,
|
||||
new PollServiceEventArgs(null, HasEvents, GetEvents, NoEvents,
|
||||
sessionID));
|
||||
m_Server.AddPollServiceHTTPHandler(
|
||||
uri, new PollServiceEventArgs(null, HasEvents, GetEvents, NoEvents, sessionID));
|
||||
|
||||
XmlDocument xmldoc = new XmlDocument();
|
||||
XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration,
|
||||
@@ -266,11 +265,6 @@ namespace OpenSim.Framework.Console
|
||||
return reply;
|
||||
}
|
||||
|
||||
private Hashtable HandleHttpPoll(Hashtable request)
|
||||
{
|
||||
return new Hashtable();
|
||||
}
|
||||
|
||||
private Hashtable HandleHttpCloseSession(Hashtable request)
|
||||
{
|
||||
DoExpire();
|
||||
|
||||
@@ -425,5 +425,11 @@ namespace OpenSim.Framework
|
||||
AllowParcelChanges = ((regionFlags & (ulong)RegionFlags.AllowParcelChanges) == (ulong)RegionFlags.AllowParcelChanges);
|
||||
AllowSetHome = ((regionFlags & (ulong)RegionFlags.AllowSetHome) == (ulong)RegionFlags.AllowSetHome);
|
||||
}
|
||||
|
||||
public bool GroupAccess(UUID groupID)
|
||||
{
|
||||
return l_EstateGroups.Contains(groupID);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,6 +84,8 @@ namespace OpenSim.Framework
|
||||
public delegate void TeleportLandmarkRequest(
|
||||
IClientAPI remoteClient, AssetLandmark lm);
|
||||
|
||||
public delegate void TeleportCancel(IClientAPI remoteClient);
|
||||
|
||||
public delegate void DisconnectUser();
|
||||
|
||||
public delegate void RequestAvatarProperties(IClientAPI remoteClient, UUID avatarID);
|
||||
@@ -175,7 +177,7 @@ namespace OpenSim.Framework
|
||||
|
||||
public delegate void ParcelAccessListUpdateRequest(UUID agentID, uint flags,
|
||||
int landLocalID, UUID transactionID, int sequenceID,
|
||||
int sections, List<ParcelManager.ParcelAccessEntry> entries,
|
||||
int sections, List<LandAccessEntry> entries,
|
||||
IClientAPI remote_client);
|
||||
|
||||
public delegate void ParcelPropertiesRequest(
|
||||
@@ -359,6 +361,8 @@ namespace OpenSim.Framework
|
||||
|
||||
public delegate void EstateChangeInfo(IClientAPI client, UUID invoice, UUID senderID, UInt32 param1, UInt32 param2);
|
||||
|
||||
public delegate void EstateManageTelehub(IClientAPI client, UUID invoice, UUID senderID, string cmd, UInt32 param1);
|
||||
|
||||
public delegate void RequestTerrain(IClientAPI remoteClient, string clientFileName);
|
||||
|
||||
public delegate void BakeTerrain(IClientAPI remoteClient);
|
||||
@@ -707,6 +711,12 @@ namespace OpenSim.Framework
|
||||
|
||||
UUID AgentId { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The scene agent for this client. This will only be set if the client has an agent in a scene (i.e. if it
|
||||
/// is connected).
|
||||
/// </summary>
|
||||
ISceneAgent SceneAgent { get; }
|
||||
|
||||
UUID SessionId { get; }
|
||||
|
||||
UUID SecureSessionId { get; }
|
||||
@@ -766,6 +776,7 @@ namespace OpenSim.Framework
|
||||
event ModifyTerrain OnModifyTerrain;
|
||||
event BakeTerrain OnBakeTerrain;
|
||||
event EstateChangeInfo OnEstateChangeInfo;
|
||||
event EstateManageTelehub OnEstateManageTelehub;
|
||||
// [Obsolete("LLClientView Specific.")]
|
||||
event SetAppearance OnSetAppearance;
|
||||
// [Obsolete("LLClientView Specific - Replace and rename OnAvatarUpdate. Difference from SetAppearance?")]
|
||||
@@ -787,6 +798,7 @@ namespace OpenSim.Framework
|
||||
event RequestAvatarProperties OnRequestAvatarProperties;
|
||||
event SetAlwaysRun OnSetAlwaysRun;
|
||||
event TeleportLandmarkRequest OnTeleportLandmarkRequest;
|
||||
event TeleportCancel OnTeleportCancel;
|
||||
event DeRezObject OnDeRezObject;
|
||||
event Action<IClientAPI> OnRegionHandShakeReply;
|
||||
event GenericCall1 OnRequestWearables;
|
||||
@@ -1073,7 +1085,15 @@ namespace OpenSim.Framework
|
||||
void SendWindData(Vector2[] windSpeeds);
|
||||
void SendCloudData(float[] cloudCover);
|
||||
|
||||
/// <summary>
|
||||
/// Sent when an agent completes its movement into a region.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This packet marks completion of the arrival of a root avatar in a region, whether through login, region
|
||||
/// crossing or direct teleport.
|
||||
/// </remarks>
|
||||
void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look);
|
||||
|
||||
void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourExternalEndPoint);
|
||||
|
||||
/// <summary>
|
||||
@@ -1132,6 +1152,8 @@ namespace OpenSim.Framework
|
||||
|
||||
void SendTaskInventory(UUID taskID, short serial, byte[] fileName);
|
||||
|
||||
void SendTelehubInfo(UUID ObjectID, string ObjectName, Vector3 ObjectPos, Quaternion ObjectRot, List<Vector3> SpawnPoint);
|
||||
|
||||
/// <summary>
|
||||
/// Used by the server to inform the client of new inventory items and folders.
|
||||
/// </summary>
|
||||
@@ -1221,7 +1243,7 @@ namespace OpenSim.Framework
|
||||
void SendEstateCovenantInformation(UUID covenant);
|
||||
|
||||
void SendDetailedEstateData(UUID invoice, string estateName, uint estateID, uint parentEstate, uint estateFlags,
|
||||
uint sunPosition, UUID covenant, string abuseEmail, UUID estateOwner);
|
||||
uint sunPosition, UUID covenant, uint covenantChanged, string abuseEmail, UUID estateOwner);
|
||||
|
||||
/// <summary>
|
||||
/// Send land properties to the client.
|
||||
@@ -1237,7 +1259,7 @@ namespace OpenSim.Framework
|
||||
float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity,
|
||||
uint regionFlags);
|
||||
|
||||
void SendLandAccessListData(List<UUID> avatars, uint accessFlag, int localLandID);
|
||||
void SendLandAccessListData(List<LandAccessEntry> accessList, uint accessFlag, int localLandID);
|
||||
void SendForceClientSelectObjects(List<uint> objectIDs);
|
||||
void SendCameraConstraint(Vector4 ConstraintPlane);
|
||||
void SendLandObjectOwners(LandData land, List<UUID> groups, Dictionary<UUID, int> ownersAndCount);
|
||||
|
||||
@@ -73,9 +73,9 @@ namespace OpenSim.Framework
|
||||
bool IsRestrictedFromLand(UUID avatar);
|
||||
void SendLandUpdateToClient(IClientAPI remote_client);
|
||||
void SendLandUpdateToClient(bool snap_selection, IClientAPI remote_client);
|
||||
List<UUID> CreateAccessListArrayByFlag(AccessList flag);
|
||||
List<LandAccessEntry> CreateAccessListArrayByFlag(AccessList flag);
|
||||
void SendAccessList(UUID agentID, UUID sessionID, uint flags, int sequenceID, IClientAPI remote_client);
|
||||
void UpdateAccessList(uint flags, UUID transactionID, int sequenceID, int sections, List<ParcelManager.ParcelAccessEntry> entries, IClientAPI remote_client);
|
||||
void UpdateAccessList(uint flags, UUID transactionID, int sequenceID, int sections, List<LandAccessEntry> entries, IClientAPI remote_client);
|
||||
void UpdateLandBitmapByteArray();
|
||||
void SetLandBitmapFromByteArray();
|
||||
bool[,] GetLandBitmap();
|
||||
@@ -130,5 +130,11 @@ namespace OpenSim.Framework
|
||||
/// </summary>
|
||||
/// <param name="url"></param>
|
||||
void SetMusicUrl(string url);
|
||||
|
||||
/// <summary>
|
||||
/// Get the music url for this land parcel
|
||||
/// </summary>
|
||||
/// <returns>The music url.</returns>
|
||||
string GetMusicUrl();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,8 +36,8 @@ namespace OpenSim.Framework
|
||||
int amount);
|
||||
|
||||
int GetBalance(UUID agentID);
|
||||
bool UploadCovered(IClientAPI client, int amount);
|
||||
bool AmountCovered(IClientAPI client, int amount);
|
||||
bool UploadCovered(UUID agentID, int amount);
|
||||
bool AmountCovered(UUID agentID, int amount);
|
||||
void ApplyCharge(UUID agentID, int amount, string text);
|
||||
void ApplyUploadCharge(UUID agentID, int amount, string text);
|
||||
void MoveMoney(UUID fromUser, UUID toUser, int amount, string text);
|
||||
|
||||
@@ -68,12 +68,14 @@ namespace OpenSim.Framework
|
||||
event restart OnRestart;
|
||||
|
||||
/// <summary>
|
||||
/// Register the new client with the scene. The client starts off as a child agent - the later agent crossing
|
||||
/// will promote it to a root agent.
|
||||
/// Add a new client and create a presence for it. All clients except initial login clients will starts off as a child agent
|
||||
/// - the later agent crossing will promote it to a root agent.
|
||||
/// </summary>
|
||||
/// <param name="client"></param>
|
||||
/// <param name="type">The type of agent to add.</param>
|
||||
void AddNewClient(IClientAPI client, PresenceType type);
|
||||
/// <returns>
|
||||
/// The scene agent if the new client was added or if an agent that already existed.</returns>
|
||||
ISceneAgent AddNewClient(IClientAPI client, PresenceType type);
|
||||
|
||||
/// <summary>
|
||||
/// Remove the given client from the scene.
|
||||
@@ -87,19 +89,6 @@ namespace OpenSim.Framework
|
||||
|
||||
string GetSimulatorVersion();
|
||||
|
||||
/// <summary>
|
||||
/// Is the agent denoted by the given agentID a child presence in this scene?
|
||||
/// </summary>
|
||||
///
|
||||
/// Used by ClientView when a 'kick everyone' or 'estate message' occurs
|
||||
///
|
||||
/// <param name="avatarID">AvatarID to lookup</param>
|
||||
/// <returns>true if the presence is a child agent, false if the presence is a root exception</returns>
|
||||
/// <exception cref="System.NullReferenceException">
|
||||
/// Thrown if the agent does not exist.
|
||||
/// </exception>
|
||||
bool PresenceChildStatus(UUID agentId);
|
||||
|
||||
bool TryGetScenePresence(UUID agentID, out object scenePresence);
|
||||
|
||||
/// <summary>
|
||||
|
||||
75
OpenSim/Framework/ISceneAgent.cs
Normal file
75
OpenSim/Framework/ISceneAgent.cs
Normal file
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
|
||||
namespace OpenSim.Framework
|
||||
{
|
||||
/// <summary>
|
||||
/// An agent in the scene.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Interface is a work in progress. Please feel free to add other required properties and methods.
|
||||
/// </remarks>
|
||||
public interface ISceneAgent : ISceneEntity
|
||||
{
|
||||
/// <value>
|
||||
/// The client controlling this presence
|
||||
/// </value>
|
||||
IClientAPI ControllingClient { get; }
|
||||
|
||||
/// <summary>
|
||||
/// What type of presence is this? User, NPC, etc.
|
||||
/// </summary>
|
||||
PresenceType PresenceType { get; }
|
||||
|
||||
/// <summary>
|
||||
/// If true, then the agent has no avatar in the scene.
|
||||
/// The agent exists to relay data from a region that neighbours the current position of the user's avatar.
|
||||
/// Occasionally data is relayed, such as which a user clicks an item in a neighbouring region.
|
||||
/// </summary>
|
||||
bool IsChildAgent { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Avatar appearance data.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
// Because appearance setting is in a module, we actually need
|
||||
// to give it access to our appearance directly, otherwise we
|
||||
// get a synchronization issue.
|
||||
/// </remarks>
|
||||
AvatarAppearance Appearance { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Send initial scene data to the client controlling this agent
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This includes scene object data and the appearance data of other avatars.
|
||||
/// </remarks>
|
||||
void SendInitialDataToMe();
|
||||
}
|
||||
}
|
||||
@@ -34,6 +34,7 @@ namespace OpenSim.Framework
|
||||
string Name { get; set; }
|
||||
UUID UUID { get; }
|
||||
uint LocalId { get; }
|
||||
|
||||
Vector3 AbsolutePosition { get; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,6 +33,12 @@ namespace OpenSim.Framework
|
||||
public interface ISceneObject
|
||||
{
|
||||
UUID UUID { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The owner of this object.
|
||||
/// </summary>
|
||||
UUID OwnerID { get; set; }
|
||||
|
||||
ISceneObject CloneForNewScene();
|
||||
string ToXml2();
|
||||
string ExtraToXmlString();
|
||||
|
||||
@@ -34,6 +34,13 @@ using OpenMetaverse;
|
||||
|
||||
namespace OpenSim.Framework
|
||||
{
|
||||
public class LandAccessEntry
|
||||
{
|
||||
public UUID AgentID;
|
||||
public int Expires;
|
||||
public AccessList Flags;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Details of a Parcel of land
|
||||
/// </summary>
|
||||
@@ -73,7 +80,7 @@ namespace OpenSim.Framework
|
||||
private string _mediaURL = String.Empty;
|
||||
private string _musicURL = String.Empty;
|
||||
private UUID _ownerID = UUID.Zero;
|
||||
private List<ParcelManager.ParcelAccessEntry> _parcelAccessList = new List<ParcelManager.ParcelAccessEntry>();
|
||||
private List<LandAccessEntry> _parcelAccessList = new List<LandAccessEntry>();
|
||||
private float _passHours = 0;
|
||||
private int _passPrice = 0;
|
||||
private int _salePrice = 0; //Unemeplemented. Parcels price.
|
||||
@@ -450,7 +457,7 @@ namespace OpenSim.Framework
|
||||
/// <summary>
|
||||
/// List of access data for the parcel. User data, some bitflags, and a time
|
||||
/// </summary>
|
||||
public List<ParcelManager.ParcelAccessEntry> ParcelAccessList {
|
||||
public List<LandAccessEntry> ParcelAccessList {
|
||||
get {
|
||||
return _parcelAccessList;
|
||||
}
|
||||
@@ -638,12 +645,12 @@ namespace OpenSim.Framework
|
||||
landData._simwidePrims = _simwidePrims;
|
||||
|
||||
landData._parcelAccessList.Clear();
|
||||
foreach (ParcelManager.ParcelAccessEntry entry in _parcelAccessList)
|
||||
foreach (LandAccessEntry entry in _parcelAccessList)
|
||||
{
|
||||
ParcelManager.ParcelAccessEntry newEntry = new ParcelManager.ParcelAccessEntry();
|
||||
LandAccessEntry newEntry = new LandAccessEntry();
|
||||
newEntry.AgentID = entry.AgentID;
|
||||
newEntry.Flags = entry.Flags;
|
||||
newEntry.Time = entry.Time;
|
||||
newEntry.Expires = entry.Expires;
|
||||
|
||||
landData._parcelAccessList.Add(newEntry);
|
||||
}
|
||||
@@ -668,4 +675,4 @@ namespace OpenSim.Framework
|
||||
return land;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,6 +143,8 @@ namespace OpenSim.Framework
|
||||
public string RemotingAddress;
|
||||
public UUID ScopeID = UUID.Zero;
|
||||
|
||||
private Dictionary<String, String> m_otherSettings = new Dictionary<string, string>();
|
||||
|
||||
|
||||
// Apparently, we're applying the same estatesettings regardless of whether it's local or remote.
|
||||
|
||||
@@ -445,6 +447,22 @@ namespace OpenSim.Framework
|
||||
m_internalEndPoint = tmpEPE;
|
||||
}
|
||||
|
||||
public string GetOtherSetting(string key)
|
||||
{
|
||||
string val;
|
||||
string keylower = key.ToLower();
|
||||
if (m_otherSettings.TryGetValue(keylower, out val))
|
||||
return val;
|
||||
m_log.DebugFormat("[RegionInfo] Could not locate value for parameter {0}", key);
|
||||
return null;
|
||||
}
|
||||
|
||||
public void SetOtherSetting(string key, string value)
|
||||
{
|
||||
string keylower = key.ToLower();
|
||||
m_otherSettings[keylower] = value;
|
||||
}
|
||||
|
||||
private void ReadNiniConfig(IConfigSource source, string name)
|
||||
{
|
||||
// bool creatingNew = false;
|
||||
@@ -473,30 +491,39 @@ namespace OpenSim.Framework
|
||||
if (source.Configs[name] == null)
|
||||
{
|
||||
source.AddConfig(name);
|
||||
|
||||
// creatingNew = true;
|
||||
}
|
||||
|
||||
RegionName = name;
|
||||
IConfig config = source.Configs[name];
|
||||
|
||||
// UUID
|
||||
//
|
||||
string regionUUID = config.GetString("RegionUUID", string.Empty);
|
||||
// Track all of the keys in this config and remove as they are processed
|
||||
// The remaining keys will be added to generic key-value storage for
|
||||
// whoever might need it
|
||||
HashSet<String> allKeys = new HashSet<String>();
|
||||
foreach (string s in config.GetKeys())
|
||||
{
|
||||
allKeys.Add(s);
|
||||
}
|
||||
|
||||
// RegionUUID
|
||||
//
|
||||
allKeys.Remove("RegionUUID");
|
||||
string regionUUID = config.GetString("RegionUUID", string.Empty);
|
||||
if (regionUUID == String.Empty)
|
||||
{
|
||||
UUID newID = UUID.Random();
|
||||
|
||||
regionUUID = MainConsole.Instance.CmdPrompt("Region UUID", newID.ToString());
|
||||
regionUUID = MainConsole.Instance.CmdPrompt("RegionUUID", newID.ToString());
|
||||
config.Set("RegionUUID", regionUUID);
|
||||
}
|
||||
|
||||
RegionID = new UUID(regionUUID);
|
||||
originRegionID = RegionID; // What IS this?!
|
||||
originRegionID = RegionID; // What IS this?! (Needed for RegionCombinerModule?)
|
||||
|
||||
RegionName = name;
|
||||
// Location
|
||||
//
|
||||
allKeys.Remove("Location");
|
||||
string location = config.GetString("Location", String.Empty);
|
||||
|
||||
if (location == String.Empty)
|
||||
{
|
||||
location = MainConsole.Instance.CmdPrompt("Region Location", "1000,1000");
|
||||
@@ -508,13 +535,10 @@ namespace OpenSim.Framework
|
||||
m_regionLocX = Convert.ToUInt32(locationElements[0]);
|
||||
m_regionLocY = Convert.ToUInt32(locationElements[1]);
|
||||
|
||||
|
||||
// Datastore (is this implemented? Omitted from example!)
|
||||
DataStore = config.GetString("Datastore", String.Empty);
|
||||
|
||||
// Internal IP
|
||||
// InternalAddress
|
||||
//
|
||||
IPAddress address;
|
||||
|
||||
allKeys.Remove("InternalAddress");
|
||||
if (config.Contains("InternalAddress"))
|
||||
{
|
||||
address = IPAddress.Parse(config.GetString("InternalAddress", String.Empty));
|
||||
@@ -525,8 +549,10 @@ namespace OpenSim.Framework
|
||||
config.Set("InternalAddress", address.ToString());
|
||||
}
|
||||
|
||||
// InternalPort
|
||||
//
|
||||
int port;
|
||||
|
||||
allKeys.Remove("InternalPort");
|
||||
if (config.Contains("InternalPort"))
|
||||
{
|
||||
port = config.GetInt("InternalPort", 9000);
|
||||
@@ -536,9 +562,11 @@ namespace OpenSim.Framework
|
||||
port = Convert.ToInt32(MainConsole.Instance.CmdPrompt("Internal port", "9000"));
|
||||
config.Set("InternalPort", port);
|
||||
}
|
||||
|
||||
m_internalEndPoint = new IPEndPoint(address, port);
|
||||
|
||||
// AllowAlternatePorts
|
||||
//
|
||||
allKeys.Remove("AllowAlternatePorts");
|
||||
if (config.Contains("AllowAlternatePorts"))
|
||||
{
|
||||
m_allow_alternate_ports = config.GetBoolean("AllowAlternatePorts", true);
|
||||
@@ -550,10 +578,10 @@ namespace OpenSim.Framework
|
||||
config.Set("AllowAlternatePorts", m_allow_alternate_ports.ToString());
|
||||
}
|
||||
|
||||
// External IP
|
||||
// ExternalHostName
|
||||
//
|
||||
allKeys.Remove("ExternalHostName");
|
||||
string externalName;
|
||||
|
||||
if (config.Contains("ExternalHostName"))
|
||||
{
|
||||
externalName = config.GetString("ExternalHostName", "SYSTEMIP");
|
||||
@@ -563,7 +591,6 @@ namespace OpenSim.Framework
|
||||
externalName = MainConsole.Instance.CmdPrompt("External host name", "SYSTEMIP");
|
||||
config.Set("ExternalHostName", externalName);
|
||||
}
|
||||
|
||||
if (externalName == "SYSTEMIP")
|
||||
{
|
||||
m_externalHostName = Util.GetLocalHost().ToString();
|
||||
@@ -576,24 +603,32 @@ namespace OpenSim.Framework
|
||||
m_externalHostName = externalName;
|
||||
}
|
||||
|
||||
// RegionType
|
||||
m_regionType = config.GetString("RegionType", String.Empty);
|
||||
allKeys.Remove("RegionType");
|
||||
|
||||
// Prim stuff
|
||||
//
|
||||
m_nonphysPrimMax = config.GetInt("NonphysicalPrimMax", 256);
|
||||
|
||||
m_physPrimMax = config.GetInt("PhysicalPrimMax", 10);
|
||||
|
||||
m_nonphysPrimMax = config.GetInt("NonphysicalPrimMax", 0);
|
||||
allKeys.Remove("NonphysicalPrimMax");
|
||||
m_physPrimMax = config.GetInt("PhysicalPrimMax", 0);
|
||||
allKeys.Remove("PhysicalPrimMax");
|
||||
m_clampPrimSize = config.GetBoolean("ClampPrimSize", false);
|
||||
|
||||
allKeys.Remove("ClampPrimSize");
|
||||
m_objectCapacity = config.GetInt("MaxPrims", 15000);
|
||||
|
||||
allKeys.Remove("MaxPrims");
|
||||
m_agentCapacity = config.GetInt("MaxAgents", 100);
|
||||
|
||||
allKeys.Remove("MaxAgents");
|
||||
|
||||
// Multi-tenancy
|
||||
//
|
||||
ScopeID = new UUID(config.GetString("ScopeID", UUID.Zero.ToString()));
|
||||
allKeys.Remove("ScopeID");
|
||||
|
||||
foreach (String s in allKeys)
|
||||
{
|
||||
SetOtherSetting(s, config.GetString(s));
|
||||
}
|
||||
}
|
||||
|
||||
private void WriteNiniConfig(IConfigSource source)
|
||||
|
||||
@@ -26,11 +26,53 @@
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using OpenMetaverse;
|
||||
|
||||
namespace OpenSim.Framework
|
||||
{
|
||||
public struct SpawnPoint
|
||||
{
|
||||
public float Yaw;
|
||||
public float Pitch;
|
||||
public float Distance;
|
||||
|
||||
public void SetLocation(Vector3 pos, Quaternion rot, Vector3 point)
|
||||
{
|
||||
// The point is an absolute position, so we need the relative
|
||||
// location to the spawn point
|
||||
Vector3 offset = point - pos;
|
||||
Distance = Vector3.Mag(offset);
|
||||
|
||||
// Next we need to rotate this vector into the spawn point's
|
||||
// coordinate system
|
||||
rot.W = -rot.W;
|
||||
offset = offset * rot;
|
||||
|
||||
Vector3 dir = Vector3.Normalize(offset);
|
||||
|
||||
// Get the bearing (yaw)
|
||||
Yaw = (float)Math.Atan2(dir.Y, dir.X);
|
||||
|
||||
// Get the elevation (pitch)
|
||||
Pitch = (float)-Math.Atan2(dir.Z, Math.Sqrt(dir.X * dir.X + dir.Y * dir.Y));
|
||||
}
|
||||
|
||||
public Vector3 GetLocation(Vector3 pos, Quaternion rot)
|
||||
{
|
||||
Quaternion y = Quaternion.CreateFromEulers(0, 0, Yaw);
|
||||
Quaternion p = Quaternion.CreateFromEulers(0, Pitch, 0);
|
||||
|
||||
Vector3 dir = new Vector3(1, 0, 0) * p * y;
|
||||
Vector3 offset = dir * (float)Distance;
|
||||
|
||||
offset *= rot;
|
||||
|
||||
return pos + offset;
|
||||
}
|
||||
}
|
||||
|
||||
public class RegionSettings
|
||||
{
|
||||
public delegate void SaveDelegate(RegionSettings rs);
|
||||
@@ -331,6 +373,14 @@ namespace OpenSim.Framework
|
||||
set { m_SunVector = value; }
|
||||
}
|
||||
|
||||
private UUID m_ParcelImageID;
|
||||
|
||||
public UUID ParcelImageID
|
||||
{
|
||||
get { return m_ParcelImageID; }
|
||||
set { m_ParcelImageID = value; }
|
||||
}
|
||||
|
||||
private UUID m_TerrainImageID;
|
||||
|
||||
public UUID TerrainImageID
|
||||
@@ -363,6 +413,14 @@ namespace OpenSim.Framework
|
||||
set { m_Covenant = value; }
|
||||
}
|
||||
|
||||
private int m_CovenantChanged = 0;
|
||||
|
||||
public int CovenantChangedDateTime
|
||||
{
|
||||
get { return m_CovenantChanged; }
|
||||
set { m_CovenantChanged = value; }
|
||||
}
|
||||
|
||||
private int m_LoadedCreationDateTime;
|
||||
public int LoadedCreationDateTime
|
||||
{
|
||||
@@ -410,5 +468,58 @@ namespace OpenSim.Framework
|
||||
get { return m_Casino; }
|
||||
set { m_Casino = value; }
|
||||
}
|
||||
|
||||
// Telehub support
|
||||
private bool m_TelehubEnabled = false;
|
||||
public bool HasTelehub
|
||||
{
|
||||
get { return m_TelehubEnabled; }
|
||||
set { m_TelehubEnabled = value; }
|
||||
}
|
||||
|
||||
// Connected Telehub object
|
||||
private UUID m_TelehubObject;
|
||||
public UUID TelehubObject
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_TelehubObject;
|
||||
}
|
||||
set
|
||||
{
|
||||
m_TelehubObject = value;
|
||||
}
|
||||
}
|
||||
|
||||
// Our Connected Telehub's SpawnPoints
|
||||
public List<SpawnPoint> l_SpawnPoints = new List<SpawnPoint>();
|
||||
|
||||
// Add a SpawnPoint
|
||||
// ** These are not region coordinates **
|
||||
// They are relative to the Telehub coordinates
|
||||
//
|
||||
public void AddSpawnPoint(SpawnPoint point)
|
||||
{
|
||||
l_SpawnPoints.Add(point);
|
||||
}
|
||||
|
||||
// Remove a SpawnPoint
|
||||
public void RemoveSpawnPoint(int point_index)
|
||||
{
|
||||
l_SpawnPoints.RemoveAt(point_index);
|
||||
}
|
||||
|
||||
// Return the List of SpawnPoints
|
||||
public List<SpawnPoint> SpawnPoints()
|
||||
{
|
||||
return l_SpawnPoints;
|
||||
|
||||
}
|
||||
|
||||
// Clear the SpawnPoints List of all entries
|
||||
public void ClearSpawnPoints()
|
||||
{
|
||||
l_SpawnPoints.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -24,11 +24,13 @@
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Xml;
|
||||
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Services.Interfaces;
|
||||
|
||||
@@ -39,18 +41,86 @@ namespace OpenSim.Framework.Serialization.External
|
||||
/// </summary>
|
||||
public class ExternalRepresentationUtils
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
/// <summary>
|
||||
/// Populate a node with data read from xml using a dictinoary of processors
|
||||
/// </summary>
|
||||
/// <param name="nodeToFill"></param>
|
||||
/// <param name="processors">/param>
|
||||
/// <param name="xtr"></param>
|
||||
public static void ExecuteReadProcessors<NodeType>(
|
||||
NodeType nodeToFill, Dictionary<string, Action<NodeType, XmlTextReader>> processors, XmlTextReader xtr)
|
||||
{
|
||||
ExecuteReadProcessors(
|
||||
nodeToFill,
|
||||
processors,
|
||||
xtr,
|
||||
(o, name, e)
|
||||
=> m_log.ErrorFormat(
|
||||
"[ExternalRepresentationUtils]: Exception while parsing element {0}, continuing. Exception {1}{2}",
|
||||
name, e.Message, e.StackTrace));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Populate a node with data read from xml using a dictinoary of processors
|
||||
/// </summary>
|
||||
/// <param name="nodeToFill"></param>
|
||||
/// <param name="processors"></param>
|
||||
/// <param name="xtr"></param>
|
||||
/// <param name="parseExceptionAction">
|
||||
/// Action to take if there is a parsing problem. This will usually just be to log the exception
|
||||
/// </param>
|
||||
public static void ExecuteReadProcessors<NodeType>(
|
||||
NodeType nodeToFill,
|
||||
Dictionary<string, Action<NodeType, XmlTextReader>> processors,
|
||||
XmlTextReader xtr,
|
||||
Action<NodeType, string, Exception> parseExceptionAction)
|
||||
{
|
||||
string nodeName = string.Empty;
|
||||
while (xtr.NodeType != XmlNodeType.EndElement)
|
||||
{
|
||||
nodeName = xtr.Name;
|
||||
|
||||
// m_log.DebugFormat("[ExternalRepresentationUtils]: Processing: {0}", nodeName);
|
||||
|
||||
Action<NodeType, XmlTextReader> p = null;
|
||||
if (processors.TryGetValue(xtr.Name, out p))
|
||||
{
|
||||
// m_log.DebugFormat("[ExternalRepresentationUtils]: Found {0} processor, nodeName);
|
||||
|
||||
try
|
||||
{
|
||||
p(nodeToFill, xtr);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
parseExceptionAction(nodeToFill, nodeName, e);
|
||||
|
||||
if (xtr.NodeType == XmlNodeType.EndElement)
|
||||
xtr.Read();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// m_log.DebugFormat("[LandDataSerializer]: caught unknown element {0}", nodeName);
|
||||
xtr.ReadOuterXml(); // ignore
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Takes a XML representation of a SceneObjectPart and returns another XML representation
|
||||
/// with creator data added to it.
|
||||
/// </summary>
|
||||
/// <param name="xml">The SceneObjectPart represented in XML2</param>
|
||||
/// <param name="profileURL">The URL of the profile service for the creator</param>
|
||||
/// <param name="homeURL">The URL of the user agents service (home) for the creator</param>
|
||||
/// <param name="userService">The service for retrieving user account information</param>
|
||||
/// <param name="scopeID">The scope of the user account information (Grid ID)</param>
|
||||
/// <returns>The SceneObjectPart represented in XML2</returns>
|
||||
public static string RewriteSOP(string xml, string profileURL, IUserAccountService userService, UUID scopeID)
|
||||
public static string RewriteSOP(string xml, string homeURL, IUserAccountService userService, UUID scopeID)
|
||||
{
|
||||
if (xml == string.Empty || profileURL == string.Empty || userService == null)
|
||||
if (xml == string.Empty || homeURL == string.Empty || userService == null)
|
||||
return xml;
|
||||
|
||||
XmlDocument doc = new XmlDocument();
|
||||
@@ -83,7 +153,7 @@ namespace OpenSim.Framework.Serialization.External
|
||||
if (!hasCreatorData && creator != null)
|
||||
{
|
||||
XmlElement creatorData = doc.CreateElement("CreatorData");
|
||||
creatorData.InnerText = profileURL + "/" + creator.PrincipalID + ";" + creator.FirstName + " " + creator.LastName;
|
||||
creatorData.InnerText = homeURL + ";" + creator.FirstName + " " + creator.LastName;
|
||||
sop.AppendChild(creatorData);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,8 +28,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Xml;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
|
||||
@@ -40,8 +42,119 @@ namespace OpenSim.Framework.Serialization.External
|
||||
/// </summary>
|
||||
public class LandDataSerializer
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
protected static UTF8Encoding m_utf8Encoding = new UTF8Encoding();
|
||||
|
||||
private static Dictionary<string, Action<LandData, XmlTextReader>> m_ldProcessors
|
||||
= new Dictionary<string, Action<LandData, XmlTextReader>>();
|
||||
|
||||
private static Dictionary<string, Action<LandAccessEntry, XmlTextReader>> m_laeProcessors
|
||||
= new Dictionary<string, Action<LandAccessEntry, XmlTextReader>>();
|
||||
|
||||
static LandDataSerializer()
|
||||
{
|
||||
// LandData processors
|
||||
m_ldProcessors.Add(
|
||||
"Area", (ld, xtr) => ld.Area = Convert.ToInt32(xtr.ReadElementString("Area")));
|
||||
m_ldProcessors.Add(
|
||||
"AuctionID", (ld, xtr) => ld.AuctionID = Convert.ToUInt32(xtr.ReadElementString("AuctionID")));
|
||||
m_ldProcessors.Add(
|
||||
"AuthBuyerID", (ld, xtr) => ld.AuthBuyerID = UUID.Parse(xtr.ReadElementString("AuthBuyerID")));
|
||||
m_ldProcessors.Add(
|
||||
"Category", (ld, xtr) => ld.Category = (ParcelCategory)Convert.ToSByte(xtr.ReadElementString("Category")));
|
||||
m_ldProcessors.Add(
|
||||
"ClaimDate", (ld, xtr) => ld.ClaimDate = Convert.ToInt32(xtr.ReadElementString("ClaimDate")));
|
||||
m_ldProcessors.Add(
|
||||
"ClaimPrice", (ld, xtr) => ld.ClaimPrice = Convert.ToInt32(xtr.ReadElementString("ClaimPrice")));
|
||||
m_ldProcessors.Add(
|
||||
"GlobalID", (ld, xtr) => ld.GlobalID = UUID.Parse(xtr.ReadElementString("GlobalID")));
|
||||
m_ldProcessors.Add(
|
||||
"GroupID", (ld, xtr) => ld.GroupID = UUID.Parse(xtr.ReadElementString("GroupID")));
|
||||
m_ldProcessors.Add(
|
||||
"IsGroupOwned", (ld, xtr) => ld.IsGroupOwned = Convert.ToBoolean(xtr.ReadElementString("IsGroupOwned")));
|
||||
m_ldProcessors.Add(
|
||||
"Bitmap", (ld, xtr) => ld.Bitmap = Convert.FromBase64String(xtr.ReadElementString("Bitmap")));
|
||||
m_ldProcessors.Add(
|
||||
"Description", (ld, xtr) => ld.Description = xtr.ReadElementString("Description"));
|
||||
m_ldProcessors.Add(
|
||||
"Flags", (ld, xtr) => ld.Flags = Convert.ToUInt32(xtr.ReadElementString("Flags")));
|
||||
m_ldProcessors.Add(
|
||||
"LandingType", (ld, xtr) => ld.LandingType = Convert.ToByte(xtr.ReadElementString("LandingType")));
|
||||
m_ldProcessors.Add(
|
||||
"Name", (ld, xtr) => ld.Name = xtr.ReadElementString("Name"));
|
||||
m_ldProcessors.Add(
|
||||
"Status", (ld, xtr) => ld.Status = (ParcelStatus)Convert.ToSByte(xtr.ReadElementString("Status")));
|
||||
m_ldProcessors.Add(
|
||||
"LocalID", (ld, xtr) => ld.LocalID = Convert.ToInt32(xtr.ReadElementString("LocalID")));
|
||||
m_ldProcessors.Add(
|
||||
"MediaAutoScale", (ld, xtr) => ld.MediaAutoScale = Convert.ToByte(xtr.ReadElementString("MediaAutoScale")));
|
||||
m_ldProcessors.Add(
|
||||
"MediaID", (ld, xtr) => ld.MediaID = UUID.Parse(xtr.ReadElementString("MediaID")));
|
||||
m_ldProcessors.Add(
|
||||
"MediaURL", (ld, xtr) => ld.MediaURL = xtr.ReadElementString("MediaURL"));
|
||||
m_ldProcessors.Add(
|
||||
"MusicURL", (ld, xtr) => ld.MusicURL = xtr.ReadElementString("MusicURL"));
|
||||
|
||||
m_ldProcessors.Add(
|
||||
"ParcelAccessList", ProcessParcelAccessList);
|
||||
|
||||
m_ldProcessors.Add(
|
||||
"PassHours", (ld, xtr) => ld.PassHours = Convert.ToSingle(xtr.ReadElementString("PassHours")));
|
||||
m_ldProcessors.Add(
|
||||
"PassPrice", (ld, xtr) => ld.PassPrice = Convert.ToInt32(xtr.ReadElementString("PassPrice")));
|
||||
m_ldProcessors.Add(
|
||||
"SalePrice", (ld, xtr) => ld.SalePrice = Convert.ToInt32(xtr.ReadElementString("SalePrice")));
|
||||
m_ldProcessors.Add(
|
||||
"SnapshotID", (ld, xtr) => ld.SnapshotID = UUID.Parse(xtr.ReadElementString("SnapshotID")));
|
||||
m_ldProcessors.Add(
|
||||
"UserLocation", (ld, xtr) => ld.UserLocation = Vector3.Parse(xtr.ReadElementString("UserLocation")));
|
||||
m_ldProcessors.Add(
|
||||
"UserLookAt", (ld, xtr) => ld.UserLookAt = Vector3.Parse(xtr.ReadElementString("UserLookAt")));
|
||||
|
||||
// No longer used here //
|
||||
// m_ldProcessors.Add("Dwell", (landData, xtr) => return);
|
||||
|
||||
m_ldProcessors.Add(
|
||||
"OtherCleanTime", (ld, xtr) => ld.OtherCleanTime = Convert.ToInt32(xtr.ReadElementString("OtherCleanTime")));
|
||||
|
||||
// LandAccessEntryProcessors
|
||||
m_laeProcessors.Add(
|
||||
"AgentID", (lae, xtr) => lae.AgentID = UUID.Parse(xtr.ReadElementString("AgentID")));
|
||||
m_laeProcessors.Add(
|
||||
"Time", (lae, xtr) =>
|
||||
{
|
||||
// We really don't care about temp vs perm here and this
|
||||
// would break on old oars. Assume all bans are perm
|
||||
xtr.ReadElementString("Time");
|
||||
lae.Expires = 0; // Convert.ToUint( xtr.ReadElementString("Time"));
|
||||
}
|
||||
);
|
||||
m_laeProcessors.Add(
|
||||
"AccessList", (lae, xtr) => lae.Flags = (AccessList)Convert.ToUInt32(xtr.ReadElementString("AccessList")));
|
||||
}
|
||||
|
||||
public static void ProcessParcelAccessList(LandData ld, XmlTextReader xtr)
|
||||
{
|
||||
if (!xtr.IsEmptyElement)
|
||||
{
|
||||
while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement)
|
||||
{
|
||||
LandAccessEntry lae = new LandAccessEntry();
|
||||
|
||||
xtr.ReadStartElement("ParcelAccessEntry");
|
||||
|
||||
ExternalRepresentationUtils.ExecuteReadProcessors<LandAccessEntry>(lae, m_laeProcessors, xtr);
|
||||
|
||||
xtr.ReadEndElement();
|
||||
|
||||
ld.ParcelAccessList.Add(lae);
|
||||
}
|
||||
}
|
||||
|
||||
xtr.Read();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reify/deserialize landData
|
||||
/// </summary>
|
||||
@@ -63,69 +176,14 @@ namespace OpenSim.Framework.Serialization.External
|
||||
{
|
||||
LandData landData = new LandData();
|
||||
|
||||
StringReader sr = new StringReader(serializedLandData);
|
||||
XmlTextReader xtr = new XmlTextReader(sr);
|
||||
|
||||
xtr.ReadStartElement("LandData");
|
||||
|
||||
landData.Area = Convert.ToInt32( xtr.ReadElementString("Area"));
|
||||
landData.AuctionID = Convert.ToUInt32( xtr.ReadElementString("AuctionID"));
|
||||
landData.AuthBuyerID = UUID.Parse( xtr.ReadElementString("AuthBuyerID"));
|
||||
landData.Category = (ParcelCategory)Convert.ToSByte( xtr.ReadElementString("Category"));
|
||||
landData.ClaimDate = Convert.ToInt32( xtr.ReadElementString("ClaimDate"));
|
||||
landData.ClaimPrice = Convert.ToInt32( xtr.ReadElementString("ClaimPrice"));
|
||||
landData.GlobalID = UUID.Parse( xtr.ReadElementString("GlobalID"));
|
||||
landData.GroupID = UUID.Parse( xtr.ReadElementString("GroupID"));
|
||||
landData.IsGroupOwned = Convert.ToBoolean( xtr.ReadElementString("IsGroupOwned"));
|
||||
landData.Bitmap = Convert.FromBase64String( xtr.ReadElementString("Bitmap"));
|
||||
landData.Description = xtr.ReadElementString("Description");
|
||||
landData.Flags = Convert.ToUInt32( xtr.ReadElementString("Flags"));
|
||||
landData.LandingType = Convert.ToByte( xtr.ReadElementString("LandingType"));
|
||||
landData.Name = xtr.ReadElementString("Name");
|
||||
landData.Status = (ParcelStatus)Convert.ToSByte( xtr.ReadElementString("Status"));
|
||||
landData.LocalID = Convert.ToInt32( xtr.ReadElementString("LocalID"));
|
||||
landData.MediaAutoScale = Convert.ToByte( xtr.ReadElementString("MediaAutoScale"));
|
||||
landData.MediaID = UUID.Parse( xtr.ReadElementString("MediaID"));
|
||||
landData.MediaURL = xtr.ReadElementString("MediaURL");
|
||||
landData.MusicURL = xtr.ReadElementString("MusicURL");
|
||||
landData.OwnerID = UUID.Parse( xtr.ReadElementString("OwnerID"));
|
||||
|
||||
landData.ParcelAccessList = new List<ParcelManager.ParcelAccessEntry>();
|
||||
xtr.Read();
|
||||
if (xtr.Name != "ParcelAccessList")
|
||||
throw new XmlException(String.Format("Expected \"ParcelAccessList\" element but got \"{0}\"", xtr.Name));
|
||||
|
||||
if (!xtr.IsEmptyElement)
|
||||
using (XmlTextReader reader = new XmlTextReader(new StringReader(serializedLandData)))
|
||||
{
|
||||
while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement)
|
||||
{
|
||||
ParcelManager.ParcelAccessEntry pae = new ParcelManager.ParcelAccessEntry();
|
||||
reader.ReadStartElement("LandData");
|
||||
|
||||
xtr.ReadStartElement("ParcelAccessEntry");
|
||||
pae.AgentID = UUID.Parse( xtr.ReadElementString("AgentID"));
|
||||
pae.Time = Convert.ToDateTime( xtr.ReadElementString("Time"));
|
||||
pae.Flags = (AccessList)Convert.ToUInt32( xtr.ReadElementString("AccessList"));
|
||||
xtr.ReadEndElement();
|
||||
ExternalRepresentationUtils.ExecuteReadProcessors<LandData>(landData, m_ldProcessors, reader);
|
||||
|
||||
landData.ParcelAccessList.Add(pae);
|
||||
}
|
||||
reader.ReadEndElement();
|
||||
}
|
||||
xtr.Read();
|
||||
|
||||
landData.PassHours = Convert.ToSingle( xtr.ReadElementString("PassHours"));
|
||||
landData.PassPrice = Convert.ToInt32( xtr.ReadElementString("PassPrice"));
|
||||
landData.SalePrice = Convert.ToInt32( xtr.ReadElementString("SalePrice"));
|
||||
landData.SnapshotID = UUID.Parse( xtr.ReadElementString("SnapshotID"));
|
||||
landData.UserLocation = Vector3.Parse( xtr.ReadElementString("UserLocation"));
|
||||
landData.UserLookAt = Vector3.Parse( xtr.ReadElementString("UserLookAt"));
|
||||
// No longer used here
|
||||
xtr.ReadElementString("Dwell");
|
||||
landData.OtherCleanTime = Convert.ToInt32( xtr.ReadElementString("OtherCleanTime"));
|
||||
|
||||
xtr.ReadEndElement();
|
||||
|
||||
xtr.Close();
|
||||
sr.Close();
|
||||
|
||||
return landData;
|
||||
}
|
||||
@@ -162,11 +220,11 @@ namespace OpenSim.Framework.Serialization.External
|
||||
xtw.WriteElementString("OwnerID", landData.OwnerID.ToString());
|
||||
|
||||
xtw.WriteStartElement("ParcelAccessList");
|
||||
foreach (ParcelManager.ParcelAccessEntry pal in landData.ParcelAccessList)
|
||||
foreach (LandAccessEntry pal in landData.ParcelAccessList)
|
||||
{
|
||||
xtw.WriteStartElement("ParcelAccessEntry");
|
||||
xtw.WriteElementString("AgentID", pal.AgentID.ToString());
|
||||
xtw.WriteElementString("Time", pal.Time.ToString("s"));
|
||||
xtw.WriteElementString("Time", pal.Expires.ToString());
|
||||
xtw.WriteElementString("AccessList", Convert.ToString((uint)pal.Flags));
|
||||
xtw.WriteEndElement();
|
||||
}
|
||||
|
||||
@@ -41,14 +41,13 @@ namespace OpenSim.Framework.Serialization.External
|
||||
{
|
||||
/// <summary>
|
||||
/// Serialize and deserialize user inventory items as an external format.
|
||||
/// </summary>
|
||||
/// XXX: Please do not use yet.
|
||||
/// </summary>
|
||||
public class UserInventoryItemSerializer
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private delegate void InventoryItemXmlProcessor(InventoryItemBase item, XmlTextReader reader);
|
||||
private static Dictionary<string, InventoryItemXmlProcessor> m_InventoryItemXmlProcessors = new Dictionary<string, InventoryItemXmlProcessor>();
|
||||
private static Dictionary<string, Action<InventoryItemBase, XmlTextReader>> m_InventoryItemXmlProcessors
|
||||
= new Dictionary<string, Action<InventoryItemBase, XmlTextReader>>();
|
||||
|
||||
#region InventoryItemBase Processor initialization
|
||||
static UserInventoryItemSerializer()
|
||||
@@ -205,39 +204,14 @@ namespace OpenSim.Framework.Serialization.External
|
||||
{
|
||||
reader.ReadStartElement("InventoryItem");
|
||||
|
||||
string nodeName = string.Empty;
|
||||
while (reader.NodeType != XmlNodeType.EndElement)
|
||||
{
|
||||
nodeName = reader.Name;
|
||||
InventoryItemXmlProcessor p = null;
|
||||
if (m_InventoryItemXmlProcessors.TryGetValue(reader.Name, out p))
|
||||
{
|
||||
//m_log.DebugFormat("[XXX] Processing: {0}", reader.Name);
|
||||
try
|
||||
{
|
||||
p(item, reader);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.DebugFormat("[InventoryItemSerializer]: exception while parsing {0}: {1}", nodeName, e);
|
||||
if (reader.NodeType == XmlNodeType.EndElement)
|
||||
reader.Read();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// m_log.DebugFormat("[InventoryItemSerializer]: caught unknown element {0}", nodeName);
|
||||
reader.ReadOuterXml(); // ignore
|
||||
}
|
||||
|
||||
}
|
||||
ExternalRepresentationUtils.ExecuteReadProcessors<InventoryItemBase>(
|
||||
item, m_InventoryItemXmlProcessors, reader);
|
||||
|
||||
reader.ReadEndElement(); // InventoryItem
|
||||
}
|
||||
|
||||
//m_log.DebugFormat("[XXX]: parsed InventoryItemBase {0} - {1}", obj.Name, obj.UUID);
|
||||
return item;
|
||||
|
||||
}
|
||||
|
||||
public static string Serialize(InventoryItemBase inventoryItem, Dictionary<string, object> options, IUserAccountService userAccountService)
|
||||
@@ -305,14 +279,14 @@ namespace OpenSim.Framework.Serialization.External
|
||||
writer.WriteEndElement();
|
||||
if (options.ContainsKey("creators") && inventoryItem.CreatorData != null && inventoryItem.CreatorData != string.Empty)
|
||||
writer.WriteElementString("CreatorData", inventoryItem.CreatorData);
|
||||
else if (options.ContainsKey("profile"))
|
||||
else if (options.ContainsKey("home"))
|
||||
{
|
||||
if (userAccountService != null)
|
||||
{
|
||||
UserAccount account = userAccountService.GetUserAccount(UUID.Zero, inventoryItem.CreatorIdAsUuid);
|
||||
if (account != null)
|
||||
{
|
||||
writer.WriteElementString("CreatorData", (string)options["profile"] + "/" + inventoryItem.CreatorIdAsUuid + ";" + account.FirstName + " " + account.LastName);
|
||||
writer.WriteElementString("CreatorData", (string)options["home"] + "/" + inventoryItem.CreatorIdAsUuid + ";" + account.FirstName + " " + account.LastName);
|
||||
}
|
||||
writer.WriteElementString("CreatorID", inventoryItem.CreatorId);
|
||||
}
|
||||
|
||||
@@ -33,8 +33,11 @@ using OpenSim.Framework;
|
||||
namespace OpenSim.Framework.Serialization.External
|
||||
{
|
||||
/// <summary>
|
||||
/// Serialize and deserialize region settings as an external format.
|
||||
/// Serialize and deserialize user profiles as an external format.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Currently UNUSED.
|
||||
/// </remarks>
|
||||
public class UserProfileSerializer
|
||||
{
|
||||
public const int MAJOR_VERSION = 0;
|
||||
|
||||
@@ -27,11 +27,12 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Serialization.External;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.StructuredData;
|
||||
using NUnit.Framework;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Serialization.External;
|
||||
using OpenSim.Tests.Common;
|
||||
|
||||
namespace OpenSim.Framework.Serialization.Tests
|
||||
{
|
||||
@@ -42,7 +43,7 @@ namespace OpenSim.Framework.Serialization.Tests
|
||||
private LandData landWithParcelAccessList;
|
||||
|
||||
private static string preSerialized = "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<LandData>\n <Area>128</Area>\n <AuctionID>0</AuctionID>\n <AuthBuyerID>00000000-0000-0000-0000-000000000000</AuthBuyerID>\n <Category>10</Category>\n <ClaimDate>0</ClaimDate>\n <ClaimPrice>0</ClaimPrice>\n <GlobalID>54ff9641-dd40-4a2c-b1f1-47dd3af24e50</GlobalID>\n <GroupID>d740204e-bbbf-44aa-949d-02c7d739f6a5</GroupID>\n <IsGroupOwned>False</IsGroupOwned>\n <Bitmap>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</Bitmap>\n <Description>land data to test LandDataSerializer</Description>\n <Flags>536870944</Flags>\n <LandingType>2</LandingType>\n <Name>LandDataSerializerTest Land</Name>\n <Status>0</Status>\n <LocalID>0</LocalID>\n <MediaAutoScale>1</MediaAutoScale>\n <MediaID>d4452578-2f25-4b97-a81b-819af559cfd7</MediaID>\n <MediaURL>http://videos.opensimulator.org/bumblebee.mp4</MediaURL>\n <MusicURL />\n <OwnerID>1b8eedf9-6d15-448b-8015-24286f1756bf</OwnerID>\n <ParcelAccessList />\n <PassHours>0</PassHours>\n <PassPrice>0</PassPrice>\n <SalePrice>0</SalePrice>\n <SnapshotID>00000000-0000-0000-0000-000000000000</SnapshotID>\n <UserLocation><0, 0, 0></UserLocation>\n <UserLookAt><0, 0, 0></UserLookAt>\n <Dwell>0</Dwell>\n <OtherCleanTime>0</OtherCleanTime>\n</LandData>";
|
||||
private static string preSerializedWithParcelAccessList = "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<LandData>\n <Area>128</Area>\n <AuctionID>0</AuctionID>\n <AuthBuyerID>00000000-0000-0000-0000-000000000000</AuthBuyerID>\n <Category>10</Category>\n <ClaimDate>0</ClaimDate>\n <ClaimPrice>0</ClaimPrice>\n <GlobalID>54ff9641-dd40-4a2c-b1f1-47dd3af24e50</GlobalID>\n <GroupID>d740204e-bbbf-44aa-949d-02c7d739f6a5</GroupID>\n <IsGroupOwned>False</IsGroupOwned>\n <Bitmap>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</Bitmap>\n <Description>land data to test LandDataSerializer</Description>\n <Flags>536870944</Flags>\n <LandingType>2</LandingType>\n <Name>LandDataSerializerTest Land</Name>\n <Status>0</Status>\n <LocalID>0</LocalID>\n <MediaAutoScale>1</MediaAutoScale>\n <MediaID>d4452578-2f25-4b97-a81b-819af559cfd7</MediaID>\n <MediaURL>http://videos.opensimulator.org/bumblebee.mp4</MediaURL>\n <MusicURL />\n <OwnerID>1b8eedf9-6d15-448b-8015-24286f1756bf</OwnerID>\n <ParcelAccessList>\n <ParcelAccessEntry>\n <AgentID>62d65d45-c91a-4f77-862c-46557d978b6c</AgentID>\n <Time>2009-10-01T00:00:00</Time>\n <AccessList>2</AccessList>\n </ParcelAccessEntry>\n <ParcelAccessEntry>\n <AgentID>ec2a8d18-2378-4fe0-8b68-2a31b57c481e</AgentID>\n <Time>2010-10-20T00:00:00</Time>\n <AccessList>1</AccessList>\n </ParcelAccessEntry>\n </ParcelAccessList>\n <PassHours>0</PassHours>\n <PassPrice>0</PassPrice>\n <SalePrice>0</SalePrice>\n <SnapshotID>00000000-0000-0000-0000-000000000000</SnapshotID>\n <UserLocation><0, 0, 0></UserLocation>\n <UserLookAt><0, 0, 0></UserLookAt>\n <Dwell>0</Dwell>\n <OtherCleanTime>0</OtherCleanTime>\n</LandData>";
|
||||
private static string preSerializedWithParcelAccessList = "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<LandData>\n <Area>128</Area>\n <AuctionID>0</AuctionID>\n <AuthBuyerID>00000000-0000-0000-0000-000000000000</AuthBuyerID>\n <Category>10</Category>\n <ClaimDate>0</ClaimDate>\n <ClaimPrice>0</ClaimPrice>\n <GlobalID>54ff9641-dd40-4a2c-b1f1-47dd3af24e50</GlobalID>\n <GroupID>d740204e-bbbf-44aa-949d-02c7d739f6a5</GroupID>\n <IsGroupOwned>False</IsGroupOwned>\n <Bitmap>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</Bitmap>\n <Description>land data to test LandDataSerializer</Description>\n <Flags>536870944</Flags>\n <LandingType>2</LandingType>\n <Name>LandDataSerializerTest Land</Name>\n <Status>0</Status>\n <LocalID>0</LocalID>\n <MediaAutoScale>1</MediaAutoScale>\n <MediaID>d4452578-2f25-4b97-a81b-819af559cfd7</MediaID>\n <MediaURL>http://videos.opensimulator.org/bumblebee.mp4</MediaURL>\n <MusicURL />\n <OwnerID>1b8eedf9-6d15-448b-8015-24286f1756bf</OwnerID>\n <ParcelAccessList>\n <ParcelAccessEntry>\n <AgentID>62d65d45-c91a-4f77-862c-46557d978b6c</AgentID>\n <Time>0</Time>\n <AccessList>2</AccessList>\n </ParcelAccessEntry>\n <ParcelAccessEntry>\n <AgentID>ec2a8d18-2378-4fe0-8b68-2a31b57c481e</AgentID>\n <Time>0</Time>\n <AccessList>1</AccessList>\n </ParcelAccessEntry>\n </ParcelAccessList>\n <PassHours>0</PassHours>\n <PassPrice>0</PassPrice>\n <SalePrice>0</SalePrice>\n <SnapshotID>00000000-0000-0000-0000-000000000000</SnapshotID>\n <UserLocation><0, 0, 0></UserLocation>\n <UserLookAt><0, 0, 0></UserLookAt>\n <Dwell>0</Dwell>\n <OtherCleanTime>0</OtherCleanTime>\n</LandData>";
|
||||
|
||||
[SetUp]
|
||||
public void setup()
|
||||
@@ -73,16 +74,16 @@ namespace OpenSim.Framework.Serialization.Tests
|
||||
this.landWithParcelAccessList = this.land.Copy();
|
||||
this.landWithParcelAccessList.ParcelAccessList.Clear();
|
||||
|
||||
ParcelManager.ParcelAccessEntry pae0 = new ParcelManager.ParcelAccessEntry();
|
||||
LandAccessEntry pae0 = new LandAccessEntry();
|
||||
pae0.AgentID = new UUID("62d65d45-c91a-4f77-862c-46557d978b6c");
|
||||
pae0.Flags = AccessList.Ban;
|
||||
pae0.Time = new DateTime(2009, 10, 01);
|
||||
pae0.Expires = 0;
|
||||
this.landWithParcelAccessList.ParcelAccessList.Add(pae0);
|
||||
|
||||
ParcelManager.ParcelAccessEntry pae1 = new ParcelManager.ParcelAccessEntry();
|
||||
LandAccessEntry pae1 = new LandAccessEntry();
|
||||
pae1.AgentID = new UUID("ec2a8d18-2378-4fe0-8b68-2a31b57c481e");
|
||||
pae1.Flags = AccessList.Access;
|
||||
pae1.Time = new DateTime(2010, 10, 20);
|
||||
pae1.Expires = 0;
|
||||
this.landWithParcelAccessList.ParcelAccessList.Add(pae1);
|
||||
}
|
||||
|
||||
@@ -92,6 +93,8 @@ namespace OpenSim.Framework.Serialization.Tests
|
||||
[Test]
|
||||
public void LandDataSerializerSerializeTest()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
|
||||
string serialized = LandDataSerializer.Serialize(this.land).Replace("\r\n", "\n");
|
||||
Assert.That(serialized.Length > 0, "Serialize(LandData) returned empty string");
|
||||
|
||||
@@ -112,20 +115,32 @@ namespace OpenSim.Framework.Serialization.Tests
|
||||
/// Test the LandDataSerializer.Deserialize() method
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestLandDataSerializerDeserializeFromStringTest()
|
||||
public void TestLandDataDeserializeNoAccessLists()
|
||||
{
|
||||
LandData reifiedLandData = LandDataSerializer.Deserialize(LandDataSerializerTest.preSerialized);
|
||||
Assert.That(reifiedLandData != null, "Deserialize(string) returned null");
|
||||
Assert.That(reifiedLandData.GlobalID == this.land.GlobalID, "Reified LandData.GlobalID != original LandData.GlobalID");
|
||||
Assert.That(reifiedLandData.Name == this.land.Name, "Reified LandData.Name != original LandData.Name");
|
||||
TestHelpers.InMethod();
|
||||
// log4net.Config.XmlConfigurator.Configure();
|
||||
|
||||
LandData reifiedLandDataWithParcelAccessList = LandDataSerializer.Deserialize(LandDataSerializerTest.preSerializedWithParcelAccessList);
|
||||
Assert.That(reifiedLandDataWithParcelAccessList != null,
|
||||
LandData ld = LandDataSerializer.Deserialize(LandDataSerializerTest.preSerialized);
|
||||
Assert.That(ld != null, "Deserialize(string) returned null");
|
||||
Assert.That(ld.GlobalID == this.land.GlobalID, "Reified LandData.GlobalID != original LandData.GlobalID");
|
||||
Assert.That(ld.Name == this.land.Name, "Reified LandData.Name != original LandData.Name");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestLandDataDeserializeWithAccessLists()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
// log4net.Config.XmlConfigurator.Configure();
|
||||
|
||||
LandData ld = LandDataSerializer.Deserialize(LandDataSerializerTest.preSerializedWithParcelAccessList);
|
||||
Assert.That(ld != null,
|
||||
"Deserialize(string) returned null (pre-serialized with parcel access list)");
|
||||
Assert.That(reifiedLandDataWithParcelAccessList.GlobalID == this.landWithParcelAccessList.GlobalID,
|
||||
Assert.That(ld.GlobalID == this.landWithParcelAccessList.GlobalID,
|
||||
"Reified LandData.GlobalID != original LandData.GlobalID (pre-serialized with parcel access list)");
|
||||
Assert.That(reifiedLandDataWithParcelAccessList.Name == this.landWithParcelAccessList.Name,
|
||||
Assert.That(ld.Name == this.landWithParcelAccessList.Name,
|
||||
"Reified LandData.Name != original LandData.Name (pre-serialized with parcel access list)");
|
||||
Assert.That(ld.ParcelAccessList.Count, Is.EqualTo(2));
|
||||
Assert.That(ld.ParcelAccessList[0].AgentID, Is.EqualTo(UUID.Parse("62d65d45-c91a-4f77-862c-46557d978b6c")));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.StructuredData;
|
||||
using NUnit.Framework;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Serialization.External;
|
||||
using OpenSim.Tests.Common;
|
||||
|
||||
namespace OpenSim.Framework.Serialization.Tests
|
||||
{
|
||||
[TestFixture]
|
||||
public class RegionSettingsSerializerTests
|
||||
{
|
||||
private string m_serializedRs = @"<?xml version=""1.0"" encoding=""utf-16""?>
|
||||
<RegionSettings>
|
||||
<General>
|
||||
<AllowDamage>True</AllowDamage>
|
||||
<AllowLandResell>True</AllowLandResell>
|
||||
<AllowLandJoinDivide>True</AllowLandJoinDivide>
|
||||
<BlockFly>True</BlockFly>
|
||||
<BlockLandShowInSearch>True</BlockLandShowInSearch>
|
||||
<BlockTerraform>True</BlockTerraform>
|
||||
<DisableCollisions>True</DisableCollisions>
|
||||
<DisablePhysics>True</DisablePhysics>
|
||||
<DisableScripts>True</DisableScripts>
|
||||
<MaturityRating>1</MaturityRating>
|
||||
<RestrictPushing>True</RestrictPushing>
|
||||
<AgentLimit>40</AgentLimit>
|
||||
<ObjectBonus>1.4</ObjectBonus>
|
||||
</General>
|
||||
<GroundTextures>
|
||||
<Texture1>00000000-0000-0000-0000-000000000020</Texture1>
|
||||
<Texture2>00000000-0000-0000-0000-000000000040</Texture2>
|
||||
<Texture3>00000000-0000-0000-0000-000000000060</Texture3>
|
||||
<Texture4>00000000-0000-0000-0000-000000000080</Texture4>
|
||||
<ElevationLowSW>1.9</ElevationLowSW>
|
||||
<ElevationLowNW>15.9</ElevationLowNW>
|
||||
<ElevationLowSE>49</ElevationLowSE>
|
||||
<ElevationLowNE>45.3</ElevationLowNE>
|
||||
<ElevationHighSW>2.1</ElevationHighSW>
|
||||
<ElevationHighNW>4.5</ElevationHighNW>
|
||||
<ElevationHighSE>9.2</ElevationHighSE>
|
||||
<ElevationHighNE>19.2</ElevationHighNE>
|
||||
</GroundTextures>
|
||||
<Terrain>
|
||||
<WaterHeight>23</WaterHeight>
|
||||
<TerrainRaiseLimit>17.9</TerrainRaiseLimit>
|
||||
<TerrainLowerLimit>0.4</TerrainLowerLimit>
|
||||
<UseEstateSun>True</UseEstateSun>
|
||||
<FixedSun>true</FixedSun>
|
||||
<SunPosition>12</SunPosition>
|
||||
</Terrain>
|
||||
</RegionSettings>";
|
||||
|
||||
private RegionSettings m_rs;
|
||||
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
{
|
||||
m_rs = new RegionSettings();
|
||||
m_rs.AgentLimit = 17;
|
||||
m_rs.AllowDamage = true;
|
||||
m_rs.AllowLandJoinDivide = true;
|
||||
m_rs.AllowLandResell = true;
|
||||
m_rs.BlockFly = true;
|
||||
m_rs.BlockShowInSearch = true;
|
||||
m_rs.BlockTerraform = true;
|
||||
m_rs.DisableCollisions = true;
|
||||
m_rs.DisablePhysics = true;
|
||||
m_rs.DisableScripts = true;
|
||||
m_rs.Elevation1NW = 15.9;
|
||||
m_rs.Elevation1NE = 45.3;
|
||||
m_rs.Elevation1SE = 49;
|
||||
m_rs.Elevation1SW = 1.9;
|
||||
m_rs.Elevation2NW = 4.5;
|
||||
m_rs.Elevation2NE = 19.2;
|
||||
m_rs.Elevation2SE = 9.2;
|
||||
m_rs.Elevation2SW = 2.1;
|
||||
m_rs.FixedSun = true;
|
||||
m_rs.SunPosition = 12.0;
|
||||
m_rs.ObjectBonus = 1.4;
|
||||
m_rs.RestrictPushing = true;
|
||||
m_rs.TerrainLowerLimit = 0.4;
|
||||
m_rs.TerrainRaiseLimit = 17.9;
|
||||
m_rs.TerrainTexture1 = UUID.Parse("00000000-0000-0000-0000-000000000020");
|
||||
m_rs.TerrainTexture2 = UUID.Parse("00000000-0000-0000-0000-000000000040");
|
||||
m_rs.TerrainTexture3 = UUID.Parse("00000000-0000-0000-0000-000000000060");
|
||||
m_rs.TerrainTexture4 = UUID.Parse("00000000-0000-0000-0000-000000000080");
|
||||
m_rs.UseEstateSun = true;
|
||||
m_rs.WaterHeight = 23;
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestRegionSettingsDeserialize()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
// log4net.Config.XmlConfigurator.Configure();
|
||||
|
||||
RegionSettings deserRs = RegionSettingsSerializer.Deserialize(m_serializedRs);
|
||||
Assert.That(deserRs, Is.Not.Null);
|
||||
Assert.That(deserRs.TerrainTexture2, Is.EqualTo(m_rs.TerrainTexture2));
|
||||
Assert.That(deserRs.DisablePhysics, Is.EqualTo(m_rs.DisablePhysics));
|
||||
Assert.That(deserRs.TerrainLowerLimit, Is.EqualTo(m_rs.TerrainLowerLimit));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -251,7 +251,7 @@ namespace OpenSim.Framework.Servers
|
||||
|
||||
sb.Append(threads.Length + " threads are being tracked:" + Environment.NewLine);
|
||||
|
||||
int timeNow = Util.EnvironmentTickCount();
|
||||
int timeNow = Environment.TickCount & Int32.MaxValue;
|
||||
|
||||
sb.AppendFormat(reportFormat, "ID", "NAME", "LAST UPDATE (MS)", "LIFETIME (MS)", "PRIORITY", "STATE");
|
||||
sb.Append(Environment.NewLine);
|
||||
@@ -600,7 +600,7 @@ namespace OpenSim.Framework.Servers
|
||||
|
||||
}
|
||||
|
||||
public string StatReport(OSHttpRequest httpRequest)
|
||||
public string StatReport(IOSHttpRequest httpRequest)
|
||||
{
|
||||
// If we catch a request for "callback", wrap the response in the value for jsonp
|
||||
if (httpRequest.Query.ContainsKey("callback"))
|
||||
|
||||
@@ -227,21 +227,17 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||
return new List<string>(m_HTTPHandlers.Keys);
|
||||
}
|
||||
|
||||
public bool AddPollServiceHTTPHandler(string methodName, GenericHTTPMethod handler, PollServiceEventArgs args)
|
||||
public bool AddPollServiceHTTPHandler(string methodName, PollServiceEventArgs args)
|
||||
{
|
||||
bool pollHandlerResult = false;
|
||||
lock (m_pollHandlers)
|
||||
{
|
||||
if (!m_pollHandlers.ContainsKey(methodName))
|
||||
{
|
||||
m_pollHandlers.Add(methodName,args);
|
||||
pollHandlerResult = true;
|
||||
m_pollHandlers.Add(methodName, args);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (pollHandlerResult)
|
||||
return AddHTTPHandler(methodName, handler);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1871,8 +1867,6 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||
{
|
||||
lock (m_pollHandlers)
|
||||
m_pollHandlers.Remove(path);
|
||||
|
||||
RemoveHTTPHandler(httpMethod, path);
|
||||
}
|
||||
|
||||
public bool RemoveAgentHandler(string agent, IHttpAgentHandler handler)
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||
public abstract class BaseStreamHandler : BaseRequestHandler, IStreamedRequestHandler
|
||||
{
|
||||
public abstract byte[] Handle(string path, Stream request,
|
||||
OSHttpRequest httpRequest, OSHttpResponse httpResponse);
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse);
|
||||
|
||||
protected BaseStreamHandler(string httpMethod, string path) : base(httpMethod, path)
|
||||
{
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||
{
|
||||
private BinaryMethod m_method;
|
||||
|
||||
public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
public override byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
byte[] data = ReadFully(request);
|
||||
string param = GetParam(path);
|
||||
|
||||
@@ -77,8 +77,8 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||
/// true if the handler was successfully registered, false if a handler with the same name already existed.
|
||||
/// </returns>
|
||||
bool AddHTTPHandler(string methodName, GenericHTTPMethod handler);
|
||||
|
||||
bool AddPollServiceHTTPHandler(string methodName, GenericHTTPMethod handler, PollServiceEventArgs args);
|
||||
|
||||
bool AddPollServiceHTTPHandler(string methodName, PollServiceEventArgs args);
|
||||
|
||||
/// <summary>
|
||||
/// Adds a LLSD handler, yay.
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Specialized;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Web;
|
||||
|
||||
namespace OpenSim.Framework.Servers.HttpServer
|
||||
{
|
||||
public interface IOSHttpRequest
|
||||
{
|
||||
string[] AcceptTypes { get; }
|
||||
Encoding ContentEncoding { get; }
|
||||
long ContentLength { get; }
|
||||
long ContentLength64 { get; }
|
||||
string ContentType { get; }
|
||||
HttpCookieCollection Cookies { get; }
|
||||
bool HasEntityBody { get; }
|
||||
NameValueCollection Headers { get; }
|
||||
string HttpMethod { get; }
|
||||
Stream InputStream { get; }
|
||||
bool IsSecured { get; }
|
||||
bool KeepAlive { get; }
|
||||
NameValueCollection QueryString { get; }
|
||||
Hashtable Query { get; }
|
||||
string RawUrl { get; }
|
||||
IPEndPoint RemoteIPEndPoint { get; }
|
||||
Uri Url { get; }
|
||||
string UserAgent { get; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Specialized;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Web;
|
||||
|
||||
namespace OpenSim.Framework.Servers.HttpServer
|
||||
{
|
||||
public interface IOSHttpResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// Content type property.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Setting this property will also set IsContentTypeSet to
|
||||
/// true.
|
||||
/// </remarks>
|
||||
string ContentType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Boolean property indicating whether the content type
|
||||
/// property actively has been set.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// IsContentTypeSet will go away together with .NET base.
|
||||
/// </remarks>
|
||||
// public bool IsContentTypeSet
|
||||
// {
|
||||
// get { return _contentTypeSet; }
|
||||
// }
|
||||
// private bool _contentTypeSet;
|
||||
|
||||
/// <summary>
|
||||
/// Length of the body content; 0 if there is no body.
|
||||
/// </summary>
|
||||
long ContentLength { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Alias for ContentLength.
|
||||
/// </summary>
|
||||
long ContentLength64 { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Encoding of the body content.
|
||||
/// </summary>
|
||||
Encoding ContentEncoding { get; set; }
|
||||
|
||||
bool KeepAlive { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Get or set the keep alive timeout property (default is
|
||||
/// 20). Setting this to 0 also disables KeepAlive. Setting
|
||||
/// this to something else but 0 also enable KeepAlive.
|
||||
/// </summary>
|
||||
int KeepAliveTimeout { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Return the output stream feeding the body.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// On its way out...
|
||||
/// </remarks>
|
||||
Stream OutputStream { get; }
|
||||
|
||||
string ProtocolVersion { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Return the output stream feeding the body.
|
||||
/// </summary>
|
||||
Stream Body { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Set a redirct location.
|
||||
/// </summary>
|
||||
string RedirectLocation { set; }
|
||||
|
||||
/// <summary>
|
||||
/// Chunk transfers.
|
||||
/// </summary>
|
||||
bool SendChunked { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// HTTP status code.
|
||||
/// </summary>
|
||||
int StatusCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// HTTP status description.
|
||||
/// </summary>
|
||||
string StatusDescription { get; set; }
|
||||
|
||||
bool ReuseContext { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Add a header field and content to the response.
|
||||
/// </summary>
|
||||
/// <param name="key">string containing the header field
|
||||
/// name</param>
|
||||
/// <param name="value">string containing the header field
|
||||
/// value</param>
|
||||
void AddHeader(string key, string value);
|
||||
|
||||
/// <summary>
|
||||
/// Send the response back to the remote client
|
||||
/// </summary>
|
||||
void Send();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,13 +45,13 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||
public interface IStreamedRequestHandler : IRequestHandler
|
||||
{
|
||||
// Handle request stream, return byte array
|
||||
byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse);
|
||||
byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse);
|
||||
}
|
||||
|
||||
public interface IStreamHandler : IRequestHandler
|
||||
{
|
||||
// Handle request stream, return byte array
|
||||
void Handle(string path, Stream request, Stream response, OSHttpRequest httpReqbuest, OSHttpResponse httpResponse);
|
||||
void Handle(string path, Stream request, Stream response, IOSHttpRequest httpReqbuest, IOSHttpResponse httpResponse);
|
||||
}
|
||||
|
||||
public interface IGenericHTTPHandler : IRequestHandler
|
||||
|
||||
@@ -39,7 +39,7 @@ using log4net;
|
||||
|
||||
namespace OpenSim.Framework.Servers.HttpServer
|
||||
{
|
||||
public class OSHttpRequest
|
||||
public class OSHttpRequest : IOSHttpRequest
|
||||
{
|
||||
private static readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
@@ -174,7 +174,6 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||
}
|
||||
private Dictionary<string, object> _whiteboard = new Dictionary<string, object>();
|
||||
|
||||
|
||||
public OSHttpRequest() {}
|
||||
|
||||
public OSHttpRequest(IHttpClientContext context, IHttpRequest req)
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||
/// OSHttpResponse is the OpenSim representation of an HTTP
|
||||
/// response.
|
||||
/// </summary>
|
||||
public class OSHttpResponse
|
||||
public class OSHttpResponse : IOSHttpResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// Content type property.
|
||||
@@ -275,7 +275,6 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected IHttpResponse _httpResponse;
|
||||
private IHttpClientContext _httpClientContext;
|
||||
|
||||
@@ -331,4 +330,4 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -45,7 +45,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||
}
|
||||
|
||||
public void Handle(string path, Stream request, Stream responseStream,
|
||||
OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
TRequest deserial;
|
||||
using (XmlTextReader xmlReader = new XmlTextReader(request))
|
||||
|
||||
@@ -28,5 +28,5 @@
|
||||
namespace OpenSim.Framework.Servers.HttpServer
|
||||
{
|
||||
public delegate string RestMethod(string request, string path, string param,
|
||||
OSHttpRequest httpRequest, OSHttpResponse httpResponse);
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse);
|
||||
}
|
||||
|
||||
@@ -211,7 +211,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||
}
|
||||
|
||||
public void Handle(string path, Stream request, Stream responseStream,
|
||||
OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
RestSessionObject<TRequest> deserial = default(RestSessionObject<TRequest>);
|
||||
bool fail = false;
|
||||
@@ -270,7 +270,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||
}
|
||||
|
||||
public void Handle(string path, Stream request, Stream responseStream,
|
||||
OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
TRequest deserial = default(TRequest);
|
||||
bool fail = false;
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||
get { return m_restMethod; }
|
||||
}
|
||||
|
||||
public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
public override byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
Encoding encoding = Encoding.UTF8;
|
||||
StreamReader streamReader = new StreamReader(request, encoding);
|
||||
|
||||
@@ -42,15 +42,15 @@ namespace OpenSim.Framework.Statistics
|
||||
{
|
||||
private long abnormalClientThreadTerminations;
|
||||
|
||||
private long assetsInCache;
|
||||
private long texturesInCache;
|
||||
private long assetCacheMemoryUsage;
|
||||
private long textureCacheMemoryUsage;
|
||||
private TimeSpan assetRequestTimeAfterCacheMiss;
|
||||
private long blockedMissingTextureRequests;
|
||||
// private long assetsInCache;
|
||||
// private long texturesInCache;
|
||||
// private long assetCacheMemoryUsage;
|
||||
// private long textureCacheMemoryUsage;
|
||||
// private TimeSpan assetRequestTimeAfterCacheMiss;
|
||||
// private long blockedMissingTextureRequests;
|
||||
|
||||
private long assetServiceRequestFailures;
|
||||
private long inventoryServiceRetrievalFailures;
|
||||
// private long assetServiceRequestFailures;
|
||||
// private long inventoryServiceRetrievalFailures;
|
||||
|
||||
private volatile float timeDilation;
|
||||
private volatile float simFps;
|
||||
@@ -79,27 +79,27 @@ namespace OpenSim.Framework.Statistics
|
||||
/// </summary>
|
||||
public long AbnormalClientThreadTerminations { get { return abnormalClientThreadTerminations; } }
|
||||
|
||||
/// <summary>
|
||||
/// These statistics are being collected by push rather than pull. Pull would be simpler, but I had the
|
||||
/// notion of providing some flow statistics (which pull wouldn't give us). Though admittedly these
|
||||
/// haven't yet been implemented...
|
||||
/// </summary>
|
||||
public long AssetsInCache { get { return assetsInCache; } }
|
||||
|
||||
/// <value>
|
||||
/// Currently unused
|
||||
/// </value>
|
||||
public long TexturesInCache { get { return texturesInCache; } }
|
||||
|
||||
/// <value>
|
||||
/// Currently misleading since we can't currently subtract removed asset memory usage without a performance hit
|
||||
/// </value>
|
||||
public long AssetCacheMemoryUsage { get { return assetCacheMemoryUsage; } }
|
||||
|
||||
/// <value>
|
||||
/// Currently unused
|
||||
/// </value>
|
||||
public long TextureCacheMemoryUsage { get { return textureCacheMemoryUsage; } }
|
||||
// /// <summary>
|
||||
// /// These statistics are being collected by push rather than pull. Pull would be simpler, but I had the
|
||||
// /// notion of providing some flow statistics (which pull wouldn't give us). Though admittedly these
|
||||
// /// haven't yet been implemented...
|
||||
// /// </summary>
|
||||
// public long AssetsInCache { get { return assetsInCache; } }
|
||||
//
|
||||
// /// <value>
|
||||
// /// Currently unused
|
||||
// /// </value>
|
||||
// public long TexturesInCache { get { return texturesInCache; } }
|
||||
//
|
||||
// /// <value>
|
||||
// /// Currently misleading since we can't currently subtract removed asset memory usage without a performance hit
|
||||
// /// </value>
|
||||
// public long AssetCacheMemoryUsage { get { return assetCacheMemoryUsage; } }
|
||||
//
|
||||
// /// <value>
|
||||
// /// Currently unused
|
||||
// /// </value>
|
||||
// public long TextureCacheMemoryUsage { get { return textureCacheMemoryUsage; } }
|
||||
|
||||
public float TimeDilation { get { return timeDilation; } }
|
||||
public float SimFps { get { return simFps; } }
|
||||
@@ -123,32 +123,33 @@ namespace OpenSim.Framework.Statistics
|
||||
public float ActiveScripts { get { return activeScripts; } }
|
||||
public float ScriptLinesPerSecond { get { return scriptLinesPerSecond; } }
|
||||
|
||||
/// <summary>
|
||||
/// This is the time it took for the last asset request made in response to a cache miss.
|
||||
/// </summary>
|
||||
public TimeSpan AssetRequestTimeAfterCacheMiss { get { return assetRequestTimeAfterCacheMiss; } }
|
||||
|
||||
/// <summary>
|
||||
/// Number of persistent requests for missing textures we have started blocking from clients. To some extent
|
||||
/// this is just a temporary statistic to keep this problem in view - the root cause of this lies either
|
||||
/// in a mishandling of the reply protocol, related to avatar appearance or may even originate in graphics
|
||||
/// driver bugs on clients (though this seems less likely).
|
||||
/// </summary>
|
||||
public long BlockedMissingTextureRequests { get { return blockedMissingTextureRequests; } }
|
||||
|
||||
/// <summary>
|
||||
/// Record the number of times that an asset request has failed. Failures are effectively exceptions, such as
|
||||
/// request timeouts. If an asset service replies that a particular asset cannot be found, this is not counted
|
||||
/// as a failure
|
||||
/// </summary>
|
||||
public long AssetServiceRequestFailures { get { return assetServiceRequestFailures; } }
|
||||
// /// <summary>
|
||||
// /// This is the time it took for the last asset request made in response to a cache miss.
|
||||
// /// </summary>
|
||||
// public TimeSpan AssetRequestTimeAfterCacheMiss { get { return assetRequestTimeAfterCacheMiss; } }
|
||||
//
|
||||
// /// <summary>
|
||||
// /// Number of persistent requests for missing textures we have started blocking from clients. To some extent
|
||||
// /// this is just a temporary statistic to keep this problem in view - the root cause of this lies either
|
||||
// /// in a mishandling of the reply protocol, related to avatar appearance or may even originate in graphics
|
||||
// /// driver bugs on clients (though this seems less likely).
|
||||
// /// </summary>
|
||||
// public long BlockedMissingTextureRequests { get { return blockedMissingTextureRequests; } }
|
||||
//
|
||||
// /// <summary>
|
||||
// /// Record the number of times that an asset request has failed. Failures are effectively exceptions, such as
|
||||
// /// request timeouts. If an asset service replies that a particular asset cannot be found, this is not counted
|
||||
// /// as a failure
|
||||
// /// </summary>
|
||||
// public long AssetServiceRequestFailures { get { return assetServiceRequestFailures; } }
|
||||
|
||||
/// <summary>
|
||||
/// Number of known failures to retrieve avatar inventory from the inventory service. This does not
|
||||
/// cover situations where the inventory service accepts the request but never returns any data, since
|
||||
/// we do not yet timeout this situation.
|
||||
/// </summary>
|
||||
public long InventoryServiceRetrievalFailures { get { return inventoryServiceRetrievalFailures; } }
|
||||
/// <remarks>Commented out because we do not cache inventory at this point</remarks>
|
||||
// public long InventoryServiceRetrievalFailures { get { return inventoryServiceRetrievalFailures; } }
|
||||
|
||||
/// <summary>
|
||||
/// Retrieve the total frame time (in ms) of the last frame
|
||||
@@ -171,58 +172,58 @@ namespace OpenSim.Framework.Statistics
|
||||
abnormalClientThreadTerminations++;
|
||||
}
|
||||
|
||||
public void AddAsset(AssetBase asset)
|
||||
{
|
||||
assetsInCache++;
|
||||
//assetCacheMemoryUsage += asset.Data.Length;
|
||||
}
|
||||
|
||||
public void RemoveAsset(UUID uuid)
|
||||
{
|
||||
assetsInCache--;
|
||||
}
|
||||
// public void AddAsset(AssetBase asset)
|
||||
// {
|
||||
// assetsInCache++;
|
||||
// //assetCacheMemoryUsage += asset.Data.Length;
|
||||
// }
|
||||
//
|
||||
// public void RemoveAsset(UUID uuid)
|
||||
// {
|
||||
// assetsInCache--;
|
||||
// }
|
||||
//
|
||||
// public void AddTexture(AssetBase image)
|
||||
// {
|
||||
// if (image.Data != null)
|
||||
// {
|
||||
// texturesInCache++;
|
||||
//
|
||||
// // This could have been a pull stat, though there was originally a nebulous idea to measure flow rates
|
||||
// textureCacheMemoryUsage += image.Data.Length;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// /// <summary>
|
||||
// /// Signal that the asset cache has been cleared.
|
||||
// /// </summary>
|
||||
// public void ClearAssetCacheStatistics()
|
||||
// {
|
||||
// assetsInCache = 0;
|
||||
// assetCacheMemoryUsage = 0;
|
||||
// texturesInCache = 0;
|
||||
// textureCacheMemoryUsage = 0;
|
||||
// }
|
||||
//
|
||||
// public void AddAssetRequestTimeAfterCacheMiss(TimeSpan ts)
|
||||
// {
|
||||
// assetRequestTimeAfterCacheMiss = ts;
|
||||
// }
|
||||
//
|
||||
// public void AddBlockedMissingTextureRequest()
|
||||
// {
|
||||
// blockedMissingTextureRequests++;
|
||||
// }
|
||||
//
|
||||
// public void AddAssetServiceRequestFailure()
|
||||
// {
|
||||
// assetServiceRequestFailures++;
|
||||
// }
|
||||
|
||||
public void AddTexture(AssetBase image)
|
||||
{
|
||||
if (image.Data != null)
|
||||
{
|
||||
texturesInCache++;
|
||||
|
||||
// This could have been a pull stat, though there was originally a nebulous idea to measure flow rates
|
||||
textureCacheMemoryUsage += image.Data.Length;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Signal that the asset cache has been cleared.
|
||||
/// </summary>
|
||||
public void ClearAssetCacheStatistics()
|
||||
{
|
||||
assetsInCache = 0;
|
||||
assetCacheMemoryUsage = 0;
|
||||
texturesInCache = 0;
|
||||
textureCacheMemoryUsage = 0;
|
||||
}
|
||||
|
||||
public void AddAssetRequestTimeAfterCacheMiss(TimeSpan ts)
|
||||
{
|
||||
assetRequestTimeAfterCacheMiss = ts;
|
||||
}
|
||||
|
||||
public void AddBlockedMissingTextureRequest()
|
||||
{
|
||||
blockedMissingTextureRequests++;
|
||||
}
|
||||
|
||||
public void AddAssetServiceRequestFailure()
|
||||
{
|
||||
assetServiceRequestFailures++;
|
||||
}
|
||||
|
||||
public void AddInventoryServiceRetrievalFailure()
|
||||
{
|
||||
inventoryServiceRetrievalFailures++;
|
||||
}
|
||||
// public void AddInventoryServiceRetrievalFailure()
|
||||
// {
|
||||
// inventoryServiceRetrievalFailures++;
|
||||
// }
|
||||
|
||||
/// <summary>
|
||||
/// Register as a packet queue stats provider
|
||||
@@ -290,8 +291,8 @@ namespace OpenSim.Framework.Statistics
|
||||
public override string Report()
|
||||
{
|
||||
StringBuilder sb = new StringBuilder(Environment.NewLine);
|
||||
sb.Append("ASSET STATISTICS");
|
||||
sb.Append(Environment.NewLine);
|
||||
// sb.Append("ASSET STATISTICS");
|
||||
// sb.Append(Environment.NewLine);
|
||||
|
||||
/*
|
||||
sb.Append(
|
||||
@@ -307,7 +308,8 @@ Asset service request failures: {6}"+ Environment.NewLine,
|
||||
BlockedMissingTextureRequests,
|
||||
AssetServiceRequestFailures));
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
sb.Append(
|
||||
string.Format(
|
||||
@"Asset cache contains {0,6} assets
|
||||
@@ -318,7 +320,7 @@ Asset service request failures: {3}" + Environment.NewLine,
|
||||
assetRequestTimeAfterCacheMiss.Milliseconds / 1000.0,
|
||||
BlockedMissingTextureRequests,
|
||||
AssetServiceRequestFailures));
|
||||
|
||||
*/
|
||||
|
||||
sb.Append(Environment.NewLine);
|
||||
sb.Append("CONNECTION STATISTICS");
|
||||
@@ -328,13 +330,13 @@ Asset service request failures: {3}" + Environment.NewLine,
|
||||
"Abnormal client thread terminations: {0}" + Environment.NewLine,
|
||||
abnormalClientThreadTerminations));
|
||||
|
||||
sb.Append(Environment.NewLine);
|
||||
sb.Append("INVENTORY STATISTICS");
|
||||
sb.Append(Environment.NewLine);
|
||||
sb.Append(
|
||||
string.Format(
|
||||
"Initial inventory caching failures: {0}" + Environment.NewLine,
|
||||
InventoryServiceRetrievalFailures));
|
||||
// sb.Append(Environment.NewLine);
|
||||
// sb.Append("INVENTORY STATISTICS");
|
||||
// sb.Append(Environment.NewLine);
|
||||
// sb.Append(
|
||||
// string.Format(
|
||||
// "Initial inventory caching failures: {0}" + Environment.NewLine,
|
||||
// InventoryServiceRetrievalFailures));
|
||||
|
||||
sb.Append(Environment.NewLine);
|
||||
sb.Append("FRAME STATISTICS");
|
||||
@@ -390,17 +392,17 @@ Asset service request failures: {3}" + Environment.NewLine,
|
||||
public override string XReport(string uptime, string version)
|
||||
{
|
||||
OSDMap args = new OSDMap(30);
|
||||
args["AssetsInCache"] = OSD.FromString (String.Format ("{0:0.##}", AssetsInCache));
|
||||
args["TimeAfterCacheMiss"] = OSD.FromString (String.Format ("{0:0.##}",
|
||||
assetRequestTimeAfterCacheMiss.Milliseconds / 1000.0));
|
||||
args["BlockedMissingTextureRequests"] = OSD.FromString (String.Format ("{0:0.##}",
|
||||
BlockedMissingTextureRequests));
|
||||
args["AssetServiceRequestFailures"] = OSD.FromString (String.Format ("{0:0.##}",
|
||||
AssetServiceRequestFailures));
|
||||
args["abnormalClientThreadTerminations"] = OSD.FromString (String.Format ("{0:0.##}",
|
||||
abnormalClientThreadTerminations));
|
||||
args["InventoryServiceRetrievalFailures"] = OSD.FromString (String.Format ("{0:0.##}",
|
||||
InventoryServiceRetrievalFailures));
|
||||
// args["AssetsInCache"] = OSD.FromString (String.Format ("{0:0.##}", AssetsInCache));
|
||||
// args["TimeAfterCacheMiss"] = OSD.FromString (String.Format ("{0:0.##}",
|
||||
// assetRequestTimeAfterCacheMiss.Milliseconds / 1000.0));
|
||||
// args["BlockedMissingTextureRequests"] = OSD.FromString (String.Format ("{0:0.##}",
|
||||
// BlockedMissingTextureRequests));
|
||||
// args["AssetServiceRequestFailures"] = OSD.FromString (String.Format ("{0:0.##}",
|
||||
// AssetServiceRequestFailures));
|
||||
// args["abnormalClientThreadTerminations"] = OSD.FromString (String.Format ("{0:0.##}",
|
||||
// abnormalClientThreadTerminations));
|
||||
// args["InventoryServiceRetrievalFailures"] = OSD.FromString (String.Format ("{0:0.##}",
|
||||
// InventoryServiceRetrievalFailures));
|
||||
args["Dilatn"] = OSD.FromString (String.Format ("{0:0.##}", timeDilation));
|
||||
args["SimFPS"] = OSD.FromString (String.Format ("{0:0.##}", simFps));
|
||||
args["PhyFPS"] = OSD.FromString (String.Format ("{0:0.##}", physicsFps));
|
||||
|
||||
@@ -64,7 +64,8 @@ namespace OpenSim.Framework
|
||||
private UUID _permsGranter;
|
||||
private int _permsMask;
|
||||
private int _type = 0;
|
||||
private UUID _oldID = UUID.Zero;
|
||||
private UUID _oldID;
|
||||
private UUID _loadedID = UUID.Zero;
|
||||
|
||||
private bool _ownerChanged = false;
|
||||
|
||||
@@ -234,6 +235,15 @@ namespace OpenSim.Framework
|
||||
}
|
||||
}
|
||||
|
||||
public UUID LoadedItemID {
|
||||
get {
|
||||
return _loadedID;
|
||||
}
|
||||
set {
|
||||
_loadedID = value;
|
||||
}
|
||||
}
|
||||
|
||||
public UUID LastOwnerID {
|
||||
get {
|
||||
return _lastOwnerID;
|
||||
@@ -359,8 +369,8 @@ namespace OpenSim.Framework
|
||||
/// <param name="partID">The new part ID to which this item belongs</param>
|
||||
public void ResetIDs(UUID partID)
|
||||
{
|
||||
if (_oldID == UUID.Zero)
|
||||
_oldID = ItemID;
|
||||
LoadedItemID = OldItemID;
|
||||
OldItemID = ItemID;
|
||||
ItemID = UUID.Random();
|
||||
ParentPartID = partID;
|
||||
ParentID = partID;
|
||||
|
||||
@@ -58,10 +58,12 @@ namespace OpenSim.Framework
|
||||
/// <remarks>
|
||||
/// None is used to execute the method in the same thread that made the call. It should only be used by regression
|
||||
/// test code that relies on predictable event ordering.
|
||||
/// RegressionTest is used by regression tests. It fires the call synchronously and does not catch any exceptions.
|
||||
/// </remarks>
|
||||
public enum FireAndForgetMethod
|
||||
{
|
||||
None,
|
||||
RegressionTest,
|
||||
UnsafeQueueUserWorkItem,
|
||||
QueueUserWorkItem,
|
||||
BeginInvoke,
|
||||
@@ -1556,27 +1558,38 @@ namespace OpenSim.Framework
|
||||
|
||||
public static void FireAndForget(System.Threading.WaitCallback callback, object obj)
|
||||
{
|
||||
// When OpenSim interacts with a database or sends data over the wire, it must send this in en_US culture
|
||||
// so that we don't encounter problems where, for instance, data is saved with a culture that uses commas
|
||||
// for decimals places but is read by a culture that treats commas as number seperators.
|
||||
WaitCallback realCallback = delegate(object o)
|
||||
{
|
||||
Culture.SetCurrentCulture();
|
||||
WaitCallback realCallback;
|
||||
|
||||
try
|
||||
if (FireAndForgetMethod == FireAndForgetMethod.RegressionTest)
|
||||
{
|
||||
// If we're running regression tests, then we want any exceptions to rise up to the test code.
|
||||
realCallback = o => { Culture.SetCurrentCulture(); callback(o); };
|
||||
}
|
||||
else
|
||||
{
|
||||
// When OpenSim interacts with a database or sends data over the wire, it must send this in en_US culture
|
||||
// so that we don't encounter problems where, for instance, data is saved with a culture that uses commas
|
||||
// for decimals places but is read by a culture that treats commas as number seperators.
|
||||
realCallback = o =>
|
||||
{
|
||||
callback(o);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[UTIL]: Continuing after async_call_method thread terminated with exception {0}{1}",
|
||||
e.Message, e.StackTrace);
|
||||
}
|
||||
};
|
||||
Culture.SetCurrentCulture();
|
||||
|
||||
try
|
||||
{
|
||||
callback(o);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[UTIL]: Continuing after async_call_method thread terminated with exception {0}{1}",
|
||||
e.Message, e.StackTrace);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
switch (FireAndForgetMethod)
|
||||
{
|
||||
case FireAndForgetMethod.RegressionTest:
|
||||
case FireAndForgetMethod.None:
|
||||
realCallback.Invoke(obj);
|
||||
break;
|
||||
@@ -1663,13 +1676,14 @@ namespace OpenSim.Framework
|
||||
/// </summary>
|
||||
public static void PrintCallStack()
|
||||
{
|
||||
StackTrace stackTrace = new StackTrace(); // get call stack
|
||||
StackTrace stackTrace = new StackTrace(true); // get call stack
|
||||
StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames)
|
||||
|
||||
// write call stack method names
|
||||
foreach (StackFrame stackFrame in stackFrames)
|
||||
{
|
||||
m_log.Debug(stackFrame.GetMethod().DeclaringType + "." + stackFrame.GetMethod().Name); // write method name
|
||||
MethodBase mb = stackFrame.GetMethod();
|
||||
m_log.DebugFormat("{0}.{1}:{2}", mb.DeclaringType, mb.Name, stackFrame.GetFileLineNumber()); // write method name
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -107,15 +107,13 @@ namespace OpenSim
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.ErrorFormat("Master ini file {0} not found", masterFilePath);
|
||||
m_log.ErrorFormat("Master ini file {0} not found", Path.GetFullPath(masterFilePath));
|
||||
Environment.Exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
string iniFileName =
|
||||
startupConfig.GetString("inifile", "OpenSim.ini");
|
||||
string iniFileName = startupConfig.GetString("inifile", "OpenSim.ini");
|
||||
|
||||
if (IsUri(iniFileName))
|
||||
{
|
||||
@@ -131,8 +129,7 @@ namespace OpenSim
|
||||
if (!File.Exists(Application.iniFilePath))
|
||||
{
|
||||
iniFileName = "OpenSim.xml";
|
||||
Application.iniFilePath = Path.GetFullPath(
|
||||
Path.Combine(Util.configDir(), iniFileName));
|
||||
Application.iniFilePath = Path.GetFullPath(Path.Combine(Util.configDir(), iniFileName));
|
||||
}
|
||||
|
||||
if (File.Exists(Application.iniFilePath))
|
||||
@@ -142,15 +139,12 @@ namespace OpenSim
|
||||
}
|
||||
}
|
||||
|
||||
string iniDirName =
|
||||
startupConfig.GetString("inidirectory", "config");
|
||||
string iniDirPath =
|
||||
Path.Combine(Util.configDir(), iniDirName);
|
||||
string iniDirName = startupConfig.GetString("inidirectory", "config");
|
||||
string iniDirPath = Path.Combine(Util.configDir(), iniDirName);
|
||||
|
||||
if (Directory.Exists(iniDirPath))
|
||||
{
|
||||
m_log.InfoFormat("Searching folder {0} for config ini files",
|
||||
iniDirPath);
|
||||
m_log.InfoFormat("Searching folder {0} for config ini files", iniDirPath);
|
||||
|
||||
string[] fileEntries = Directory.GetFiles(iniDirName);
|
||||
foreach (string filePath in fileEntries)
|
||||
@@ -172,7 +166,6 @@ namespace OpenSim
|
||||
if (sources.Count == 0)
|
||||
{
|
||||
m_log.FatalFormat("[CONFIG]: Could not load any configuration");
|
||||
m_log.FatalFormat("[CONFIG]: Did you copy the OpenSimDefaults.ini.example file to OpenSimDefaults.ini?");
|
||||
Environment.Exit(1);
|
||||
}
|
||||
|
||||
|
||||
@@ -188,6 +188,18 @@ namespace OpenSim
|
||||
}
|
||||
}
|
||||
|
||||
// Hook up to the watchdog timer
|
||||
Watchdog.OnWatchdogTimeout += WatchdogTimeoutHandler;
|
||||
|
||||
PrintFileToConsole("startuplogo.txt");
|
||||
|
||||
// For now, start at the 'root' level by default
|
||||
if (m_sceneManager.Scenes.Count == 1) // If there is only one region, select it
|
||||
ChangeSelectedRegion("region",
|
||||
new string[] {"change", "region", m_sceneManager.Scenes[0].RegionInfo.RegionName});
|
||||
else
|
||||
ChangeSelectedRegion("region", new string[] {"change", "region", "root"});
|
||||
|
||||
//Run Startup Commands
|
||||
if (String.IsNullOrEmpty(m_startupCommandsFile))
|
||||
{
|
||||
@@ -206,18 +218,6 @@ namespace OpenSim
|
||||
m_scriptTimer.Interval = 1200*1000;
|
||||
m_scriptTimer.Elapsed += RunAutoTimerScript;
|
||||
}
|
||||
|
||||
// Hook up to the watchdog timer
|
||||
Watchdog.OnWatchdogTimeout += WatchdogTimeoutHandler;
|
||||
|
||||
PrintFileToConsole("startuplogo.txt");
|
||||
|
||||
// For now, start at the 'root' level by default
|
||||
if (m_sceneManager.Scenes.Count == 1) // If there is only one region, select it
|
||||
ChangeSelectedRegion("region",
|
||||
new string[] {"change", "region", m_sceneManager.Scenes[0].RegionInfo.RegionName});
|
||||
else
|
||||
ChangeSelectedRegion("region", new string[] {"change", "region", "root"});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -250,8 +250,10 @@ namespace OpenSim
|
||||
+ "If level <= 0 then no extra http logging is done.\n",
|
||||
Debug);
|
||||
|
||||
m_console.Commands.AddCommand("region", false, "debug teleport", "debug teleport", "Toggle teleport route debugging", Debug);
|
||||
|
||||
m_console.Commands.AddCommand("region", false, "debug scene",
|
||||
"debug scene <cripting> <collisions> <physics>",
|
||||
"debug scene <scripting> <collisions> <physics>",
|
||||
"Turn on scene debugging", Debug);
|
||||
|
||||
m_console.Commands.AddCommand("region", false, "change region",
|
||||
@@ -289,12 +291,16 @@ namespace OpenSim
|
||||
|
||||
m_console.Commands.AddCommand("region", false, "save oar",
|
||||
//"save oar [-v|--version=<N>] [-p|--profile=<url>] [<OAR path>]",
|
||||
"save oar [-p|--profile=<url>] [--noassets] [--perm=<permissions>] [<OAR path>]",
|
||||
"save oar [-h|--home=<url>] [--noassets] [--publish] [--perm=<permissions>] [<OAR path>]",
|
||||
"Save a region's data to an OAR archive.",
|
||||
// "-v|--version=<N> generates scene objects as per older versions of the serialization (e.g. -v=0)" + Environment.NewLine
|
||||
"-p|--profile=<url> adds the url of the profile service to the saved user information." + Environment.NewLine
|
||||
"-h|--home=<url> adds the url of the profile service to the saved user information." + Environment.NewLine
|
||||
+ "--noassets stops assets being saved to the OAR." + Environment.NewLine
|
||||
+ "--perm stops objects with insufficient permissions from being saved to the OAR." + Environment.NewLine
|
||||
+ "--publish saves an OAR stripped of owner and last owner information." + Environment.NewLine
|
||||
+ " on reload, the estate owner will be the owner of all objects" + Environment.NewLine
|
||||
+ " this is useful if you're making oars generally available that might be reloaded to the same grid from which you published" + Environment.NewLine
|
||||
+ " this option is EXPERIMENTAL" + Environment.NewLine
|
||||
+ "--perm=<permissions> stops objects with insufficient permissions from being saved to the OAR." + Environment.NewLine
|
||||
+ " <permissions> can contain one or more of these characters: \"C\" = Copy, \"T\" = Transfer" + Environment.NewLine
|
||||
+ "The OAR path must be a filesystem path."
|
||||
+ " If this is not given then the oar is saved to region.oar in the current directory.",
|
||||
@@ -796,6 +802,7 @@ namespace OpenSim
|
||||
break;
|
||||
|
||||
case "backup":
|
||||
MainConsole.Instance.Output("Triggering save of pending object updates to persistent store");
|
||||
m_sceneManager.BackupCurrentScene();
|
||||
break;
|
||||
|
||||
@@ -806,7 +813,7 @@ namespace OpenSim
|
||||
if (m_sceneManager.TryGetScene(regRemoveName, out removeScene))
|
||||
RemoveRegion(removeScene, false);
|
||||
else
|
||||
MainConsole.Instance.Output("no region with that name");
|
||||
MainConsole.Instance.Output("No region with that name");
|
||||
break;
|
||||
|
||||
case "delete-region":
|
||||
@@ -947,6 +954,21 @@ namespace OpenSim
|
||||
|
||||
break;
|
||||
|
||||
case "teleport":
|
||||
foreach(Scene s in m_sceneManager.Scenes)
|
||||
{
|
||||
if (s.DEBUG)
|
||||
{
|
||||
s.DEBUG = false;
|
||||
MainConsole.Instance.Output("Teleport debugging is disabled!");
|
||||
}
|
||||
else{
|
||||
s.DEBUG = true;
|
||||
MainConsole.Instance.Output("Teleport debugging is enabled!");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
MainConsole.Instance.Output("Unknown debug command");
|
||||
break;
|
||||
|
||||
@@ -46,7 +46,7 @@ using OpenSim.Region.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Region.Physics.Manager;
|
||||
using OpenSim.Server.Base;
|
||||
using OpenSim.Server.Base;
|
||||
using OpenSim.Services.Base;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using OpenSim.Services.UserAccountService;
|
||||
@@ -62,6 +62,7 @@ namespace OpenSim
|
||||
|
||||
// These are the names of the plugin-points extended by this
|
||||
// class during system startup.
|
||||
//
|
||||
|
||||
private const string PLUGIN_ASSET_CACHE = "/OpenSim/AssetCache";
|
||||
private const string PLUGIN_ASSET_SERVER_CLIENT = "/OpenSim/AssetClient";
|
||||
@@ -210,16 +211,16 @@ namespace OpenSim
|
||||
// Load the simulation data service
|
||||
IConfig simDataConfig = m_config.Source.Configs["SimulationDataStore"];
|
||||
if (simDataConfig == null)
|
||||
throw new Exception("Configuration file is missing the [SimulationDataStore] section");
|
||||
throw new Exception("Configuration file is missing the [SimulationDataStore] section. Have you copied OpenSim.ini.example to OpenSim.ini to reference config-include/ files?");
|
||||
string module = simDataConfig.GetString("LocalServiceModule", String.Empty);
|
||||
if (String.IsNullOrEmpty(module))
|
||||
throw new Exception("Configuration file is missing the LocalServiceModule parameter in the [SimulationDataStore] section");
|
||||
throw new Exception("Configuration file is missing the LocalServiceModule parameter in the [SimulationDataStore] section.");
|
||||
m_simulationDataService = ServerUtils.LoadPlugin<ISimulationDataService>(module, new object[] { m_config.Source });
|
||||
|
||||
// Load the estate data service
|
||||
IConfig estateDataConfig = m_config.Source.Configs["EstateDataStore"];
|
||||
if (estateDataConfig == null)
|
||||
throw new Exception("Configuration file is missing the [EstateDataStore] section");
|
||||
throw new Exception("Configuration file is missing the [EstateDataStore] section. Have you copied OpenSim.ini.example to OpenSim.ini to reference config-include/ files?");
|
||||
module = estateDataConfig.GetString("LocalServiceModule", String.Empty);
|
||||
if (String.IsNullOrEmpty(module))
|
||||
throw new Exception("Configuration file is missing the LocalServiceModule parameter in the [EstateDataStore] section");
|
||||
@@ -431,10 +432,14 @@ namespace OpenSim
|
||||
// TODO : Try setting resource for region xstats here on scene
|
||||
MainServer.Instance.AddStreamHandler(new Region.Framework.Scenes.RegionStatsHandler(regionInfo));
|
||||
|
||||
scene.loadAllLandObjectsFromStorage(regionInfo.originRegionID);
|
||||
scene.EventManager.TriggerParcelPrimCountUpdate();
|
||||
|
||||
if (scene.SnmpService != null)
|
||||
{
|
||||
scene.SnmpService.BootInfo("Grid Registration in progress", scene);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
scene.RegisterRegionWithGrid();
|
||||
@@ -459,9 +464,6 @@ namespace OpenSim
|
||||
scene.SnmpService.BootInfo("Grid Registration done", scene);
|
||||
}
|
||||
|
||||
scene.loadAllLandObjectsFromStorage(regionInfo.originRegionID);
|
||||
scene.EventManager.TriggerParcelPrimCountUpdate();
|
||||
|
||||
// We need to do this after we've initialized the
|
||||
// scripting engines.
|
||||
scene.CreateScriptInstances();
|
||||
@@ -801,7 +803,7 @@ namespace OpenSim
|
||||
public class SimStatusHandler : IStreamedRequestHandler
|
||||
{
|
||||
public byte[] Handle(string path, Stream request,
|
||||
OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
return Util.UTF8.GetBytes("OK");
|
||||
}
|
||||
@@ -838,7 +840,7 @@ namespace OpenSim
|
||||
}
|
||||
|
||||
public byte[] Handle(string path, Stream request,
|
||||
OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
return Util.UTF8.GetBytes(m_opensim.StatReport(httpRequest));
|
||||
}
|
||||
@@ -879,7 +881,7 @@ namespace OpenSim
|
||||
}
|
||||
|
||||
public byte[] Handle(string path, Stream request,
|
||||
OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
return Util.UTF8.GetBytes(m_opensim.StatReport(httpRequest));
|
||||
}
|
||||
|
||||
@@ -94,6 +94,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
private static readonly string m_notecardUpdatePath = "0004/";
|
||||
private static readonly string m_notecardTaskUpdatePath = "0005/";
|
||||
// private static readonly string m_fetchInventoryPath = "0006/";
|
||||
private static readonly string m_copyFromNotecardPath = "0007/";
|
||||
// private static readonly string m_remoteParcelRequestPath = "0009/";// This is in the LandManagementModule.
|
||||
|
||||
|
||||
@@ -180,6 +181,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
m_HostCapsObj.RegisterHandler("UpdateNotecardAgentInventory", req);
|
||||
m_HostCapsObj.RegisterHandler("UpdateScriptAgentInventory", req);
|
||||
m_HostCapsObj.RegisterHandler("UpdateScriptAgent", req);
|
||||
m_HostCapsObj.RegisterHandler("CopyInventoryFromNotecard", new RestStreamHandler("POST", capsBase + m_copyFromNotecardPath, CopyInventoryFromNotecard));
|
||||
|
||||
// As of RC 1.22.9 of the Linden client this is
|
||||
// supported
|
||||
@@ -223,7 +225,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
/// <param name="httpResponse">HTTP response header object</param>
|
||||
/// <returns></returns>
|
||||
public string SeedCapRequest(string request, string path, string param,
|
||||
OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
// m_log.Debug("[CAPS]: Seed Caps Request in region: " + m_regionName);
|
||||
|
||||
@@ -256,7 +258,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
/// <param name="httpResponse">HTTP response header object</param>
|
||||
/// <returns></returns>
|
||||
public string ScriptTaskInventory(string request, string path, string param,
|
||||
OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -366,7 +368,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
|
||||
if (mm != null)
|
||||
{
|
||||
if (!mm.UploadCovered(client, mm.UploadCharge))
|
||||
if (!mm.UploadCovered(client.AgentId, mm.UploadCharge))
|
||||
{
|
||||
if (client != null)
|
||||
client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false);
|
||||
@@ -420,7 +422,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
string assetType)
|
||||
{
|
||||
m_log.DebugFormat(
|
||||
"Uploaded asset {0} for inventory item {1}, inv type {2}, asset type {3}",
|
||||
"[BUNCH OF CAPS]: Uploaded asset {0} for inventory item {1}, inv type {2}, asset type {3}",
|
||||
assetID, inventoryItem, inventoryType, assetType);
|
||||
|
||||
sbyte assType = 0;
|
||||
@@ -623,7 +625,12 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
item.AssetType = assType;
|
||||
item.InvType = inType;
|
||||
item.Folder = parentFolder;
|
||||
item.CurrentPermissions = (uint)PermissionMask.All;
|
||||
|
||||
// If we set PermissionMask.All then when we rez the item the next permissions will replace the current
|
||||
// (owner) permissions. This becomes a problem if next permissions are changed.
|
||||
item.CurrentPermissions
|
||||
= (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer);
|
||||
|
||||
item.BasePermissions = (uint)PermissionMask.All;
|
||||
item.EveryOnePermissions = 0;
|
||||
item.NextPermissions = (uint)PermissionMask.All;
|
||||
@@ -685,7 +692,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
/// <param name="param"></param>
|
||||
/// <returns></returns>
|
||||
public string NoteCardAgentInventory(string request, string path, string param,
|
||||
OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
//m_log.Debug("[CAPS]: NoteCardAgentInventory Request in region: " + m_regionName + "\n" + request);
|
||||
//m_log.Debug("[CAPS]: NoteCardAgentInventory Request is: " + request);
|
||||
@@ -723,6 +730,75 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
|
||||
return LLSDHelpers.SerialiseLLSDReply(uploadResponse);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Called by the CopyInventoryFromNotecard caps handler.
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <param name="path"></param>
|
||||
/// <param name="param"></param>
|
||||
public string CopyInventoryFromNotecard(string request, string path, string param,
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
Hashtable response = new Hashtable();
|
||||
response["int_response_code"] = 404;
|
||||
response["content_type"] = "text/plain";
|
||||
response["keepalive"] = false;
|
||||
response["str_response_string"] = "";
|
||||
|
||||
try
|
||||
{
|
||||
OSDMap content = (OSDMap)OSDParser.DeserializeLLSDXml(request);
|
||||
UUID objectID = content["object-id"].AsUUID();
|
||||
UUID notecardID = content["notecard-id"].AsUUID();
|
||||
UUID folderID = content["folder-id"].AsUUID();
|
||||
UUID itemID = content["item-id"].AsUUID();
|
||||
|
||||
// m_log.InfoFormat("[CAPS]: CopyInventoryFromNotecard, FolderID:{0}, ItemID:{1}, NotecardID:{2}, ObjectID:{3}", folderID, itemID, notecardID, objectID);
|
||||
|
||||
if (objectID != UUID.Zero)
|
||||
{
|
||||
SceneObjectPart part = m_Scene.GetSceneObjectPart(objectID);
|
||||
if (part != null)
|
||||
{
|
||||
TaskInventoryItem taskItem = part.Inventory.GetInventoryItem(notecardID);
|
||||
if (!m_Scene.Permissions.CanCopyObjectInventory(notecardID, objectID, m_HostCapsObj.AgentID))
|
||||
{
|
||||
return LLSDHelpers.SerialiseLLSDReply(response);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
InventoryItemBase item = null;
|
||||
InventoryItemBase copyItem = null;
|
||||
IClientAPI client = null;
|
||||
|
||||
m_Scene.TryGetClient(m_HostCapsObj.AgentID, out client);
|
||||
item = m_Scene.InventoryService.GetItem(new InventoryItemBase(itemID));
|
||||
if (item != null)
|
||||
{
|
||||
copyItem = m_Scene.GiveInventoryItem(m_HostCapsObj.AgentID, item.Owner, itemID, folderID);
|
||||
if (copyItem != null && client != null)
|
||||
{
|
||||
m_log.InfoFormat("[CAPS]: CopyInventoryFromNotecard, ItemID:{0}, FolderID:{1}", copyItem.ID, copyItem.Folder);
|
||||
client.SendBulkUpdateInventory(copyItem);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.ErrorFormat("[CAPS]: CopyInventoryFromNotecard - Failed to retrieve item {0} from notecard {1}", itemID, notecardID);
|
||||
if (client != null)
|
||||
client.SendAlertMessage("Failed to retrieve item");
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[CAPS]: CopyInventoryFromNotecard : {0}", e.ToString());
|
||||
}
|
||||
|
||||
response["int_response_code"] = 200;
|
||||
return LLSDHelpers.SerialiseLLSDReply(response);
|
||||
}
|
||||
}
|
||||
|
||||
public class AssetUploader
|
||||
@@ -1018,4 +1094,4 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
fs.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -361,7 +361,6 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
// This will persist this beyond the expiry of the caps handlers
|
||||
MainServer.Instance.AddPollServiceHTTPHandler(
|
||||
capsBase + EventQueueGetUUID.ToString() + "/",
|
||||
EventQueuePoll,
|
||||
new PollServiceEventArgs(null, HasEvents, GetEvents, NoEvents, agentID));
|
||||
|
||||
Random rnd = new Random(Environment.TickCount);
|
||||
@@ -578,11 +577,6 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
// return responsedata;
|
||||
// }
|
||||
|
||||
public Hashtable EventQueuePoll(Hashtable request)
|
||||
{
|
||||
return new Hashtable();
|
||||
}
|
||||
|
||||
// public Hashtable EventQueuePath2(Hashtable request)
|
||||
// {
|
||||
// string capuuid = (string)request["uri"]; //path.Replace("/CAPS/EQG/","");
|
||||
|
||||
151
OpenSim/Region/ClientStack/Linden/Caps/FetchInventory2Module.cs
Normal file
151
OpenSim/Region/ClientStack/Linden/Caps/FetchInventory2Module.cs
Normal file
@@ -0,0 +1,151 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using Mono.Addins;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using Caps = OpenSim.Framework.Capabilities.Caps;
|
||||
using OpenSim.Capabilities.Handlers;
|
||||
|
||||
namespace OpenSim.Region.ClientStack.Linden
|
||||
{
|
||||
/// <summary>
|
||||
/// This module implements both WebFetchInventoryDescendents and FetchInventoryDescendents2 capabilities.
|
||||
/// </summary>
|
||||
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
|
||||
public class FetchInventory2Module : INonSharedRegionModule
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public bool Enabled { get; private set; }
|
||||
|
||||
private Scene m_scene;
|
||||
|
||||
private IInventoryService m_inventoryService;
|
||||
|
||||
private string m_fetchInventory2Url;
|
||||
|
||||
private FetchInventory2Handler m_fetchHandler;
|
||||
|
||||
#region ISharedRegionModule Members
|
||||
|
||||
public void Initialise(IConfigSource source)
|
||||
{
|
||||
IConfig config = source.Configs["ClientStack.LindenCaps"];
|
||||
if (config == null)
|
||||
return;
|
||||
|
||||
m_fetchInventory2Url = config.GetString("Cap_FetchInventory2", string.Empty);
|
||||
|
||||
if (m_fetchInventory2Url != string.Empty)
|
||||
Enabled = true;
|
||||
}
|
||||
|
||||
public void AddRegion(Scene s)
|
||||
{
|
||||
if (!Enabled)
|
||||
return;
|
||||
|
||||
m_scene = s;
|
||||
}
|
||||
|
||||
public void RemoveRegion(Scene s)
|
||||
{
|
||||
if (!Enabled)
|
||||
return;
|
||||
|
||||
m_scene.EventManager.OnRegisterCaps -= RegisterCaps;
|
||||
m_scene = null;
|
||||
}
|
||||
|
||||
public void RegionLoaded(Scene s)
|
||||
{
|
||||
if (!Enabled)
|
||||
return;
|
||||
|
||||
m_inventoryService = m_scene.InventoryService;
|
||||
|
||||
// We'll reuse the same handler for all requests.
|
||||
if (m_fetchInventory2Url == "localhost")
|
||||
m_fetchHandler = new FetchInventory2Handler(m_inventoryService);
|
||||
|
||||
m_scene.EventManager.OnRegisterCaps += RegisterCaps;
|
||||
}
|
||||
|
||||
public void PostInitialise() {}
|
||||
|
||||
public void Close() {}
|
||||
|
||||
public string Name { get { return "FetchInventory2Module"; } }
|
||||
|
||||
public Type ReplaceableInterface
|
||||
{
|
||||
get { return null; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private void RegisterCaps(UUID agentID, Caps caps)
|
||||
{
|
||||
RegisterFetchCap(agentID, caps, "FetchInventory2", m_fetchInventory2Url);
|
||||
}
|
||||
|
||||
private void RegisterFetchCap(UUID agentID, Caps caps, string capName, string url)
|
||||
{
|
||||
string capUrl;
|
||||
|
||||
if (url == "localhost")
|
||||
{
|
||||
capUrl = "/CAPS/" + UUID.Random();
|
||||
|
||||
IRequestHandler reqHandler
|
||||
= new RestStreamHandler("POST", capUrl, m_fetchHandler.FetchInventoryRequest);
|
||||
|
||||
caps.RegisterHandler(capName, reqHandler);
|
||||
}
|
||||
else
|
||||
{
|
||||
capUrl = url;
|
||||
|
||||
caps.RegisterHandler(capName, capUrl);
|
||||
}
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[FETCH INVENTORY2 MODULE]: Registered capability {0} at {1} in region {2} for {3}",
|
||||
// capName, capUrl, m_scene.RegionInfo.RegionName, agentID);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -50,8 +50,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
|
||||
public class NewFileAgentInventoryVariablePriceModule : INonSharedRegionModule
|
||||
{
|
||||
// private static readonly ILog m_log =
|
||||
// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private Scene m_scene;
|
||||
// private IAssetService m_assetService;
|
||||
@@ -147,7 +146,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
{
|
||||
if (m_scene.TryGetClient(agentID, out client))
|
||||
{
|
||||
if (!mm.UploadCovered(client, mm.UploadCharge))
|
||||
if (!mm.UploadCovered(client.AgentId, mm.UploadCharge))
|
||||
{
|
||||
if (client != null)
|
||||
client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false);
|
||||
@@ -210,6 +209,9 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType,
|
||||
string assetType,UUID AgentID)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[NEW FILE AGENT INVENTORY VARIABLE PRICE MODULE]: Upload complete for {0}", inventoryItem);
|
||||
|
||||
sbyte assType = 0;
|
||||
sbyte inType = 0;
|
||||
|
||||
@@ -259,13 +261,13 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
item.AssetType = assType;
|
||||
item.InvType = inType;
|
||||
item.Folder = parentFolder;
|
||||
item.CurrentPermissions = (uint)PermissionMask.All;
|
||||
item.CurrentPermissions
|
||||
= (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer);
|
||||
item.BasePermissions = (uint)PermissionMask.All;
|
||||
item.EveryOnePermissions = 0;
|
||||
item.NextPermissions = (uint)PermissionMask.All;
|
||||
item.CreationDate = Util.UnixTimeSinceEpoch();
|
||||
m_scene.AddInventoryItem(item);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -339,7 +339,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
m_scene.AddSceneObject(grp);
|
||||
grp.AbsolutePosition = obj.Position;
|
||||
}
|
||||
|
||||
|
||||
allparts[i] = grp;
|
||||
}
|
||||
|
||||
|
||||
@@ -104,7 +104,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
"UploadBakedTexture",
|
||||
new RestStreamHandler(
|
||||
"POST",
|
||||
"/CAPS/" + m_uploadBakedTexturePath,
|
||||
"/CAPS/" + caps.CapsObjectPath + m_uploadBakedTexturePath,
|
||||
new UploadBakedTextureHandler(
|
||||
caps, m_scene.AssetService, m_persistBakedTextures).UploadBakedTexture));
|
||||
}
|
||||
|
||||
@@ -45,6 +45,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
private const int IMAGE_PACKET_SIZE = 1000;
|
||||
private const int FIRST_PACKET_SIZE = 600;
|
||||
|
||||
/// <summary>
|
||||
/// If we've requested an asset but not received it in this ticks timeframe, then allow a duplicate
|
||||
/// request from the client to trigger a fresh asset request.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// There are 10,000 ticks in a millisecond
|
||||
/// </remarks>
|
||||
private const int ASSET_REQUEST_TIMEOUT = 100000000;
|
||||
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public uint LastSequence;
|
||||
@@ -56,9 +65,23 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
public IAssetService AssetService;
|
||||
public UUID AgentID;
|
||||
public IInventoryAccessModule InventoryAccessModule;
|
||||
public OpenJPEG.J2KLayerInfo[] Layers;
|
||||
public bool IsDecoded;
|
||||
public bool HasAsset;
|
||||
private OpenJPEG.J2KLayerInfo[] m_layers;
|
||||
|
||||
/// <summary>
|
||||
/// Has this request decoded the asset data?
|
||||
/// </summary>
|
||||
public bool IsDecoded { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Has this request received the required asset data?
|
||||
/// </summary>
|
||||
public bool HasAsset { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Time in milliseconds at which the asset was requested.
|
||||
/// </summary>
|
||||
public long AssetRequestTime { get; private set; }
|
||||
|
||||
public C5.IPriorityQueueHandle<J2KImage> PriorityQueueHandle;
|
||||
|
||||
private uint m_currentPacket;
|
||||
@@ -82,7 +105,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
/// <param name="packetsToSend">Maximum number of packets to send during this call</param>
|
||||
/// <param name="packetsSent">Number of packets sent during this call</param>
|
||||
/// <returns>True if the transfer completes at the current discard level, otherwise false</returns>
|
||||
public bool SendPackets(LLClientView client, int packetsToSend, out int packetsSent)
|
||||
public bool SendPackets(IClientAPI client, int packetsToSend, out int packetsSent)
|
||||
{
|
||||
packetsSent = 0;
|
||||
|
||||
@@ -102,7 +125,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
{
|
||||
m_currentPacket = 2;
|
||||
}
|
||||
|
||||
|
||||
while (sendMore && packetsSent < packetsToSend && m_currentPacket <= m_stopPacket)
|
||||
{
|
||||
sendMore = SendPacket(client);
|
||||
@@ -114,17 +137,24 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
return (m_currentPacket > m_stopPacket);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This is where we decide what we need to update
|
||||
/// and assign the real discardLevel and packetNumber
|
||||
/// assuming of course that the connected client might be bonkers
|
||||
/// </summary>
|
||||
public void RunUpdate()
|
||||
{
|
||||
//This is where we decide what we need to update
|
||||
//and assign the real discardLevel and packetNumber
|
||||
//assuming of course that the connected client might be bonkers
|
||||
|
||||
if (!HasAsset)
|
||||
{
|
||||
if (!m_assetRequested)
|
||||
if (!m_assetRequested || DateTime.UtcNow.Ticks > AssetRequestTime + ASSET_REQUEST_TIMEOUT)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[J2KIMAGE]: Requesting asset {0} from request in packet {1}, already requested? {2}, due to timeout? {3}",
|
||||
// TextureID, LastSequence, m_assetRequested, DateTime.UtcNow.Ticks > AssetRequestTime + ASSET_REQUEST_TIMEOUT);
|
||||
|
||||
m_assetRequested = true;
|
||||
AssetRequestTime = DateTime.UtcNow.Ticks;
|
||||
|
||||
AssetService.Get(TextureID.ToString(), this, AssetReceived);
|
||||
}
|
||||
}
|
||||
@@ -137,6 +167,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
{
|
||||
//Request decode
|
||||
m_decodeRequested = true;
|
||||
|
||||
// m_log.DebugFormat("[J2KIMAGE]: Requesting decode of asset {0}", TextureID);
|
||||
|
||||
// Do we have a jpeg decoder?
|
||||
if (J2KDecoder != null)
|
||||
{
|
||||
@@ -149,7 +182,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
// Send it off to the jpeg decoder
|
||||
J2KDecoder.BeginDecode(TextureID, m_asset, J2KDecodedCallback);
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -170,14 +202,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
if (DiscardLevel >= 0 || m_stopPacket == 0)
|
||||
{
|
||||
// This shouldn't happen, but if it does, we really can't proceed
|
||||
if (Layers == null)
|
||||
if (m_layers == null)
|
||||
{
|
||||
m_log.Warn("[J2KIMAGE]: RunUpdate() called with missing Layers. Canceling texture transfer");
|
||||
m_currentPacket = m_stopPacket;
|
||||
return;
|
||||
}
|
||||
|
||||
int maxDiscardLevel = Math.Max(0, Layers.Length - 1);
|
||||
int maxDiscardLevel = Math.Max(0, m_layers.Length - 1);
|
||||
|
||||
// Treat initial texture downloads with a DiscardLevel of -1 a request for the highest DiscardLevel
|
||||
if (DiscardLevel < 0 && m_stopPacket == 0)
|
||||
@@ -187,9 +219,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
DiscardLevel = (sbyte)Math.Min(DiscardLevel, maxDiscardLevel);
|
||||
|
||||
//Calculate the m_stopPacket
|
||||
if (Layers.Length > 0)
|
||||
if (m_layers.Length > 0)
|
||||
{
|
||||
m_stopPacket = (uint)GetPacketForBytePosition(Layers[(Layers.Length - 1) - DiscardLevel].End);
|
||||
m_stopPacket = (uint)GetPacketForBytePosition(m_layers[(m_layers.Length - 1) - DiscardLevel].End);
|
||||
//I don't know why, but the viewer seems to expect the final packet if the file
|
||||
//is just one packet bigger.
|
||||
if (TexturePacketCount() == m_stopPacket + 1)
|
||||
@@ -203,7 +235,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
}
|
||||
|
||||
//Give them at least two packets, to play nice with some broken viewers (SL also behaves this way)
|
||||
if (m_stopPacket == 1 && Layers[0].End > FIRST_PACKET_SIZE) m_stopPacket++;
|
||||
if (m_stopPacket == 1 && m_layers[0].End > FIRST_PACKET_SIZE) m_stopPacket++;
|
||||
|
||||
m_currentPacket = StartPacket;
|
||||
}
|
||||
@@ -211,7 +243,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
}
|
||||
}
|
||||
|
||||
private bool SendFirstPacket(LLClientView client)
|
||||
private bool SendFirstPacket(IClientAPI client)
|
||||
{
|
||||
if (client == null)
|
||||
return false;
|
||||
@@ -246,7 +278,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
return false;
|
||||
}
|
||||
|
||||
private bool SendPacket(LLClientView client)
|
||||
private bool SendPacket(IClientAPI client)
|
||||
{
|
||||
if (client == null)
|
||||
return false;
|
||||
@@ -331,20 +363,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
{
|
||||
if (m_currentPacket == 0)
|
||||
return 0;
|
||||
|
||||
if (m_currentPacket == 1)
|
||||
return FIRST_PACKET_SIZE;
|
||||
|
||||
int result = FIRST_PACKET_SIZE + ((int)m_currentPacket - 2) * IMAGE_PACKET_SIZE;
|
||||
|
||||
if (result < 0)
|
||||
{
|
||||
result = FIRST_PACKET_SIZE;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private void J2KDecodedCallback(UUID AssetId, OpenJPEG.J2KLayerInfo[] layers)
|
||||
{
|
||||
Layers = layers;
|
||||
m_layers = layers;
|
||||
IsDecoded = true;
|
||||
RunUpdate();
|
||||
}
|
||||
@@ -375,9 +408,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
private void AssetReceived(string id, Object sender, AssetBase asset)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[J2KIMAGE]: Received asset {0} ({1} bytes)", id, asset != null ? asset.Data.Length.ToString() : "n/a");
|
||||
|
||||
UUID assetID = UUID.Zero;
|
||||
if (asset != null)
|
||||
{
|
||||
assetID = asset.FullID;
|
||||
}
|
||||
else if ((InventoryAccessModule != null) && (sender != InventoryAccessModule))
|
||||
{
|
||||
// Unfortunately we need this here, there's no other way.
|
||||
@@ -388,14 +426,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
string assetServerURL = string.Empty;
|
||||
if (InventoryAccessModule.IsForeignUser(AgentID, out assetServerURL))
|
||||
{
|
||||
m_log.DebugFormat("[J2KIMAGE]: texture {0} not found in local asset storage. Trying user's storage.", id);
|
||||
AssetService.Get(assetServerURL + "/" + id, InventoryAccessModule, AssetReceived);
|
||||
if (!assetServerURL.EndsWith("/") && !assetServerURL.EndsWith("="))
|
||||
assetServerURL = assetServerURL + "/";
|
||||
|
||||
m_log.DebugFormat("[J2KIMAGE]: texture {0} not found in local asset storage. Trying user's storage.", assetServerURL + id);
|
||||
AssetService.Get(assetServerURL + id, InventoryAccessModule, AssetReceived);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
AssetDataCallback(assetID, asset);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -140,6 +140,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
public event RequestMapName OnMapNameRequest;
|
||||
public event TeleportLocationRequest OnTeleportLocationRequest;
|
||||
public event TeleportLandmarkRequest OnTeleportLandmarkRequest;
|
||||
public event TeleportCancel OnTeleportCancel;
|
||||
public event DisconnectUser OnDisconnectUser;
|
||||
public event RequestAvatarProperties OnRequestAvatarProperties;
|
||||
public event SetAlwaysRun OnSetAlwaysRun;
|
||||
@@ -219,6 +220,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
public event BakeTerrain OnBakeTerrain;
|
||||
public event RequestTerrain OnUploadTerrain;
|
||||
public event EstateChangeInfo OnEstateChangeInfo;
|
||||
public event EstateManageTelehub OnEstateManageTelehub;
|
||||
public event EstateRestartSimRequest OnEstateRestartSimRequest;
|
||||
public event EstateChangeCovenantRequest OnEstateChangeCovenantRequest;
|
||||
public event UpdateEstateAccessDeltaRequest OnUpdateEstateAccessDeltaRequest;
|
||||
@@ -305,6 +307,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
protected static Dictionary<PacketType, PacketMethod> PacketHandlers = new Dictionary<PacketType, PacketMethod>(); //Global/static handlers for all clients
|
||||
|
||||
/// <summary>
|
||||
/// Handles UDP texture download.
|
||||
/// </summary>
|
||||
public LLImageManager ImageManager { get; private set; }
|
||||
|
||||
private readonly LLUDPServer m_udpServer;
|
||||
private readonly LLUDPClient m_udpClient;
|
||||
private readonly UUID m_sessionId;
|
||||
@@ -350,7 +357,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>();
|
||||
protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers
|
||||
protected Scene m_scene;
|
||||
protected LLImageManager m_imageManager;
|
||||
protected string m_firstName;
|
||||
protected string m_lastName;
|
||||
protected Thread m_clientThread;
|
||||
@@ -390,6 +396,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
}
|
||||
}
|
||||
public UUID AgentId { get { return m_agentId; } }
|
||||
public ISceneAgent SceneAgent { get; private set; }
|
||||
public UUID ActiveGroupId { get { return m_activeGroupID; } }
|
||||
public string ActiveGroupName { get { return m_activeGroupName; } }
|
||||
public ulong ActiveGroupPowers { get { return m_activeGroupPowers; } }
|
||||
@@ -450,6 +457,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
public LLClientView(EndPoint remoteEP, Scene scene, LLUDPServer udpServer, LLUDPClient udpClient, AuthenticateResponse sessionInfo,
|
||||
UUID agentId, UUID sessionId, uint circuitCode)
|
||||
{
|
||||
// DebugPacketLevel = 1;
|
||||
|
||||
RegisterInterface<IClientIM>(this);
|
||||
RegisterInterface<IClientChat>(this);
|
||||
RegisterInterface<IClientIPEndpoint>(this);
|
||||
@@ -466,7 +475,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
m_assetService = m_scene.RequestModuleInterface<IAssetService>();
|
||||
m_GroupsModule = scene.RequestModuleInterface<IGroupsModule>();
|
||||
m_imageManager = new LLImageManager(this, m_assetService, Scene.RequestModuleInterface<IJ2KDecoder>());
|
||||
ImageManager = new LLImageManager(this, m_assetService, Scene.RequestModuleInterface<IJ2KDecoder>());
|
||||
m_channelVersion = Util.StringToBytes256(scene.GetSimulatorVersion());
|
||||
m_agentId = agentId;
|
||||
m_sessionId = sessionId;
|
||||
@@ -518,8 +527,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
IsActive = false;
|
||||
|
||||
// Shutdown the image manager
|
||||
if (m_imageManager != null)
|
||||
m_imageManager.Close();
|
||||
ImageManager.Close();
|
||||
|
||||
// Fire the callback for this connection closing
|
||||
if (OnConnectionClosed != null)
|
||||
@@ -531,6 +539,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
// Remove ourselves from the scene
|
||||
m_scene.RemoveClient(AgentId, true);
|
||||
SceneAgent = null;
|
||||
|
||||
// We can't reach into other scenes and close the connection
|
||||
// We need to do this over grid communications
|
||||
@@ -546,7 +555,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
public void Kick(string message)
|
||||
{
|
||||
if (!ChildAgentStatus())
|
||||
if (!SceneAgent.IsChildAgent)
|
||||
{
|
||||
KickUserPacket kupack = (KickUserPacket)PacketPool.Instance.GetPacket(PacketType.KickUser);
|
||||
kupack.UserInfo.AgentID = AgentId;
|
||||
@@ -595,8 +604,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
/// <summary>
|
||||
/// Add a handler for the given packet type.
|
||||
/// </summary>
|
||||
/// <remarks>The packet is handled on its own thread. If packets must be handled in the order in which thye
|
||||
/// are received then please us ethe synchronous version of this method.</remarks>
|
||||
/// <remarks>
|
||||
/// The packet is handled on its own thread. If packets must be handled in the order in which they
|
||||
/// are received then please use the synchronous version of this method.
|
||||
/// </remarks>
|
||||
/// <param name="packetType"></param>
|
||||
/// <param name="handler"></param>
|
||||
/// <returns>true if the handler was added. This is currently always the case.</returns>
|
||||
@@ -710,7 +721,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
public virtual void Start()
|
||||
{
|
||||
m_scene.AddNewClient(this, PresenceType.User);
|
||||
SceneAgent = m_scene.AddNewClient(this, PresenceType.User);
|
||||
|
||||
RefreshGroupMembership();
|
||||
}
|
||||
@@ -775,9 +786,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
OutPacket(handshake, ThrottleOutPacketType.Task);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look)
|
||||
{
|
||||
AgentMovementCompletePacket mov = (AgentMovementCompletePacket)PacketPool.Instance.GetPacket(PacketType.AgentMovementComplete);
|
||||
@@ -2463,7 +2471,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
/// <param name="Message"></param>
|
||||
public void SendBlueBoxMessage(UUID FromAvatarID, String FromAvatarName, String Message)
|
||||
{
|
||||
if (!ChildAgentStatus())
|
||||
if (!SceneAgent.IsChildAgent)
|
||||
SendInstantMessage(new GridInstantMessage(null, FromAvatarID, FromAvatarName, AgentId, 1, Message, false, new Vector3()));
|
||||
|
||||
//SendInstantMessage(FromAvatarID, fromSessionID, Message, AgentId, SessionId, FromAvatarName, (byte)21,(uint) Util.UnixTimeSinceEpoch());
|
||||
@@ -2758,7 +2766,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
reply.Data.ParcelID = parcelID;
|
||||
reply.Data.OwnerID = land.OwnerID;
|
||||
reply.Data.Name = Utils.StringToBytes(land.Name);
|
||||
reply.Data.Desc = Utils.StringToBytes(land.Description);
|
||||
if (land != null && land.Description != null && land.Description != String.Empty)
|
||||
reply.Data.Desc = Utils.StringToBytes(land.Description.Substring(0, land.Description.Length > 254 ? 254: land.Description.Length));
|
||||
else
|
||||
reply.Data.Desc = new Byte[0];
|
||||
reply.Data.ActualArea = land.Area;
|
||||
reply.Data.BillableArea = land.Area; // TODO: what is this?
|
||||
|
||||
@@ -3487,6 +3498,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
public void SendAppearance(UUID agentID, byte[] visualParams, byte[] textureEntry)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[LLCLIENTVIEW]: Sending avatar appearance for {0} with {1} bytes to {2} {3}",
|
||||
// agentID, textureEntry.Length, Name, AgentId);
|
||||
|
||||
AvatarAppearancePacket avp = (AvatarAppearancePacket)PacketPool.Instance.GetPacket(PacketType.AvatarAppearance);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218];
|
||||
@@ -3508,7 +3523,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
public void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs)
|
||||
{
|
||||
//m_log.DebugFormat("[CLIENT]: Sending animations to {0}", Name);
|
||||
// m_log.DebugFormat("[LLCLIENTVIEW]: Sending animations for {0} to {1}", sourceAgentId, Name);
|
||||
|
||||
AvatarAnimationPacket ani = (AvatarAnimationPacket)PacketPool.Instance.GetPacket(PacketType.AvatarAnimation);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
@@ -3543,6 +3558,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
/// </summary>
|
||||
public void SendAvatarDataImmediate(ISceneEntity avatar)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[LLCLIENTVIEW]: Sending immediate object update for avatar {0} {1} to {2} {3}",
|
||||
// avatar.Name, avatar.UUID, Name, AgentId);
|
||||
|
||||
ScenePresence presence = avatar as ScenePresence;
|
||||
if (presence == null)
|
||||
return;
|
||||
@@ -3552,7 +3571,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
objupdate.RegionData.RegionHandle = presence.RegionHandle;
|
||||
objupdate.RegionData.TimeDilation = ushort.MaxValue;
|
||||
|
||||
|
||||
objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
|
||||
objupdate.ObjectData[0] = CreateAvatarUpdateBlock(presence);
|
||||
|
||||
@@ -3977,15 +3996,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
}
|
||||
|
||||
if ((categories & ThrottleOutPacketTypeFlags.Texture) != 0)
|
||||
{
|
||||
ProcessTextureRequests();
|
||||
}
|
||||
}
|
||||
|
||||
void ProcessTextureRequests()
|
||||
{
|
||||
if (m_imageManager != null)
|
||||
m_imageManager.ProcessImageQueue(m_udpServer.TextureSendLimit);
|
||||
ImageManager.ProcessImageQueue(m_udpServer.TextureSendLimit);
|
||||
}
|
||||
|
||||
public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID)
|
||||
@@ -4486,7 +4497,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
EstateCovenantReplyPacket einfopack = new EstateCovenantReplyPacket();
|
||||
EstateCovenantReplyPacket.DataBlock edata = new EstateCovenantReplyPacket.DataBlock();
|
||||
edata.CovenantID = covenant;
|
||||
edata.CovenantTimestamp = 0;
|
||||
edata.CovenantTimestamp = (uint) m_scene.RegionInfo.RegionSettings.CovenantChangedDateTime;
|
||||
edata.EstateOwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
|
||||
edata.EstateName = Utils.StringToBytes(m_scene.RegionInfo.EstateSettings.EstateName);
|
||||
einfopack.Data = edata;
|
||||
@@ -4494,8 +4505,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
}
|
||||
|
||||
public void SendDetailedEstateData(
|
||||
UUID invoice, string estateName, uint estateID, uint parentEstate, uint estateFlags, uint sunPosition,
|
||||
UUID covenant, string abuseEmail, UUID estateOwner)
|
||||
UUID invoice, string estateName, uint estateID, uint parentEstate, uint estateFlags, uint sunPosition,
|
||||
UUID covenant, uint covenantChanged, string abuseEmail, UUID estateOwner)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[LLCLIENTVIEW]: Sending detailed estate data to {0} with covenant asset id {1}", Name, covenant);
|
||||
@@ -4520,7 +4531,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
returnblock[4].Parameter = Utils.StringToBytes(sunPosition.ToString());
|
||||
returnblock[5].Parameter = Utils.StringToBytes(parentEstate.ToString());
|
||||
returnblock[6].Parameter = Utils.StringToBytes(covenant.ToString());
|
||||
returnblock[7].Parameter = Utils.StringToBytes("1160895077"); // what is this?
|
||||
returnblock[7].Parameter = Utils.StringToBytes(covenantChanged.ToString());
|
||||
returnblock[8].Parameter = Utils.StringToBytes("1"); // what is this?
|
||||
returnblock[9].Parameter = Utils.StringToBytes(abuseEmail);
|
||||
|
||||
@@ -4530,6 +4541,23 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
OutPacket(packet, ThrottleOutPacketType.Task);
|
||||
}
|
||||
|
||||
public void SendTelehubInfo(UUID ObjectID, string ObjectName, Vector3 ObjectPos, Quaternion ObjectRot, List<Vector3> SpawnPoint)
|
||||
{
|
||||
TelehubInfoPacket packet = (TelehubInfoPacket)PacketPool.Instance.GetPacket(PacketType.TelehubInfo);
|
||||
packet.TelehubBlock.ObjectID = ObjectID;
|
||||
packet.TelehubBlock.ObjectName = Utils.StringToBytes(ObjectName);
|
||||
packet.TelehubBlock.TelehubPos = ObjectPos;
|
||||
packet.TelehubBlock.TelehubRot = ObjectRot;
|
||||
|
||||
packet.SpawnPointBlock = new TelehubInfoPacket.SpawnPointBlockBlock[SpawnPoint.Count];
|
||||
for (int n = 0; n < SpawnPoint.Count; n++)
|
||||
{
|
||||
packet.SpawnPointBlock[n] = new TelehubInfoPacket.SpawnPointBlockBlock{SpawnPointPos = SpawnPoint[n]};
|
||||
}
|
||||
|
||||
OutPacket(packet, ThrottleOutPacketType.Task);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Land Data Sending Methods
|
||||
@@ -4605,7 +4633,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
if (landData.SimwideArea > 0)
|
||||
{
|
||||
int simulatorCapacity = (int)((double)(landData.SimwideArea * m_scene.RegionInfo.ObjectCapacity) * m_scene.RegionInfo.RegionSettings.ObjectBonus) / 65536;
|
||||
int simulatorCapacity = (int)((long)landData.SimwideArea * (long)m_scene.RegionInfo.ObjectCapacity * (long)m_scene.RegionInfo.RegionSettings.ObjectBonus / 65536L);
|
||||
// Never report more than sim total capacity
|
||||
if (simulatorCapacity > m_scene.RegionInfo.ObjectCapacity)
|
||||
simulatorCapacity = m_scene.RegionInfo.ObjectCapacity;
|
||||
@@ -4656,7 +4684,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
}
|
||||
}
|
||||
|
||||
public void SendLandAccessListData(List<UUID> avatars, uint accessFlag, int localLandID)
|
||||
public void SendLandAccessListData(List<LandAccessEntry> accessList, uint accessFlag, int localLandID)
|
||||
{
|
||||
ParcelAccessListReplyPacket replyPacket = (ParcelAccessListReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelAccessListReply);
|
||||
replyPacket.Data.AgentID = AgentId;
|
||||
@@ -4665,12 +4693,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
replyPacket.Data.SequenceID = 0;
|
||||
|
||||
List<ParcelAccessListReplyPacket.ListBlock> list = new List<ParcelAccessListReplyPacket.ListBlock>();
|
||||
foreach (UUID avatar in avatars)
|
||||
foreach (LandAccessEntry entry in accessList)
|
||||
{
|
||||
ParcelAccessListReplyPacket.ListBlock block = new ParcelAccessListReplyPacket.ListBlock();
|
||||
block.Flags = accessFlag;
|
||||
block.ID = avatar;
|
||||
block.Time = 0;
|
||||
block.ID = entry.AgentID;
|
||||
block.Time = entry.Expires;
|
||||
list.Add(block);
|
||||
}
|
||||
|
||||
@@ -4946,8 +4974,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
update.Scale = new Vector3(0.45f, 0.6f, 1.9f);
|
||||
update.Text = Utils.EmptyBytes;
|
||||
update.TextColor = new byte[4];
|
||||
|
||||
// Don't send texture anim for avatars - this has no meaning for them.
|
||||
update.TextureAnim = Utils.EmptyBytes;
|
||||
update.TextureEntry = (data.Appearance.Texture != null) ? data.Appearance.Texture.GetBytes() : Utils.EmptyBytes;
|
||||
|
||||
// Don't send texture entry for avatars here - this is accomplished via the AvatarAppearance packet
|
||||
update.TextureEntry = Utils.EmptyBytes;
|
||||
// update.TextureEntry = (data.Appearance.Texture != null) ? data.Appearance.Texture.GetBytes() : Utils.EmptyBytes;
|
||||
|
||||
update.UpdateFlags = (uint)(
|
||||
PrimFlags.Physics | PrimFlags.ObjectModify | PrimFlags.ObjectCopy | PrimFlags.ObjectAnyOwner |
|
||||
PrimFlags.ObjectYouOwner | PrimFlags.ObjectMove | PrimFlags.InventoryEmpty | PrimFlags.ObjectTransfer |
|
||||
@@ -5110,14 +5144,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This is a utility method used by single states to not duplicate kicks and blue card of death messages.
|
||||
/// </summary>
|
||||
public bool ChildAgentStatus()
|
||||
{
|
||||
return m_scene.PresenceChildStatus(AgentId);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
@@ -5142,7 +5168,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
AddLocalPacketHandler(PacketType.ImprovedInstantMessage, HandlerImprovedInstantMessage, false);
|
||||
AddLocalPacketHandler(PacketType.AcceptFriendship, HandlerAcceptFriendship);
|
||||
AddLocalPacketHandler(PacketType.DeclineFriendship, HandlerDeclineFriendship);
|
||||
AddLocalPacketHandler(PacketType.TerminateFriendship, HandlerTerminateFrendship);
|
||||
AddLocalPacketHandler(PacketType.TerminateFriendship, HandlerTerminateFriendship);
|
||||
AddLocalPacketHandler(PacketType.RezObject, HandlerRezObject);
|
||||
AddLocalPacketHandler(PacketType.DeRezObject, HandlerDeRezObject);
|
||||
AddLocalPacketHandler(PacketType.ModifyLand, HandlerModifyLand);
|
||||
@@ -5237,6 +5263,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
AddLocalPacketHandler(PacketType.MapBlockRequest, HandleMapBlockRequest, false);
|
||||
AddLocalPacketHandler(PacketType.MapNameRequest, HandleMapNameRequest, false);
|
||||
AddLocalPacketHandler(PacketType.TeleportLandmarkRequest, HandleTeleportLandmarkRequest);
|
||||
AddLocalPacketHandler(PacketType.TeleportCancel, HandleTeleportCancel);
|
||||
AddLocalPacketHandler(PacketType.TeleportLocationRequest, HandleTeleportLocationRequest);
|
||||
AddLocalPacketHandler(PacketType.UUIDNameRequest, HandleUUIDNameRequest, false);
|
||||
AddLocalPacketHandler(PacketType.RegionHandleRequest, HandleRegionHandleRequest);
|
||||
@@ -5864,7 +5891,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool HandlerTerminateFrendship(IClientAPI sender, Packet Pack)
|
||||
private bool HandlerTerminateFriendship(IClientAPI sender, Packet Pack)
|
||||
{
|
||||
TerminateFriendshipPacket tfriendpack = (TerminateFriendshipPacket)Pack;
|
||||
|
||||
@@ -5879,13 +5906,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
UUID listOwnerAgentID = tfriendpack.AgentData.AgentID;
|
||||
UUID exFriendID = tfriendpack.ExBlock.OtherID;
|
||||
|
||||
FriendshipTermination handlerTerminateFriendship = OnTerminateFriendship;
|
||||
if (handlerTerminateFriendship != null)
|
||||
FriendshipTermination TerminateFriendshipHandler = OnTerminateFriendship;
|
||||
if (TerminateFriendshipHandler != null)
|
||||
{
|
||||
handlerTerminateFriendship(this, listOwnerAgentID, exFriendID);
|
||||
TerminateFriendshipHandler(this, listOwnerAgentID, exFriendID);
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
private bool HandleFindAgent(IClientAPI client, Packet Packet)
|
||||
@@ -6064,7 +6091,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
// for the client session anyway, in order to protect ourselves against bad code in plugins
|
||||
try
|
||||
{
|
||||
|
||||
byte[] visualparams = new byte[appear.VisualParam.Length];
|
||||
for (int i = 0; i < appear.VisualParam.Length; i++)
|
||||
visualparams[i] = appear.VisualParam[i].ParamValue;
|
||||
@@ -7535,12 +7561,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
if ((ImageType)block.Type == ImageType.Baked)
|
||||
args.Priority *= 2.0f;
|
||||
|
||||
// in the end, we null this, so we have to check if it's null
|
||||
if (m_imageManager != null)
|
||||
{
|
||||
m_imageManager.EnqueueReq(args);
|
||||
}
|
||||
ImageManager.EnqueueReq(args);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -7666,6 +7689,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
if (transfer.TransferInfo.SourceType == (int)SourceType.SimEstate)
|
||||
{
|
||||
//TransferRequestPacket does not include covenant uuid?
|
||||
//get scene covenant uuid
|
||||
taskID = m_scene.RegionInfo.RegionSettings.Covenant;
|
||||
}
|
||||
|
||||
MakeAssetRequest(transfer, taskID);
|
||||
|
||||
@@ -8476,6 +8506,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool HandleTeleportCancel(IClientAPI sender, Packet Pack)
|
||||
{
|
||||
TeleportCancel handlerTeleportCancel = OnTeleportCancel;
|
||||
if (handlerTeleportCancel != null)
|
||||
{
|
||||
handlerTeleportCancel(this);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private AssetBase FindAssetInUserAssetServer(string id)
|
||||
{
|
||||
AgentCircuitData aCircuit = ((Scene)Scene).AuthenticateHandler.GetAgentCircuitData(CircuitCode);
|
||||
@@ -8608,13 +8648,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
}
|
||||
#endregion
|
||||
|
||||
List<ParcelManager.ParcelAccessEntry> entries = new List<ParcelManager.ParcelAccessEntry>();
|
||||
List<LandAccessEntry> entries = new List<LandAccessEntry>();
|
||||
foreach (ParcelAccessListUpdatePacket.ListBlock block in updatePacket.List)
|
||||
{
|
||||
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
|
||||
LandAccessEntry entry = new LandAccessEntry();
|
||||
entry.AgentID = block.ID;
|
||||
entry.Flags = (AccessList)block.Flags;
|
||||
entry.Time = Util.ToDateTime(block.Time);
|
||||
entry.Expires = block.Time;
|
||||
entries.Add(entry);
|
||||
}
|
||||
|
||||
@@ -8969,7 +9009,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
private bool HandleEstateOwnerMessage(IClientAPI sender, Packet Pack)
|
||||
{
|
||||
EstateOwnerMessagePacket messagePacket = (EstateOwnerMessagePacket)Pack;
|
||||
//m_log.Debug(messagePacket.ToString());
|
||||
// m_log.InfoFormat("[LLCLIENTVIEW]: Packet: {0}", Utils.BytesToString(messagePacket.MethodData.Method));
|
||||
GodLandStatRequest handlerLandStatRequest;
|
||||
|
||||
#region Packet Session and User Check
|
||||
@@ -9268,6 +9308,34 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
}
|
||||
return true;
|
||||
|
||||
case "telehub":
|
||||
if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
|
||||
{
|
||||
UUID invoice = messagePacket.MethodData.Invoice;
|
||||
UUID SenderID = messagePacket.AgentData.AgentID;
|
||||
UInt32 param1 = 0u;
|
||||
|
||||
string command = (string)Utils.BytesToString(messagePacket.ParamList[0].Parameter);
|
||||
|
||||
if (command != "info ui")
|
||||
{
|
||||
try
|
||||
{
|
||||
param1 = Convert.ToUInt32(Utils.BytesToString(messagePacket.ParamList[1].Parameter));
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
EstateManageTelehub handlerEstateManageTelehub = OnEstateManageTelehub;
|
||||
if (handlerEstateManageTelehub != null)
|
||||
{
|
||||
handlerEstateManageTelehub(this, invoice, SenderID, command, param1);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
default:
|
||||
m_log.Error("EstateOwnerMessage: Unknown method requested\n" + messagePacket);
|
||||
return true;
|
||||
@@ -9279,8 +9347,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
//lsrp.RequestData.ReportType; // 1 = colliders, 0 = scripts
|
||||
//lsrp.RequestData.RequestFlags;
|
||||
//lsrp.RequestData.Filter;
|
||||
|
||||
// return true;
|
||||
}
|
||||
|
||||
private bool HandleRequestRegionInfo(IClientAPI sender, Packet Pack)
|
||||
@@ -10456,6 +10522,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool HandleGroupRoleMembersRequest(IClientAPI sender, Packet Pack)
|
||||
{
|
||||
GroupRoleMembersRequestPacket groupRoleMembersRequest =
|
||||
@@ -11335,9 +11402,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
/// <summary>
|
||||
/// Send a response back to a client when it asks the asset server (via the region server) if it has
|
||||
/// its appearance texture cached.
|
||||
///
|
||||
/// At the moment, we always reply that there is no cached texture.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// At the moment, we always reply that there is no cached texture.
|
||||
/// </remarks>
|
||||
/// <param name="simclient"></param>
|
||||
/// <param name="packet"></param>
|
||||
/// <returns></returns>
|
||||
@@ -11347,7 +11415,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
AgentCachedTexturePacket cachedtex = (AgentCachedTexturePacket)packet;
|
||||
AgentCachedTextureResponsePacket cachedresp = (AgentCachedTextureResponsePacket)PacketPool.Instance.GetPacket(PacketType.AgentCachedTextureResponse);
|
||||
|
||||
if (cachedtex.AgentData.SessionID != SessionId) return false;
|
||||
if (cachedtex.AgentData.SessionID != SessionId)
|
||||
return false;
|
||||
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
cachedresp.AgentData.AgentID = AgentId;
|
||||
@@ -11745,10 +11814,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
if (DebugPacketLevel <= 50 && packet.Type == PacketType.ImprovedTerseObjectUpdate)
|
||||
logPacket = false;
|
||||
|
||||
if (DebugPacketLevel <= 25 && packet.Type == PacketType.ObjectPropertiesFamily)
|
||||
logPacket = false;
|
||||
|
||||
if (logPacket)
|
||||
m_log.DebugFormat(
|
||||
"[CLIENT]: PACKET OUT to {0} ({1}) in {2} - {3}",
|
||||
Name, ChildAgentStatus() ? "child" : "root ", m_scene.RegionInfo.RegionName, packet.Type);
|
||||
Name, SceneAgent.IsChildAgent ? "child" : "root ", m_scene.RegionInfo.RegionName, packet.Type);
|
||||
}
|
||||
|
||||
m_udpServer.SendPacket(m_udpClient, packet, throttlePacketType, doAutomaticSplitting, method);
|
||||
@@ -11802,10 +11874,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
if (DebugPacketLevel <= 100 && (packet.Type == PacketType.ViewerEffect || packet.Type == PacketType.AgentAnimation))
|
||||
logPacket = false;
|
||||
|
||||
if (DebugPacketLevel <= 25 && packet.Type == PacketType.RequestObjectPropertiesFamily)
|
||||
logPacket = false;
|
||||
|
||||
if (logPacket)
|
||||
m_log.DebugFormat(
|
||||
"[CLIENT]: PACKET IN from {0} ({1}) in {2} - {3}",
|
||||
Name, ChildAgentStatus() ? "child" : "root ", m_scene.RegionInfo.RegionName, packet.Type);
|
||||
Name, SceneAgent.IsChildAgent ? "child" : "root ", m_scene.RegionInfo.RegionName, packet.Type);
|
||||
}
|
||||
|
||||
if (!ProcessPacketMethod(packet))
|
||||
@@ -12045,6 +12120,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
{
|
||||
requestID = new UUID(transferRequest.TransferInfo.Params, 80);
|
||||
}
|
||||
else if (transferRequest.TransferInfo.SourceType == (int)SourceType.SimEstate)
|
||||
{
|
||||
requestID = taskID;
|
||||
}
|
||||
|
||||
|
||||
// m_log.DebugFormat("[CLIENT]: {0} requesting asset {1}", Name, requestID);
|
||||
|
||||
|
||||
@@ -39,6 +39,9 @@ using log4net;
|
||||
|
||||
namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
{
|
||||
/// <summary>
|
||||
/// This class handles UDP texture requests.
|
||||
/// </summary>
|
||||
public class LLImageManager
|
||||
{
|
||||
private sealed class J2KImageComparer : IComparer<J2KImage>
|
||||
@@ -52,18 +55,29 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
private bool m_shuttingdown;
|
||||
private AssetBase m_missingImage;
|
||||
private LLClientView m_client; //Client we're assigned to
|
||||
private IAssetService m_assetCache; //Asset Cache
|
||||
private IJ2KDecoder m_j2kDecodeModule; //Our J2K module
|
||||
private IAssetService m_assetCache;
|
||||
private IJ2KDecoder m_j2kDecodeModule;
|
||||
|
||||
/// <summary>
|
||||
/// Priority queue for determining which image to send first.
|
||||
/// </summary>
|
||||
private C5.IntervalHeap<J2KImage> m_priorityQueue = new C5.IntervalHeap<J2KImage>(10, new J2KImageComparer());
|
||||
|
||||
/// <summary>
|
||||
/// Used to control thread access to the priority queue.
|
||||
/// </summary>
|
||||
private object m_syncRoot = new object();
|
||||
|
||||
public LLClientView Client { get { return m_client; } }
|
||||
/// <summary>
|
||||
/// Client served by this image manager
|
||||
/// </summary>
|
||||
public IClientAPI Client { get; private set; }
|
||||
|
||||
public AssetBase MissingImage { get { return m_missingImage; } }
|
||||
|
||||
public LLImageManager(LLClientView client, IAssetService pAssetCache, IJ2KDecoder pJ2kDecodeModule)
|
||||
public LLImageManager(IClientAPI client, IAssetService pAssetCache, IJ2KDecoder pJ2kDecodeModule)
|
||||
{
|
||||
m_client = client;
|
||||
Client = client;
|
||||
m_assetCache = pAssetCache;
|
||||
|
||||
if (pAssetCache != null)
|
||||
@@ -81,7 +95,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
/// <param name="newRequest"></param>
|
||||
public void EnqueueReq(TextureRequestArgs newRequest)
|
||||
{
|
||||
//Make sure we're not shutting down..
|
||||
if (!m_shuttingdown)
|
||||
{
|
||||
J2KImage imgrequest;
|
||||
@@ -96,19 +109,23 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
{
|
||||
//m_log.Debug("[TEX]: (CAN) ID=" + newRequest.RequestedAssetID);
|
||||
|
||||
try
|
||||
try
|
||||
{
|
||||
lock (m_syncRoot)
|
||||
m_priorityQueue.Delete(imgrequest.PriorityQueueHandle);
|
||||
m_priorityQueue.Delete(imgrequest.PriorityQueueHandle);
|
||||
}
|
||||
catch (Exception) { }
|
||||
}
|
||||
else
|
||||
{
|
||||
//m_log.DebugFormat("[TEX]: (UPD) ID={0}: D={1}, S={2}, P={3}",
|
||||
// newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority);
|
||||
// m_log.DebugFormat(
|
||||
// "[LL IMAGE MANAGER]: Received duplicate of existing request for {0}, start packet {1} from {2}",
|
||||
// newRequest.RequestedAssetID, newRequest.PacketNumber, m_client.Name);
|
||||
|
||||
//Check the packet sequence to make sure this isn't older than
|
||||
// m_log.DebugFormat("[TEX]: (UPD) ID={0}: D={1}, S={2}, P={3}",
|
||||
// newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority);
|
||||
|
||||
//Check the packet sequence to make sure this isn't older than
|
||||
//one we've already received
|
||||
if (newRequest.requestSequence > imgrequest.LastSequence)
|
||||
{
|
||||
@@ -123,11 +140,34 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
//Update the requested priority
|
||||
imgrequest.Priority = newRequest.Priority;
|
||||
|
||||
UpdateImageInQueue(imgrequest);
|
||||
|
||||
//Run an update
|
||||
imgrequest.RunUpdate();
|
||||
|
||||
// J2KImage imgrequest2 = new J2KImage(this);
|
||||
// imgrequest2.J2KDecoder = m_j2kDecodeModule;
|
||||
// imgrequest2.AssetService = m_assetCache;
|
||||
// imgrequest2.AgentID = m_client.AgentId;
|
||||
// imgrequest2.InventoryAccessModule = m_client.Scene.RequestModuleInterface<IInventoryAccessModule>();
|
||||
// imgrequest2.DiscardLevel = newRequest.DiscardLevel;
|
||||
// imgrequest2.StartPacket = Math.Max(1, newRequest.PacketNumber);
|
||||
// imgrequest2.Priority = newRequest.Priority;
|
||||
// imgrequest2.TextureID = newRequest.RequestedAssetID;
|
||||
// imgrequest2.Priority = newRequest.Priority;
|
||||
//
|
||||
// //Add this download to the priority queue
|
||||
// AddImageToQueue(imgrequest2);
|
||||
//
|
||||
// imgrequest2.RunUpdate();
|
||||
|
||||
}
|
||||
// else
|
||||
// {
|
||||
// m_log.DebugFormat(
|
||||
// "[LL IMAGE MANAGER]: Ignoring duplicate of existing request for {0} (sequence {1}) from {2} as its request sequence {3} is not greater",
|
||||
// newRequest.RequestedAssetID, imgrequest.LastSequence, m_client.Name, newRequest.requestSequence);
|
||||
// }
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -139,14 +179,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
}
|
||||
else
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[LL IMAGE MANAGER]: Received request for {0}, start packet {1} from {2}",
|
||||
// newRequest.RequestedAssetID, newRequest.PacketNumber, m_client.Name);
|
||||
|
||||
//m_log.DebugFormat("[TEX]: (NEW) ID={0}: D={1}, S={2}, P={3}",
|
||||
// newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority);
|
||||
|
||||
imgrequest = new J2KImage(this);
|
||||
imgrequest.J2KDecoder = m_j2kDecodeModule;
|
||||
imgrequest.AssetService = m_assetCache;
|
||||
imgrequest.AgentID = m_client.AgentId;
|
||||
imgrequest.InventoryAccessModule = m_client.Scene.RequestModuleInterface<IInventoryAccessModule>();
|
||||
imgrequest.AgentID = Client.AgentId;
|
||||
imgrequest.InventoryAccessModule = Client.Scene.RequestModuleInterface<IInventoryAccessModule>();
|
||||
imgrequest.DiscardLevel = newRequest.DiscardLevel;
|
||||
imgrequest.StartPacket = Math.Max(1, newRequest.PacketNumber);
|
||||
imgrequest.Priority = newRequest.Priority;
|
||||
@@ -156,7 +200,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
//Add this download to the priority queue
|
||||
AddImageToQueue(imgrequest);
|
||||
|
||||
//Run an update
|
||||
imgrequest.RunUpdate();
|
||||
}
|
||||
}
|
||||
@@ -173,12 +216,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
// If null was returned, the texture priority queue is currently empty
|
||||
if (image == null)
|
||||
return false;
|
||||
break;
|
||||
|
||||
if (image.IsDecoded)
|
||||
{
|
||||
int sent;
|
||||
bool imageDone = image.SendPackets(m_client, packetsToSend - packetsSent, out sent);
|
||||
bool imageDone = image.SendPackets(Client, packetsToSend - packetsSent, out sent);
|
||||
packetsSent += sent;
|
||||
|
||||
// If the send is complete, destroy any knowledge of this transfer
|
||||
@@ -191,10 +234,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
// written. Undecoded textures should not be going into the priority
|
||||
// queue, because a high priority undecoded texture will clog up the
|
||||
// pipeline for a client
|
||||
return true;
|
||||
// m_log.DebugFormat(
|
||||
// "[LL IMAGE MANAGER]: Exiting image queue processing early on encountering undecoded image {0}",
|
||||
// image.TextureID);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// if (packetsSent != 0)
|
||||
// m_log.DebugFormat("[LL IMAGE MANAGER]: Processed {0} packets from image queue", packetsSent);
|
||||
|
||||
return m_priorityQueue.Count > 0;
|
||||
}
|
||||
|
||||
@@ -206,9 +256,39 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
m_shuttingdown = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clear the image queue.
|
||||
/// </summary>
|
||||
/// <returns>The number of requests cleared.</returns>
|
||||
public int ClearImageQueue()
|
||||
{
|
||||
int requestsDeleted;
|
||||
|
||||
lock (m_priorityQueue)
|
||||
{
|
||||
requestsDeleted = m_priorityQueue.Count;
|
||||
|
||||
// Surprisingly, there doesn't seem to be a clear method at this time.
|
||||
while (!m_priorityQueue.IsEmpty)
|
||||
m_priorityQueue.DeleteMax();
|
||||
}
|
||||
|
||||
return requestsDeleted;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns an array containing all the images in the queue.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public J2KImage[] GetImages()
|
||||
{
|
||||
lock (m_priorityQueue)
|
||||
return m_priorityQueue.ToArray();
|
||||
}
|
||||
|
||||
#region Priority Queue Helpers
|
||||
|
||||
J2KImage GetHighestPriorityImage()
|
||||
private J2KImage GetHighestPriorityImage()
|
||||
{
|
||||
J2KImage image = null;
|
||||
|
||||
@@ -216,34 +296,50 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
{
|
||||
if (m_priorityQueue.Count > 0)
|
||||
{
|
||||
try { image = m_priorityQueue.FindMax(); }
|
||||
try
|
||||
{
|
||||
image = m_priorityQueue.FindMax();
|
||||
}
|
||||
catch (Exception) { }
|
||||
}
|
||||
}
|
||||
return image;
|
||||
}
|
||||
|
||||
void AddImageToQueue(J2KImage image)
|
||||
private void AddImageToQueue(J2KImage image)
|
||||
{
|
||||
image.PriorityQueueHandle = null;
|
||||
|
||||
lock (m_syncRoot)
|
||||
try { m_priorityQueue.Add(ref image.PriorityQueueHandle, image); }
|
||||
{
|
||||
try
|
||||
{
|
||||
m_priorityQueue.Add(ref image.PriorityQueueHandle, image);
|
||||
}
|
||||
catch (Exception) { }
|
||||
}
|
||||
}
|
||||
|
||||
void RemoveImageFromQueue(J2KImage image)
|
||||
{
|
||||
lock (m_syncRoot)
|
||||
try { m_priorityQueue.Delete(image.PriorityQueueHandle); }
|
||||
catch (Exception) { }
|
||||
}
|
||||
|
||||
void UpdateImageInQueue(J2KImage image)
|
||||
private void RemoveImageFromQueue(J2KImage image)
|
||||
{
|
||||
lock (m_syncRoot)
|
||||
{
|
||||
try { m_priorityQueue.Replace(image.PriorityQueueHandle, image); }
|
||||
try
|
||||
{
|
||||
m_priorityQueue.Delete(image.PriorityQueueHandle);
|
||||
}
|
||||
catch (Exception) { }
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateImageInQueue(J2KImage image)
|
||||
{
|
||||
lock (m_syncRoot)
|
||||
{
|
||||
try
|
||||
{
|
||||
m_priorityQueue.Replace(image.PriorityQueueHandle, image);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
image.PriorityQueueHandle = null;
|
||||
@@ -254,4 +350,4 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
#endregion Priority Queue Helpers
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -498,7 +498,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
{
|
||||
if (m_deliverPackets == false) return false;
|
||||
|
||||
OutgoingPacket packet;
|
||||
OutgoingPacket packet = null;
|
||||
OpenSim.Framework.LocklessQueue<OutgoingPacket> queue;
|
||||
TokenBucket bucket;
|
||||
bool packetSent = false;
|
||||
@@ -530,32 +530,49 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
// No dequeued packet waiting to be sent, try to pull one off
|
||||
// this queue
|
||||
queue = m_packetOutboxes[i];
|
||||
if (queue != null && queue.Dequeue(out packet))
|
||||
if (queue != null)
|
||||
{
|
||||
// A packet was pulled off the queue. See if we have
|
||||
// enough tokens in the bucket to send it out
|
||||
if (bucket.RemoveTokens(packet.Buffer.DataLength))
|
||||
bool success = false;
|
||||
try
|
||||
{
|
||||
// Send the packet
|
||||
m_udpServer.SendPacketFinal(packet);
|
||||
packetSent = true;
|
||||
success = queue.Dequeue(out packet);
|
||||
}
|
||||
catch
|
||||
{
|
||||
m_packetOutboxes[i] = new OpenSim.Framework.LocklessQueue<OutgoingPacket>();
|
||||
}
|
||||
if (success)
|
||||
{
|
||||
// A packet was pulled off the queue. See if we have
|
||||
// enough tokens in the bucket to send it out
|
||||
if (bucket.RemoveTokens(packet.Buffer.DataLength))
|
||||
{
|
||||
// Send the packet
|
||||
m_udpServer.SendPacketFinal(packet);
|
||||
packetSent = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Save the dequeued packet for the next iteration
|
||||
m_nextPackets[i] = packet;
|
||||
}
|
||||
|
||||
// If the queue is empty after this dequeue, fire the queue
|
||||
// empty callback now so it has a chance to fill before we
|
||||
// get back here
|
||||
if (queue.Count == 0)
|
||||
emptyCategories |= CategoryToFlag(i);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Save the dequeued packet for the next iteration
|
||||
m_nextPackets[i] = packet;
|
||||
}
|
||||
|
||||
// If the queue is empty after this dequeue, fire the queue
|
||||
// empty callback now so it has a chance to fill before we
|
||||
// get back here
|
||||
if (queue.Count == 0)
|
||||
// No packets in this queue. Fire the queue empty callback
|
||||
// if it has not been called recently
|
||||
emptyCategories |= CategoryToFlag(i);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// No packets in this queue. Fire the queue empty callback
|
||||
// if it has not been called recently
|
||||
m_packetOutboxes[i] = new OpenSim.Framework.LocklessQueue<OutgoingPacket>();
|
||||
emptyCategories |= CategoryToFlag(i);
|
||||
}
|
||||
}
|
||||
@@ -713,4 +730,4 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -328,7 +328,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
/// The method to call if the packet is not acked by the client. If null, then a standard
|
||||
/// resend of the packet is done.
|
||||
/// </param>
|
||||
public void SendPacket(
|
||||
public virtual void SendPacket(
|
||||
LLUDPClient udpClient, Packet packet, ThrottleOutPacketType category, bool allowSplitting, UnackedPacketMethod method)
|
||||
{
|
||||
// CoarseLocationUpdate packets cannot be split in an automated way
|
||||
@@ -492,6 +492,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
if ((Environment.TickCount & Int32.MaxValue) - udpClient.TickLastPacketReceived > 1000 * 60)
|
||||
{
|
||||
m_log.Warn("[LLUDPSERVER]: Ack timeout, disconnecting " + udpClient.AgentID);
|
||||
StatsManager.SimExtraStats.AddAbnormalClientThreadTermination();
|
||||
|
||||
RemoveClient(udpClient);
|
||||
return;
|
||||
@@ -611,11 +612,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
outgoingPacket.TickCount = Environment.TickCount & Int32.MaxValue;
|
||||
}
|
||||
|
||||
protected override void PacketReceived(UDPPacketBuffer buffer)
|
||||
public override void PacketReceived(UDPPacketBuffer buffer)
|
||||
{
|
||||
// Debugging/Profiling
|
||||
//try { Thread.CurrentThread.Name = "PacketReceived (" + m_scene.RegionInfo.RegionName + ")"; }
|
||||
//catch (Exception) { }
|
||||
// m_log.DebugFormat(
|
||||
// "[LLUDPSERVER]: Packet received from {0} in {1}", buffer.RemoteEndPoint, m_scene.RegionInfo.RegionName);
|
||||
|
||||
LLUDPClient udpClient = null;
|
||||
Packet packet = null;
|
||||
@@ -625,7 +628,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
#region Decoding
|
||||
|
||||
if (buffer.DataLength < 7)
|
||||
{
|
||||
// m_log.WarnFormat(
|
||||
// "[LLUDPSERVER]: Dropping undersized packet with {0} bytes received from {1} in {2}",
|
||||
// buffer.DataLength, buffer.RemoteEndPoint, m_scene.RegionInfo.RegionName);
|
||||
|
||||
return; // Drop undersizd packet
|
||||
}
|
||||
|
||||
int headerLen = 7;
|
||||
if (buffer.Data[6] == 0xFF)
|
||||
@@ -637,7 +646,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
}
|
||||
|
||||
if (buffer.DataLength < headerLen)
|
||||
{
|
||||
// m_log.WarnFormat(
|
||||
// "[LLUDPSERVER]: Dropping packet with malformed header received from {0} in {1}",
|
||||
// buffer.RemoteEndPoint, m_scene.RegionInfo.RegionName);
|
||||
|
||||
return; // Malformed header
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
@@ -650,6 +665,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
}
|
||||
catch (IndexOutOfRangeException)
|
||||
{
|
||||
// m_log.WarnFormat(
|
||||
// "[LLUDPSERVER]: Dropping short packet received from {0} in {1}",
|
||||
// buffer.RemoteEndPoint, m_scene.RegionInfo.RegionName);
|
||||
|
||||
return; // Drop short packet
|
||||
}
|
||||
catch(Exception e)
|
||||
@@ -887,23 +906,55 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
// DateTime startTime = DateTime.Now;
|
||||
object[] array = (object[])o;
|
||||
UDPPacketBuffer buffer = (UDPPacketBuffer)array[0];
|
||||
UseCircuitCodePacket packet = (UseCircuitCodePacket)array[1];
|
||||
UseCircuitCodePacket uccp = (UseCircuitCodePacket)array[1];
|
||||
|
||||
m_log.DebugFormat("[LLUDPSERVER]: Handling UseCircuitCode request from {0}", buffer.RemoteEndPoint);
|
||||
|
||||
IPEndPoint remoteEndPoint = (IPEndPoint)buffer.RemoteEndPoint;
|
||||
|
||||
// Begin the process of adding the client to the simulator
|
||||
AddNewClient((UseCircuitCodePacket)packet, remoteEndPoint);
|
||||
|
||||
// Send ack
|
||||
SendAckImmediate(remoteEndPoint, packet.Header.Sequence);
|
||||
AuthenticateResponse sessionInfo;
|
||||
if (IsClientAuthorized(uccp, out sessionInfo))
|
||||
{
|
||||
// Begin the process of adding the client to the simulator
|
||||
IClientAPI client
|
||||
= AddClient(
|
||||
uccp.CircuitCode.Code,
|
||||
uccp.CircuitCode.ID,
|
||||
uccp.CircuitCode.SessionID,
|
||||
remoteEndPoint,
|
||||
sessionInfo);
|
||||
|
||||
// Send ack straight away to let the viewer know that the connection is active.
|
||||
// The client will be null if it already exists (e.g. if on a region crossing the client sends a use
|
||||
// circuit code to the existing child agent. This is not particularly obvious.
|
||||
SendAckImmediate(remoteEndPoint, uccp.Header.Sequence);
|
||||
|
||||
// We only want to send initial data to new clients, not ones which are being converted from child to root.
|
||||
if (client != null)
|
||||
client.SceneAgent.SendInitialDataToMe();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Don't create clients for unauthorized requesters.
|
||||
m_log.WarnFormat(
|
||||
"[LLUDPSERVER]: Connection request for client {0} connecting with unnotified circuit code {1} from {2}",
|
||||
uccp.CircuitCode.ID, uccp.CircuitCode.Code, remoteEndPoint);
|
||||
}
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[LLUDPSERVER]: Handling UseCircuitCode request from {0} took {1}ms",
|
||||
// buffer.RemoteEndPoint, (DateTime.Now - startTime).Milliseconds);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Send an ack immediately to the given endpoint.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// FIXME: Might be possible to use SendPacketData() like everything else, but this will require refactoring so
|
||||
/// that we can obtain the UDPClient easily at this point.
|
||||
/// </remarks>
|
||||
/// <param name="remoteEndpoint"></param>
|
||||
/// <param name="sequenceNumber"></param>
|
||||
private void SendAckImmediate(IPEndPoint remoteEndpoint, uint sequenceNumber)
|
||||
{
|
||||
PacketAckPacket ack = new PacketAckPacket();
|
||||
@@ -912,6 +963,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
ack.Packets[0] = new PacketAckPacket.PacketsBlock();
|
||||
ack.Packets[0].ID = sequenceNumber;
|
||||
|
||||
SendAckImmediate(remoteEndpoint, ack);
|
||||
}
|
||||
|
||||
public virtual void SendAckImmediate(IPEndPoint remoteEndpoint, PacketAckPacket ack)
|
||||
{
|
||||
byte[] packetData = ack.ToBytes();
|
||||
int length = packetData.Length;
|
||||
|
||||
@@ -933,55 +989,39 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
return sessionInfo.Authorised;
|
||||
}
|
||||
|
||||
private void AddNewClient(UseCircuitCodePacket useCircuitCode, IPEndPoint remoteEndPoint)
|
||||
/// <summary>
|
||||
/// Add a client.
|
||||
/// </summary>
|
||||
/// <param name="circuitCode"></param>
|
||||
/// <param name="agentID"></param>
|
||||
/// <param name="sessionID"></param>
|
||||
/// <param name="remoteEndPoint"></param>
|
||||
/// <param name="sessionInfo"></param>
|
||||
/// <returns>The client if it was added. Null if the client already existed.</returns>
|
||||
protected virtual IClientAPI AddClient(
|
||||
uint circuitCode, UUID agentID, UUID sessionID, IPEndPoint remoteEndPoint, AuthenticateResponse sessionInfo)
|
||||
{
|
||||
UUID agentID = useCircuitCode.CircuitCode.ID;
|
||||
UUID sessionID = useCircuitCode.CircuitCode.SessionID;
|
||||
uint circuitCode = useCircuitCode.CircuitCode.Code;
|
||||
IClientAPI client = null;
|
||||
|
||||
AuthenticateResponse sessionInfo;
|
||||
if (IsClientAuthorized(useCircuitCode, out sessionInfo))
|
||||
{
|
||||
AddClient(circuitCode, agentID, sessionID, remoteEndPoint, sessionInfo);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Don't create circuits for unauthorized clients
|
||||
m_log.WarnFormat(
|
||||
"[LLUDPSERVER]: Connection request for client {0} connecting with unnotified circuit code {1} from {2}",
|
||||
useCircuitCode.CircuitCode.ID, useCircuitCode.CircuitCode.Code, remoteEndPoint);
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void AddClient(uint circuitCode, UUID agentID, UUID sessionID, IPEndPoint remoteEndPoint, AuthenticateResponse sessionInfo)
|
||||
{
|
||||
// In priciple there shouldn't be more than one thread here, ever.
|
||||
// But in case that happens, we need to synchronize this piece of code
|
||||
// because it's too important
|
||||
lock (this)
|
||||
{
|
||||
IClientAPI existingClient;
|
||||
|
||||
if (!m_scene.TryGetClient(agentID, out existingClient))
|
||||
if (!m_scene.TryGetClient(agentID, out client))
|
||||
{
|
||||
// Create the LLUDPClient
|
||||
LLUDPClient udpClient = new LLUDPClient(this, ThrottleRates, m_throttle, circuitCode, agentID, remoteEndPoint, m_defaultRTO, m_maxRTO);
|
||||
// Create the LLClientView
|
||||
LLClientView client = new LLClientView(remoteEndPoint, m_scene, this, udpClient, sessionInfo, agentID, sessionID, circuitCode);
|
||||
|
||||
client = new LLClientView(remoteEndPoint, m_scene, this, udpClient, sessionInfo, agentID, sessionID, circuitCode);
|
||||
client.OnLogout += LogoutHandler;
|
||||
|
||||
client.DisableFacelights = m_disableFacelights;
|
||||
((LLClientView)client).DisableFacelights = m_disableFacelights;
|
||||
|
||||
// Start the IClientAPI
|
||||
client.Start();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.WarnFormat("[LLUDPSERVER]: Ignoring a repeated UseCircuitCode from {0} at {1} for circuit {2}",
|
||||
existingClient.AgentId, remoteEndPoint, circuitCode);
|
||||
}
|
||||
}
|
||||
|
||||
return client;
|
||||
}
|
||||
|
||||
private void RemoveClient(LLUDPClient udpClient)
|
||||
|
||||
@@ -44,7 +44,7 @@ namespace OpenMetaverse
|
||||
/// This method is called when an incoming packet is received
|
||||
/// </summary>
|
||||
/// <param name="buffer">Incoming packet buffer</param>
|
||||
protected abstract void PacketReceived(UDPPacketBuffer buffer);
|
||||
public abstract void PacketReceived(UDPPacketBuffer buffer);
|
||||
|
||||
/// <summary>UDP port to bind to in server mode</summary>
|
||||
protected int m_udpPort;
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Net;
|
||||
using log4net.Config;
|
||||
using Nini.Config;
|
||||
@@ -32,6 +33,7 @@ using NUnit.Framework;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.Packets;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Tests.Common;
|
||||
using OpenSim.Tests.Common.Mock;
|
||||
|
||||
@@ -43,19 +45,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
|
||||
[TestFixture]
|
||||
public class BasicCircuitTests
|
||||
{
|
||||
[SetUp]
|
||||
public void Init()
|
||||
[TestFixtureSetUp]
|
||||
public void FixtureInit()
|
||||
{
|
||||
try
|
||||
{
|
||||
XmlConfigurator.Configure();
|
||||
}
|
||||
catch
|
||||
{
|
||||
// I don't care, just leave log4net off
|
||||
}
|
||||
// Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread.
|
||||
Util.FireAndForgetMethod = FireAndForgetMethod.RegressionTest;
|
||||
}
|
||||
|
||||
|
||||
[TestFixtureTearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
// We must set this back afterwards, otherwise later tests will fail since they're expecting multiple
|
||||
// threads. Possibly, later tests should be rewritten so none of them require async stuff (which regression
|
||||
// tests really shouldn't).
|
||||
Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod;
|
||||
}
|
||||
|
||||
// /// <summary>
|
||||
// /// Add a client for testing
|
||||
// /// </summary>
|
||||
@@ -78,54 +83,54 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
|
||||
// testLLUDPServer.LocalScene = scene;
|
||||
// }
|
||||
|
||||
/// <summary>
|
||||
/// Set up a client for tests which aren't concerned with this process itself and where only one client is being
|
||||
/// tested
|
||||
/// </summary>
|
||||
/// <param name="circuitCode"></param>
|
||||
/// <param name="epSender"></param>
|
||||
/// <param name="testLLUDPServer"></param>
|
||||
/// <param name="acm"></param>
|
||||
protected void AddClient(
|
||||
uint circuitCode, EndPoint epSender, TestLLUDPServer testLLUDPServer, AgentCircuitManager acm)
|
||||
{
|
||||
UUID myAgentUuid = UUID.Parse("00000000-0000-0000-0000-000000000001");
|
||||
UUID mySessionUuid = UUID.Parse("00000000-0000-0000-0000-000000000002");
|
||||
|
||||
AddClient(circuitCode, epSender, myAgentUuid, mySessionUuid, testLLUDPServer, acm);
|
||||
}
|
||||
// /// <summary>
|
||||
// /// Set up a client for tests which aren't concerned with this process itself and where only one client is being
|
||||
// /// tested
|
||||
// /// </summary>
|
||||
// /// <param name="circuitCode"></param>
|
||||
// /// <param name="epSender"></param>
|
||||
// /// <param name="testLLUDPServer"></param>
|
||||
// /// <param name="acm"></param>
|
||||
// protected void AddClient(
|
||||
// uint circuitCode, EndPoint epSender, TestLLUDPServer testLLUDPServer, AgentCircuitManager acm)
|
||||
// {
|
||||
// UUID myAgentUuid = UUID.Parse("00000000-0000-0000-0000-000000000001");
|
||||
// UUID mySessionUuid = UUID.Parse("00000000-0000-0000-0000-000000000002");
|
||||
//
|
||||
// AddClient(circuitCode, epSender, myAgentUuid, mySessionUuid, testLLUDPServer, acm);
|
||||
// }
|
||||
|
||||
/// <summary>
|
||||
/// Set up a client for tests which aren't concerned with this process itself
|
||||
/// </summary>
|
||||
/// <param name="circuitCode"></param>
|
||||
/// <param name="epSender"></param>
|
||||
/// <param name="agentId"></param>
|
||||
/// <param name="sessionId"></param>
|
||||
/// <param name="testLLUDPServer"></param>
|
||||
/// <param name="acm"></param>
|
||||
protected void AddClient(
|
||||
uint circuitCode, EndPoint epSender, UUID agentId, UUID sessionId,
|
||||
TestLLUDPServer testLLUDPServer, AgentCircuitManager acm)
|
||||
{
|
||||
AgentCircuitData acd = new AgentCircuitData();
|
||||
acd.AgentID = agentId;
|
||||
acd.SessionID = sessionId;
|
||||
|
||||
UseCircuitCodePacket uccp = new UseCircuitCodePacket();
|
||||
|
||||
UseCircuitCodePacket.CircuitCodeBlock uccpCcBlock
|
||||
= new UseCircuitCodePacket.CircuitCodeBlock();
|
||||
uccpCcBlock.Code = circuitCode;
|
||||
uccpCcBlock.ID = agentId;
|
||||
uccpCcBlock.SessionID = sessionId;
|
||||
uccp.CircuitCode = uccpCcBlock;
|
||||
|
||||
acm.AddNewCircuit(circuitCode, acd);
|
||||
|
||||
testLLUDPServer.LoadReceive(uccp, epSender);
|
||||
testLLUDPServer.ReceiveData(null);
|
||||
}
|
||||
// /// <summary>
|
||||
// /// Set up a client for tests which aren't concerned with this process itself
|
||||
// /// </summary>
|
||||
// /// <param name="circuitCode"></param>
|
||||
// /// <param name="epSender"></param>
|
||||
// /// <param name="agentId"></param>
|
||||
// /// <param name="sessionId"></param>
|
||||
// /// <param name="testLLUDPServer"></param>
|
||||
// /// <param name="acm"></param>
|
||||
// protected void AddClient(
|
||||
// uint circuitCode, EndPoint epSender, UUID agentId, UUID sessionId,
|
||||
// TestLLUDPServer testLLUDPServer, AgentCircuitManager acm)
|
||||
// {
|
||||
// AgentCircuitData acd = new AgentCircuitData();
|
||||
// acd.AgentID = agentId;
|
||||
// acd.SessionID = sessionId;
|
||||
//
|
||||
// UseCircuitCodePacket uccp = new UseCircuitCodePacket();
|
||||
//
|
||||
// UseCircuitCodePacket.CircuitCodeBlock uccpCcBlock
|
||||
// = new UseCircuitCodePacket.CircuitCodeBlock();
|
||||
// uccpCcBlock.Code = circuitCode;
|
||||
// uccpCcBlock.ID = agentId;
|
||||
// uccpCcBlock.SessionID = sessionId;
|
||||
// uccp.CircuitCode = uccpCcBlock;
|
||||
//
|
||||
// acm.AddNewCircuit(circuitCode, acd);
|
||||
//
|
||||
// testLLUDPServer.LoadReceive(uccp, epSender);
|
||||
// testLLUDPServer.ReceiveData(null);
|
||||
// }
|
||||
|
||||
/// <summary>
|
||||
/// Build an object name packet for test purposes
|
||||
@@ -144,54 +149,69 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
|
||||
return onp;
|
||||
}
|
||||
|
||||
// /// <summary>
|
||||
// /// Test adding a client to the stack
|
||||
// /// </summary>
|
||||
// [Test]
|
||||
// public void TestAddClient()
|
||||
// {
|
||||
// TestHelper.InMethod();
|
||||
//
|
||||
// uint myCircuitCode = 123456;
|
||||
// UUID myAgentUuid = UUID.Parse("00000000-0000-0000-0000-000000000001");
|
||||
// UUID mySessionUuid = UUID.Parse("00000000-0000-0000-0000-000000000002");
|
||||
//
|
||||
// TestLLUDPServer testLLUDPServer;
|
||||
// TestLLPacketServer testLLPacketServer;
|
||||
// AgentCircuitManager acm;
|
||||
// SetupStack(new MockScene(), out testLLUDPServer, out testLLPacketServer, out acm);
|
||||
//
|
||||
// AgentCircuitData acd = new AgentCircuitData();
|
||||
// acd.AgentID = myAgentUuid;
|
||||
// acd.SessionID = mySessionUuid;
|
||||
//
|
||||
// UseCircuitCodePacket uccp = new UseCircuitCodePacket();
|
||||
//
|
||||
// UseCircuitCodePacket.CircuitCodeBlock uccpCcBlock
|
||||
// = new UseCircuitCodePacket.CircuitCodeBlock();
|
||||
// uccpCcBlock.Code = myCircuitCode;
|
||||
// uccpCcBlock.ID = myAgentUuid;
|
||||
// uccpCcBlock.SessionID = mySessionUuid;
|
||||
// uccp.CircuitCode = uccpCcBlock;
|
||||
//
|
||||
// EndPoint testEp = new IPEndPoint(IPAddress.Loopback, 999);
|
||||
//
|
||||
// testLLUDPServer.LoadReceive(uccp, testEp);
|
||||
// testLLUDPServer.ReceiveData(null);
|
||||
//
|
||||
// // Circuit shouildn't exist since the circuit manager doesn't know about this circuit for authentication yet
|
||||
// Assert.IsFalse(testLLUDPServer.HasCircuit(myCircuitCode));
|
||||
//
|
||||
// acm.AddNewCircuit(myCircuitCode, acd);
|
||||
//
|
||||
// testLLUDPServer.LoadReceive(uccp, testEp);
|
||||
// testLLUDPServer.ReceiveData(null);
|
||||
//
|
||||
// // Should succeed now
|
||||
// Assert.IsTrue(testLLUDPServer.HasCircuit(myCircuitCode));
|
||||
// Assert.IsFalse(testLLUDPServer.HasCircuit(101));
|
||||
// }
|
||||
//
|
||||
/// <summary>
|
||||
/// Test adding a client to the stack
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestAddClient()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
// XmlConfigurator.Configure();
|
||||
|
||||
TestScene scene = SceneHelpers.SetupScene();
|
||||
uint myCircuitCode = 123456;
|
||||
UUID myAgentUuid = TestHelpers.ParseTail(0x1);
|
||||
UUID mySessionUuid = TestHelpers.ParseTail(0x2);
|
||||
IPEndPoint testEp = new IPEndPoint(IPAddress.Loopback, 999);
|
||||
|
||||
uint port = 0;
|
||||
AgentCircuitManager acm = scene.AuthenticateHandler;
|
||||
|
||||
TestLLUDPServer llUdpServer
|
||||
= new TestLLUDPServer(IPAddress.Any, ref port, 0, false, new IniConfigSource(), acm);
|
||||
llUdpServer.AddScene(scene);
|
||||
|
||||
UseCircuitCodePacket uccp = new UseCircuitCodePacket();
|
||||
|
||||
UseCircuitCodePacket.CircuitCodeBlock uccpCcBlock
|
||||
= new UseCircuitCodePacket.CircuitCodeBlock();
|
||||
uccpCcBlock.Code = myCircuitCode;
|
||||
uccpCcBlock.ID = myAgentUuid;
|
||||
uccpCcBlock.SessionID = mySessionUuid;
|
||||
uccp.CircuitCode = uccpCcBlock;
|
||||
|
||||
byte[] uccpBytes = uccp.ToBytes();
|
||||
UDPPacketBuffer upb = new UDPPacketBuffer(testEp, uccpBytes.Length);
|
||||
upb.DataLength = uccpBytes.Length; // God knows why this isn't set by the constructor.
|
||||
Buffer.BlockCopy(uccpBytes, 0, upb.Data, 0, uccpBytes.Length);
|
||||
|
||||
llUdpServer.PacketReceived(upb);
|
||||
|
||||
// Presence shouldn't exist since the circuit manager doesn't know about this circuit for authentication yet
|
||||
Assert.That(scene.GetScenePresence(myAgentUuid), Is.Null);
|
||||
|
||||
AgentCircuitData acd = new AgentCircuitData();
|
||||
acd.AgentID = myAgentUuid;
|
||||
acd.SessionID = mySessionUuid;
|
||||
|
||||
acm.AddNewCircuit(myCircuitCode, acd);
|
||||
|
||||
llUdpServer.PacketReceived(upb);
|
||||
|
||||
// Should succeed now
|
||||
ScenePresence sp = scene.GetScenePresence(myAgentUuid);
|
||||
Assert.That(sp.UUID, Is.EqualTo(myAgentUuid));
|
||||
|
||||
Assert.That(llUdpServer.PacketsSent.Count, Is.EqualTo(1));
|
||||
|
||||
Packet packet = llUdpServer.PacketsSent[0];
|
||||
Assert.That(packet, Is.InstanceOf(typeof(PacketAckPacket)));
|
||||
|
||||
PacketAckPacket ackPacket = packet as PacketAckPacket;
|
||||
Assert.That(ackPacket.Packets.Length, Is.EqualTo(1));
|
||||
Assert.That(ackPacket.Packets[0].ID, Is.EqualTo(0));
|
||||
}
|
||||
|
||||
// /// <summary>
|
||||
// /// Test removing a client from the stack
|
||||
// /// </summary>
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Reflection;
|
||||
using log4net.Config;
|
||||
using Nini.Config;
|
||||
using NUnit.Framework;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.Packets;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.CoreModules.Agent.TextureSender;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Tests.Common;
|
||||
using OpenSim.Tests.Common.Mock;
|
||||
|
||||
namespace OpenSim.Region.ClientStack.LindenUDP.Tests
|
||||
{
|
||||
[TestFixture]
|
||||
public class LLImageManagerTests
|
||||
{
|
||||
private AssetBase m_testImageAsset;
|
||||
private Scene scene;
|
||||
private LLImageManager llim;
|
||||
private TestClient tc;
|
||||
|
||||
[TestFixtureSetUp]
|
||||
public void FixtureInit()
|
||||
{
|
||||
using (
|
||||
Stream resource
|
||||
= GetType().Assembly.GetManifestResourceStream(
|
||||
"OpenSim.Region.ClientStack.LindenUDP.Tests.Resources.4-tile2.jp2"))
|
||||
{
|
||||
using (BinaryReader br = new BinaryReader(resource))
|
||||
{
|
||||
m_testImageAsset
|
||||
= new AssetBase(
|
||||
TestHelpers.ParseTail(0x1),
|
||||
"Test Image",
|
||||
(sbyte)AssetType.Texture,
|
||||
TestHelpers.ParseTail(0x2).ToString());
|
||||
|
||||
m_testImageAsset.Data = br.ReadBytes(99999999);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
UUID userId = TestHelpers.ParseTail(0x3);
|
||||
|
||||
J2KDecoderModule j2kdm = new J2KDecoderModule();
|
||||
|
||||
scene = SceneHelpers.SetupScene();
|
||||
SceneHelpers.SetupSceneModules(scene, j2kdm);
|
||||
|
||||
tc = new TestClient(SceneHelpers.GenerateAgentData(userId), scene);
|
||||
llim = new LLImageManager(tc, scene.AssetService, j2kdm);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestSendImage()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
// XmlConfigurator.Configure();
|
||||
|
||||
scene.AssetService.Store(m_testImageAsset);
|
||||
|
||||
TextureRequestArgs args = new TextureRequestArgs();
|
||||
args.RequestedAssetID = m_testImageAsset.FullID;
|
||||
args.DiscardLevel = 0;
|
||||
args.PacketNumber = 1;
|
||||
args.Priority = 5;
|
||||
args.requestSequence = 1;
|
||||
|
||||
llim.EnqueueReq(args);
|
||||
llim.ProcessImageQueue(20);
|
||||
|
||||
Assert.That(tc.SentImageDataPackets.Count, Is.EqualTo(1));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestDiscardImage()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
// XmlConfigurator.Configure();
|
||||
|
||||
scene.AssetService.Store(m_testImageAsset);
|
||||
|
||||
TextureRequestArgs args = new TextureRequestArgs();
|
||||
args.RequestedAssetID = m_testImageAsset.FullID;
|
||||
args.DiscardLevel = 0;
|
||||
args.PacketNumber = 1;
|
||||
args.Priority = 5;
|
||||
args.requestSequence = 1;
|
||||
llim.EnqueueReq(args);
|
||||
|
||||
// Now create a discard request
|
||||
TextureRequestArgs discardArgs = new TextureRequestArgs();
|
||||
discardArgs.RequestedAssetID = m_testImageAsset.FullID;
|
||||
discardArgs.DiscardLevel = -1;
|
||||
discardArgs.PacketNumber = 1;
|
||||
discardArgs.Priority = 0;
|
||||
discardArgs.requestSequence = 2;
|
||||
llim.EnqueueReq(discardArgs);
|
||||
|
||||
llim.ProcessImageQueue(20);
|
||||
|
||||
Assert.That(tc.SentImageDataPackets.Count, Is.EqualTo(0));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestMissingImage()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
// XmlConfigurator.Configure();
|
||||
|
||||
TextureRequestArgs args = new TextureRequestArgs();
|
||||
args.RequestedAssetID = m_testImageAsset.FullID;
|
||||
args.DiscardLevel = 0;
|
||||
args.PacketNumber = 1;
|
||||
args.Priority = 5;
|
||||
args.requestSequence = 1;
|
||||
|
||||
llim.EnqueueReq(args);
|
||||
llim.ProcessImageQueue(20);
|
||||
|
||||
Assert.That(tc.SentImageDataPackets.Count, Is.EqualTo(0));
|
||||
Assert.That(tc.SentImageNotInDatabasePackets.Count, Is.EqualTo(1));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -53,9 +53,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
|
||||
public override void Update() {}
|
||||
public override void LoadWorldMap() {}
|
||||
|
||||
public override void AddNewClient(IClientAPI client, PresenceType type)
|
||||
public override ISceneAgent AddNewClient(IClientAPI client, PresenceType type)
|
||||
{
|
||||
client.OnObjectName += RecordObjectNameCall;
|
||||
|
||||
// FIXME
|
||||
return null;
|
||||
}
|
||||
|
||||
public override void RemoveClient(UUID agentID, bool someReason) {}
|
||||
|
||||
Binary file not shown.
@@ -36,107 +36,106 @@ using OpenSim.Framework;
|
||||
namespace OpenSim.Region.ClientStack.LindenUDP.Tests
|
||||
{
|
||||
/// <summary>
|
||||
/// This class enables synchronous testing of the LLUDPServer by allowing us to load our own data into the end
|
||||
/// receive event
|
||||
/// This class enables regression testing of the LLUDPServer by allowing us to intercept outgoing data.
|
||||
/// </summary>
|
||||
public class TestLLUDPServer : LLUDPServer
|
||||
{
|
||||
public List<Packet> PacketsSent { get; private set; }
|
||||
|
||||
public TestLLUDPServer(IPAddress listenIP, ref uint port, int proxyPortOffsetParm, bool allow_alternate_port, IConfigSource configSource, AgentCircuitManager circuitManager)
|
||||
: base(listenIP, ref port, proxyPortOffsetParm, allow_alternate_port, configSource, circuitManager)
|
||||
{}
|
||||
{
|
||||
PacketsSent = new List<Packet>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The chunks of data to pass to the LLUDPServer when it calls EndReceive
|
||||
/// </summary>
|
||||
protected Queue<ChunkSenderTuple> m_chunksToLoad = new Queue<ChunkSenderTuple>();
|
||||
|
||||
// protected override void BeginReceive()
|
||||
// {
|
||||
// if (m_chunksToLoad.Count > 0 && m_chunksToLoad.Peek().BeginReceiveException)
|
||||
// {
|
||||
// ChunkSenderTuple tuple = m_chunksToLoad.Dequeue();
|
||||
// reusedEpSender = tuple.Sender;
|
||||
// throw new SocketException();
|
||||
// }
|
||||
// }
|
||||
|
||||
// protected override bool EndReceive(out int numBytes, IAsyncResult result, ref EndPoint epSender)
|
||||
// {
|
||||
// numBytes = 0;
|
||||
//
|
||||
// //m_log.Debug("Queue size " + m_chunksToLoad.Count);
|
||||
//
|
||||
// if (m_chunksToLoad.Count <= 0)
|
||||
// return false;
|
||||
//
|
||||
// ChunkSenderTuple tuple = m_chunksToLoad.Dequeue();
|
||||
// RecvBuffer = tuple.Data;
|
||||
// numBytes = tuple.Data.Length;
|
||||
// epSender = tuple.Sender;
|
||||
//
|
||||
// return true;
|
||||
// }
|
||||
|
||||
// public override void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode)
|
||||
// {
|
||||
// // Don't do anything just yet
|
||||
// }
|
||||
|
||||
/// <summary>
|
||||
/// Signal that this chunk should throw an exception on Socket.BeginReceive()
|
||||
/// </summary>
|
||||
/// <param name="epSender"></param>
|
||||
public void LoadReceiveWithBeginException(EndPoint epSender)
|
||||
public override void SendAckImmediate(IPEndPoint remoteEndpoint, PacketAckPacket ack)
|
||||
{
|
||||
ChunkSenderTuple tuple = new ChunkSenderTuple(epSender);
|
||||
tuple.BeginReceiveException = true;
|
||||
m_chunksToLoad.Enqueue(tuple);
|
||||
PacketsSent.Add(ack);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Load some data to be received by the LLUDPServer on the next receive call
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <param name="epSender"></param>
|
||||
public void LoadReceive(byte[] data, EndPoint epSender)
|
||||
{
|
||||
m_chunksToLoad.Enqueue(new ChunkSenderTuple(data, epSender));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Load a packet to be received by the LLUDPServer on the next receive call
|
||||
/// </summary>
|
||||
/// <param name="packet"></param>
|
||||
public void LoadReceive(Packet packet, EndPoint epSender)
|
||||
{
|
||||
LoadReceive(packet.ToBytes(), epSender);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calls the protected asynchronous result method. This fires out all data chunks currently queued for send
|
||||
/// </summary>
|
||||
/// <param name="result"></param>
|
||||
public void ReceiveData(IAsyncResult result)
|
||||
{
|
||||
// Doesn't work the same way anymore
|
||||
// while (m_chunksToLoad.Count > 0)
|
||||
// OnReceivedData(result);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Has a circuit with the given code been established?
|
||||
/// </summary>
|
||||
/// <param name="circuitCode"></param>
|
||||
/// <returns></returns>
|
||||
public bool HasCircuit(uint circuitCode)
|
||||
{
|
||||
// lock (clientCircuits_reverse)
|
||||
// {
|
||||
// return clientCircuits_reverse.ContainsKey(circuitCode);
|
||||
// }
|
||||
|
||||
return true;
|
||||
public override void SendPacket(
|
||||
LLUDPClient udpClient, Packet packet, ThrottleOutPacketType category, bool allowSplitting, UnackedPacketMethod method)
|
||||
{
|
||||
PacketsSent.Add(packet);
|
||||
}
|
||||
|
||||
//// /// <summary>
|
||||
//// /// The chunks of data to pass to the LLUDPServer when it calls EndReceive
|
||||
//// /// </summary>
|
||||
//// protected Queue<ChunkSenderTuple> m_chunksToLoad = new Queue<ChunkSenderTuple>();
|
||||
//
|
||||
//// protected override void BeginReceive()
|
||||
//// {
|
||||
//// if (m_chunksToLoad.Count > 0 && m_chunksToLoad.Peek().BeginReceiveException)
|
||||
//// {
|
||||
//// ChunkSenderTuple tuple = m_chunksToLoad.Dequeue();
|
||||
//// reusedEpSender = tuple.Sender;
|
||||
//// throw new SocketException();
|
||||
//// }
|
||||
//// }
|
||||
//
|
||||
//// protected override bool EndReceive(out int numBytes, IAsyncResult result, ref EndPoint epSender)
|
||||
//// {
|
||||
//// numBytes = 0;
|
||||
////
|
||||
//// //m_log.Debug("Queue size " + m_chunksToLoad.Count);
|
||||
////
|
||||
//// if (m_chunksToLoad.Count <= 0)
|
||||
//// return false;
|
||||
////
|
||||
//// ChunkSenderTuple tuple = m_chunksToLoad.Dequeue();
|
||||
//// RecvBuffer = tuple.Data;
|
||||
//// numBytes = tuple.Data.Length;
|
||||
//// epSender = tuple.Sender;
|
||||
////
|
||||
//// return true;
|
||||
//// }
|
||||
//
|
||||
//// public override void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode)
|
||||
//// {
|
||||
//// // Don't do anything just yet
|
||||
//// }
|
||||
//
|
||||
// /// <summary>
|
||||
// /// Signal that this chunk should throw an exception on Socket.BeginReceive()
|
||||
// /// </summary>
|
||||
// /// <param name="epSender"></param>
|
||||
// public void LoadReceiveWithBeginException(EndPoint epSender)
|
||||
// {
|
||||
// ChunkSenderTuple tuple = new ChunkSenderTuple(epSender);
|
||||
// tuple.BeginReceiveException = true;
|
||||
// m_chunksToLoad.Enqueue(tuple);
|
||||
// }
|
||||
//
|
||||
// /// <summary>
|
||||
// /// Load some data to be received by the LLUDPServer on the next receive call
|
||||
// /// </summary>
|
||||
// /// <param name="data"></param>
|
||||
// /// <param name="epSender"></param>
|
||||
// public void LoadReceive(byte[] data, EndPoint epSender)
|
||||
// {
|
||||
// m_chunksToLoad.Enqueue(new ChunkSenderTuple(data, epSender));
|
||||
// }
|
||||
//
|
||||
// /// <summary>
|
||||
// /// Load a packet to be received by the LLUDPServer on the next receive call
|
||||
// /// </summary>
|
||||
// /// <param name="packet"></param>
|
||||
// public void LoadReceive(Packet packet, EndPoint epSender)
|
||||
// {
|
||||
// LoadReceive(packet.ToBytes(), epSender);
|
||||
// }
|
||||
//
|
||||
// /// <summary>
|
||||
// /// Calls the protected asynchronous result method. This fires out all data chunks currently queued for send
|
||||
// /// </summary>
|
||||
// /// <param name="result"></param>
|
||||
// public void ReceiveData(IAsyncResult result)
|
||||
// {
|
||||
// // Doesn't work the same way anymore
|
||||
//// while (m_chunksToLoad.Count > 0)
|
||||
//// OnReceivedData(result);
|
||||
// }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -246,7 +246,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
||||
|
||||
if (mm != null)
|
||||
{
|
||||
if (!mm.UploadCovered(remoteClient, mm.UploadCharge))
|
||||
if (!mm.UploadCovered(remoteClient.AgentId, mm.UploadCharge))
|
||||
{
|
||||
remoteClient.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false);
|
||||
return;
|
||||
|
||||
@@ -103,6 +103,10 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender
|
||||
// If it's cached, return the cached results
|
||||
if (m_decodedCache.TryGetValue(assetID, out result))
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[J2KDecoderModule]: Returning existing cached {0} layers j2k decode for {1}",
|
||||
// result.Length, assetID);
|
||||
|
||||
callback(assetID, result);
|
||||
}
|
||||
else
|
||||
@@ -129,18 +133,20 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender
|
||||
|
||||
// Do Decode!
|
||||
if (decode)
|
||||
DoJ2KDecode(assetID, j2kData);
|
||||
Decode(assetID, j2kData);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Provides a synchronous decode so that caller can be assured that this executes before the next line
|
||||
/// </summary>
|
||||
/// <param name="assetID"></param>
|
||||
/// <param name="j2kData"></param>
|
||||
public void Decode(UUID assetID, byte[] j2kData)
|
||||
public bool Decode(UUID assetID, byte[] j2kData)
|
||||
{
|
||||
DoJ2KDecode(assetID, j2kData);
|
||||
OpenJPEG.J2KLayerInfo[] layers;
|
||||
int components;
|
||||
return Decode(assetID, j2kData, out layers, out components);
|
||||
}
|
||||
|
||||
public bool Decode(UUID assetID, byte[] j2kData, out OpenJPEG.J2KLayerInfo[] layers, out int components)
|
||||
{
|
||||
return DoJ2KDecode(assetID, j2kData, out layers, out components);
|
||||
}
|
||||
|
||||
#endregion IJ2KDecoder
|
||||
@@ -150,11 +156,21 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender
|
||||
/// </summary>
|
||||
/// <param name="assetID">UUID of Asset</param>
|
||||
/// <param name="j2kData">JPEG2000 data</param>
|
||||
private void DoJ2KDecode(UUID assetID, byte[] j2kData)
|
||||
/// <param name="layers">layer data</param>
|
||||
/// <param name="components">number of components</param>
|
||||
/// <returns>true if decode was successful. false otherwise.</returns>
|
||||
private bool DoJ2KDecode(UUID assetID, byte[] j2kData, out OpenJPEG.J2KLayerInfo[] layers, out int components)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[J2KDecoderModule]: Doing J2K decoding of {0} bytes for asset {1}", j2kData.Length, assetID);
|
||||
|
||||
bool decodedSuccessfully = true;
|
||||
|
||||
//int DecodeTime = 0;
|
||||
//DecodeTime = Environment.TickCount;
|
||||
OpenJPEG.J2KLayerInfo[] layers;
|
||||
|
||||
// We don't get this from CSJ2K. Is it relevant?
|
||||
components = 0;
|
||||
|
||||
if (!TryLoadCacheForAsset(assetID, out layers))
|
||||
{
|
||||
@@ -189,14 +205,15 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender
|
||||
catch (Exception ex)
|
||||
{
|
||||
m_log.Warn("[J2KDecoderModule]: CSJ2K threw an exception decoding texture " + assetID + ": " + ex.Message);
|
||||
decodedSuccessfully = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int components;
|
||||
if (!OpenJPEG.DecodeLayerBoundaries(j2kData, out layers, out components))
|
||||
{
|
||||
m_log.Warn("[J2KDecoderModule]: OpenJPEG failed to decode texture " + assetID);
|
||||
decodedSuccessfully = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -205,6 +222,7 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender
|
||||
m_log.Warn("[J2KDecoderModule]: Failed to decode layer data for texture " + assetID + ", guessing sane defaults");
|
||||
// Layer decoding completely failed. Guess at sane defaults for the layer boundaries
|
||||
layers = CreateDefaultLayers(j2kData.Length);
|
||||
decodedSuccessfully = false;
|
||||
}
|
||||
|
||||
// Cache Decoded layers
|
||||
@@ -224,6 +242,8 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender
|
||||
m_notifyList.Remove(assetID);
|
||||
}
|
||||
}
|
||||
|
||||
return decodedSuccessfully;
|
||||
}
|
||||
|
||||
private OpenJPEG.J2KLayerInfo[] CreateDefaultLayers(int j2kLength)
|
||||
|
||||
@@ -39,6 +39,7 @@ using OpenSim.Region.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Region.Framework.Scenes.Serialization;
|
||||
using OpenSim.Services.Interfaces;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||
{
|
||||
@@ -114,6 +115,42 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||
return;
|
||||
}
|
||||
|
||||
// m_log.DebugFormat("[ATTACHMENTS MODULE]: Rezzing any attachments for {0}", sp.Name);
|
||||
|
||||
XmlDocument doc = new XmlDocument();
|
||||
string stateData = String.Empty;
|
||||
|
||||
IAttachmentsService attServ = m_scene.RequestModuleInterface<IAttachmentsService>();
|
||||
if (attServ != null)
|
||||
{
|
||||
m_log.DebugFormat("[ATTACHMENT]: Loading attachment data from attachment service");
|
||||
stateData = attServ.Get(sp.UUID.ToString());
|
||||
if (stateData != String.Empty)
|
||||
{
|
||||
try
|
||||
{
|
||||
doc.LoadXml(stateData);
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
}
|
||||
|
||||
Dictionary<UUID, string> itemData = new Dictionary<UUID, string>();
|
||||
|
||||
XmlNodeList nodes = doc.GetElementsByTagName("Attachment");
|
||||
if (nodes.Count > 0)
|
||||
{
|
||||
foreach (XmlNode n in nodes)
|
||||
{
|
||||
XmlElement elem = (XmlElement)n;
|
||||
string itemID = elem.GetAttribute("ItemID");
|
||||
string xml = elem.InnerXml;
|
||||
|
||||
itemData[new UUID(itemID)] = xml;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
List<AvatarAttachment> attachments = sp.Appearance.GetAttachments();
|
||||
foreach (AvatarAttachment attach in attachments)
|
||||
{
|
||||
@@ -133,12 +170,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||
|
||||
try
|
||||
{
|
||||
string xmlData;
|
||||
XmlDocument d = null;
|
||||
UUID asset;
|
||||
if (itemData.TryGetValue(attach.ItemID, out xmlData))
|
||||
{
|
||||
d = new XmlDocument();
|
||||
d.LoadXml(xmlData);
|
||||
m_log.InfoFormat("[ATTACHMENT]: Found saved state for item {0}, loading it", attach.ItemID);
|
||||
}
|
||||
|
||||
// If we're an NPC then skip all the item checks and manipulations since we don't have an
|
||||
// inventory right now.
|
||||
if (sp.PresenceType == PresenceType.Npc)
|
||||
RezSingleAttachmentFromInventoryInternal(sp, UUID.Zero, attach.AssetID, p, null);
|
||||
else
|
||||
RezSingleAttachmentFromInventory(sp, attach.ItemID, p);
|
||||
RezSingleAttachmentFromInventory(sp, attach.ItemID, p, true, d);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -147,7 +194,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||
}
|
||||
}
|
||||
|
||||
public void SaveChangedAttachments(IScenePresence sp)
|
||||
public void SaveChangedAttachments(IScenePresence sp, bool saveAllScripted)
|
||||
{
|
||||
// m_log.DebugFormat("[ATTACHMENTS MODULE]: Saving changed attachments for {0}", sp.Name);
|
||||
|
||||
@@ -156,13 +203,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||
|
||||
foreach (SceneObjectGroup grp in sp.GetAttachments())
|
||||
{
|
||||
// if (grp.HasGroupChanged) // Resizer scripts?
|
||||
// {
|
||||
grp.IsAttachment = false;
|
||||
grp.AbsolutePosition = grp.RootPart.AttachedPos;
|
||||
UpdateKnownItem(sp, grp);
|
||||
grp.IsAttachment = true;
|
||||
// }
|
||||
grp.IsAttachment = false;
|
||||
grp.AbsolutePosition = grp.RootPart.AttachedPos;
|
||||
UpdateKnownItem(sp, grp, saveAllScripted);
|
||||
grp.IsAttachment = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -464,9 +508,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||
/// </remarks>
|
||||
/// <param name="sp"></param>
|
||||
/// <param name="grp"></param>
|
||||
private void UpdateKnownItem(IScenePresence sp, SceneObjectGroup grp)
|
||||
private void UpdateKnownItem(IScenePresence sp, SceneObjectGroup grp, bool saveAllScripted)
|
||||
{
|
||||
if (grp.HasGroupChanged || grp.ContainsScripts())
|
||||
// Saving attachments for NPCs messes them up for the real owner!
|
||||
INPCModule module = m_scene.RequestModuleInterface<INPCModule>();
|
||||
if (module != null)
|
||||
{
|
||||
if (module.IsNPC(sp.UUID, m_scene))
|
||||
return;
|
||||
}
|
||||
|
||||
if (grp.HasGroupChanged || (saveAllScripted && grp.ContainsScripts()))
|
||||
{
|
||||
m_log.DebugFormat(
|
||||
"[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}",
|
||||
@@ -499,6 +551,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||
if (sp.ControllingClient != null)
|
||||
sp.ControllingClient.SendInventoryItemCreateUpdate(item, 0);
|
||||
}
|
||||
grp.HasGroupChanged = false; // Prevent it being saved over and over
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -692,7 +745,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||
group.IsAttachment = false;
|
||||
group.AbsolutePosition = group.RootPart.AttachedPos;
|
||||
|
||||
UpdateKnownItem(sp, group);
|
||||
UpdateKnownItem(sp, group, true);
|
||||
m_scene.DeleteSceneObject(group, false);
|
||||
|
||||
return;
|
||||
@@ -753,6 +806,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||
if (tainted)
|
||||
objatt.HasGroupChanged = true;
|
||||
|
||||
if (doc != null)
|
||||
{
|
||||
objatt.LoadScriptState(doc);
|
||||
objatt.ResetOwnerChangeFlag();
|
||||
}
|
||||
|
||||
// Fire after attach, so we don't get messy perms dialogs
|
||||
// 4 == AttachedRez
|
||||
objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 4);
|
||||
@@ -769,20 +828,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||
"[ATTACHMENTS MODULE]: Could not retrieve item {0} for attaching to avatar {1} at point {2}",
|
||||
itemID, sp.Name, attachmentPt);
|
||||
}
|
||||
|
||||
if (doc != null)
|
||||
{
|
||||
objatt.LoadScriptState(doc);
|
||||
objatt.ResetOwnerChangeFlag();
|
||||
}
|
||||
|
||||
// Fire after attach, so we don't get messy perms dialogs
|
||||
// 4 == AttachedRez
|
||||
objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 4);
|
||||
objatt.ResumeScripts();
|
||||
|
||||
// Do this last so that event listeners have access to all the effects of the attachment
|
||||
m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, sp.UUID);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,16 +26,15 @@
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
using System.Text;
|
||||
using System.Timers;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
|
||||
using System.Threading;
|
||||
using System.Timers;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Services.Interfaces;
|
||||
@@ -45,6 +44,9 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||
public class AvatarFactoryModule : IAvatarFactoryModule, IRegionModule
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public const string BAKED_TEXTURES_REPORT_FORMAT = "{0,-9} {1}";
|
||||
|
||||
private Scene m_scene = null;
|
||||
|
||||
private int m_savetime = 5; // seconds to wait before saving changed appearance
|
||||
@@ -147,16 +149,21 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||
// Process the baked texture array
|
||||
if (textureEntry != null)
|
||||
{
|
||||
m_log.InfoFormat("[AVFACTORY]: Received texture update for {0} {1}", sp.Name, sp.UUID);
|
||||
|
||||
// WriteBakedTexturesReport(sp, m_log.DebugFormat);
|
||||
|
||||
changed = sp.Appearance.SetTextureEntries(textureEntry) || changed;
|
||||
|
||||
m_log.InfoFormat("[AVFACTORY]: received texture update for {0}", sp.UUID);
|
||||
Util.FireAndForget(delegate(object o) { ValidateBakedTextureCache(sp, false); });
|
||||
// WriteBakedTexturesReport(sp, m_log.DebugFormat);
|
||||
if (!ValidateBakedTextureCache(sp))
|
||||
RequestRebake(sp, true);
|
||||
|
||||
// This appears to be set only in the final stage of the appearance
|
||||
// update transaction. In theory, we should be able to do an immediate
|
||||
// appearance send and save here.
|
||||
|
||||
}
|
||||
|
||||
// save only if there were changes, send no matter what (doesn't hurt to send twice)
|
||||
if (changed)
|
||||
QueueAppearanceSave(sp.ControllingClient.AgentId);
|
||||
@@ -245,18 +252,12 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check for the existence of the baked texture assets.
|
||||
/// </summary>
|
||||
/// <param name="sp"></param>
|
||||
public bool ValidateBakedTextureCache(IScenePresence sp)
|
||||
{
|
||||
return ValidateBakedTextureCache(sp, true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Queue up a request to send appearance, makes it possible to
|
||||
/// accumulate changes without sending out each one separately.
|
||||
/// Queue up a request to send appearance.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Makes it possible to accumulate changes without sending out each one separately.
|
||||
/// </remarks>
|
||||
/// <param name="agentId"></param>
|
||||
public void QueueAppearanceSend(UUID agentid)
|
||||
{
|
||||
// m_log.DebugFormat("[AVFACTORY]: Queue appearance send for {0}", agentid);
|
||||
@@ -283,17 +284,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region AvatarFactoryModule private methods
|
||||
|
||||
/// <summary>
|
||||
/// Check for the existence of the baked texture assets. Request a rebake
|
||||
/// unless checkonly is true.
|
||||
/// </summary>
|
||||
/// <param name="client"></param>
|
||||
/// <param name="checkonly"></param>
|
||||
private bool ValidateBakedTextureCache(IScenePresence sp, bool checkonly)
|
||||
public bool ValidateBakedTextureCache(IScenePresence sp)
|
||||
{
|
||||
bool defonly = true; // are we only using default textures
|
||||
|
||||
@@ -320,41 +311,67 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||
|
||||
defonly = false; // found a non-default texture reference
|
||||
|
||||
if (!CheckBakedTextureAsset(sp, face.TextureID, idx))
|
||||
{
|
||||
// the asset didn't exist if we are only checking, then we found a bad
|
||||
// one and we're done otherwise, ask for a rebake
|
||||
if (checkonly)
|
||||
return false;
|
||||
|
||||
sp.ControllingClient.SendRebakeAvatarTextures(face.TextureID);
|
||||
}
|
||||
if (m_scene.AssetService.Get(face.TextureID.ToString()) == null)
|
||||
return false;
|
||||
}
|
||||
|
||||
m_log.DebugFormat("[AVFACTORY]: Completed texture check for {0}", sp.UUID);
|
||||
m_log.DebugFormat("[AVFACTORY]: Completed texture check for {0} {1}", sp.Name, sp.UUID);
|
||||
|
||||
// If we only found default textures, then the appearance is not cached
|
||||
return (defonly ? false : true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks for the existance of a baked texture asset and
|
||||
/// requests the viewer rebake if the asset is not found
|
||||
/// </summary>
|
||||
/// <param name="sp"></param>
|
||||
/// <param name="textureID"></param>
|
||||
/// <param name="idx"></param>
|
||||
private bool CheckBakedTextureAsset(IScenePresence sp, UUID textureID, int idx)
|
||||
public int RequestRebake(IScenePresence sp, bool missingTexturesOnly)
|
||||
{
|
||||
if (m_scene.AssetService.Get(textureID.ToString()) == null)
|
||||
int texturesRebaked = 0;
|
||||
|
||||
for (int i = 0; i < AvatarAppearance.BAKE_INDICES.Length; i++)
|
||||
{
|
||||
m_log.InfoFormat("[AVFACTORY]: Missing baked texture {0} ({1}) for avatar {2}",
|
||||
textureID, idx, sp.Name);
|
||||
return false;
|
||||
int idx = AvatarAppearance.BAKE_INDICES[i];
|
||||
Primitive.TextureEntryFace face = sp.Appearance.Texture.FaceTextures[idx];
|
||||
|
||||
// if there is no texture entry, skip it
|
||||
if (face == null)
|
||||
continue;
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[AVFACTORY]: Looking for texture {0}, id {1} for {2} {3}",
|
||||
// face.TextureID, idx, client.Name, client.AgentId);
|
||||
|
||||
// if the texture is one of the "defaults" then skip it
|
||||
// this should probably be more intelligent (skirt texture doesnt matter
|
||||
// if the avatar isnt wearing a skirt) but if any of the main baked
|
||||
// textures is default then the rest should be as well
|
||||
if (face.TextureID == UUID.Zero || face.TextureID == AppearanceManager.DEFAULT_AVATAR_TEXTURE)
|
||||
continue;
|
||||
|
||||
if (missingTexturesOnly)
|
||||
{
|
||||
if (m_scene.AssetService.Get(face.TextureID.ToString()) != null)
|
||||
continue;
|
||||
else
|
||||
m_log.DebugFormat(
|
||||
"[AVFACTORY]: Missing baked texture {0} ({1}) for {2}, requesting rebake.",
|
||||
face.TextureID, idx, sp.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.DebugFormat(
|
||||
"[AVFACTORY]: Requesting rebake of {0} ({1}) for {2}.",
|
||||
face.TextureID, idx, sp.Name);
|
||||
}
|
||||
|
||||
texturesRebaked++;
|
||||
sp.ControllingClient.SendRebakeAvatarTextures(face.TextureID);
|
||||
}
|
||||
return true;
|
||||
|
||||
return texturesRebaked;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region AvatarFactoryModule private methods
|
||||
|
||||
private Dictionary<BakeType, Primitive.TextureEntryFace> GetBakedTextureFaces(ScenePresence sp)
|
||||
{
|
||||
if (sp.IsChildAgent)
|
||||
@@ -424,10 +441,13 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||
m_savequeue.Remove(avatarID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (m_savequeue.Count == 0 && m_sendqueue.Count == 0)
|
||||
m_updateTimer.Stop();
|
||||
// We must lock both queues here so that QueueAppearanceSave() or *Send() don't m_updateTimer.Start() on
|
||||
// another thread inbetween the first count calls and m_updateTimer.Stop() on this thread.
|
||||
lock (m_sendqueue)
|
||||
if (m_savequeue.Count == 0 && m_sendqueue.Count == 0)
|
||||
m_updateTimer.Stop();
|
||||
}
|
||||
}
|
||||
|
||||
private void SaveAppearance(UUID agentid)
|
||||
@@ -573,5 +593,37 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
public void WriteBakedTexturesReport(IScenePresence sp, ReportOutputAction outputAction)
|
||||
{
|
||||
outputAction("For {0} in {1}", sp.Name, m_scene.RegionInfo.RegionName);
|
||||
outputAction(BAKED_TEXTURES_REPORT_FORMAT, "Bake Type", "UUID");
|
||||
|
||||
Dictionary<BakeType, Primitive.TextureEntryFace> bakedTextures = GetBakedTextureFaces(sp.UUID);
|
||||
|
||||
foreach (BakeType bt in bakedTextures.Keys)
|
||||
{
|
||||
string rawTextureID;
|
||||
|
||||
if (bakedTextures[bt] == null)
|
||||
{
|
||||
rawTextureID = "not set";
|
||||
}
|
||||
else
|
||||
{
|
||||
rawTextureID = bakedTextures[bt].TextureID.ToString();
|
||||
|
||||
if (m_scene.AssetService.Get(rawTextureID) == null)
|
||||
rawTextureID += " (not found)";
|
||||
else
|
||||
rawTextureID += " (uploaded)";
|
||||
}
|
||||
|
||||
outputAction(BAKED_TEXTURES_REPORT_FORMAT, bt, rawTextureID);
|
||||
}
|
||||
|
||||
bool bakedTextureValid = m_scene.AvatarFactory.ValidateBakedTextureCache(sp);
|
||||
outputAction("{0} baked appearance texture is {1}", sp.Name, bakedTextureValid ? "OK" : "corrupt");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -54,8 +54,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||
m_FriendsModule = fmodule;
|
||||
}
|
||||
|
||||
public override byte[] Handle(string path, Stream requestData,
|
||||
OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||
public override byte[] Handle(
|
||||
string path, Stream requestData, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
StreamReader sr = new StreamReader(requestData);
|
||||
string body = sr.ReadToEnd();
|
||||
|
||||
@@ -50,6 +50,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
IUserManagement m_uMan;
|
||||
IUserManagement UserManagementModule
|
||||
{
|
||||
get
|
||||
{
|
||||
if (m_uMan == null)
|
||||
m_uMan = m_Scenes[0].RequestModuleInterface<IUserManagement>();
|
||||
return m_uMan;
|
||||
}
|
||||
}
|
||||
|
||||
#region ISharedRegionModule
|
||||
public override string Name
|
||||
{
|
||||
@@ -369,9 +380,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||
protected override FriendInfo[] GetFriendsFromService(IClientAPI client)
|
||||
{
|
||||
// m_log.DebugFormat("[HGFRIENDS MODULE]: Entering GetFriendsFromService for {0}", client.Name);
|
||||
Boolean agentIsLocal = true;
|
||||
if (UserManagementModule != null)
|
||||
agentIsLocal = UserManagementModule.IsLocalGridUser(client.AgentId);
|
||||
|
||||
UserAccount account1 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, client.AgentId);
|
||||
if (account1 != null)
|
||||
if (agentIsLocal)
|
||||
return base.GetFriendsFromService(client);
|
||||
|
||||
FriendInfo[] finfos = new FriendInfo[0];
|
||||
@@ -392,16 +405,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||
|
||||
protected override bool StoreRights(UUID agentID, UUID friendID, int rights)
|
||||
{
|
||||
UserAccount account1 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID);
|
||||
UserAccount account2 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, friendID);
|
||||
Boolean agentIsLocal = true;
|
||||
Boolean friendIsLocal = true;
|
||||
if (UserManagementModule != null)
|
||||
{
|
||||
agentIsLocal = UserManagementModule.IsLocalGridUser(agentID);
|
||||
friendIsLocal = UserManagementModule.IsLocalGridUser(friendID);
|
||||
}
|
||||
|
||||
// Are they both local users?
|
||||
if (account1 != null && account2 != null)
|
||||
if (agentIsLocal && friendIsLocal)
|
||||
{
|
||||
// local grid users
|
||||
return base.StoreRights(agentID, friendID, rights);
|
||||
}
|
||||
|
||||
if (account1 != null) // agent is local, friend is foreigner
|
||||
if (agentIsLocal) // agent is local, friend is foreigner
|
||||
{
|
||||
FriendInfo[] finfos = GetFriends(agentID);
|
||||
FriendInfo finfo = GetFriend(finfos, friendID);
|
||||
@@ -412,7 +431,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||
}
|
||||
}
|
||||
|
||||
if (account2 != null) // agent is foreigner, friend is local
|
||||
if (friendIsLocal) // agent is foreigner, friend is local
|
||||
{
|
||||
string agentUUI = GetUUI(friendID, agentID);
|
||||
if (agentUUI != string.Empty)
|
||||
@@ -427,10 +446,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||
|
||||
protected override void StoreBackwards(UUID friendID, UUID agentID)
|
||||
{
|
||||
UserAccount account1 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID);
|
||||
UserAccount account2 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, friendID);
|
||||
Boolean agentIsLocal = true;
|
||||
Boolean friendIsLocal = true;
|
||||
if (UserManagementModule != null)
|
||||
{
|
||||
agentIsLocal = UserManagementModule.IsLocalGridUser(agentID);
|
||||
friendIsLocal = UserManagementModule.IsLocalGridUser(friendID);
|
||||
}
|
||||
|
||||
// Are they both local users?
|
||||
if (account1 != null && account2 != null)
|
||||
if (agentIsLocal && friendIsLocal)
|
||||
{
|
||||
// local grid users
|
||||
m_log.DebugFormat("[HGFRIENDS MODULE]: Users are both local");
|
||||
@@ -444,10 +469,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||
|
||||
protected override void StoreFriendships(UUID agentID, UUID friendID)
|
||||
{
|
||||
UserAccount agentAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID);
|
||||
UserAccount friendAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, friendID);
|
||||
Boolean agentIsLocal = true;
|
||||
Boolean friendIsLocal = true;
|
||||
if (UserManagementModule != null)
|
||||
{
|
||||
agentIsLocal = UserManagementModule.IsLocalGridUser(agentID);
|
||||
friendIsLocal = UserManagementModule.IsLocalGridUser(friendID);
|
||||
}
|
||||
|
||||
// Are they both local users?
|
||||
if (agentAccount != null && friendAccount != null)
|
||||
if (agentIsLocal && friendIsLocal)
|
||||
{
|
||||
// local grid users
|
||||
m_log.DebugFormat("[HGFRIENDS MODULE]: Users are both local");
|
||||
@@ -484,7 +515,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||
// Generate a random 8-character hex number that will sign this friendship
|
||||
string secret = UUID.Random().ToString().Substring(0, 8);
|
||||
|
||||
if (agentAccount != null) // agent is local, 'friend' is foreigner
|
||||
if (agentIsLocal) // agent is local, 'friend' is foreigner
|
||||
{
|
||||
// This may happen when the agent returned home, in which case the friend is not there
|
||||
// We need to look for its information in the friends list itself
|
||||
@@ -520,7 +551,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||
friendsConn.NewFriendship(friendID, agentUUI + ";" + secret);
|
||||
}
|
||||
}
|
||||
else if (friendAccount != null) // 'friend' is local, agent is foreigner
|
||||
else if (friendIsLocal) // 'friend' is local, agent is foreigner
|
||||
{
|
||||
// store in the local friends service a reference to the foreign agent
|
||||
FriendsService.StoreFriend(friendID.ToString(), agentUUI + ";" + secret, 1);
|
||||
@@ -553,10 +584,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||
|
||||
protected override bool DeleteFriendship(UUID agentID, UUID exfriendID)
|
||||
{
|
||||
UserAccount agentAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID);
|
||||
UserAccount friendAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, exfriendID);
|
||||
Boolean agentIsLocal = true;
|
||||
Boolean friendIsLocal = true;
|
||||
if (UserManagementModule != null)
|
||||
{
|
||||
agentIsLocal = UserManagementModule.IsLocalGridUser(agentID);
|
||||
friendIsLocal = UserManagementModule.IsLocalGridUser(exfriendID);
|
||||
}
|
||||
|
||||
// Are they both local users?
|
||||
if (agentAccount != null && friendAccount != null)
|
||||
if (agentIsLocal && friendIsLocal)
|
||||
{
|
||||
// local grid users
|
||||
return base.DeleteFriendship(agentID, exfriendID);
|
||||
@@ -566,7 +603,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||
string agentUUI = string.Empty;
|
||||
string friendUUI = string.Empty;
|
||||
|
||||
if (agentAccount != null) // agent is local, 'friend' is foreigner
|
||||
if (agentIsLocal) // agent is local, 'friend' is foreigner
|
||||
{
|
||||
// We need to look for its information in the friends list itself
|
||||
FriendInfo[] finfos = GetFriends(agentID);
|
||||
@@ -587,7 +624,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (friendAccount != null) // agent is foreigner, 'friend' is local
|
||||
else if (friendIsLocal) // agent is foreigner, 'friend' is local
|
||||
{
|
||||
agentUUI = GetUUI(exfriendID, agentID);
|
||||
|
||||
|
||||
@@ -111,8 +111,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods
|
||||
}
|
||||
|
||||
private string HandleUntrustedSimulatorMessage(string request,
|
||||
string path, string param, OSHttpRequest httpRequest,
|
||||
OSHttpResponse httpResponse)
|
||||
string path, string param, IOSHttpRequest httpRequest,
|
||||
IOSHttpResponse httpResponse)
|
||||
{
|
||||
OSDMap osd = (OSDMap)OSDParser.DeserializeLLSDXml(request);
|
||||
|
||||
|
||||
@@ -180,10 +180,9 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
||||
|
||||
// m_log.DebugFormat("[HG INSTANT MESSAGE]: Delivering IM to {0} via XMLRPC", im.toAgentID);
|
||||
// Is the user a local user?
|
||||
UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, toAgentID);
|
||||
string url = string.Empty;
|
||||
bool foreigner = false;
|
||||
if (account == null) // foreign user
|
||||
if (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(toAgentID)) // foreign user
|
||||
{
|
||||
url = UserManagementModule.GetUserServerURL(toAgentID, "IMServerURI");
|
||||
foreigner = true;
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Timers;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
@@ -42,6 +43,10 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
||||
private static readonly ILog m_log = LogManager.GetLogger(
|
||||
MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private Timer m_logTimer = new Timer(10000);
|
||||
private List<GridInstantMessage> m_logData = new List<GridInstantMessage>();
|
||||
private string m_restUrl;
|
||||
|
||||
/// <value>
|
||||
/// Is this module enabled?
|
||||
/// </value>
|
||||
@@ -61,9 +66,12 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
||||
"InstantMessageModule", "InstantMessageModule") !=
|
||||
"InstantMessageModule")
|
||||
return;
|
||||
m_restUrl = config.Configs["Messaging"].GetString("LogURL", String.Empty);
|
||||
}
|
||||
|
||||
m_enabled = true;
|
||||
m_logTimer.AutoReset = false;
|
||||
m_logTimer.Elapsed += LogTimerElapsed;
|
||||
}
|
||||
|
||||
public void AddRegion(Scene scene)
|
||||
@@ -148,6 +156,9 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
||||
{
|
||||
byte dialog = im.dialog;
|
||||
|
||||
if (client != null && dialog == (byte)InstantMessageDialog.MessageFromAgent)
|
||||
LogInstantMesssage(im);
|
||||
|
||||
if (dialog != (byte)InstantMessageDialog.MessageFromAgent
|
||||
&& dialog != (byte)InstantMessageDialog.StartTyping
|
||||
&& dialog != (byte)InstantMessageDialog.StopTyping
|
||||
@@ -226,5 +237,35 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
||||
//
|
||||
OnInstantMessage(null, msg);
|
||||
}
|
||||
|
||||
private void LogInstantMesssage(GridInstantMessage im)
|
||||
{
|
||||
if (m_logData.Count < 20)
|
||||
{
|
||||
// Restart the log write timer
|
||||
m_logTimer.Stop();
|
||||
}
|
||||
if (!m_logTimer.Enabled)
|
||||
m_logTimer.Start();
|
||||
|
||||
lock (m_logData)
|
||||
{
|
||||
m_logData.Add(im);
|
||||
}
|
||||
}
|
||||
|
||||
private void LogTimerElapsed(object source, ElapsedEventArgs e)
|
||||
{
|
||||
lock (m_logData)
|
||||
{
|
||||
if (m_restUrl != String.Empty && m_logData.Count > 0)
|
||||
{
|
||||
bool success = SynchronousRestObjectRequester.MakeRequest<List<GridInstantMessage>, bool>("POST", m_restUrl + "/LogMessages/", m_logData);
|
||||
if (!success)
|
||||
m_log.ErrorFormat("[INSTANT MESSAGE]: Failed to save log data");
|
||||
}
|
||||
m_logData.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -146,20 +146,13 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
||||
ScenePresence sp = scene.GetScenePresence(toAgentID);
|
||||
if (sp != null && !sp.IsChildAgent)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[INSTANT MESSAGE]: Looking for root agent {0} in {1}",
|
||||
// toAgentID.ToString(), scene.RegionInfo.RegionName);
|
||||
|
||||
ScenePresence user = (ScenePresence) scene.Entities[toAgentID];
|
||||
if (!user.IsChildAgent)
|
||||
{
|
||||
// m_log.DebugFormat("[INSTANT MESSAGE]: Delivering to client");
|
||||
user.ControllingClient.SendInstantMessage(im);
|
||||
// Local message
|
||||
// m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to root agent {0} {1}", user.Name, toAgentID);
|
||||
sp.ControllingClient.SendInstantMessage(im);
|
||||
|
||||
// Message sent
|
||||
result(true);
|
||||
return;
|
||||
}
|
||||
// Message sent
|
||||
result(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,10 +165,8 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
||||
if (sp != null)
|
||||
{
|
||||
// Local message
|
||||
ScenePresence user = (ScenePresence) scene.Entities[toAgentID];
|
||||
|
||||
// m_log.DebugFormat("[INSTANT MESSAGE]: Delivering to client");
|
||||
user.ControllingClient.SendInstantMessage(im);
|
||||
// m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to child agent {0} {1}", user.Name, toAgentID);
|
||||
sp.ControllingClient.SendInstantMessage(im);
|
||||
|
||||
// Message sent
|
||||
result(true);
|
||||
|
||||
@@ -212,7 +212,8 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
||||
im.dialog != (byte)InstantMessageDialog.MessageFromAgent &&
|
||||
im.dialog != (byte)InstantMessageDialog.GroupNotice &&
|
||||
im.dialog != (byte)InstantMessageDialog.GroupInvitation &&
|
||||
im.dialog != (byte)InstantMessageDialog.InventoryOffered)
|
||||
im.dialog != (byte)InstantMessageDialog.InventoryOffered &&
|
||||
im.dialog != (byte)InstantMessageDialog.TaskInventoryOffered)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -493,7 +493,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||
}
|
||||
else
|
||||
{
|
||||
sceneObjects.Add(SceneObjectSerializer.FromOriginalXmlFormat(xmlData));
|
||||
SceneObjectGroup deserializedObject = SceneObjectSerializer.FromOriginalXmlFormat(xmlData);
|
||||
|
||||
if (deserializedObject != null)
|
||||
sceneObjects.Add(deserializedObject);
|
||||
}
|
||||
|
||||
foreach (SceneObjectGroup sog in sceneObjects)
|
||||
|
||||
@@ -412,7 +412,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||
{
|
||||
int majorVersion, minorVersion;
|
||||
|
||||
if (options.ContainsKey("profile"))
|
||||
if (options.ContainsKey("home"))
|
||||
{
|
||||
majorVersion = 1;
|
||||
minorVersion = 2;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user