Compare commits
2421 Commits
Author | SHA1 | Date |
---|---|---|
UbitUmarov | 4f00fb2659 | |
UbitUmarov | 87b55a0627 | |
UbitUmarov | 3b06891252 | |
UbitUmarov | 111c741f1b | |
UbitUmarov | 1c37f357b3 | |
UbitUmarov | c19a0cc21f | |
UbitUmarov | c575c211f9 | |
UbitUmarov | bd2476c61e | |
UbitUmarov | d52b794828 | |
UbitUmarov | cbc8974245 | |
UbitUmarov | e2982fbadc | |
UbitUmarov | c4a0b8fa3f | |
UbitUmarov | be5c2bb212 | |
UbitUmarov | 0c716cbd73 | |
UbitUmarov | e08ca7402c | |
UbitUmarov | d9a680703f | |
UbitUmarov | e0aff5e640 | |
UbitUmarov | bb56157c92 | |
UbitUmarov | 6fafb7462d | |
UbitUmarov | c077cfdd78 | |
UbitUmarov | c2af3a5474 | |
UbitUmarov | 25582af3dc | |
UbitUmarov | 03e3078a9f | |
UbitUmarov | 6e15cf41a4 | |
UbitUmarov | 53b9f87da6 | |
UbitUmarov | baa95b8707 | |
UbitUmarov | 730c864df8 | |
UbitUmarov | ce92ee1057 | |
UbitUmarov | 7a55f82f74 | |
UbitUmarov | 1f822c6077 | |
UbitUmarov | f7104a66a5 | |
UbitUmarov | 4176e1491e | |
UbitUmarov | 4bc74139a4 | |
UbitUmarov | 402186844c | |
UbitUmarov | 6a27f3fb20 | |
UbitUmarov | 6c5bf4ed25 | |
UbitUmarov | f32c0ead05 | |
UbitUmarov | b2068fd39f | |
UbitUmarov | ba972b50ed | |
UbitUmarov | fe7d9625aa | |
UbitUmarov | 6ba5b78851 | |
UbitUmarov | 541cb15751 | |
UbitUmarov | ebf5b69283 | |
UbitUmarov | 82ccf57533 | |
UbitUmarov | fe5e6d4189 | |
UbitUmarov | 01b4f83421 | |
UbitUmarov | f334c1206f | |
UbitUmarov | 107ece1ce0 | |
UbitUmarov | af6fa37cc2 | |
UbitUmarov | 28fcbc65f9 | |
UbitUmarov | e5c2bd505c | |
UbitUmarov | 5b596bb29e | |
UbitUmarov | c4f05016d7 | |
UbitUmarov | fb35f31078 | |
UbitUmarov | 7cf329c846 | |
UbitUmarov | 1c4300ff91 | |
UbitUmarov | 34fa6abc00 | |
UbitUmarov | d7fb822533 | |
UbitUmarov | 16cfb3deab | |
UbitUmarov | 27a81d4909 | |
UbitUmarov | a568b759bc | |
UbitUmarov | 71d8bcd90c | |
UbitUmarov | 86bd9ca255 | |
UbitUmarov | e2ffc17d1f | |
UbitUmarov | 73754670ca | |
UbitUmarov | b7750e52d6 | |
UbitUmarov | 63ae8a09c6 | |
UbitUmarov | 768f506a23 | |
UbitUmarov | 60da45b715 | |
UbitUmarov | 1d42d8ab6e | |
UbitUmarov | f3eb71113e | |
UbitUmarov | 7b3ac662dc | |
UbitUmarov | 16c18c0855 | |
UbitUmarov | eec92454b0 | |
UbitUmarov | 8fe2cd6c46 | |
UbitUmarov | 7b77609537 | |
UbitUmarov | 7da23b6714 | |
UbitUmarov | 53b0ee242d | |
UbitUmarov | 5b87347476 | |
UbitUmarov | e04af236f2 | |
UbitUmarov | 29bf9522e2 | |
UbitUmarov | bcacd2ff21 | |
UbitUmarov | 5b56a09cb2 | |
UbitUmarov | 17e7e9b354 | |
UbitUmarov | edf93abdbc | |
UbitUmarov | e3ecf0ddbe | |
UbitUmarov | d322248fd1 | |
UbitUmarov | dd2495be9d | |
UbitUmarov | 1b870131d4 | |
UbitUmarov | 362025be38 | |
UbitUmarov | 3c8b4423b1 | |
UbitUmarov | cca383b452 | |
UbitUmarov | f708b413a1 | |
UbitUmarov | 6cb2cb40cc | |
UbitUmarov | 8f79439558 | |
UbitUmarov | 44c90bf294 | |
UbitUmarov | 104f7f0eb2 | |
UbitUmarov | 369a2e1453 | |
UbitUmarov | e7807d4359 | |
UbitUmarov | e538628dec | |
UbitUmarov | 7a9e03876a | |
UbitUmarov | 24689f064c | |
UbitUmarov | 46dce3cedb | |
UbitUmarov | 70f867a518 | |
UbitUmarov | 24a0f0f6da | |
UbitUmarov | 833ae02121 | |
UbitUmarov | 00b2837d30 | |
UbitUmarov | 9ae867abd3 | |
UbitUmarov | 4329f5962a | |
UbitUmarov | b3ce8e9fc7 | |
UbitUmarov | 3a5d5fd50e | |
UbitUmarov | dfa69b1869 | |
UbitUmarov | d1c78564bb | |
UbitUmarov | d7089bcff2 | |
UbitUmarov | 05dc8594f0 | |
UbitUmarov | 1980c01eb8 | |
UbitUmarov | 9a18678fec | |
UbitUmarov | b37141182a | |
UbitUmarov | 3bf0f6c407 | |
UbitUmarov | e404d671c8 | |
UbitUmarov | d1ecccfaca | |
UbitUmarov | e407f69b2c | |
UbitUmarov | e8b9735f95 | |
UbitUmarov | 02ccbd0bbd | |
UbitUmarov | c6fcc33e49 | |
UbitUmarov | 13ed40d9f6 | |
UbitUmarov | 9ce70be5ce | |
UbitUmarov | 2179aa14e0 | |
UbitUmarov | efb2b67456 | |
UbitUmarov | fa0a87f1c0 | |
UbitUmarov | a61b5d5d38 | |
UbitUmarov | 8d2b502393 | |
UbitUmarov | e2be90caaf | |
UbitUmarov | 0d76635113 | |
UbitUmarov | bde4354c15 | |
UbitUmarov | fa0044fb6c | |
UbitUmarov | f4dfe2159c | |
UbitUmarov | 444a6b707b | |
UbitUmarov | 5b338fb31a | |
UbitUmarov | e1b234d9d0 | |
UbitUmarov | d3cb210080 | |
UbitUmarov | 351235f78e | |
UbitUmarov | 9c55c5bdb2 | |
UbitUmarov | 1a57abebfc | |
UbitUmarov | 775420c46a | |
UbitUmarov | b440a9534d | |
UbitUmarov | 38fc68ac0c | |
UbitUmarov | 7ef69edf33 | |
UbitUmarov | 7a07731371 | |
UbitUmarov | 84a3ff37ab | |
UbitUmarov | 301f28cfd4 | |
UbitUmarov | 2efa53af52 | |
UbitUmarov | 0a22bde6d1 | |
UbitUmarov | 3188db7041 | |
UbitUmarov | 06bdfc48d0 | |
UbitUmarov | 239c07ed9d | |
UbitUmarov | 8cebc84de7 | |
UbitUmarov | fde3727453 | |
UbitUmarov | 9b09bd255c | |
UbitUmarov | 9bd5310fe8 | |
UbitUmarov | 873b3b0af6 | |
UbitUmarov | 190acf093a | |
UbitUmarov | 43094592d5 | |
UbitUmarov | e0c49c42e3 | |
UbitUmarov | 41d9441512 | |
UbitUmarov | f0581ff1ff | |
UbitUmarov | 8ac70b6155 | |
UbitUmarov | 42b75021b6 | |
UbitUmarov | 5ac1fff43e | |
UbitUmarov | b541de034c | |
UbitUmarov | 7b8db526b3 | |
UbitUmarov | 9896224605 | |
UbitUmarov | 8f39405380 | |
UbitUmarov | 563d5d30ee | |
UbitUmarov | 182b266ec4 | |
UbitUmarov | d2dbe3f4d0 | |
UbitUmarov | 8a9ebe48ce | |
UbitUmarov | 0a48da85a3 | |
UbitUmarov | d460a3fc86 | |
UbitUmarov | 1c5b9e5af8 | |
UbitUmarov | 66eb8a2c2e | |
UbitUmarov | 5f52de2578 | |
UbitUmarov | cc4e14a88d | |
UbitUmarov | b598573f41 | |
UbitUmarov | 4679ede2f2 | |
UbitUmarov | f326cc8901 | |
UbitUmarov | 3c33d5c448 | |
UbitUmarov | 86d8f9963c | |
UbitUmarov | 8d8ead9776 | |
UbitUmarov | 6e0d82f584 | |
UbitUmarov | 35b0b77656 | |
UbitUmarov | 0bfacb7892 | |
UbitUmarov | fffac7d531 | |
UbitUmarov | 5167bd097b | |
UbitUmarov | 337832ecbe | |
UbitUmarov | 822fea4a99 | |
UbitUmarov | aca62392ac | |
UbitUmarov | 28b22a4fc1 | |
UbitUmarov | aca5728ab2 | |
UbitUmarov | e308ab8843 | |
UbitUmarov | 9ecee558b5 | |
UbitUmarov | 4fa8e20aab | |
UbitUmarov | fe72b54652 | |
UbitUmarov | 9ce52ed2fc | |
UbitUmarov | dc5a0244fc | |
UbitUmarov | cfe1285869 | |
UbitUmarov | 65ca238cd7 | |
UbitUmarov | baf5c61387 | |
UbitUmarov | 48892ad8a7 | |
UbitUmarov | 7098091616 | |
UbitUmarov | c0597e278b | |
UbitUmarov | 79bb22eaf6 | |
UbitUmarov | 214cf5d60b | |
UbitUmarov | 5848d3a6bb | |
UbitUmarov | 67bc086782 | |
UbitUmarov | 8b77162020 | |
UbitUmarov | dd55a3d19c | |
UbitUmarov | af1e20d054 | |
UbitUmarov | 4c7107dfda | |
UbitUmarov | f15c6be20c | |
UbitUmarov | a2c7a13065 | |
UbitUmarov | 51bc19f1ab | |
UbitUmarov | d613287a77 | |
UbitUmarov | c63fabe054 | |
UbitUmarov | 48df8869e8 | |
UbitUmarov | 6a4564869b | |
UbitUmarov | 7c0b3387dd | |
UbitUmarov | c40b297fc7 | |
UbitUmarov | 4bf4c76a64 | |
UbitUmarov | 8da733c485 | |
UbitUmarov | 713c222ec8 | |
UbitUmarov | 7f3bb9267a | |
UbitUmarov | 6d92b75452 | |
UbitUmarov | 2629d9d901 | |
UbitUmarov | c15869438c | |
UbitUmarov | aafc6579a1 | |
UbitUmarov | c1d69018bd | |
UbitUmarov | a367828a85 | |
UbitUmarov | ea11f1aeb8 | |
UbitUmarov | bcb9ab29d7 | |
UbitUmarov | fa5b4dc5d8 | |
UbitUmarov | 72c1c923f8 | |
UbitUmarov | c2c00c5d84 | |
UbitUmarov | f38c5d7ac2 | |
UbitUmarov | bf218f2cef | |
UbitUmarov | f70f0b5ffd | |
UbitUmarov | f0fc1f628f | |
UbitUmarov | 1908c095d3 | |
UbitUmarov | 58a4f45712 | |
UbitUmarov | 6c49f16132 | |
UbitUmarov | ac7187eada | |
UbitUmarov | d5baeb4690 | |
UbitUmarov | 1e8e59e635 | |
UbitUmarov | 41d7d2f2f4 | |
UbitUmarov | 0b0b5111df | |
UbitUmarov | 6d030e2f2b | |
UbitUmarov | 1ad3a256f2 | |
UbitUmarov | ab14241871 | |
UbitUmarov | 929fa3efbd | |
UbitUmarov | 5fa81a6ca9 | |
UbitUmarov | 22c28a0260 | |
UbitUmarov | 36d005e1cc | |
UbitUmarov | 003b109561 | |
UbitUmarov | b023914cc0 | |
UbitUmarov | 715c7a4825 | |
UbitUmarov | 52f50d2035 | |
UbitUmarov | 88a81a9ca4 | |
UbitUmarov | c289b83250 | |
UbitUmarov | 5da135a90b | |
UbitUmarov | ae15b75f79 | |
UbitUmarov | b0e1347cd0 | |
UbitUmarov | 693adf9ecf | |
UbitUmarov | 6c349e6534 | |
UbitUmarov | d42c7e5e32 | |
UbitUmarov | b069b668e4 | |
UbitUmarov | c39ffa4dd1 | |
UbitUmarov | 7b5934ea26 | |
UbitUmarov | 3a21d4de1e | |
UbitUmarov | 7a8a7c7168 | |
UbitUmarov | bff6be4f66 | |
UbitUmarov | f9e3c9adab | |
UbitUmarov | 3482259518 | |
UbitUmarov | 1f7286fb95 | |
UbitUmarov | 0b29bff512 | |
UbitUmarov | 1abc6149bb | |
UbitUmarov | d8b182afff | |
UbitUmarov | b6a02269f7 | |
UbitUmarov | dee822208a | |
UbitUmarov | 7e2ed9ee2b | |
UbitUmarov | bfcbdc8a93 | |
UbitUmarov | 5929e43c2c | |
UbitUmarov | 27ea249194 | |
UbitUmarov | b4fc5c33ec | |
UbitUmarov | 04b28f206a | |
UbitUmarov | 6d66770228 | |
UbitUmarov | b5067baa4a | |
UbitUmarov | 89dee19060 | |
UbitUmarov | fa844d7e6e | |
UbitUmarov | 0518b397a3 | |
UbitUmarov | a3cd0cbfcb | |
UbitUmarov | 9d08f8307e | |
UbitUmarov | 6ffb5bcf23 | |
UbitUmarov | 8526f938f7 | |
UbitUmarov | 8900d1139e | |
UbitUmarov | 6050eff683 | |
UbitUmarov | b68748507d | |
UbitUmarov | c07f4f3c41 | |
UbitUmarov | 05f098be56 | |
UbitUmarov | 473dba93e8 | |
UbitUmarov | e0418da6e1 | |
UbitUmarov | e63231887b | |
UbitUmarov | dcc2f764f2 | |
UbitUmarov | 70d2878d0a | |
UbitUmarov | cafe49d44b | |
UbitUmarov | d44baf20cd | |
UbitUmarov | 2d1900165b | |
UbitUmarov | 0348c01ce7 | |
UbitUmarov | 830b034b81 | |
UbitUmarov | 8fb4b2f4e3 | |
UbitUmarov | 5bde41b30f | |
UbitUmarov | 605a01fe6e | |
UbitUmarov | 99658309ce | |
UbitUmarov | ee77a6d80b | |
UbitUmarov | 80de74e127 | |
UbitUmarov | 7f2cfe734b | |
UbitUmarov | eae9928961 | |
UbitUmarov | 288dffcda1 | |
UbitUmarov | e48d2f2c1f | |
UbitUmarov | 23961abf8a | |
UbitUmarov | bac6890391 | |
UbitUmarov | 07caee4956 | |
UbitUmarov | 84cd4b4808 | |
UbitUmarov | 3d09ff57f0 | |
UbitUmarov | 7856192da6 | |
UbitUmarov | ba8d188a0d | |
UbitUmarov | 76019258e3 | |
UbitUmarov | 899620bc13 | |
UbitUmarov | f955482dfd | |
UbitUmarov | 8d2f90a8e2 | |
UbitUmarov | 9000240238 | |
UbitUmarov | ca5756a100 | |
UbitUmarov | f2a025bc41 | |
UbitUmarov | 6cd822fd83 | |
UbitUmarov | 7a24d8af52 | |
UbitUmarov | 9a5a811c7d | |
UbitUmarov | 426d83c535 | |
UbitUmarov | 46162e620a | |
UbitUmarov | 10988fe980 | |
UbitUmarov | 0fe51f34c2 | |
UbitUmarov | e818c570bb | |
UbitUmarov | 5a51553e7d | |
UbitUmarov | fefcda52f5 | |
UbitUmarov | 92518129ee | |
UbitUmarov | 212c25f906 | |
UbitUmarov | 6b6baa9e51 | |
UbitUmarov | 1475b83699 | |
UbitUmarov | 50b81258a9 | |
UbitUmarov | 43fdbf87d4 | |
UbitUmarov | c097f148dd | |
UbitUmarov | e2f84f0c1f | |
UbitUmarov | 4ab8da01bc | |
UbitUmarov | bdddedc550 | |
UbitUmarov | e859985cfa | |
UbitUmarov | 7572a60993 | |
UbitUmarov | a6abc3d2b6 | |
UbitUmarov | 944f3dd7ec | |
UbitUmarov | f20845c89e | |
UbitUmarov | 8baab939d2 | |
UbitUmarov | 920a26eeec | |
UbitUmarov | b419f71a68 | |
UbitUmarov | e0ba96055c | |
UbitUmarov | 745a469af8 | |
UbitUmarov | d1f1324a2d | |
UbitUmarov | bbc5d5bc2d | |
UbitUmarov | f95925e0fd | |
UbitUmarov | 7ce9f890b1 | |
UbitUmarov | 0d940df4e2 | |
UbitUmarov | 1c6d454691 | |
UbitUmarov | 6fea9dafaf | |
UbitUmarov | 50cd0ab982 | |
UbitUmarov | 0a1e1ae9e0 | |
UbitUmarov | 7ecc9408a9 | |
UbitUmarov | 05c77f9342 | |
UbitUmarov | c99014991b | |
UbitUmarov | 523d6dd2da | |
UbitUmarov | f976d10de2 | |
UbitUmarov | f0f067d05c | |
UbitUmarov | b4eb5d6cca | |
UbitUmarov | 29f59fe407 | |
UbitUmarov | 3989dbac31 | |
UbitUmarov | 0a4232430b | |
UbitUmarov | 50b8c90b42 | |
UbitUmarov | f1761a5b6c | |
UbitUmarov | 4af5dfa0d0 | |
UbitUmarov | 1e083c38ad | |
UbitUmarov | fe9df55410 | |
UbitUmarov | 67cd5efab3 | |
UbitUmarov | 650b051cdf | |
UbitUmarov | 817c2b3bb9 | |
UbitUmarov | e558dd3ac6 | |
UbitUmarov | ef49ac7049 | |
UbitUmarov | 2e66f8dbdf | |
UbitUmarov | 0958eceadd | |
UbitUmarov | 87646f340b | |
UbitUmarov | 1002987aea | |
UbitUmarov | 918f56d682 | |
UbitUmarov | 8e6fc69a11 | |
UbitUmarov | 0a4a3199f5 | |
UbitUmarov | f1204e2147 | |
UbitUmarov | 9ce4b8914b | |
UbitUmarov | 010f091dd4 | |
UbitUmarov | 9864d1abfc | |
UbitUmarov | f2c0957f5a | |
UbitUmarov | ac43124a93 | |
UbitUmarov | 59d3f9fa62 | |
UbitUmarov | 5401e323dc | |
UbitUmarov | cfef190424 | |
UbitUmarov | 63c5da539f | |
UbitUmarov | 5f76a62d29 | |
UbitUmarov | b292950b1c | |
UbitUmarov | beee52032e | |
UbitUmarov | c172adbaec | |
UbitUmarov | e4f7a1c07a | |
UbitUmarov | 033f6f889d | |
UbitUmarov | 2e9417bd01 | |
UbitUmarov | cf5630f2f7 | |
UbitUmarov | 3956fbe496 | |
UbitUmarov | 98de42eedc | |
UbitUmarov | 38b93a0f50 | |
UbitUmarov | abe26f39f6 | |
UbitUmarov | 1df06f459a | |
UbitUmarov | 8728e4cf2f | |
UbitUmarov | ad601c9502 | |
UbitUmarov | 20b974cff0 | |
UbitUmarov | ed34c00956 | |
UbitUmarov | d0ba9f84df | |
UbitUmarov | 248d56d3ad | |
UbitUmarov | 6684c35bb0 | |
UbitUmarov | 25b4a310f5 | |
UbitUmarov | c30cb8a9cf | |
UbitUmarov | be16cf9531 | |
UbitUmarov | 97cb6254ef | |
UbitUmarov | 904553cdb3 | |
UbitUmarov | d3b1465444 | |
UbitUmarov | cf948d56a1 | |
UbitUmarov | 7e9ce0929d | |
UbitUmarov | 693492a3f1 | |
UbitUmarov | dc225e348d | |
UbitUmarov | 71b5ca95e6 | |
UbitUmarov | e76006aff5 | |
UbitUmarov | 49386d34e5 | |
UbitUmarov | af7d09c6b5 | |
UbitUmarov | 4d67fdfa9d | |
UbitUmarov | 3707301c59 | |
UbitUmarov | 665037e366 | |
UbitUmarov | 22e201bb49 | |
UbitUmarov | 7ef657c415 | |
UbitUmarov | d1df9c9ee5 | |
UbitUmarov | 8c74e47557 | |
UbitUmarov | c2ca5a699d | |
UbitUmarov | ad5aff2d17 | |
UbitUmarov | 94f88e330b | |
UbitUmarov | ea8eeaa307 | |
UbitUmarov | 7d7fc8f06a | |
UbitUmarov | 20d77d3905 | |
UbitUmarov | 771381558e | |
UbitUmarov | 6dd5ea0c96 | |
UbitUmarov | 828a3bb7f8 | |
UbitUmarov | ca48bf4117 | |
UbitUmarov | c9137912c9 | |
UbitUmarov | ceb9289f13 | |
UbitUmarov | d47ce25b5b | |
UbitUmarov | 6cadcb8bdf | |
UbitUmarov | df2536c407 | |
UbitUmarov | 1de010e969 | |
UbitUmarov | 72d38b267e | |
UbitUmarov | 5f232077a7 | |
UbitUmarov | 270a3e3836 | |
UbitUmarov | c887446b7e | |
UbitUmarov | 60a924f3c6 | |
UbitUmarov | 0e6a7c3dac | |
UbitUmarov | 6c94f5d432 | |
UbitUmarov | 7c977f9e27 | |
UbitUmarov | d7671f3c01 | |
UbitUmarov | 8d8b5b756f | |
UbitUmarov | 6d2bb27ef7 | |
UbitUmarov | c8a95e21ee | |
UbitUmarov | b9cf2244a4 | |
UbitUmarov | c11249f1ca | |
UbitUmarov | 23aae75563 | |
UbitUmarov | e155ab7814 | |
UbitUmarov | 59414467e2 | |
UbitUmarov | 55333a5171 | |
UbitUmarov | a42085f1a9 | |
UbitUmarov | 20a08c9f41 | |
UbitUmarov | fa4602e048 | |
UbitUmarov | 0e7c19e181 | |
UbitUmarov | 75e5217fff | |
UbitUmarov | e1d5892f78 | |
UbitUmarov | f3238781cc | |
UbitUmarov | fb2380efd6 | |
UbitUmarov | 11c49c211c | |
UbitUmarov | c239269762 | |
UbitUmarov | ce72aa2eac | |
UbitUmarov | b97237b513 | |
UbitUmarov | 8cbe743440 | |
UbitUmarov | 68e7e65e2e | |
UbitUmarov | 9478e607db | |
UbitUmarov | 22227fa0b8 | |
UbitUmarov | c2ab11a51e | |
UbitUmarov | 169f161576 | |
UbitUmarov | 43fea6530f | |
UbitUmarov | c245ce3c25 | |
UbitUmarov | b2ef1545e5 | |
UbitUmarov | 88d91b68f7 | |
UbitUmarov | 8060d132b9 | |
UbitUmarov | 7a79a6ddfe | |
UbitUmarov | 4de3dc2860 | |
UbitUmarov | 18f2e25b23 | |
UbitUmarov | 3196d2fa6f | |
UbitUmarov | 662c41ddee | |
UbitUmarov | a22acd1c5c | |
UbitUmarov | 9a5844fdb9 | |
UbitUmarov | 441b4e01f6 | |
UbitUmarov | 941b65b44a | |
UbitUmarov | fdecf80016 | |
UbitUmarov | 016886b3c6 | |
UbitUmarov | f89afd2aa8 | |
UbitUmarov | fb1911d409 | |
UbitUmarov | 8075c1e363 | |
UbitUmarov | 53c9473100 | |
UbitUmarov | 76987fb647 | |
UbitUmarov | 8df27ba2a1 | |
UbitUmarov | 868c05fdf6 | |
UbitUmarov | 5bb96cf18e | |
UbitUmarov | 004cab9289 | |
UbitUmarov | 64c7e1de5b | |
UbitUmarov | 598ba5d6ae | |
UbitUmarov | f61b83b1ea | |
UbitUmarov | 2a38210fe9 | |
UbitUmarov | 33eabf1069 | |
UbitUmarov | da0ba17d1a | |
UbitUmarov | 59f41598db | |
UbitUmarov | 7adaede14a | |
UbitUmarov | 8db60ba3aa | |
UbitUmarov | 8cc02916ab | |
UbitUmarov | 3f601c9267 | |
UbitUmarov | 0bd102a397 | |
UbitUmarov | 0e1e247289 | |
UbitUmarov | b70d44eb7e | |
UbitUmarov | 80fe0c640b | |
UbitUmarov | 54370169bc | |
UbitUmarov | ad6499cc09 | |
UbitUmarov | ddef089eaa | |
UbitUmarov | f85e932f59 | |
UbitUmarov | ba174b777c | |
UbitUmarov | 28db80f100 | |
UbitUmarov | 8db2ddb07f | |
UbitUmarov | 550f64cb2d | |
UbitUmarov | 2b2b5d8bff | |
UbitUmarov | 5ad62558b3 | |
UbitUmarov | 1899a36105 | |
UbitUmarov | 62f3892cd7 | |
UbitUmarov | 6f5b7957a9 | |
UbitUmarov | f417a647db | |
UbitUmarov | c2cef470f5 | |
UbitUmarov | b9e74dd504 | |
UbitUmarov | 29a6c1d0c8 | |
UbitUmarov | ea7dd150b1 | |
UbitUmarov | d92ef598c5 | |
UbitUmarov | ac32188978 | |
UbitUmarov | 5dbcb7a99e | |
UbitUmarov | 42afa8429e | |
UbitUmarov | c54460b6f0 | |
UbitUmarov | d9d763c8f8 | |
UbitUmarov | 7bdc408cac | |
UbitUmarov | 066a6fbaa1 | |
UbitUmarov | 7516288634 | |
UbitUmarov | 60473ff44e | |
UbitUmarov | 8c21b30a51 | |
UbitUmarov | d400b2c545 | |
UbitUmarov | 449bd9beab | |
UbitUmarov | 052e4a060c | |
UbitUmarov | 5c5e4bd830 | |
UbitUmarov | b3db90db92 | |
UbitUmarov | bd15005d77 | |
UbitUmarov | e8d1493777 | |
UbitUmarov | 17e4b52171 | |
UbitUmarov | 9aa0f21ffa | |
UbitUmarov | 6e2b5ac238 | |
UbitUmarov | 14270e316a | |
UbitUmarov | 2a508edcb4 | |
UbitUmarov | 943d0935a6 | |
UbitUmarov | d5f918f945 | |
UbitUmarov | 9b7ad30ee1 | |
UbitUmarov | 647622bb02 | |
UbitUmarov | bd12d60e80 | |
UbitUmarov | 0cf3ec553a | |
UbitUmarov | 730a35eedc | |
UbitUmarov | bf0697d5f4 | |
UbitUmarov | 496a2228f5 | |
UbitUmarov | b5d2a6088c | |
UbitUmarov | 3708f504a6 | |
Diva Canto | 72362dd09c | |
Crista Lopes | 9fd2b239d9 | |
UbitUmarov | 7dd5c9ccad | |
UbitUmarov | 103ebac082 | |
UbitUmarov | 61f918cbda | |
UbitUmarov | cb97ab5c6f | |
UbitUmarov | 45625a02a2 | |
UbitUmarov | 31aef4e82b | |
Terry | 999a068172 | |
Terry | 2f79f463ea | |
UbitUmarov | eabf9a7c04 | |
UbitUmarov | d9d78c3423 | |
UbitUmarov | 5d2ffdc35b | |
UbitUmarov | 2828aa3e9b | |
UbitUmarov | 8fcecc93a6 | |
UbitUmarov | d10f11d310 | |
UbitUmarov | 9eb5fd4330 | |
UbitUmarov | 01832b3e3c | |
UbitUmarov | e87dfd48bf | |
UbitUmarov | 38a77a8bb5 | |
UbitUmarov | ee68085628 | |
UbitUmarov | 435c30c038 | |
UbitUmarov | b4d9f7ffe8 | |
UbitUmarov | f6ea22647d | |
UbitUmarov | 727216044b | |
UbitUmarov | 53339d2970 | |
UbitUmarov | 4b5a3308ad | |
UbitUmarov | ca4bb8c492 | |
UbitUmarov | bd9f6ae3f0 | |
UbitUmarov | 8ed0680bb9 | |
UbitUmarov | 926e4ea95e | |
UbitUmarov | 11a357d7fa | |
UbitUmarov | 040c8d5e9a | |
UbitUmarov | 21f86c453d | |
UbitUmarov | bae7b21e87 | |
UbitUmarov | f2cf3b201b | |
UbitUmarov | 26b5affb04 | |
UbitUmarov | 3236e24c74 | |
UbitUmarov | 5a3ba2afbb | |
UbitUmarov | 9d6a1e01f9 | |
UbitUmarov | defa235859 | |
UbitUmarov | 4797f8210c | |
UbitUmarov | b073d2ae6b | |
UbitUmarov | 3c4bc681c3 | |
UbitUmarov | bf2e0f7737 | |
UbitUmarov | be6080c3c8 | |
UbitUmarov | 46e36601cb | |
UbitUmarov | da0a8d6c43 | |
UbitUmarov | b98ad6c53c | |
UbitUmarov | d838a7e5c7 | |
UbitUmarov | 7939974d92 | |
UbitUmarov | 7f8d5bbdce | |
UbitUmarov | a7f8412644 | |
UbitUmarov | 656ea163cc | |
UbitUmarov | ab335b5926 | |
UbitUmarov | 7ed339324f | |
UbitUmarov | 24b1e84eca | |
UbitUmarov | 9d698bcffb | |
UbitUmarov | f09a18a7a8 | |
UbitUmarov | 2a90f78fe1 | |
UbitUmarov | d6abf2a2fe | |
UbitUmarov | 53c39bf25f | |
UbitUmarov | 6b930a596b | |
UbitUmarov | 5971021b5d | |
UbitUmarov | 0587dd38dc | |
UbitUmarov | 96553ecc11 | |
UbitUmarov | 1a21ab1938 | |
UbitUmarov | 45ad812457 | |
UbitUmarov | b87301f692 | |
UbitUmarov | 43bf3af138 | |
UbitUmarov | 2abf375351 | |
UbitUmarov | c7714d6320 | |
UbitUmarov | 0e3f24a67e | |
UbitUmarov | d79d7e228a | |
UbitUmarov | 77126cee00 | |
UbitUmarov | 23587391f8 | |
UbitUmarov | 6d1ad6acd5 | |
UbitUmarov | 5bbaea50e4 | |
UbitUmarov | 0273baaef6 | |
UbitUmarov | 2c1909a873 | |
UbitUmarov | 55d70f5df7 | |
Melanie | be34b8e79d | |
Melanie | eb55f7f2bc | |
Melanie | 22599fbf29 | |
Melanie | aed0eaf4d7 | |
UbitUmarov | 1b70b569ad | |
UbitUmarov | c5e2afa9f8 | |
Melanie | 09d8da7e77 | |
Melanie | abdc78d6d3 | |
UbitUmarov | 03da5a9714 | |
UbitUmarov | 39aa27af2b | |
UbitUmarov | 27a40461e2 | |
UbitUmarov | 64834a880d | |
UbitUmarov | 43b56eaf08 | |
UbitUmarov | b046ccebf2 | |
UbitUmarov | d7bf623f57 | |
UbitUmarov | 63239402ae | |
UbitUmarov | 24a977323b | |
Robert Adams | 4161182be0 | |
Robert Adams | 9956f5cb4a | |
UbitUmarov | 645c0c780d | |
UbitUmarov | 63b0bd7f6b | |
UbitUmarov | 85aa77566b | |
UbitUmarov | 5f1fde5f38 | |
UbitUmarov | 0bef393b6b | |
UbitUmarov | 025fc98262 | |
UbitUmarov | ecfa3cf7dc | |
UbitUmarov | aea5f186c5 | |
UbitUmarov | 07874fa058 | |
UbitUmarov | 9d6c996570 | |
UbitUmarov | 6aa369d858 | |
UbitUmarov | 304d72565d | |
UbitUmarov | f835960d17 | |
UbitUmarov | 93f13aa00d | |
UbitUmarov | 7771cc00c4 | |
Melanie | 3d019323e8 | |
UbitUmarov | bfc1756fe3 | |
UbitUmarov | c4904de6a7 | |
UbitUmarov | fc550e2b3e | |
UbitUmarov | 3aae1d0918 | |
UbitUmarov | 98b86c012e | |
UbitUmarov | fd252b1285 | |
UbitUmarov | eedb0a1c85 | |
UbitUmarov | ae130d9f25 | |
UbitUmarov | 38dbc03288 | |
UbitUmarov | 7cdce3e276 | |
UbitUmarov | 695821a93a | |
UbitUmarov | 0bafb36aad | |
UbitUmarov | 694ad7d8bc | |
UbitUmarov | 8938ae498f | |
UbitUmarov | c0521482ce | |
UbitUmarov | 85b615309b | |
UbitUmarov | 0e33014572 | |
UbitUmarov | 450ae4a927 | |
UbitUmarov | 562ec0eed3 | |
UbitUmarov | 7a82f9ef9f | |
UbitUmarov | 60fa28740a | |
UbitUmarov | 718c6d1e4d | |
UbitUmarov | ab92dff5be | |
Melanie | 584df2ab38 | |
UbitUmarov | c4e453d948 | |
UbitUmarov | 35e3c3dec4 | |
UbitUmarov | 030ad7f47a | |
Melanie | 110644c23a | |
Melanie | 7e136c67fd | |
Melanie | 0fd17c08ae | |
UbitUmarov | f7a496136d | |
UbitUmarov | 4acd07c0fa | |
UbitUmarov | 7f52bcbc7f | |
UbitUmarov | d5db4b9d93 | |
UbitUmarov | a687c5fce9 | |
UbitUmarov | 6b868f8682 | |
UbitUmarov | 115d69e633 | |
UbitUmarov | db374112c6 | |
UbitUmarov | eb9cf78e6b | |
UbitUmarov | 16bf737b26 | |
UbitUmarov | 64c56fc52b | |
UbitUmarov | 9ddd2e842e | |
UbitUmarov | 7d0b37faec | |
UbitUmarov | 12abb3ffe4 | |
UbitUmarov | 002ef3cd89 | |
UbitUmarov | 4812833435 | |
UbitUmarov | ffd5c5cc9c | |
Melanie | c9b7ec2af9 | |
Melanie | f332f3fc41 | |
Melanie | 34816fe1ab | |
Melanie | 0726ef5302 | |
UbitUmarov | c043008e04 | |
Melanie | c80926192a | |
Melanie | 1a8c235d58 | |
Melanie Thielker | c3e74d9e04 | |
Melanie | ba680ceecb | |
Melanie | d781742d8e | |
UbitUmarov | 21aa26d796 | |
UbitUmarov | 8d1c12dfad | |
UbitUmarov | 4ea679d9e8 | |
UbitUmarov | 1e0984b64c | |
UbitUmarov | 5b39860573 | |
UbitUmarov | 482c51a42a | |
UbitUmarov | 04eb4744df | |
UbitUmarov | 0142f102ce | |
UbitUmarov | 96dabca85b | |
UbitUmarov | 618c6ceda5 | |
UbitUmarov | 6359874d64 | |
UbitUmarov | 0bcd58fd0f | |
UbitUmarov | 1499baf13e | |
UbitUmarov | b5b518dc0d | |
TBG Renfold | 0163af970f | |
TBG Renfold | 8de67dad76 | |
UbitUmarov | cd641e8629 | |
UbitUmarov | 944a785a32 | |
UbitUmarov | 185ed42123 | |
UbitUmarov | a92b0e7716 | |
Melanie | 24aa13239c | |
Melanie | d29ffbf551 | |
Melanie | 08c9ad6a5b | |
UbitUmarov | 87eb2fa9da | |
Melanie | 08b62c8daa | |
Melanie | 1c8508cfbd | |
Melanie | 34209d2a39 | |
Melanie | d6723dab37 | |
UbitUmarov | 78359c108d | |
Melanie | 2f52a3b124 | |
Melanie | aedaa32ddc | |
UbitUmarov | d372309e3c | |
UbitUmarov | 03abb970f4 | |
UbitUmarov | 05f508229c | |
UbitUmarov | 79442c8c56 | |
UbitUmarov | b09ea5bdc7 | |
UbitUmarov | 086248c13b | |
UbitUmarov | 4b8c5ee6e8 | |
UbitUmarov | 878d0defc7 | |
UbitUmarov | da90da220e | |
UbitUmarov | 238efad690 | |
UbitUmarov | 017253fae9 | |
UbitUmarov | 2cba0d676e | |
UbitUmarov | 9ff7601214 | |
UbitUmarov | 41e2379f97 | |
UbitUmarov | 38e937f91b | |
UbitUmarov | 8410a01fb4 | |
UbitUmarov | 9c44dc3384 | |
UbitUmarov | 0e2adbe0fb | |
UbitUmarov | 3ae4115e43 | |
UbitUmarov | 3a055c578d | |
UbitUmarov | ea32a73103 | |
UbitUmarov | 11c945a565 | |
UbitUmarov | 9225b78309 | |
UbitUmarov | 3491af440f | |
UbitUmarov | e9587c8835 | |
UbitUmarov | 15dd033490 | |
UbitUmarov | 8994045d5f | |
UbitUmarov | 5314f375c5 | |
UbitUmarov | bd442208d8 | |
UbitUmarov | 2b4e5fcded | |
UbitUmarov | 11cad57c9c | |
UbitUmarov | 37fb937e0d | |
UbitUmarov | 09d92565dc | |
UbitUmarov | 6bbd5eb6a2 | |
UbitUmarov | 2fa5d10c00 | |
UbitUmarov | a83b7a292b | |
UbitUmarov | cfd3923868 | |
UbitUmarov | a824258c88 | |
UbitUmarov | 2b604fa889 | |
UbitUmarov | d977613162 | |
UbitUmarov | 4475b3db27 | |
UbitUmarov | ee989dd552 | |
UbitUmarov | b459b2c65f | |
UbitUmarov | b051b3a81d | |
UbitUmarov | c09b312b05 | |
UbitUmarov | 49fb9d6b4b | |
UbitUmarov | b8a061816f | |
UbitUmarov | f29fdb6bda | |
UbitUmarov | 2c8e03b589 | |
UbitUmarov | cadcf412ec | |
UbitUmarov | b104934a25 | |
UbitUmarov | 539a3a9273 | |
UbitUmarov | 442ef1cc9e | |
UbitUmarov | ec6a52c029 | |
UbitUmarov | a25e18587c | |
UbitUmarov | b7c1d6e7f5 | |
UbitUmarov | 0ebb1f3f4b | |
UbitUmarov | 5ed2b5c990 | |
UbitUmarov | 3bc0690a7a | |
UbitUmarov | 28c9725730 | |
UbitUmarov | 7ce45235e6 | |
UbitUmarov | 6485377ecd | |
UbitUmarov | 63321f9ccc | |
UbitUmarov | 0652f01d4c | |
UbitUmarov | 8d272fb1d0 | |
UbitUmarov | 50c810549c | |
UbitUmarov | a56f40470e | |
UbitUmarov | 07796d5ccf | |
UbitUmarov | 42414bfa55 | |
UbitUmarov | 15b6d8c147 | |
UbitUmarov | 8e094887cd | |
UbitUmarov | b458c5a9b4 | |
UbitUmarov | e7f0131509 | |
UbitUmarov | 433e529512 | |
UbitUmarov | 8152e47a4a | |
UbitUmarov | 1984cbdbe5 | |
UbitUmarov | ba66d2d3c1 | |
UbitUmarov | 2739b2f5cc | |
UbitUmarov | 7f55db72d2 | |
UbitUmarov | 3b63699b9d | |
UbitUmarov | 5dc7623e38 | |
UbitUmarov | 3327bed34b | |
UbitUmarov | 772aa5234a | |
UbitUmarov | 7110e98815 | |
UbitUmarov | 190e2da672 | |
UbitUmarov | 939aff5c3b | |
UbitUmarov | 9650cb8708 | |
UbitUmarov | 3a6d87da95 | |
UbitUmarov | 89ac80189c | |
UbitUmarov | 4626f0850a | |
UbitUmarov | 98be996991 | |
UbitUmarov | fa4716955e | |
UbitUmarov | 6cf85a3db1 | |
UbitUmarov | f6db9e044d | |
UbitUmarov | 3644879677 | |
UbitUmarov | 1847a42a86 | |
UbitUmarov | 5663e2c0c8 | |
UbitUmarov | dad533fe1c | |
UbitUmarov | 83fd05f131 | |
UbitUmarov | 5035de053a | |
UbitUmarov | b32b104996 | |
UbitUmarov | 481d7156d1 | |
UbitUmarov | 027750e98f | |
UbitUmarov | 33986aea5e | |
UbitUmarov | 9c322c93cc | |
UbitUmarov | b6626739e2 | |
UbitUmarov | 010d64dcd2 | |
UbitUmarov | a9aba562b1 | |
UbitUmarov | d0052c8174 | |
UbitUmarov | db191cd4e2 | |
UbitUmarov | cfbd34f618 | |
UbitUmarov | b1cf06796f | |
UbitUmarov | 7211afb3b9 | |
UbitUmarov | d6b3413c63 | |
UbitUmarov | 81ff118378 | |
UbitUmarov | fe6317f009 | |
UbitUmarov | af35882eda | |
UbitUmarov | c521ff394e | |
UbitUmarov | 7884278097 | |
UbitUmarov | a7927e9d7b | |
UbitUmarov | 71361f61f4 | |
UbitUmarov | 132d8be9cc | |
UbitUmarov | b10a3ba023 | |
UbitUmarov | 182977a872 | |
UbitUmarov | 1c6be0fae3 | |
UbitUmarov | 6dde1aaa14 | |
UbitUmarov | c2086e6257 | |
UbitUmarov | 199d4a1bd0 | |
UbitUmarov | ee0eef5ee0 | |
UbitUmarov | f17dba9925 | |
UbitUmarov | 37619443a7 | |
UbitUmarov | 606d096709 | |
UbitUmarov | 6fd7b931b1 | |
UbitUmarov | 84187975bd | |
UbitUmarov | b9987b4183 | |
UbitUmarov | 9ccca71c1b | |
UbitUmarov | 8bb0c05825 | |
UbitUmarov | ee8ad3e69d | |
UbitUmarov | 2ff5b322be | |
UbitUmarov | 5428b4799d | |
UbitUmarov | d8f9a007f4 | |
UbitUmarov | 4a80802bec | |
UbitUmarov | 492ba8f644 | |
UbitUmarov | e1c20a32ca | |
UbitUmarov | 46dc9ebd4e | |
UbitUmarov | f143dbc23f | |
UbitUmarov | b82337de09 | |
UbitUmarov | 1b8999b130 | |
root | c7a02dc058 | |
root | 0a4f0758fa | |
root | c3f9b1568c | |
root | e877c94b51 | |
root | d8e558a3da | |
UbitUmarov | 68b0d9f31d | |
UbitUmarov | 186e9e2838 | |
UbitUmarov | 32a03a49fc | |
UbitUmarov | 7b55d42b11 | |
UbitUmarov | 343239c7c3 | |
UbitUmarov | 6bc37f348e | |
UbitUmarov | e9d7ced733 | |
UbitUmarov | a32060180f | |
UbitUmarov | 155e499457 | |
UbitUmarov | 95c4de6144 | |
UbitUmarov | 4e7cddc6a8 | |
UbitUmarov | 9ccc3ed756 | |
UbitUmarov | fbd741ece3 | |
UbitUmarov | 6ae1341c58 | |
UbitUmarov | 9487f5cdd3 | |
UbitUmarov | fdb1ce827b | |
UbitUmarov | 0970dc04e2 | |
UbitUmarov | cf0f3954a8 | |
Robert Adams | 87c81b5172 | |
UbitUmarov | 39f73b82d4 | |
UbitUmarov | 0944a96517 | |
UbitUmarov | b5ad1b7dcc | |
UbitUmarov | 80056abbe7 | |
UbitUmarov | ca1993c72d | |
UbitUmarov | 9da1ca2b44 | |
UbitUmarov | 8a8ce8b10a | |
UbitUmarov | 87733b196b | |
Robert Adams | bd1b992aaf | |
UbitUmarov | 9e182c27fb | |
UbitUmarov | bcf05afd64 | |
UbitUmarov | fe46f8cd1d | |
UbitUmarov | 4de5e14e54 | |
UbitUmarov | e24adb9ea1 | |
UbitUmarov | 91569e00a0 | |
UbitUmarov | a07951b044 | |
UbitUmarov | d5d4dc4754 | |
UbitUmarov | 91fab70236 | |
UbitUmarov | d01165818d | |
UbitUmarov | 4dd89ce094 | |
UbitUmarov | cd5a6daa84 | |
UbitUmarov | 800f6d6529 | |
UbitUmarov | 009af3122f | |
UbitUmarov | d89a089ca2 | |
UbitUmarov | 6e05695244 | |
UbitUmarov | 5d78f52f7b | |
UbitUmarov | bd27573130 | |
UbitUmarov | ece3843798 | |
UbitUmarov | b7507b70bc | |
UbitUmarov | 16596b6ad0 | |
UbitUmarov | 17ea412da1 | |
UbitUmarov | 0f574d432d | |
UbitUmarov | 72c472f988 | |
UbitUmarov | ac651a168a | |
UbitUmarov | 62fb0961fd | |
UbitUmarov | 7c0eab8a23 | |
UbitUmarov | b56eb2fe63 | |
UbitUmarov | fdf5274c25 | |
UbitUmarov | 98b6ba24b4 | |
UbitUmarov | 040ab65f68 | |
UbitUmarov | b242232c7b | |
UbitUmarov | 06930a1803 | |
UbitUmarov | f58e1f6265 | |
Robert Adams | 52947b6280 | |
Robert Adams | a1568697d0 | |
UbitUmarov | 874cc47617 | |
UbitUmarov | 175817fe55 | |
UbitUmarov | b8121ad8a2 | |
UbitUmarov | 55f27135dd | |
UbitUmarov | 364b718acf | |
UbitUmarov | ef3b424b26 | |
UbitUmarov | 2f3101e1d2 | |
UbitUmarov | 75e48610e7 | |
UbitUmarov | 6bb8055cc2 | |
fly-man- | 45de5eb638 | |
UbitUmarov | b16ee749ed | |
UbitUmarov | 9046e5cb9d | |
UbitUmarov | 76b777b1fb | |
UbitUmarov | 44e6f45ed6 | |
UbitUmarov | e0b06d4b6b | |
UbitUmarov | 1e1d296ef4 | |
UbitUmarov | 73e64c6597 | |
UbitUmarov | dd43e613f0 | |
UbitUmarov | d86bb08c28 | |
UbitUmarov | eb7715e2f8 | |
UbitUmarov | 5fc44398fe | |
UbitUmarov | 373ec7afa2 | |
UbitUmarov | dc633ee768 | |
UbitUmarov | 6479eb9022 | |
UbitUmarov | 6bc8e2413f | |
UbitUmarov | f1076607dc | |
UbitUmarov | 52e5f58c9a | |
UbitUmarov | cc27168cc1 | |
UbitUmarov | 4c79a85621 | |
UbitUmarov | cc204a279e | |
UbitUmarov | 695d807696 | |
UbitUmarov | 07946e040d | |
UbitUmarov | f7926eb28c | |
UbitUmarov | 367bd48d91 | |
UbitUmarov | df568b1a66 | |
UbitUmarov | 61fb39e49b | |
UbitUmarov | 8048746759 | |
UbitUmarov | cb94991acb | |
UbitUmarov | 3ee70aac0b | |
UbitUmarov | e3d0ec6f40 | |
UbitUmarov | 27f5248d9f | |
UbitUmarov | f474c10f71 | |
UbitUmarov | 15c28bb2d4 | |
UbitUmarov | d5059d650f | |
UbitUmarov | eb9ac87dd9 | |
UbitUmarov | 9e2152d2cb | |
UbitUmarov | 9d002fb568 | |
UbitUmarov | 611cfc83d6 | |
UbitUmarov | 237cf1ced6 | |
UbitUmarov | 44d6746f40 | |
UbitUmarov | d7d5f9f775 | |
UbitUmarov | ef43111fc1 | |
UbitUmarov | da0ea2698b | |
UbitUmarov | fad63ca814 | |
UbitUmarov | 33a062612f | |
UbitUmarov | a287a8e121 | |
UbitUmarov | 81bb620d64 | |
UbitUmarov | 3897774424 | |
UbitUmarov | 0c38d52538 | |
UbitUmarov | 3bfa278984 | |
UbitUmarov | 881cdc34b3 | |
UbitUmarov | 2060b70e5d | |
UbitUmarov | bef8ea8bcc | |
UbitUmarov | cc19957e0a | |
UbitUmarov | 796a8efe25 | |
UbitUmarov | fc075c61ed | |
UbitUmarov | 04f44bcf99 | |
UbitUmarov | 0c85517e9e | |
UbitUmarov | b2810c4ca7 | |
UbitUmarov | d8e5b7385e | |
UbitUmarov | 75d3e7a7a0 | |
UbitUmarov | cc55cf3080 | |
UbitUmarov | df14ed7d31 | |
UbitUmarov | 3cf9a257f7 | |
UbitUmarov | 31ec5dde45 | |
UbitUmarov | 8bb644159e | |
UbitUmarov | 4cfcf805b3 | |
UbitUmarov | ab35bf5b9d | |
UbitUmarov | f7619b6ee0 | |
UbitUmarov | 43f4eca67c | |
UbitUmarov | a1182cddd5 | |
UbitUmarov | c0c91f3773 | |
UbitUmarov | a98b7fc389 | |
UbitUmarov | 5bd16eaf9e | |
UbitUmarov | 7d9d862e8b | |
UbitUmarov | 47ae155f13 | |
UbitUmarov | ff8f70418b | |
UbitUmarov | 2ccaf54a1f | |
UbitUmarov | c37b2094ba | |
UbitUmarov | 59cfea73ca | |
UbitUmarov | 950b605b42 | |
UbitUmarov | 6e60917522 | |
UbitUmarov | 54b4523da8 | |
UbitUmarov | 3e49e13249 | |
UbitUmarov | c5604d3857 | |
UbitUmarov | f2b447a08f | |
UbitUmarov | be94a0bffa | |
UbitUmarov | fc4de64af4 | |
UbitUmarov | e79f266714 | |
UbitUmarov | f58a106068 | |
UbitUmarov | dd5717f7ae | |
UbitUmarov | d90b45f25e | |
UbitUmarov | 2ac6fb9ae9 | |
UbitUmarov | c032724921 | |
UbitUmarov | b24c669c16 | |
UbitUmarov | 9c043fe414 | |
UbitUmarov | 02492f7b15 | |
UbitUmarov | 813fda90da | |
UbitUmarov | ae00623b65 | |
UbitUmarov | d841c593b9 | |
Melanie | d8ade44fe9 | |
UbitUmarov | ffca7de65d | |
UbitUmarov | 24c4cf74c6 | |
UbitUmarov | 488e2bcde2 | |
UbitUmarov | 817b622b79 | |
UbitUmarov | cf89799c0b | |
UbitUmarov | b156378819 | |
UbitUmarov | 333aa0d67c | |
UbitUmarov | 7679617d52 | |
UbitUmarov | 4d3d9998a9 | |
UbitUmarov | 616fa8dbee | |
UbitUmarov | 00278f7258 | |
UbitUmarov | 8d28c94879 | |
UbitUmarov | 650cef67d1 | |
UbitUmarov | c14209e362 | |
UbitUmarov | 92b7dd27a3 | |
UbitUmarov | 4a73cc81dc | |
UbitUmarov | 0cf5876c45 | |
UbitUmarov | 21728b3129 | |
UbitUmarov | 47563564b7 | |
UbitUmarov | 810ab5f1a3 | |
UbitUmarov | 3a20ccb403 | |
UbitUmarov | 97747cd3d4 | |
UbitUmarov | b240de6aca | |
UbitUmarov | 23d03517a9 | |
UbitUmarov | 5c998f6d60 | |
UbitUmarov | f03ee2f795 | |
UbitUmarov | 3941c827cc | |
UbitUmarov | 9e0a119f9b | |
Stolen Ruby | 551c097db9 | |
UbitUmarov | 530a6a40ed | |
UbitUmarov | f94b6c3ead | |
UbitUmarov | 4d13b1db49 | |
UbitUmarov | 921364e877 | |
fly-man- | ed039a5fe0 | |
UbitUmarov | a2c200e659 | |
Melanie | f31845ed8d | |
UbitUmarov | 18947d93fc | |
UbitUmarov | d6c9ddfdee | |
Bill Blight | 0881840946 | |
UbitUmarov | af2a9d9508 | |
Melanie | 5e9fa5e7f5 | |
UbitUmarov | 2059d548a6 | |
UbitUmarov | 2c2b887c8a | |
uriesk | 34b7d7ec6e | |
UbitUmarov | 1610595697 | |
UbitUmarov | 11b467cabf | |
UbitUmarov | 6297717399 | |
UbitUmarov | 043a213302 | |
UbitUmarov | 6597b7ab46 | |
UbitUmarov | 295f24fe01 | |
UbitUmarov | f8c3fc5e05 | |
UbitUmarov | 7b2b29d10d | |
UbitUmarov | 144f353d50 | |
UbitUmarov | ede7f28184 | |
UbitUmarov | 58b68aa5e9 | |
UbitUmarov | 66f46c6846 | |
UbitUmarov | d2bfe986bf | |
UbitUmarov | deb0ab7400 | |
UbitUmarov | 037de89a75 | |
UbitUmarov | 66f3c6c730 | |
UbitUmarov | 79234795fd | |
UbitUmarov | 57bd671e00 | |
UbitUmarov | ca754b0156 | |
UbitUmarov | 7a4d8017d7 | |
UbitUmarov | 9cb0c51483 | |
UbitUmarov | 8c80572b02 | |
UbitUmarov | 4ced4fed33 | |
UbitUmarov | 27dfdcf1fa | |
UbitUmarov | e08b43569e | |
UbitUmarov | 60bc64a90f | |
UbitUmarov | b783244a50 | |
UbitUmarov | 7554e62861 | |
UbitUmarov | 0ba13b9b00 | |
UbitUmarov | cc7a241cbc | |
UbitUmarov | 98b12278f0 | |
UbitUmarov | 2eee87fea3 | |
UbitUmarov | 47bc1fb257 | |
UbitUmarov | a99055160b | |
UbitUmarov | aeba9c2394 | |
UbitUmarov | 834a8fac2f | |
UbitUmarov | c98f4d0158 | |
UbitUmarov | 46defa5d31 | |
UbitUmarov | cc6a02dd53 | |
UbitUmarov | 28171e1d10 | |
UbitUmarov | 0307427b94 | |
UbitUmarov | 7258531e3b | |
UbitUmarov | 27da6f1301 | |
UbitUmarov | 911ef0ce52 | |
UbitUmarov | 87acd20d95 | |
UbitUmarov | 1e76e14cce | |
UbitUmarov | 28366f789e | |
UbitUmarov | dc9f0d3627 | |
UbitUmarov | be2c0aa552 | |
UbitUmarov | cded996265 | |
UbitUmarov | d179b2dda1 | |
UbitUmarov | 91986445a6 | |
UbitUmarov | fa29db5552 | |
UbitUmarov | 590d7ccf43 | |
UbitUmarov | 5dc20ad1e5 | |
UbitUmarov | 56845d4b75 | |
UbitUmarov | 5951152082 | |
UbitUmarov | fb0c8036f0 | |
UbitUmarov | 3e5ca6efd6 | |
UbitUmarov | 5485ba2ae6 | |
UbitUmarov | a2208e5c8c | |
UbitUmarov | 82415785fc | |
UbitUmarov | cb1ebd1604 | |
UbitUmarov | c4a0e574c8 | |
UbitUmarov | cea34f7065 | |
UbitUmarov | b71ec0f2d6 | |
UbitUmarov | 67d5212d53 | |
UbitUmarov | 8474af04e1 | |
UbitUmarov | 2fb82f84d2 | |
UbitUmarov | 5f2a76437e | |
UbitUmarov | 9dfb906666 | |
UbitUmarov | 01b84ef46b | |
UbitUmarov | 5b2fab99a6 | |
UbitUmarov | ba87ba9c47 | |
UbitUmarov | 9be4663d3c | |
UbitUmarov | 65310f3e5e | |
UbitUmarov | a23be00bf3 | |
UbitUmarov | bbf1ed6727 | |
UbitUmarov | 6e98272f0d | |
UbitUmarov | ad99461590 | |
UbitUmarov | cebe40f5cd | |
UbitUmarov | f6d4fadb0a | |
UbitUmarov | 87a723cbc8 | |
UbitUmarov | 852e20a5a7 | |
UbitUmarov | efd6fb05a9 | |
UbitUmarov | 1f5169e636 | |
UbitUmarov | d43eeb1d9d | |
UbitUmarov | 9234613ed5 | |
UbitUmarov | 7bcef500a9 | |
UbitUmarov | d537862cc2 | |
UbitUmarov | f44569eee5 | |
Kevin Cozens | 54b4e7a3e3 | |
Kevin Cozens | 06fef1569b | |
UbitUmarov | fad6295398 | |
UbitUmarov | afb1d6cdd7 | |
UbitUmarov | 35f5d4449b | |
UbitUmarov | b48cbcbfdd | |
UbitUmarov | 942fd5e653 | |
UbitUmarov | a1a8b5f4a7 | |
UbitUmarov | 48854ec83d | |
UbitUmarov | cc10cd2161 | |
UbitUmarov | e4ed2d7d6c | |
UbitUmarov | 191b0888a2 | |
UbitUmarov | d31854ee3c | |
UbitUmarov | 7fcb3fdf11 | |
UbitUmarov | c28738a17f | |
UbitUmarov | 64f8036d8f | |
UbitUmarov | c05598fe62 | |
UbitUmarov | 9185d397df | |
UbitUmarov | 90db067d2a | |
UbitUmarov | f9a2fbed83 | |
UbitUmarov | 492b9e3326 | |
UbitUmarov | fe63b4c97d | |
UbitUmarov | 72d9bbfafb | |
UbitUmarov | 31e49a7ab3 | |
UbitUmarov | ad8ddb8a78 | |
UbitUmarov | afd3852a36 | |
UbitUmarov | 41df4d7da4 | |
UbitUmarov | 3741abab7c | |
UbitUmarov | 2f07f96686 | |
UbitUmarov | 6ea394467d | |
UbitUmarov | 9e274ce64d | |
UbitUmarov | 5b5e53aa1d | |
UbitUmarov | 3e6342eb61 | |
UbitUmarov | 0aff4a2914 | |
UbitUmarov | 1ea5116f00 | |
UbitUmarov | 9e71b5575a | |
UbitUmarov | 292a9c9cd7 | |
UbitUmarov | cf33e0440a | |
UbitUmarov | a1d132d3ca | |
UbitUmarov | a95397e8f5 | |
UbitUmarov | 7479638e88 | |
UbitUmarov | 82a0fa7dfe | |
Bill Blight | bd4907e960 | |
UbitUmarov | c643b4236f | |
Mandarinka Tasty | 06a35b9559 | |
UbitUmarov | 7c8cf9f362 | |
UbitUmarov | 601d965009 | |
UbitUmarov | cba65b1935 | |
UbitUmarov | d842f835a6 | |
UbitUmarov | 050d53fe5b | |
UbitUmarov | dd2fd3e4a0 | |
UbitUmarov | fdb4fb3f3f | |
UbitUmarov | 495b22470d | |
UbitUmarov | 0986555765 | |
lickx | 94a5e5b9b7 | |
UbitUmarov | 4ca859b4fc | |
UbitUmarov | 56d5b3bf92 | |
UbitUmarov | 47488c9017 | |
UbitUmarov | 2c3522a826 | |
UbitUmarov | d1d370ada3 | |
UbitUmarov | 05b79e203d | |
UbitUmarov | 8b5b251d1a | |
UbitUmarov | 2ea5f09ed3 | |
UbitUmarov | 6d063785bd | |
UbitUmarov | e7d9fe966c | |
UbitUmarov | f01e4600d1 | |
UbitUmarov | 0611d3339b | |
UbitUmarov | d9018cf517 | |
UbitUmarov | 76f8a09bb3 | |
UbitUmarov | 2886408a76 | |
UbitUmarov | 4fae8d3d39 | |
UbitUmarov | 190e7433cc | |
UbitUmarov | 6569f12d40 | |
UbitUmarov | db255c97d6 | |
UbitUmarov | 877a78ce91 | |
UbitUmarov | 96acb48334 | |
UbitUmarov | 235dd37b9c | |
UbitUmarov | 57ec0d3884 | |
UbitUmarov | 7eeaee631d | |
UbitUmarov | 87e97543d6 | |
UbitUmarov | eb5fe57a17 | |
UbitUmarov | 1bcdcc2419 | |
UbitUmarov | 57ae99b113 | |
UbitUmarov | 0f1bc23039 | |
Mandarinka Tasty | 5751add537 | |
UbitUmarov | 8812684355 | |
Bill Blight | 6d9de17d77 | |
UbitUmarov | ed0e2623b9 | |
UbitUmarov | 5a0c9c2fcf | |
UbitUmarov | 37dcb8722c | |
UbitUmarov | a5d6a394ef | |
UbitUmarov | 391edb862e | |
UbitUmarov | e96e923159 | |
UbitUmarov | 075ebf3524 | |
UbitUmarov | 4652f8b84f | |
UbitUmarov | ca404e5001 | |
UbitUmarov | cd9327cd8b | |
Melanie | e874e3a2ad | |
Melanie | 39e82cb043 | |
UbitUmarov | 714f4387b8 | |
UbitUmarov | f466c56ba4 | |
UbitUmarov | ca9651df0d | |
UbitUmarov | 0d93d5ce69 | |
UbitUmarov | e6615a193d | |
mewtwo0641 | 4e4d687f3f | |
UbitUmarov | 50627304a6 | |
UbitUmarov | 9647a1e6c5 | |
Mandarinka Tasty | 99a23421a8 | |
UbitUmarov | 7120ffbc08 | |
UbitUmarov | e075b349ce | |
Fly Man | d9028ac07f | |
UbitUmarov | 9f3c803552 | |
UbitUmarov | 7c60e83f30 | |
UbitUmarov | 58ba645160 | |
UbitUmarov | 14f55ab36e | |
UbitUmarov | 10e4d01375 | |
fly-man- | d3d915ce3c | |
UbitUmarov | 88d638a0cf | |
UbitUmarov | 390cb703f3 | |
UbitUmarov | a6d5da3e7f | |
UbitUmarov | 1b5c6c48f9 | |
UbitUmarov | e15fca60d1 | |
UbitUmarov | 8c1c9129aa | |
UbitUmarov | 9278a9a9dd | |
UbitUmarov | 81fb1b008f | |
UbitUmarov | aee981e5e2 | |
UbitUmarov | ee2eed8c6f | |
UbitUmarov | 01400e38d5 | |
UbitUmarov | 0daa4eff8a | |
UbitUmarov | ee6f261415 | |
UbitUmarov | dd508d4c4f | |
UbitUmarov | 282877a454 | |
UbitUmarov | dd67ab6025 | |
UbitUmarov | a4881797b9 | |
UbitUmarov | 6b8fda098d | |
UbitUmarov | 0731220a9d | |
UbitUmarov | 8ab5a87520 | |
UbitUmarov | 84235900b2 | |
UbitUmarov | ef8097f998 | |
UbitUmarov | ea815df6bd | |
UbitUmarov | 6f4052561e | |
UbitUmarov | f9c9dc585c | |
UbitUmarov | f17b48e73e | |
UbitUmarov | 770f59ff87 | |
UbitUmarov | c7baee1638 | |
UbitUmarov | d7a9195078 | |
UbitUmarov | 519d320e3c | |
UbitUmarov | 8ed4bee521 | |
UbitUmarov | a235a28132 | |
fly-man- | 334986ddc6 | |
UbitUmarov | 3cea21ab63 | |
UbitUmarov | e52bc6b575 | |
UbitUmarov | ee115a83df | |
UbitUmarov | c3933ce8b9 | |
UbitUmarov | 60644b440b | |
Vincent Sylvester | 6e3f934c4b | |
UbitUmarov | 102fbf8422 | |
UbitUmarov | 18cc36cf41 | |
Kevin Cozens | e5238cadf7 | |
UbitUmarov | 8ac69a5d27 | |
UbitUmarov | 834a0e8b6d | |
UbitUmarov | 6da07ded04 | |
UbitUmarov | 5e1bf88875 | |
UbitUmarov | 91247e0631 | |
UbitUmarov | 39c8db8eb1 | |
UbitUmarov | c53658248a | |
UbitUmarov | 9b87626cdb | |
UbitUmarov | 31633699cf | |
UbitUmarov | c3d2f2d119 | |
UbitUmarov | ba193fc606 | |
UbitUmarov | 76a82ba5de | |
UbitUmarov | a48d65fd77 | |
UbitUmarov | 3b2786d27e | |
UbitUmarov | 83029042d3 | |
UbitUmarov | 629eeca836 | |
UbitUmarov | 5463bffa68 | |
UbitUmarov | 458fe42afd | |
UbitUmarov | e0b2ee80f9 | |
UbitUmarov | d5117b6cf7 | |
UbitUmarov | 007adce081 | |
UbitUmarov | f6765b8668 | |
UbitUmarov | 57fb1ea9df | |
UbitUmarov | 7c50651cd1 | |
UbitUmarov | 8f0f102869 | |
UbitUmarov | 631308a1d1 | |
Kevin Cozens | c7f3f3586d | |
Kevin Cozens | 1ea71c6182 | |
UbitUmarov | 06d6c4abda | |
UbitUmarov | f87219975d | |
UbitUmarov | 570440256b | |
UbitUmarov | fbb77274da | |
UbitUmarov | 468b25ff69 | |
UbitUmarov | 0d83b9edc3 | |
UbitUmarov | cf1ea3b093 | |
UbitUmarov | f7475d4a98 | |
UbitUmarov | 4837a8a8fa | |
UbitUmarov | fd426354f1 | |
UbitUmarov | ea5d40f7f2 | |
UbitUmarov | 00cc17c239 | |
UbitUmarov | b91c0f0d01 | |
UbitUmarov | 0467b6dc3b | |
UbitUmarov | dffa628966 | |
UbitUmarov | bf0ece8061 | |
UbitUmarov | 020f34f75b | |
UbitUmarov | a91ef313ef | |
UbitUmarov | 09ae675d28 | |
UbitUmarov | 24df1086fa | |
UbitUmarov | acd55c6f12 | |
UbitUmarov | 7838689dda | |
UbitUmarov | 9ae3452e03 | |
UbitUmarov | 26ecba48f0 | |
UbitUmarov | 44fd5bb7b5 | |
Kevin Cozens | bf175d1f01 | |
Kevin Cozens | 16c72dce5d | |
UbitUmarov | 76c4296e39 | |
UbitUmarov | c6c386cd80 | |
Kevin Cozens | 8af2d99ba9 | |
UbitUmarov | f29358744d | |
UbitUmarov | 037e5d8031 | |
UbitUmarov | ad0b736405 | |
UbitUmarov | 79ec9d2887 | |
UbitUmarov | 728040ab47 | |
UbitUmarov | fced731e70 | |
UbitUmarov | 7c9c5cfedf | |
UbitUmarov | 90482182e5 | |
UbitUmarov | ca7bd13dee | |
UbitUmarov | dc35ce26d0 | |
UbitUmarov | 63418349e5 | |
UbitUmarov | 5d0a1656bf | |
UbitUmarov | 8a30d1303d | |
UbitUmarov | 81431e90de | |
UbitUmarov | 63da4d3f99 | |
UbitUmarov | 996de5eaf1 | |
UbitUmarov | 75c5821dfa | |
Kevin Cozens | 6accf854a7 | |
UbitUmarov | 80c7ffeb29 | |
UbitUmarov | e031d79d48 | |
UbitUmarov | 86d8f2af5b | |
UbitUmarov | a8308e2a13 | |
UbitUmarov | ee6034f751 | |
UbitUmarov | f5365cb06d | |
UbitUmarov | 4958425e37 | |
UbitUmarov | b1569d09bf | |
UbitUmarov | 6b02c99194 | |
UbitUmarov | 20d221a963 | |
UbitUmarov | cb134e5487 | |
UbitUmarov | e733bfb3b5 | |
UbitUmarov | 0a1d96b95e | |
Kevin Cozens | 122d3a3768 | |
Kevin Cozens | 6b24ff0bc9 | |
Kevin Cozens | a4ac91dc6b | |
UbitUmarov | 1363a95840 | |
UbitUmarov | f83f7e18b6 | |
UbitUmarov | 0341b46279 | |
UbitUmarov | a0d0d65c70 | |
UbitUmarov | 2369ce413d | |
UbitUmarov | 2dc49dc1e9 | |
UbitUmarov | c723a1be16 | |
UbitUmarov | cf5ec5d29c | |
UbitUmarov | 8c390ef3fe | |
UbitUmarov | d543421675 | |
UbitUmarov | c408f0a38e | |
UbitUmarov | c5ce9b7be8 | |
UbitUmarov | 47fd3afecd | |
UbitUmarov | befe1ad4be | |
UbitUmarov | dc5cd9a3ae | |
UbitUmarov | 18914fae64 | |
mewtwo0641 | f579fbba0e | |
UbitUmarov | 5ff57f01b7 | |
UbitUmarov | 85b973ce1d | |
UbitUmarov | 2f94fa4dc7 | |
UbitUmarov | f158867d93 | |
UbitUmarov | 2129d941ac | |
UbitUmarov | 756fbf324a | |
UbitUmarov | 846f35d365 | |
UbitUmarov | 4a982adb02 | |
UbitUmarov | 25d6d99c6e | |
UbitUmarov | 9a73a39989 | |
UbitUmarov | d6a35d6d2f | |
UbitUmarov | 467b591f3a | |
UbitUmarov | 96aecf80ef | |
UbitUmarov | 01ceb4d17e | |
UbitUmarov | cddb848c13 | |
UbitUmarov | 53a910e3e5 | |
UbitUmarov | aa2c710c57 | |
UbitUmarov | 38cd12b3cf | |
UbitUmarov | a7e2978db9 | |
UbitUmarov | b1226609a1 | |
UbitUmarov | e685d8dcef | |
UbitUmarov | 617d76697d | |
UbitUmarov | 73177f2afa | |
UbitUmarov | 42d07e283f | |
UbitUmarov | e7e8a7ab4d | |
UbitUmarov | 04a8ec518d | |
UbitUmarov | 20ca517887 | |
UbitUmarov | 83e2fee71b | |
UbitUmarov | c70b77a528 | |
UbitUmarov | a22606a89f | |
UbitUmarov | c889eb64e5 | |
UbitUmarov | 5ae09e03aa | |
UbitUmarov | 3635943d39 | |
UbitUmarov | 35d1642889 | |
UbitUmarov | 4381f16e18 | |
UbitUmarov | 4d051f3acb | |
UbitUmarov | 5548b66dc0 | |
UbitUmarov | 4c65bb4196 | |
UbitUmarov | f89b2379a0 | |
UbitUmarov | 13b4ce8199 | |
UbitUmarov | 3dbdacf31f | |
UbitUmarov | 6978181075 | |
UbitUmarov | 5e3eb8b370 | |
UbitUmarov | e3f804e1d8 | |
UbitUmarov | 98019031df | |
UbitUmarov | cdd3ef857c | |
UbitUmarov | 266eabcad4 | |
UbitUmarov | 3aff72e403 | |
UbitUmarov | 22666ad18a | |
UbitUmarov | fc224b444a | |
UbitUmarov | 5a246026a0 | |
UbitUmarov | e7b834874e | |
UbitUmarov | c87585ad96 | |
UbitUmarov | 3f7ffc12c4 | |
UbitUmarov | cf3d3f4f4a | |
UbitUmarov | a67b523acf | |
UbitUmarov | af9bff7ed2 | |
UbitUmarov | b164925262 | |
UbitUmarov | e326792aa3 | |
UbitUmarov | 9e4bf3439c | |
UbitUmarov | efc7480342 | |
UbitUmarov | e3fc272f50 | |
UbitUmarov | d38161f83d | |
UbitUmarov | 437369778d | |
UbitUmarov | d4a5454f3c | |
UbitUmarov | 73b587989c | |
UbitUmarov | 855dcda9c3 | |
UbitUmarov | ccdaebaed6 | |
UbitUmarov | 0dbed94e13 | |
UbitUmarov | cb5a7246a2 | |
UbitUmarov | 56535cdb47 | |
UbitUmarov | 49b4408782 | |
UbitUmarov | ccd47d0cf1 | |
UbitUmarov | e32efe5d22 | |
UbitUmarov | c34f07b6f3 | |
UbitUmarov | e89f1e635b | |
UbitUmarov | a7db6d3097 | |
UbitUmarov | dd491bba57 | |
UbitUmarov | 0a81e35697 | |
UbitUmarov | a6e0ba262a | |
UbitUmarov | 20f3c46b78 | |
UbitUmarov | 389e54214d | |
UbitUmarov | 4b1a153cfb | |
UbitUmarov | 0ad6ba11fe | |
UbitUmarov | 707eb8de82 | |
UbitUmarov | e9d2d81880 | |
UbitUmarov | ade0d8a81f | |
UbitUmarov | 029d6e40f6 | |
UbitUmarov | 2c8251d450 | |
UbitUmarov | be02aece36 | |
UbitUmarov | 6dec7869b8 | |
UbitUmarov | 2c252032c7 | |
UbitUmarov | d1f6ffc2fd | |
UbitUmarov | 5579144c16 | |
UbitUmarov | c35803964f | |
UbitUmarov | 8fe16a1974 | |
UbitUmarov | b903287dd1 | |
UbitUmarov | d39bf37926 | |
UbitUmarov | 8f1a68633e | |
UbitUmarov | 49848b09e6 | |
UbitUmarov | ae04a24e7a | |
UbitUmarov | 6f3e538c79 | |
UbitUmarov | c92ba1cc04 | |
UbitUmarov | 7a09a10f58 | |
UbitUmarov | 01448d751a | |
UbitUmarov | 3d87e37d99 | |
UbitUmarov | 88511bfab2 | |
UbitUmarov | 8a68c330e8 | |
UbitUmarov | 1d6a157134 | |
UbitUmarov | 4e8fa27411 | |
UbitUmarov | a3d78b24fd | |
UbitUmarov | e0b695a776 | |
UbitUmarov | eafad5a4cb | |
UbitUmarov | d91c7c5958 | |
UbitUmarov | d3ff4e0806 | |
UbitUmarov | 4345d225f1 | |
UbitUmarov | 792a1c6e3d | |
UbitUmarov | fa78a6fd90 | |
UbitUmarov | 271fab6ac2 | |
UbitUmarov | 41633de8cb | |
UbitUmarov | 17f2838757 | |
UbitUmarov | a3e50ef8dc | |
UbitUmarov | 98f79cf735 | |
UbitUmarov | 3c3b8fc759 | |
UbitUmarov | c69920376b | |
UbitUmarov | 439cbf0d4d | |
UbitUmarov | e908c0ecad | |
UbitUmarov | 1a6770191c | |
UbitUmarov | eec3921800 | |
UbitUmarov | 250acf891f | |
UbitUmarov | 875ca104b8 | |
UbitUmarov | 89a690c11f | |
UbitUmarov | 0b96cd56fc | |
UbitUmarov | ce0aa53cc4 | |
UbitUmarov | ec6f87d3ef | |
UbitUmarov | 7f49364d65 | |
UbitUmarov | 2811e5cef3 | |
UbitUmarov | 48dbba3441 | |
UbitUmarov | 3576d6d764 | |
UbitUmarov | 8eea9531ee | |
UbitUmarov | 7ffb0aca44 | |
UbitUmarov | 0259019431 | |
UbitUmarov | a7803409f6 | |
UbitUmarov | 8032898773 | |
UbitUmarov | f0fd15ccc9 | |
UbitUmarov | 3b141e6e6f | |
UbitUmarov | 201c916670 | |
UbitUmarov | 17b79cec91 | |
UbitUmarov | b35a10e2be | |
UbitUmarov | ab0f866087 | |
UbitUmarov | d32debe618 | |
UbitUmarov | a95e286168 | |
UbitUmarov | 1e3cb82756 | |
UbitUmarov | 4150a616c5 | |
UbitUmarov | 366cdac656 | |
UbitUmarov | 2f13b68d4f | |
Melanie Thielker | d35ab8c86c | |
UbitUmarov | 873d42005f | |
TomTheDragon | 98f90f4eed | |
UbitUmarov | 17c65d918a | |
UbitUmarov | 6546ea6da6 | |
UbitUmarov | f2b54c8cf9 | |
TomTheDragon | 6a75b7c65e | |
UbitUmarov | cdb7d506fd | |
UbitUmarov | eaa239eb06 | |
UbitUmarov | ca4804b758 | |
UbitUmarov | 8e8108c78c | |
UbitUmarov | e0fd966186 | |
UbitUmarov | fcb8b2a3c3 | |
UbitUmarov | 8eb9bc8b19 | |
UbitUmarov | 8479658cd0 | |
TomTheDragon | 56d2db3a18 | |
UbitUmarov | 39d1426f27 | |
UbitUmarov | 5360a8fea4 | |
UbitUmarov | 3fb61f4470 | |
UbitUmarov | 16a8e166ff | |
Kevin Cozens | 6a5b234262 | |
Kevin Cozens | 70d693eff2 | |
Kevin Cozens | 5cc41eee34 | |
Kevin Cozens | fbb2f7f319 | |
Kevin Cozens | d65f055e4e | |
UbitUmarov | f81375cf1e | |
UbitUmarov | c220c277e2 | |
UbitUmarov | 3d6553afee | |
UbitUmarov | 68e9baf2e0 | |
Robert Adams | b51b4d4171 | |
UbitUmarov | dd58f15bff | |
Robert Adams | df3759e099 | |
UbitUmarov | 59afeb6c4c | |
UbitUmarov | 8520ceed63 | |
UbitUmarov | b1814d3492 | |
UbitUmarov | db88c93243 | |
Robert Adams | cc915b4d05 | |
UbitUmarov | e4dfa50654 | |
UbitUmarov | 765f4eef1e | |
UbitUmarov | 2247251c2f | |
UbitUmarov | 5687c5d494 | |
UbitUmarov | 997a85568e | |
UbitUmarov | 05da6b9f14 | |
UbitUmarov | b581a64788 | |
UbitUmarov | 0ac81f6a09 | |
UbitUmarov | ca493a1beb | |
Robert Adams | 921e3ceb09 | |
Robert Adams | 4608b44817 | |
UbitUmarov | 86493d75fa | |
Kevin Cozens | e08b051ca6 | |
Kevin Cozens | 05db0c977f | |
Robert Adams | f348f7fa90 | |
Robert Adams | 6c5cfbafba | |
Robert Adams | 33e773959f | |
Robert Adams | 0afa3a294a | |
UbitUmarov | 34da125a4d | |
UbitUmarov | 3fe3471532 | |
UbitUmarov | c9198dc1d4 | |
UbitUmarov | 566e79b574 | |
UbitUmarov | a578df9589 | |
UbitUmarov | b9fc629bdf | |
UbitUmarov | a30d8f8e64 | |
UbitUmarov | 46ead8dcb2 | |
UbitUmarov | 41e8b9f91f | |
UbitUmarov | d4a3aa5e08 | |
UbitUmarov | 22c7450363 | |
Robert Adams | 5c36561424 | |
UbitUmarov | e4747b938b | |
UbitUmarov | 47648557c1 | |
UbitUmarov | b3eec90d3c | |
UbitUmarov | 396ab1424c | |
UbitUmarov | dfdc3e3adf | |
UbitUmarov | a1aa2f1add | |
UbitUmarov | 05b8ead8b2 | |
UbitUmarov | c5802c9460 | |
UbitUmarov | 1a7c8893ee | |
UbitUmarov | 74524cb3be | |
UbitUmarov | b1fdb02be1 | |
UbitUmarov | 1ca70232a5 | |
UbitUmarov | 8434def603 | |
UbitUmarov | 6cf27e2191 | |
UbitUmarov | f9c01db33c | |
UbitUmarov | 539c006cb8 | |
Robert Adams | 1fdd56f987 | |
UbitUmarov | e2ca5853fc | |
Diva Canto | 2df4c1bb91 | |
UbitUmarov | ea53cb0dfa | |
Diva Canto | 3acdae74db | |
Robert Adams | c804835801 | |
UbitUmarov | c54cd4d808 | |
UbitUmarov | 218160494e | |
UbitUmarov | 6d4b0a8ce3 | |
Robert Adams | 78c78f69b1 | |
UbitUmarov | bf84e46c59 | |
Robert Adams | 9e86721d70 | |
Robert Adams | a754ab0e4f | |
Robert Adams | 36ee8e3941 | |
Robert Adams | 8f3c17189c | |
Robert Adams | 76c29cb106 | |
Diva Canto | eb837defdf | |
Diva Canto | 8b6557e377 | |
Diva Canto | 6a0b7a607f | |
Diva Canto | 40f4b30361 | |
Diva Canto | 26a4c5ff85 | |
Diva Canto | 856d218f99 | |
Diva Canto | ea448d9d6b | |
Diva Canto | 5e9b090845 | |
Diva Canto | af5573728a | |
Diva Canto | 3052c7080a | |
UbitUmarov | 1dbf3215b0 | |
UbitUmarov | 82e2e1e00c | |
Robert Adams | 2afd158b1d | |
Kevin Cozens | e9b7971929 | |
UbitUmarov | a4e7ab6fcf | |
UbitUmarov | f658b68181 | |
UbitUmarov | 1830387840 | |
Kevin Cozens | cf855c3842 | |
UbitUmarov | fc4212bc81 | |
UbitUmarov | 169a50286b | |
UbitUmarov | ad930f8e41 | |
UbitUmarov | 21b71ff1d8 | |
UbitUmarov | 324bda8ab9 | |
UbitUmarov | 6996bab4a1 | |
UbitUmarov | 0b23964349 | |
UbitUmarov | 0bbe7bab7b | |
UbitUmarov | a91ceae826 | |
UbitUmarov | 025e82341f | |
UbitUmarov | 74389c74cb | |
UbitUmarov | d52a64c7a3 | |
UbitUmarov | 8739ceb00f | |
UbitUmarov | 35b1166ba8 | |
UbitUmarov | 1557b78d67 | |
UbitUmarov | 1071c92bb0 | |
UbitUmarov | 86c9c86eeb | |
UbitUmarov | c5b34a51fd | |
UbitUmarov | 81d1ebc510 | |
UbitUmarov | 13564aa984 | |
UbitUmarov | 6bf96f83c5 | |
UbitUmarov | 8b2e95d1c1 | |
UbitUmarov | 04eeb0e5cb | |
UbitUmarov | 3ae210d36f | |
UbitUmarov | 618e142cf8 | |
UbitUmarov | 93582523a7 | |
UbitUmarov | d71d13f72b | |
UbitUmarov | 98c64f1aa9 | |
UbitUmarov | c1ab1289ab | |
UbitUmarov | f6f0b1c513 | |
UbitUmarov | 66a5b4d120 | |
UbitUmarov | d1f7fac570 | |
UbitUmarov | fe6ad384e4 | |
UbitUmarov | 4293b2cb3c | |
UbitUmarov | f921ad005f | |
UbitUmarov | 59de8fbba0 | |
UbitUmarov | 2f9222bec3 | |
UbitUmarov | 9ae26fc5af | |
UbitUmarov | 04b97be71e | |
UbitUmarov | cd15de628d | |
UbitUmarov | 4ef64d4425 | |
UbitUmarov | 101413ddd9 | |
UbitUmarov | ad46a29d9e | |
UbitUmarov | 4b7f79e296 | |
UbitUmarov | 8b16131206 | |
UbitUmarov | 4fe13ef639 | |
UbitUmarov | a17abe7518 | |
UbitUmarov | bd249bdf5b | |
UbitUmarov | 61e3fe42bd | |
UbitUmarov | 51d32e3bed | |
UbitUmarov | 457551d069 | |
UbitUmarov | aff9c345dd | |
UbitUmarov | a069ed09a8 | |
UbitUmarov | 3847f861e3 | |
UbitUmarov | c8a9b0321f | |
UbitUmarov | f5324833ee | |
UbitUmarov | 72bce8c4b4 | |
UbitUmarov | 40b16f1705 | |
UbitUmarov | f8cdccc167 | |
UbitUmarov | 9dbcb4e5f6 | |
UbitUmarov | 63e3fc21ef | |
UbitUmarov | cc5d6f6b7b | |
UbitUmarov | ead95e85c5 | |
UbitUmarov | dfef16297b | |
UbitUmarov | 1dc56eb15f | |
UbitUmarov | 39751891f4 | |
UbitUmarov | c5a4c299cb | |
UbitUmarov | f3a920237b | |
UbitUmarov | edc7575f9e | |
UbitUmarov | 965d004fbe | |
UbitUmarov | 6b0a3e981c | |
UbitUmarov | aa4eb2bc14 | |
UbitUmarov | cb2607d4fa | |
UbitUmarov | 190874344b | |
UbitUmarov | 6bac44e767 | |
UbitUmarov | e243dd0519 | |
UbitUmarov | b0a0163253 | |
UbitUmarov | 936aee412d | |
UbitUmarov | 5242853d68 | |
UbitUmarov | b319977a3f | |
UbitUmarov | e53f439981 | |
UbitUmarov | b59ce7c968 | |
UbitUmarov | 3fda7c6315 | |
UbitUmarov | 9ea6580c37 | |
UbitUmarov | f660aa37ac | |
UbitUmarov | cbd0af3cab | |
UbitUmarov | ef74efeaa7 | |
UbitUmarov | e075cf4461 | |
UbitUmarov | 0c5f412ed4 | |
UbitUmarov | 0418542344 | |
UbitUmarov | 3ce909528d | |
UbitUmarov | 84abdf866a | |
UbitUmarov | a9a44eaeb5 | |
UbitUmarov | cb8975e567 | |
UbitUmarov | 5d776fca3a | |
UbitUmarov | 1a8a77c41e | |
UbitUmarov | 8d1dd44edb | |
UbitUmarov | ed8fc359f3 | |
UbitUmarov | 72db6f76b5 | |
UbitUmarov | ae4266916c | |
UbitUmarov | c3dbf91152 | |
UbitUmarov | 191661b51d | |
UbitUmarov | 0a1f497dee | |
UbitUmarov | 83e443bca1 | |
UbitUmarov | 95595a8360 | |
UbitUmarov | 3c6790b061 | |
UbitUmarov | 28caf1e089 | |
UbitUmarov | cbae148f68 | |
UbitUmarov | aea49070c9 | |
UbitUmarov | 66c8b7202b | |
UbitUmarov | 11d3860781 | |
UbitUmarov | 1bfe4da378 | |
UbitUmarov | 637d35631c | |
UbitUmarov | 70da902732 | |
UbitUmarov | 36442c004f | |
UbitUmarov | 651952e01e | |
UbitUmarov | 79e166e9aa | |
UbitUmarov | 3fc6f62c45 | |
UbitUmarov | fe0fce424c | |
UbitUmarov | 4df19ece53 | |
UbitUmarov | 10d526f961 | |
UbitUmarov | 822574df9f | |
UbitUmarov | 969d5f742c | |
UbitUmarov | 1c64b5018a | |
UbitUmarov | d9a300fa8e | |
UbitUmarov | 8e3a50212c | |
UbitUmarov | ef87370cf1 | |
UbitUmarov | 84946e3061 | |
UbitUmarov | 5e67bd5778 | |
UbitUmarov | 614a5266c5 | |
UbitUmarov | ed8526bcfb | |
UbitUmarov | ad43cc6784 | |
UbitUmarov | 482ff06e13 | |
UbitUmarov | 5ce15566ac | |
UbitUmarov | f33a871d61 | |
UbitUmarov | fd8836e493 | |
UbitUmarov | 9526a96b4f | |
UbitUmarov | 3ba63dde6e | |
UbitUmarov | e650a4ff16 | |
UbitUmarov | 25371933b4 | |
UbitUmarov | 46ba2ead1a | |
UbitUmarov | a18d45fbdc | |
UbitUmarov | f62400c4ca | |
UbitUmarov | 70be8ba6de | |
UbitUmarov | 617f42bcfa | |
UbitUmarov | dd7ab862ab | |
UbitUmarov | 953872510f | |
UbitUmarov | d0afd4335c | |
UbitUmarov | 5e83c2e422 | |
UbitUmarov | 8c5f09f44b | |
UbitUmarov | bd2da771a4 | |
Kevin Cozens | 46c8c4854e | |
UbitUmarov | 7941f8da23 | |
UbitUmarov | 08659811c7 | |
UbitUmarov | 5842d5f7b0 | |
UbitUmarov | 73aa752034 | |
UbitUmarov | b5910cfdb7 | |
UbitUmarov | be975d1e89 | |
UbitUmarov | e8165a7b51 | |
UbitUmarov | f69e48bedc | |
Kevin Cozens | 3cddfddc3f | |
Kevin Cozens | 0ac6b74c5e | |
UbitUmarov | d12957dc2c | |
Robert Adams | 5bfe8b18fe | |
UbitUmarov | 1e3a19e673 | |
UbitUmarov | ef2fd8fcea | |
UbitUmarov | 29f2421d4f | |
UbitUmarov | 7bea4f1578 | |
UbitUmarov | 02b51b84f4 | |
UbitUmarov | 2d93008bd9 | |
UbitUmarov | eca89c6e61 | |
UbitUmarov | c8b3925085 | |
UbitUmarov | 7d58b73bbc | |
UbitUmarov | 8971e9f126 | |
UbitUmarov | 9011ca8461 | |
UbitUmarov | 773914591d | |
UbitUmarov | a23f99366f | |
UbitUmarov | 258d169392 | |
Robert Adams | fa5bf4fd0b | |
UbitUmarov | aea282ba38 | |
UbitUmarov | 4320758d97 | |
UbitUmarov | 01bd578bb0 | |
UbitUmarov | f26ad07ce1 | |
UbitUmarov | 67e540e05c | |
UbitUmarov | 12a6625dc7 | |
UbitUmarov | 7310b7625e | |
UbitUmarov | de153c2b62 | |
UbitUmarov | b920f784ea | |
UbitUmarov | c68e7b6621 | |
UbitUmarov | 5c156508e2 | |
UbitUmarov | 55babdc160 | |
UbitUmarov | 7217c20291 | |
UbitUmarov | f5f0fa5d1f | |
UbitUmarov | 74da81890c | |
UbitUmarov | 720a69a49b | |
UbitUmarov | b1c585718c | |
UbitUmarov | e5991124dd | |
UbitUmarov | 0fa3af96a4 | |
UbitUmarov | 79b2926ce1 | |
UbitUmarov | 90da5280af | |
UbitUmarov | e5bebe3a32 | |
UbitUmarov | 91caf98308 | |
UbitUmarov | a317bba8cf | |
UbitUmarov | 0f0673552c | |
UbitUmarov | 8f86de265c | |
UbitUmarov | 7be6e16555 | |
UbitUmarov | 27afe136d4 | |
UbitUmarov | 2c19d08448 | |
UbitUmarov | 6d23e0bc31 | |
UbitUmarov | d94b2e6f6d | |
UbitUmarov | 5274a3181e | |
UbitUmarov | 99111e5052 | |
UbitUmarov | 687c01b29e | |
UbitUmarov | d1306c8976 | |
UbitUmarov | 572e84c822 | |
UbitUmarov | 18f1ea1086 | |
UbitUmarov | 6a0eba3d7b | |
UbitUmarov | a2c824e124 | |
UbitUmarov | 2603363e3e | |
UbitUmarov | a7db505caf | |
UbitUmarov | 117e6ec266 | |
UbitUmarov | 6609965f6e | |
UbitUmarov | d5d09253bc | |
UbitUmarov | 582dc75381 | |
UbitUmarov | c54985f8a1 | |
UbitUmarov | f7ae87a0d5 | |
UbitUmarov | 289d4ca128 | |
UbitUmarov | 2be362bd67 | |
UbitUmarov | e7c2674dec | |
UbitUmarov | 8f10db0a6a | |
UbitUmarov | 426f2130fc | |
UbitUmarov | 5287489a3c | |
UbitUmarov | 7a82c7c5b2 | |
UbitUmarov | 8d8236cfb2 | |
UbitUmarov | d90b68c2a6 | |
UbitUmarov | 2777995331 | |
UbitUmarov | 31b4a31246 | |
UbitUmarov | 772c5b7db0 | |
Geir Nøklebye | 0d31898fd6 | |
UbitUmarov | e5377eb839 | |
UbitUmarov | 65e9421058 | |
UbitUmarov | 8195cd5153 | |
UbitUmarov | b6c23fe911 | |
UbitUmarov | 4286ae43f2 | |
UbitUmarov | 9a1d94f455 | |
UbitUmarov | dca3a45803 | |
UbitUmarov | 2008e65695 | |
UbitUmarov | 8989e8ef3a | |
UbitUmarov | c0bfaac0ac | |
UbitUmarov | 07e614a32c | |
UbitUmarov | 3c97bb1e6f | |
UbitUmarov | e1aa591815 | |
UbitUmarov | d5e8e116d4 | |
UbitUmarov | 8e777d50a6 | |
UbitUmarov | e69057a1b6 | |
UbitUmarov | f3eb73926e | |
UbitUmarov | 928733efc9 | |
UbitUmarov | 7b80bcc57a | |
UbitUmarov | c080d9fa23 | |
UbitUmarov | 24885819fc | |
UbitUmarov | 4da5d249d8 | |
UbitUmarov | ea88927a65 | |
UbitUmarov | 73222e4dd4 | |
Geir Nøklebye | 8f9256ea1c | |
UbitUmarov | fcb435deb4 | |
UbitUmarov | bad00670a9 | |
UbitUmarov | 0320225ca8 | |
UbitUmarov | 7c3200b393 | |
UbitUmarov | e520dba717 | |
UbitUmarov | a2c2456076 | |
UbitUmarov | 319ccf17c8 | |
UbitUmarov | c7fdb2ec53 | |
UbitUmarov | a5e3aab575 | |
UbitUmarov | 046ec66ff9 | |
UbitUmarov | 02a4298b02 | |
UbitUmarov | 49d42ee08a | |
UbitUmarov | 774e00b3ee | |
UbitUmarov | 78c4f8000e | |
UbitUmarov | 9397b358d3 | |
UbitUmarov | 52dd683326 | |
UbitUmarov | 7c9615f000 | |
UbitUmarov | 2717ef5da9 | |
UbitUmarov | 40091f9be5 | |
UbitUmarov | ef35805176 | |
UbitUmarov | c5d0c69a35 | |
UbitUmarov | c28430d527 | |
UbitUmarov | c74e0e2d9b | |
Geir Nøklebye | 7f163e8f76 | |
Geir Nøklebye | c1d06a806d | |
UbitUmarov | eea247fcc5 | |
UbitUmarov | 156707edfb | |
UbitUmarov | 92df6095d5 | |
UbitUmarov | f968118e23 | |
UbitUmarov | 9ab8ce1404 | |
UbitUmarov | cb21caae77 | |
UbitUmarov | 25ca8695f3 | |
UbitUmarov | dd0269df48 | |
Geir Nøklebye | 7cf82a71d6 | |
UbitUmarov | 16f02cb6fd | |
UbitUmarov | 9ea49d107d | |
UbitUmarov | 086eb28a91 | |
UbitUmarov | 948138a3a4 | |
UbitUmarov | 566c96dc85 | |
UbitUmarov | d08df7bda7 | |
UbitUmarov | 5e577baa10 | |
UbitUmarov | 0f2ab6bddd | |
UbitUmarov | 8bdd4c3ed9 | |
UbitUmarov | 9c46e4921a | |
UbitUmarov | a932f24ba4 | |
UbitUmarov | dcdc527401 | |
UbitUmarov | 19d141c9a5 | |
UbitUmarov | 1b7aee89d3 | |
UbitUmarov | 97d02ecf32 | |
UbitUmarov | b8138c37d3 | |
UbitUmarov | cc95b7e2d4 | |
UbitUmarov | f09fafff34 | |
UbitUmarov | fb427daa34 | |
UbitUmarov | 211a1fe9d4 | |
UbitUmarov | 5968c6372a | |
UbitUmarov | 7e8c996d1b | |
UbitUmarov | 09c4952c6d | |
UbitUmarov | 731510c305 | |
UbitUmarov | 52d4cf692c | |
Geir Nøklebye | 03a38a80ab | |
UbitUmarov | 957ca41b13 | |
Geir Nøklebye | d952d62baa | |
UbitUmarov | 4b3d57e964 | |
UbitUmarov | 72811de98b | |
UbitUmarov | 5622b174c4 | |
UbitUmarov | f358b39ef5 | |
UbitUmarov | 6c79cc652b | |
UbitUmarov | 604b966d84 | |
UbitUmarov | 8ef43e5fb3 | |
UbitUmarov | b20778d8ec | |
UbitUmarov | 11f6d28a06 | |
UbitUmarov | d0912b6151 | |
UbitUmarov | de55ad9545 | |
UbitUmarov | c57215687f | |
UbitUmarov | 4b2ef46de6 | |
UbitUmarov | 76337b1d8e | |
UbitUmarov | 504736eb43 | |
UbitUmarov | 54eb6fc779 | |
UbitUmarov | eb93855d84 | |
UbitUmarov | ae191cd304 | |
UbitUmarov | 025bef4e07 | |
UbitUmarov | d26a9ed0b1 | |
UbitUmarov | d9038e650a | |
UbitUmarov | 8e30016841 | |
UbitUmarov | 3bc64f638a | |
Diva Canto | 3f641d98bd | |
Diva Canto | 424a7a274b | |
Diva Canto | dd88319495 | |
Diva Canto | ab4f870000 | |
UbitUmarov | f31fe66ce1 | |
UbitUmarov | 9e12ef9234 | |
UbitUmarov | 5f5b7e56db | |
UbitUmarov | 04a50b47bf | |
UbitUmarov | 3402819888 | |
UbitUmarov | 3a8dd24fd1 | |
UbitUmarov | d62aed7f46 | |
UbitUmarov | 3ef583f205 | |
UbitUmarov | fc46274732 | |
UbitUmarov | 4c42716022 | |
UbitUmarov | 94bb6d965e | |
UbitUmarov | 8a330bc45d | |
UbitUmarov | b0244107dc | |
UbitUmarov | 1b501f03f9 | |
UbitUmarov | cffe2f87e6 | |
UbitUmarov | 832ca518d7 | |
UbitUmarov | 02b43f06d1 | |
UbitUmarov | 1bfe9354e3 | |
UbitUmarov | 710677cdc6 | |
UbitUmarov | 55f7986b44 | |
UbitUmarov | a18ee3b6b3 | |
UbitUmarov | 6c2f8176ae | |
UbitUmarov | a890ea312b | |
UbitUmarov | ed22c5f3be | |
Diva Canto | 9c82ff7673 | |
Diva Canto | 3c43cdbbcc | |
UbitUmarov | 8498cc2f02 | |
Diva Canto | 1ca2a7937e | |
Diva Canto | 8e88a9d702 | |
Diva Canto | 9c6dd5d967 | |
Diva Canto | 45096b6238 | |
UbitUmarov | 28d8eda768 | |
UbitUmarov | 60dc124872 | |
Diva Canto | 442a736a4c | |
UbitUmarov | 2dbf96593c | |
UbitUmarov | a96c0f760a | |
UbitUmarov | 0d59a29dc7 | |
UbitUmarov | b67904a651 | |
Melanie Thielker | cf1064a245 | |
UbitUmarov | 10922c2a1a | |
UbitUmarov | 514249e80e | |
UbitUmarov | 116d32d947 | |
UbitUmarov | d8341588b3 | |
UbitUmarov | fedd1a93d2 | |
UbitUmarov | 522695c821 | |
UbitUmarov | 04117d9f75 | |
UbitUmarov | 725ccbb477 | |
UbitUmarov | 74f0ffbda6 | |
UbitUmarov | 019b34ea39 | |
UbitUmarov | 00091f1fb9 | |
UbitUmarov | ba4e13ef55 | |
UbitUmarov | 8d3d87e0b2 | |
UbitUmarov | ce655056ca | |
Diva Canto | c8fcf9bceb | |
Diva Canto | 8dfab8757c | |
UbitUmarov | 1b8c71c965 | |
UbitUmarov | ce3af94a69 | |
Diva Canto | 2b8cdb2a75 | |
Diva Canto | 3b01c209b2 | |
UbitUmarov | a680d8b8d7 | |
UbitUmarov | 7c5376f224 | |
UbitUmarov | 29ab39f14f | |
UbitUmarov | 2f6c78b888 | |
UbitUmarov | 7a54c3e9c3 | |
UbitUmarov | c91e101224 | |
UbitUmarov | 65a1547209 | |
UbitUmarov | 3b33a90e37 | |
UbitUmarov | 54819fa4ae | |
UbitUmarov | cf444ecc54 | |
Geir Nøklebye | ebcfad1a83 | |
Michael Cerquoni | b498d554e1 | |
UbitUmarov | 84c9125016 | |
Geir Nøklebye | 28125202cc | |
Geir Nøklebye | fe83763c36 | |
Michael Cerquoni | 52e03ee5bd | |
UbitUmarov | 006c08886a | |
UbitUmarov | 49884b94a7 | |
UbitUmarov | 9354e60df0 | |
UbitUmarov | b52f7b9203 | |
UbitUmarov | 0f7ffc56ce | |
UbitUmarov | 156ef0bbe3 | |
UbitUmarov | 4f8f04d949 | |
UbitUmarov | 73be6cb269 | |
UbitUmarov | 63383bf3c5 | |
UbitUmarov | 22e9647748 | |
UbitUmarov | 9d8220ac9f | |
UbitUmarov | 040037d713 | |
UbitUmarov | 1848b1fdb1 | |
UbitUmarov | a41924d1f8 | |
UbitUmarov | c0904a32cb | |
UbitUmarov | c58f2167bb | |
UbitUmarov | 2805cb9dec | |
UbitUmarov | d085c337a9 | |
UbitUmarov | e237e1b2fa | |
UbitUmarov | ca250e0b0b | |
UbitUmarov | 056b765fbc | |
UbitUmarov | c6150c2066 | |
UbitUmarov | 4bb27917f4 | |
UbitUmarov | 1264069b41 | |
UbitUmarov | 2bb5e98574 | |
UbitUmarov | eb11505d19 | |
UbitUmarov | 44993550a8 | |
UbitUmarov | 443fc60cdf | |
UbitUmarov | 24b7903cd0 | |
UbitUmarov | 6a35a965ff | |
Melanie Thielker | b033a2559e | |
Melanie Thielker | 5587ee4500 | |
UbitUmarov | 9a01fddd1c | |
UbitUmarov | efed73b2c3 | |
Melanie Thielker | 07c39624ef | |
Melanie Thielker | 202fcc7d6f | |
UbitUmarov | 056ccaed90 | |
UbitUmarov | d4111ff670 | |
UbitUmarov | 0091c37ed3 | |
UbitUmarov | f76ea3bb76 | |
UbitUmarov | 4b9c94a3aa | |
UbitUmarov | 56e3aaefde | |
UbitUmarov | cdc23bab74 | |
UbitUmarov | ed365f6220 | |
UbitUmarov | 2fc7993d69 | |
UbitUmarov | dd190f1a1f | |
UbitUmarov | 02fbe5a740 | |
UbitUmarov | f722f1cf6c | |
UbitUmarov | 74ac2034e0 | |
UbitUmarov | b45f6b933f | |
UbitUmarov | c673ef7e3c | |
UbitUmarov | df035a4022 | |
UbitUmarov | 8d99c86f96 | |
UbitUmarov | 50e318c401 | |
UbitUmarov | c14ec1a9bd | |
UbitUmarov | 7a1d9e213e | |
UbitUmarov | 186f0b73cd | |
UbitUmarov | 0a5d6671ce | |
UbitUmarov | 9d61df0887 | |
UbitUmarov | b20bd1a9df | |
UbitUmarov | 85a31c9e76 | |
UbitUmarov | d62854cbd3 | |
UbitUmarov | c0231fe169 | |
UbitUmarov | 48f137599f | |
UbitUmarov | 05196ebe27 | |
UbitUmarov | dac32c4e5a | |
UbitUmarov | df40cdc83e | |
UbitUmarov | 69bcbd856b | |
UbitUmarov | 97e6f21c6c | |
UbitUmarov | 6826ca9b57 | |
UbitUmarov | d8108ab740 | |
UbitUmarov | b9651652e1 | |
UbitUmarov | 984345a202 | |
UbitUmarov | 7651d60d72 | |
UbitUmarov | 673bd37219 | |
UbitUmarov | fe9a785ecc | |
UbitUmarov | b9ecc962ac | |
UbitUmarov | 3b96cd8ff2 | |
UbitUmarov | 1ff7e34996 | |
UbitUmarov | b23ce04a6e | |
UbitUmarov | e2c2d92d5a | |
UbitUmarov | e963789714 | |
UbitUmarov | c14d81f538 | |
UbitUmarov | 6d784f6306 | |
UbitUmarov | 06bca0388f | |
UbitUmarov | db2fbf6516 | |
UbitUmarov | 1113407280 | |
UbitUmarov | a5c693e302 | |
UbitUmarov | 2b5ef89272 | |
UbitUmarov | 180add745c | |
UbitUmarov | 6735d3496c | |
UbitUmarov | ffa6c7aae2 | |
UbitUmarov | 733072b6a3 | |
Melanie Thielker | d78f04b326 | |
UbitUmarov | b9e2606c2f | |
UbitUmarov | 45695ef2e3 | |
UbitUmarov | 694720d7a9 | |
UbitUmarov | add27a503e | |
UbitUmarov | 6172446e2a | |
UbitUmarov | 254b26a7d5 | |
UbitUmarov | 9d28fd41c6 | |
UbitUmarov | 5da7752ebc | |
UbitUmarov | 82a26671b8 | |
UbitUmarov | 5fc3605955 | |
UbitUmarov | 1107d0ccb9 | |
UbitUmarov | 2a01173715 | |
UbitUmarov | 88c96d3973 | |
UbitUmarov | 5c79e03f18 | |
UbitUmarov | 52e7fc31f7 | |
UbitUmarov | 1b95ada105 | |
UbitUmarov | 86cc02f33e | |
UbitUmarov | 4bdf89d59b | |
UbitUmarov | bbbbf47507 | |
UbitUmarov | 82fc8e1a36 | |
UbitUmarov | 18a292ad02 | |
UbitUmarov | 8114ff9d06 | |
UbitUmarov | 30dccd57cd | |
UbitUmarov | 6627da693e | |
UbitUmarov | 806e75eefb | |
UbitUmarov | 55c04a2410 | |
UbitUmarov | 95ff859484 | |
UbitUmarov | 3a81642d97 | |
UbitUmarov | 049dd374e9 | |
UbitUmarov | 4993a08d25 | |
UbitUmarov | ccaa7a4a8a | |
UbitUmarov | 1680425f4d | |
UbitUmarov | 9df95afd86 | |
UbitUmarov | b981ac42bc | |
UbitUmarov | ebbb918404 | |
UbitUmarov | 6b017f94ea | |
UbitUmarov | 877d3092b4 | |
UbitUmarov | 08dee3fa34 | |
UbitUmarov | 7cb3d583a9 | |
UbitUmarov | ec8393571f | |
UbitUmarov | 93ea7bd7f4 | |
UbitUmarov | bb32b3b4a1 | |
UbitUmarov | 0c39a3e348 | |
UbitUmarov | 01a4a883e0 | |
UbitUmarov | 8c7fe3c0db | |
UbitUmarov | 2ce0673af2 | |
UbitUmarov | 085965b86c | |
UbitUmarov | 6b0094645c | |
UbitUmarov | 80d4f76d18 | |
UbitUmarov | 7aa4bd7006 | |
UbitUmarov | 5b946405a0 | |
UbitUmarov | 9843e3776e | |
UbitUmarov | b51739e23e | |
UbitUmarov | db1e75b0ac | |
UbitUmarov | 82997c5907 | |
UbitUmarov | e5383604cb | |
UbitUmarov | 606e9f99f3 | |
UbitUmarov | 4f9378bf97 | |
UbitUmarov | 9aec227767 | |
UbitUmarov | 7ba3fb7b5d | |
UbitUmarov | a0538eb53d | |
UbitUmarov | 081c66631c | |
UbitUmarov | 8d22b79ba4 | |
UbitUmarov | 68a4e363dd | |
UbitUmarov | 4c7b2b2ed7 | |
UbitUmarov | c035871e76 | |
UbitUmarov | d0ccaead0e | |
UbitUmarov | 3b76b2f176 | |
UbitUmarov | 5576a100ce | |
UbitUmarov | a9befe1c62 | |
UbitUmarov | 62d0e50ca4 | |
UbitUmarov | a63aef978a | |
UbitUmarov | cb23d1bf24 | |
UbitUmarov | 22b1b91599 | |
UbitUmarov | 18bcacdded | |
UbitUmarov | 3cf8a58f9d | |
UbitUmarov | 376084a2e5 | |
UbitUmarov | 2062418c56 | |
UbitUmarov | 475087de79 | |
UbitUmarov | 2cacd77d41 | |
UbitUmarov | 2c6db4f617 | |
UbitUmarov | 46c55b6fa0 | |
UbitUmarov | eaefae7e20 | |
UbitUmarov | 79e464f33f | |
UbitUmarov | e881562d34 | |
UbitUmarov | 442b272228 | |
UbitUmarov | 6a02ac634b | |
UbitUmarov | c802368c86 |
|
@ -145,7 +145,12 @@
|
|||
</exec>
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.services.inventoryservice.tests)==0}" />
|
||||
|
||||
<delete dir="%temp%"/>
|
||||
<exec program="${nunitcmd}" failonerror="true" resultproperty="testresult.opensim.tests.permissions">
|
||||
<arg value="./bin/OpenSim.Tests.Permissions.dll" />
|
||||
</exec>
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.tests.permissions)==0}" />
|
||||
|
||||
<delete dir="%temp%"/>
|
||||
</target>
|
||||
|
||||
<target name="test-stress" depends="build, find-nunit">
|
||||
|
@ -260,6 +265,11 @@
|
|||
<arg value="-xml=test-results/OpenSim.Services.InventoryService.Tests.dll-Results.xml" />
|
||||
</exec>
|
||||
|
||||
<exec program="${nunitcmd}" failonerror="false" resultproperty="testresult.opensim.tests.permissions">
|
||||
<arg value="./bin/OpenSim.Tests.Permissions.dll" />
|
||||
<arg value="-xml=test-results/OpenSim.Tests.Permissions.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}" />
|
||||
|
@ -271,6 +281,7 @@
|
|||
<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}" />
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.services.inventoryservice.tests)==0}" />
|
||||
<fail message="Failures reported in unit tests." unless="${int::parse(testresult.opensim.tests.permissions)==0}" />
|
||||
</target>
|
||||
|
||||
<target name="doxygen">
|
||||
|
|
35
BUILDING.md
35
BUILDING.md
|
@ -1,38 +1,35 @@
|
|||
# Building on Windows
|
||||
|
||||
Steps:
|
||||
|
||||
* runprebuild.bat
|
||||
* Load OpenSim.sln into Visual Studio .NET and build the solution.
|
||||
* chdir bin
|
||||
* copy OpenSim.ini.example to OpenSim.ini and other appropriate files in bin/config-include
|
||||
* run OpenSim.exe
|
||||
|
||||
# Building on Linux
|
||||
# Building on Linux / Mac
|
||||
|
||||
Prereqs:
|
||||
* Mono >= 2.4.3
|
||||
* Nant >= 0.85
|
||||
* 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
|
||||
|
||||
* Mono > 5.0
|
||||
* On some Linux distributions you may need to install additional packages.
|
||||
* msbuild or xbuild if still supported by the mono version
|
||||
* See http://opensimulator.org/wiki/Dependencies for more information.
|
||||
|
||||
From the distribution type:
|
||||
|
||||
* ./runprebuild.sh
|
||||
* nant (or !* xbuild)
|
||||
* type msbuild or xbuild
|
||||
* cd bin
|
||||
* copy OpenSim.ini.example to OpenSim.ini and other appropriate files in bin/config-include
|
||||
* run mono OpenSim.exe
|
||||
!* xbuild option switches
|
||||
!* clean: xbuild /target:clean
|
||||
!* debug: (default) xbuild /property:Configuration=Debug
|
||||
!* release: xbuild /property:Configuration=Release
|
||||
|
||||
# Using Monodevelop
|
||||
|
||||
From the distribution type:
|
||||
* ./runprebuild.sh
|
||||
* type monodevelop OpenSim.sln
|
||||
* review and change those ini files according to your needs
|
||||
* windows: execute opensim.exe or opensim32.exe for small regions
|
||||
* linux: run ./opensim.sh
|
||||
* msbuild (xbuild) option switches
|
||||
* clean: msbuild /target:clean
|
||||
* debug: (default) msbuild /property:Configuration=Debug
|
||||
* release: msbuild /property:Configuration=Release
|
||||
|
||||
# References
|
||||
|
||||
|
|
|
@ -4,14 +4,9 @@ The following people have contributed to OpenSim (Thank you for your effort!)
|
|||
These folks represent the current core team for OpenSim, and are the
|
||||
people that make the day to day of OpenSim happen.
|
||||
|
||||
* justincc (OSVW Consulting, justincc.org)
|
||||
* Melanie Thielker
|
||||
* Diva (Crista Lopes, University of California, Irvine)
|
||||
* BlueWall (James Hughes)
|
||||
* Nebadon Izumi (Michael Cerquoni, OSgrid)
|
||||
* Snoopy Pfeffer
|
||||
* Robert Adams (MisterBlue)
|
||||
* Oren Hurvitz (Kitely)
|
||||
* Kevin Cozens
|
||||
* Leal Duarte (Ubit Umarov)
|
||||
|
||||
|
@ -20,11 +15,8 @@ Core developers who have temporarily (we hope) gone chasing the white rabbit.
|
|||
They are in all similar to the active core developers, except that they haven't
|
||||
been that active lately, so their voting rights are awaiting their come back.
|
||||
|
||||
* Teravus (w3z)
|
||||
* Arthur Rodrigo S Valadares (IBM)
|
||||
* Dan Lake
|
||||
* Marck
|
||||
* Mic Bowman
|
||||
* Nebadon Izumi (Michael Cerquoni, OSgrid)
|
||||
* Alicia Raven
|
||||
|
||||
= Past Open Sim Developers =
|
||||
These folks are alumns of the OpenSim core group, but are now
|
||||
|
@ -57,7 +49,15 @@ where we are today.
|
|||
* John Hurliman
|
||||
* chi11ken (Genkii)
|
||||
* dahlia
|
||||
|
||||
* justincc (OSVW Consulting, justincc.org)
|
||||
* Arthur Rodrigo S Valadares (IBM)
|
||||
* BlueWall (James Hughes)
|
||||
* Dan Lake
|
||||
* Marck
|
||||
* Mic Bowman
|
||||
* Oren Hurvitz (Kitely)
|
||||
* Snoopy Pfeffer
|
||||
* Teravus (w3z)
|
||||
|
||||
= Additional OpenSim Contributors =
|
||||
These folks have contributed code patches or content to OpenSimulator to help make it
|
||||
|
@ -69,9 +69,9 @@ what it is today.
|
|||
* alex_carnell
|
||||
* Alan Webb (IBM)
|
||||
* Aleric
|
||||
* Alicia Raven
|
||||
* Allen Kerensky
|
||||
* BigFootAg
|
||||
* Bill Blight
|
||||
* BlueWall Slade
|
||||
* bobshaffer2
|
||||
* brianw/Sir_Ahzz
|
||||
|
@ -131,6 +131,7 @@ what it is today.
|
|||
* KittyLiu
|
||||
* Kurt Taylor (IBM)
|
||||
* Lani Global
|
||||
* lickx
|
||||
* lillith_xue
|
||||
* lkalif
|
||||
* LuciusSirnah
|
||||
|
@ -142,6 +143,7 @@ what it is today.
|
|||
* Mandarinka Tasty
|
||||
* MarcelEdward
|
||||
* Matt Lehmann
|
||||
* mewtwo0641
|
||||
* Mic Bowman
|
||||
* Michelle Argus
|
||||
* Michael Cortez (The Flotsam Project, http://osflotsam.org/)
|
||||
|
@ -149,6 +151,7 @@ what it is today.
|
|||
* Micheil Merlin
|
||||
* Mike Osias (IBM)
|
||||
* Mike Pitman (IBM)
|
||||
* Mike Rieker (Dreamnation)
|
||||
* mikemig
|
||||
* mikkopa/_someone - RealXtend
|
||||
* Misterblue
|
||||
|
@ -182,16 +185,20 @@ what it is today.
|
|||
* SpotOn3D
|
||||
* Stefan_Boom / stoehr
|
||||
* Steven Zielinski (MOSES)
|
||||
* Stolen Ruby
|
||||
* Strawberry Fride
|
||||
* Talun
|
||||
* TechplexEngineer (Blake Bourque)
|
||||
* TBG Renfold
|
||||
* Terry Ford
|
||||
* tglion
|
||||
* tlaukkan/Tommil (Tommi S. E. Laukkanen, Bubble Cloud)
|
||||
* TomDataWorks
|
||||
* TomTheDragon (muckwaddle)
|
||||
* tyre
|
||||
* uriesk
|
||||
* Vegaslon <vegaslon@gmail.com>
|
||||
* Vincent Sylvester
|
||||
* VikingErik
|
||||
* Vytek
|
||||
* webmage (IBM)
|
||||
|
|
|
@ -252,7 +252,7 @@ namespace OpenSim.Groups
|
|||
|
||||
m_debugEnabled = verbose;
|
||||
|
||||
MainConsole.Instance.OutputFormat("{0} verbose logging set to {1}", Name, m_debugEnabled);
|
||||
MainConsole.Instance.Output("{0} verbose logging set to {1}", Name, m_debugEnabled);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -599,36 +599,34 @@ namespace OpenSim.Groups
|
|||
{
|
||||
if (m_debugEnabled) m_log.DebugFormat("[Groups.Messaging]: Sending chatterbox invite instant message");
|
||||
|
||||
UUID fromAgent = new UUID(msg.fromAgentID);
|
||||
// Force? open the group session dialog???
|
||||
// and simultanously deliver the message, so we don't need to do a seperate client.SendInstantMessage(msg);
|
||||
IEventQueue eq = activeClient.Scene.RequestModuleInterface<IEventQueue>();
|
||||
eq.ChatterboxInvitation(
|
||||
GroupID
|
||||
, groupInfo.GroupName
|
||||
, new UUID(msg.fromAgentID)
|
||||
, msg.message
|
||||
, AgentID
|
||||
, msg.fromAgentName
|
||||
, msg.dialog
|
||||
, msg.timestamp
|
||||
, msg.offline == 1
|
||||
, (int)msg.ParentEstateID
|
||||
, msg.Position
|
||||
, 1
|
||||
, new UUID(msg.imSessionID)
|
||||
, msg.fromGroup
|
||||
, OpenMetaverse.Utils.StringToBytes(groupInfo.GroupName)
|
||||
);
|
||||
if (eq != null)
|
||||
{
|
||||
eq.ChatterboxInvitation(
|
||||
GroupID
|
||||
, groupInfo.GroupName
|
||||
, fromAgent
|
||||
, msg.message
|
||||
, AgentID
|
||||
, msg.fromAgentName
|
||||
, msg.dialog
|
||||
, msg.timestamp
|
||||
, msg.offline == 1
|
||||
, (int)msg.ParentEstateID
|
||||
, msg.Position
|
||||
, 1
|
||||
, new UUID(msg.imSessionID)
|
||||
, msg.fromGroup
|
||||
, OpenMetaverse.Utils.StringToBytes(groupInfo.GroupName)
|
||||
);
|
||||
|
||||
eq.ChatterBoxSessionAgentListUpdates(
|
||||
new UUID(GroupID)
|
||||
, AgentID
|
||||
, new UUID(msg.toAgentID)
|
||||
, false //canVoiceChat
|
||||
, false //isModerator
|
||||
, false //text mute
|
||||
, true // Enter
|
||||
);
|
||||
var update = new GroupChatListAgentUpdateData(AgentID);
|
||||
var updates = new List<GroupChatListAgentUpdateData> { update };
|
||||
eq.ChatterBoxSessionAgentListUpdates(GroupID, new UUID(msg.toAgentID), updates);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -663,15 +661,12 @@ namespace OpenSim.Groups
|
|||
ChatterBoxSessionStartReplyViaCaps(remoteClient, groupInfo.GroupName, GroupID);
|
||||
|
||||
IEventQueue queue = remoteClient.Scene.RequestModuleInterface<IEventQueue>();
|
||||
queue.ChatterBoxSessionAgentListUpdates(
|
||||
GroupID
|
||||
, AgentID
|
||||
, new UUID(im.toAgentID)
|
||||
, false //canVoiceChat
|
||||
, false //isModerator
|
||||
, false //text mute
|
||||
, true
|
||||
);
|
||||
if (queue != null)
|
||||
{
|
||||
var update = new GroupChatListAgentUpdateData(AgentID);
|
||||
var updates = new List<GroupChatListAgentUpdateData> { update };
|
||||
queue.ChatterBoxSessionAgentListUpdates(GroupID, remoteClient.AgentId, updates);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -713,11 +708,7 @@ namespace OpenSim.Groups
|
|||
bodyMap.Add("session_info", sessionMap);
|
||||
|
||||
IEventQueue queue = remoteClient.Scene.RequestModuleInterface<IEventQueue>();
|
||||
|
||||
if (queue != null)
|
||||
{
|
||||
queue.Enqueue(queue.BuildEvent("ChatterBoxSessionStartReply", bodyMap), remoteClient.AgentId);
|
||||
}
|
||||
queue?.Enqueue(queue.BuildEvent("ChatterBoxSessionStartReply", bodyMap), remoteClient.AgentId);
|
||||
}
|
||||
|
||||
private void DebugGridInstantMessage(GridInstantMessage im)
|
||||
|
|
|
@ -38,7 +38,7 @@ using OpenSim.Framework;
|
|||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using DirFindFlags = OpenMetaverse.DirectoryManager.DirFindFlags;
|
||||
using PermissionMask = OpenSim.Framework.PermissionMask;
|
||||
|
||||
namespace OpenSim.Groups
|
||||
{
|
||||
|
@ -127,7 +127,7 @@ namespace OpenSim.Groups
|
|||
|
||||
m_debugEnabled = verbose;
|
||||
|
||||
MainConsole.Instance.OutputFormat("{0} verbose logging set to {1}", Name, m_debugEnabled);
|
||||
MainConsole.Instance.Output("{0} verbose logging set to {1}", Name, m_debugEnabled);
|
||||
}
|
||||
|
||||
public void RegionLoaded(Scene scene)
|
||||
|
@ -233,7 +233,7 @@ namespace OpenSim.Groups
|
|||
if (m_debugEnabled) m_log.DebugFormat("[Groups]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||
|
||||
client.OnAgentDataUpdateRequest += OnAgentDataUpdateRequest;
|
||||
client.OnRequestAvatarProperties += OnRequestAvatarProperties;
|
||||
//client.OnRequestAvatarProperties += OnRequestAvatarProperties;
|
||||
}
|
||||
|
||||
|
||||
|
@ -249,7 +249,7 @@ namespace OpenSim.Groups
|
|||
// There might be some problem with the thread we're generating this on but not
|
||||
// doing the update at this time causes problems (Mantis #7920 and #7915)
|
||||
// TODO: move sending this update to a later time in the rootification of the client.
|
||||
if(!sp.haveGroupInformation)
|
||||
if(!sp.m_haveGroupInformation)
|
||||
SendAgentGroupDataUpdate(sp.ControllingClient, false);
|
||||
}
|
||||
|
||||
|
@ -261,7 +261,7 @@ namespace OpenSim.Groups
|
|||
// Used for Notices and Group Invites/Accept/Reject
|
||||
sp.ControllingClient.OnInstantMessage -= OnInstantMessage;
|
||||
}
|
||||
|
||||
/*
|
||||
private void OnRequestAvatarProperties(IClientAPI remoteClient, UUID avatarID)
|
||||
{
|
||||
if (m_debugEnabled) m_log.DebugFormat("[Groups]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||
|
@ -269,7 +269,7 @@ namespace OpenSim.Groups
|
|||
GroupMembershipData[] avatarGroups = GetProfileListedGroupMemberships(remoteClient, avatarID);
|
||||
remoteClient.SendAvatarGroupsReply(avatarID, avatarGroups);
|
||||
}
|
||||
|
||||
*/
|
||||
private void OnClientClosed(UUID AgentId, Scene scene)
|
||||
{
|
||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||
|
@ -281,7 +281,7 @@ namespace OpenSim.Groups
|
|||
if (client != null)
|
||||
{
|
||||
client.OnAgentDataUpdateRequest -= OnAgentDataUpdateRequest;
|
||||
client.OnRequestAvatarProperties -= OnRequestAvatarProperties;
|
||||
//client.OnRequestAvatarProperties -= OnRequestAvatarProperties;
|
||||
// make child possible not called?
|
||||
client.OnUUIDGroupNameRequest -= HandleUUIDGroupNameRequest;
|
||||
client.OnInstantMessage -= OnInstantMessage;
|
||||
|
@ -344,14 +344,24 @@ namespace OpenSim.Groups
|
|||
|
||||
private void OnInstantMessage(IClientAPI remoteClient, GridInstantMessage im)
|
||||
{
|
||||
if (m_debugEnabled) m_log.DebugFormat("[Groups]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||
if (m_debugEnabled)
|
||||
m_log.DebugFormat("[Groups]: OnInstantMessage called");
|
||||
|
||||
if(remoteClient == null || !remoteClient.IsActive || remoteClient.AgentId == UUID.Zero)
|
||||
return;
|
||||
|
||||
Scene scene = (Scene)remoteClient.Scene;
|
||||
if (scene == null)
|
||||
return;
|
||||
|
||||
string remoteAgentIDstr = remoteClient.AgentId.ToString();
|
||||
|
||||
//m_log.DebugFormat("[Groups]: IM From {0} to {1} msg {2} type {3}", im.fromAgentID, im.toAgentID, im.message, (InstantMessageDialog)im.dialog);
|
||||
// Group invitations
|
||||
if ((im.dialog == (byte)InstantMessageDialog.GroupInvitationAccept) || (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline))
|
||||
{
|
||||
UUID inviteID = new UUID(im.imSessionID);
|
||||
GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(GetRequestingAgentIDStr(remoteClient), inviteID);
|
||||
GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(remoteAgentIDstr, inviteID);
|
||||
|
||||
if (inviteInfo == null)
|
||||
{
|
||||
|
@ -374,7 +384,7 @@ namespace OpenSim.Groups
|
|||
|
||||
// and the sessionid is the role
|
||||
string reason = string.Empty;
|
||||
if (!m_groupData.AddAgentToGroup(GetRequestingAgentIDStr(remoteClient), invitee.ToString(), inviteInfo.GroupID, inviteInfo.RoleID, string.Empty, out reason))
|
||||
if (!m_groupData.AddAgentToGroup(remoteAgentIDstr, invitee.ToString(), inviteInfo.GroupID, inviteInfo.RoleID, string.Empty, out reason))
|
||||
remoteClient.SendAgentAlertMessage("Unable to add you to the group: " + reason, false);
|
||||
else
|
||||
{
|
||||
|
@ -401,121 +411,237 @@ namespace OpenSim.Groups
|
|||
}
|
||||
}
|
||||
|
||||
m_groupData.RemoveAgentToGroupInvite(GetRequestingAgentIDStr(remoteClient), inviteID);
|
||||
m_groupData.RemoveAgentToGroupInvite(remoteAgentIDstr, inviteID);
|
||||
}
|
||||
|
||||
// Reject
|
||||
if (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline)
|
||||
{
|
||||
if (m_debugEnabled) m_log.DebugFormat("[Groups]: Received a reject invite notice.");
|
||||
m_groupData.RemoveAgentToGroupInvite(GetRequestingAgentIDStr(remoteClient), inviteID);
|
||||
if (m_debugEnabled)
|
||||
m_log.DebugFormat("[Groups]: Received a reject invite notice.");
|
||||
|
||||
m_groupData.RemoveAgentFromGroup(GetRequestingAgentIDStr(remoteClient), inviteInfo.AgentID, inviteInfo.GroupID);
|
||||
m_groupData.RemoveAgentToGroupInvite(remoteAgentIDstr, inviteID);
|
||||
m_groupData.RemoveAgentFromGroup(remoteAgentIDstr, inviteInfo.AgentID, inviteInfo.GroupID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Group notices
|
||||
if ((im.dialog == (byte)InstantMessageDialog.GroupNotice))
|
||||
else if ((im.dialog == (byte)InstantMessageDialog.GroupNotice))
|
||||
{
|
||||
if (!m_groupNoticesEnabled)
|
||||
return;
|
||||
|
||||
UUID GroupID = new UUID(im.toAgentID);
|
||||
GroupMembershipData grpMemberData = m_groupData.GetAgentGroupMembership(remoteAgentIDstr, remoteAgentIDstr, GroupID);
|
||||
if (grpMemberData == null)
|
||||
{
|
||||
remoteClient.SendAgentAlertMessage("Group membership not found", false);
|
||||
return;
|
||||
}
|
||||
|
||||
UUID GroupID = new UUID(im.toAgentID);
|
||||
if (m_groupData.GetGroupRecord(GetRequestingAgentIDStr(remoteClient), GroupID, null) != null)
|
||||
if ((grpMemberData.GroupPowers & (ulong)GroupPowers.SendNotices) == 0)
|
||||
{
|
||||
UUID NoticeID = UUID.Random();
|
||||
string Subject = im.message.Substring(0, im.message.IndexOf('|'));
|
||||
string Message = im.message.Substring(Subject.Length + 1);
|
||||
remoteClient.SendAgentAlertMessage("No permission to send notice to group", false);
|
||||
return;
|
||||
}
|
||||
|
||||
InventoryItemBase item = null;
|
||||
bool hasAttachment = false;
|
||||
int index = im.message.IndexOf('|');
|
||||
if (index < 0)
|
||||
return;
|
||||
|
||||
if (im.binaryBucket.Length >= 1 && im.binaryBucket[0] > 0)
|
||||
string Subject = im.message.Substring(0, index);
|
||||
string Message = im.message.Substring(index + 1);
|
||||
|
||||
UUID NoticeID = UUID.Random();
|
||||
|
||||
InventoryItemBase item = null;
|
||||
bool hasAttachment = false;
|
||||
|
||||
if (im.binaryBucket.Length >= 1 && im.binaryBucket[0] > 0)
|
||||
{
|
||||
UUID itemID = UUID.Zero;
|
||||
UUID ownerID = UUID.Zero;
|
||||
try
|
||||
{
|
||||
hasAttachment = true;
|
||||
string binBucket = OpenMetaverse.Utils.BytesToString(im.binaryBucket);
|
||||
binBucket = binBucket.Remove(0, 14).Trim();
|
||||
string binBucket = Utils.BytesToString(im.binaryBucket);
|
||||
binBucket = binBucket.Substring(15); // remove extra LLSD pre header
|
||||
|
||||
OSD binBucketOSD = OSDParser.DeserializeLLSDXml(binBucket);
|
||||
if (binBucketOSD is OSDMap)
|
||||
{
|
||||
OSDMap binBucketMap = (OSDMap)binBucketOSD;
|
||||
|
||||
UUID itemID = binBucketMap["item_id"].AsUUID();
|
||||
UUID ownerID = binBucketMap["owner_id"].AsUUID();
|
||||
item = m_sceneList[0].InventoryService.GetItem(ownerID, itemID);
|
||||
}
|
||||
else
|
||||
m_log.DebugFormat("[Groups]: Received OSD with unexpected type: {0}", binBucketOSD.GetType());
|
||||
OSDMap binBucketMAP = (OSDMap)OSDParser.DeserializeLLSDXml(binBucket);
|
||||
itemID = binBucketMAP["item_id"].AsUUID();
|
||||
ownerID = binBucketMAP["owner_id"].AsUUID();
|
||||
}
|
||||
catch
|
||||
{
|
||||
m_log.DebugFormat("[GROUPS]: failed to decode group notice bucket");
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_groupData.AddGroupNotice(GetRequestingAgentIDStr(remoteClient), GroupID, NoticeID, im.fromAgentName, Subject, Message,
|
||||
hasAttachment,
|
||||
(byte)(item == null ? 0 : item.AssetType),
|
||||
item == null ? null : item.Name,
|
||||
item == null ? UUID.Zero : item.ID,
|
||||
item == null ? UUID.Zero.ToString() : item.Owner.ToString()))
|
||||
if (itemID != UUID.Zero && ownerID != UUID.Zero)
|
||||
{
|
||||
if (OnNewGroupNotice != null)
|
||||
item = scene.InventoryService.GetItem(ownerID, itemID);
|
||||
if(item != null)
|
||||
{
|
||||
OnNewGroupNotice(GroupID, NoticeID);
|
||||
}
|
||||
|
||||
// Send notice out to everyone that wants notices
|
||||
foreach (GroupMembersData member in m_groupData.GetGroupMembers(GetRequestingAgentIDStr(remoteClient), GroupID))
|
||||
{
|
||||
if (member.AcceptNotices)
|
||||
if ((item.CurrentPermissions & (uint)(PermissionMask.Transfer | PermissionMask.Copy)) !=
|
||||
(uint)(PermissionMask.Transfer | PermissionMask.Copy))
|
||||
{
|
||||
// Build notice IIM, one of reach, because the sending may be async
|
||||
GridInstantMessage msg = CreateGroupNoticeIM(UUID.Zero, NoticeID, (byte)OpenMetaverse.InstantMessageDialog.GroupNotice);
|
||||
msg.toAgentID = member.AgentID.Guid;
|
||||
OutgoingInstantMessage(msg, member.AgentID);
|
||||
remoteClient.SendAgentAlertMessage("Item must be have Copy and Transfer rights to attach to group notice", false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
hasAttachment = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_groupData.AddGroupNotice(remoteAgentIDstr, GroupID, NoticeID, im.fromAgentName, Subject, Message,
|
||||
hasAttachment,
|
||||
(byte)(item == null ? 0 : item.AssetType),
|
||||
item == null ? null : item.Name,
|
||||
item == null ? UUID.Zero : item.ID,
|
||||
item == null ? UUID.Zero.ToString() : item.Owner.ToString()))
|
||||
{
|
||||
OnNewGroupNotice?.Invoke(GroupID, NoticeID);
|
||||
|
||||
// Send notice out to everyone that wants notices
|
||||
foreach (GroupMembersData member in m_groupData.GetGroupMembers(remoteAgentIDstr, GroupID))
|
||||
{
|
||||
GridInstantMessage msg = CreateGroupNoticeIM(UUID.Zero, NoticeID, (byte)InstantMessageDialog.GroupNotice);
|
||||
if (member.AcceptNotices)
|
||||
{
|
||||
// Build notice IIM, one of reach, because the sending may be async
|
||||
msg.toAgentID = member.AgentID.Guid;
|
||||
OutgoingInstantMessage(msg, member.AgentID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (im.dialog == (byte)InstantMessageDialog.GroupNoticeInventoryAccepted)
|
||||
{
|
||||
if (im.binaryBucket.Length < 16) // Invalid
|
||||
if (!m_groupNoticesEnabled)
|
||||
return;
|
||||
|
||||
//// 16 bytes are the UUID. Maybe.
|
||||
// UUID folderID = new UUID(im.binaryBucket, 0);
|
||||
UUID noticeID = new UUID(im.imSessionID);
|
||||
|
||||
GroupNoticeInfo notice = m_groupData.GetGroupNotice(remoteClient.AgentId.ToString(), noticeID);
|
||||
if (notice != null)
|
||||
if (m_debugEnabled)
|
||||
m_log.DebugFormat("[xmlGROUPS]: Accepted notice {0} for {1}", noticeID, remoteClient.AgentId);
|
||||
|
||||
if (noticeID == UUID.Zero)
|
||||
return;
|
||||
|
||||
UUID folderID = UUID.Zero;
|
||||
try
|
||||
{
|
||||
UUID giver = new UUID(im.toAgentID);
|
||||
string tmp = string.Empty;
|
||||
Util.ParseUniversalUserIdentifier(notice.noticeData.AttachmentOwnerID, out giver, out tmp, out tmp, out tmp, out tmp);
|
||||
|
||||
m_log.DebugFormat("[Groups]: Giving inventory from {0} to {1}", giver, remoteClient.AgentId);
|
||||
string message;
|
||||
InventoryItemBase itemCopy = ((Scene)(remoteClient.Scene)).GiveInventoryItem(remoteClient.AgentId,
|
||||
giver, notice.noticeData.AttachmentItemID, out message);
|
||||
|
||||
if (itemCopy == null)
|
||||
{
|
||||
remoteClient.SendAgentAlertMessage(message, false);
|
||||
return;
|
||||
}
|
||||
|
||||
remoteClient.SendInventoryItemCreateUpdate(itemCopy, 0);
|
||||
if (im.binaryBucket != null && im.binaryBucket.Length >= 16)
|
||||
folderID = new UUID(im.binaryBucket, 0);
|
||||
}
|
||||
catch
|
||||
{
|
||||
m_log.DebugFormat("[xmlGROUPS]: GroupNoticeInventoryAccepted failed to decode target folder");
|
||||
return;
|
||||
}
|
||||
|
||||
GroupNoticeInfo notice = m_groupData.GetGroupNotice(remoteAgentIDstr, noticeID);
|
||||
if (notice == null)
|
||||
{
|
||||
if (m_debugEnabled)
|
||||
m_log.DebugFormat(
|
||||
"[GROUPS]: Could not find notice {0} for {1} on GroupNoticeInventoryAccepted.",
|
||||
noticeID, remoteClient.AgentId);
|
||||
return;
|
||||
}
|
||||
|
||||
string tmp;
|
||||
UUID giver = new UUID(im.toAgentID);
|
||||
Util.ParseUniversalUserIdentifier(notice.noticeData.AttachmentOwnerID, out giver, out tmp, out tmp, out tmp, out tmp);
|
||||
|
||||
m_log.DebugFormat("[Groups]: Giving inventory from {0} to {1}", giver, remoteClient.AgentId);
|
||||
|
||||
string message = "Could not find group notice attached item";
|
||||
InventoryItemBase itemCopy = scene.GiveInventoryItem(remoteClient.AgentId,
|
||||
giver, notice.noticeData.AttachmentItemID, folderID, out message);
|
||||
|
||||
if (itemCopy == null)
|
||||
{
|
||||
remoteClient.SendAgentAlertMessage(message, false);
|
||||
return;
|
||||
}
|
||||
|
||||
remoteClient.SendInventoryItemCreateUpdate(itemCopy, 0);
|
||||
}
|
||||
|
||||
else if (im.dialog == (byte)InstantMessageDialog.GroupNoticeInventoryDeclined)
|
||||
{
|
||||
if (!m_groupNoticesEnabled)
|
||||
return;
|
||||
|
||||
UUID noticeID = new UUID(im.imSessionID);
|
||||
|
||||
if (m_debugEnabled)
|
||||
m_log.DebugFormat("[GROUPS]: Accepted notice {0} for {1}", noticeID, remoteAgentIDstr);
|
||||
|
||||
if (noticeID == UUID.Zero)
|
||||
return;
|
||||
|
||||
UUID remoteAgentID = remoteClient.AgentId;
|
||||
|
||||
GroupNoticeInfo notice = m_groupData.GetGroupNotice(remoteAgentIDstr, noticeID);
|
||||
if (notice == null)
|
||||
{
|
||||
if (m_debugEnabled)
|
||||
m_log.DebugFormat(
|
||||
"[GROUPS]: Could not find notice {0} for {1} on GroupNoticeInventoryAccepted.",
|
||||
noticeID, remoteClient.AgentId);
|
||||
return;
|
||||
}
|
||||
string giver = notice.noticeData.AttachmentOwnerID;
|
||||
UUID attachmentUUID = notice.noticeData.AttachmentItemID;
|
||||
|
||||
if (attachmentUUID == null ||
|
||||
attachmentUUID == UUID.Zero ||
|
||||
giver == null ||
|
||||
giver == UUID.Zero.ToString()
|
||||
)
|
||||
return;
|
||||
|
||||
if (m_debugEnabled)
|
||||
m_log.DebugFormat("[xmlGroups]: Deny inventory from {0} to {1}", giver, remoteAgentIDstr);
|
||||
|
||||
string message = String.Empty;
|
||||
|
||||
InventoryItemBase itemCopy = scene.InventoryService.GetItem(remoteAgentID, attachmentUUID);
|
||||
if (itemCopy == null)
|
||||
return;
|
||||
|
||||
InventoryFolderBase trash = scene.InventoryService.GetFolderForType(remoteAgentID, FolderType.Trash);
|
||||
if (trash == null)
|
||||
{
|
||||
m_log.DebugFormat("[GROUPS]: failed to find trash folder for {0} ", remoteAgentID);
|
||||
return;
|
||||
}
|
||||
|
||||
if (itemCopy.Folder == trash.ID || remoteAgentIDstr == notice.noticeData.AttachmentOwnerID)
|
||||
return;
|
||||
|
||||
itemCopy.Folder = trash.ID;
|
||||
scene.InventoryService.MoveItems(itemCopy.Owner, new List<InventoryItemBase>() { itemCopy });
|
||||
|
||||
if (itemCopy == null)
|
||||
{
|
||||
remoteClient.SendAgentAlertMessage(message, false);
|
||||
return;
|
||||
}
|
||||
|
||||
remoteClient.SendInventoryItemCreateUpdate(itemCopy, 0);
|
||||
}
|
||||
|
||||
|
||||
// Interop, received special 210 code for ejecting a group member
|
||||
// this only works within the comms servers domain, and won't work hypergrid
|
||||
// TODO:FIXME: Use a presense server of some kind to find out where the
|
||||
// client actually is, and try contacting that region directly to notify them,
|
||||
// or provide the notification via xmlrpc update queue
|
||||
if ((im.dialog == 210))
|
||||
else if ((im.dialog == 210))
|
||||
{
|
||||
// This is sent from the region that the ejectee was ejected from
|
||||
// if it's being delivered here, then the ejectee is here
|
||||
|
@ -787,7 +913,7 @@ namespace OpenSim.Groups
|
|||
remoteClient.SendCreateGroupReply(groupID, true, "Group created successfully");
|
||||
|
||||
// Update the founder with new group information.
|
||||
SendAgentGroupDataUpdate(remoteClient, false);
|
||||
SendAgentGroupDataUpdate(remoteClient, true);
|
||||
}
|
||||
else
|
||||
remoteClient.SendCreateGroupReply(groupID, false, reason);
|
||||
|
@ -949,6 +1075,7 @@ namespace OpenSim.Groups
|
|||
bucket = new byte[19 + name.Length];
|
||||
bucket[0] = 1; // has attachment?
|
||||
bucket[1] = info.noticeData.AttachmentType; // attachment type
|
||||
info.GroupID.ToBytes(bucket, 2);
|
||||
name.CopyTo(bucket, 18);
|
||||
}
|
||||
else
|
||||
|
@ -959,7 +1086,6 @@ namespace OpenSim.Groups
|
|||
bucket[18] = 0; // null terminated
|
||||
}
|
||||
|
||||
info.GroupID.ToBytes(bucket, 2);
|
||||
msg.binaryBucket = bucket;
|
||||
}
|
||||
else
|
||||
|
@ -1208,7 +1334,7 @@ namespace OpenSim.Groups
|
|||
|
||||
public List<DirGroupsReplyData> FindGroups(IClientAPI remoteClient, string query)
|
||||
{
|
||||
return m_groupData.FindGroups(GetRequestingAgentIDStr(remoteClient), query);
|
||||
return m_groupData.FindGroups(remoteClient.AgentId.ToString(), query);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
|
|
@ -246,9 +246,9 @@ namespace OpenSim.Groups
|
|||
return null;
|
||||
}
|
||||
|
||||
public List<DirGroupsReplyData> FindGroups(string RequestingAgentID, string search)
|
||||
public List<DirGroupsReplyData> FindGroups(string RequestingAgentIDstr, string search)
|
||||
{
|
||||
return m_LocalGroupsConnector.FindGroups(AgentUUI(RequestingAgentID), search);
|
||||
return m_LocalGroupsConnector.FindGroups(RequestingAgentIDstr, search);
|
||||
}
|
||||
|
||||
public List<GroupMembersData> GetGroupMembers(string RequestingAgentID, UUID GroupID)
|
||||
|
@ -605,14 +605,8 @@ namespace OpenSim.Groups
|
|||
private string AgentUUI(string AgentIDStr)
|
||||
{
|
||||
UUID AgentID = UUID.Zero;
|
||||
try
|
||||
{
|
||||
AgentID = new UUID(AgentIDStr);
|
||||
}
|
||||
catch (FormatException)
|
||||
{
|
||||
return AgentID.ToString();
|
||||
}
|
||||
if (!UUID.TryParse(AgentIDStr, out AgentID) || AgentID == UUID.Zero)
|
||||
return UUID.Zero.ToString();
|
||||
|
||||
if (m_UserManagement.IsLocalGridUser(AgentID))
|
||||
return AgentID.ToString();
|
||||
|
@ -636,14 +630,8 @@ namespace OpenSim.Groups
|
|||
private string AgentUUIForOutside(string AgentIDStr)
|
||||
{
|
||||
UUID AgentID = UUID.Zero;
|
||||
try
|
||||
{
|
||||
AgentID = new UUID(AgentIDStr);
|
||||
}
|
||||
catch (FormatException)
|
||||
{
|
||||
return AgentID.ToString();
|
||||
}
|
||||
if (!UUID.TryParse(AgentIDStr, out AgentID) || AgentID == UUID.Zero)
|
||||
return UUID.Zero.ToString();
|
||||
|
||||
AgentCircuitData agent = null;
|
||||
foreach (Scene scene in m_Scenes)
|
||||
|
|
|
@ -115,9 +115,10 @@ namespace OpenSim.Groups
|
|||
protected override byte[] ProcessRequest(string path, Stream requestData,
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
StreamReader sr = new StreamReader(requestData);
|
||||
string body = sr.ReadToEnd();
|
||||
sr.Close();
|
||||
string body;
|
||||
using(StreamReader sr = new StreamReader(requestData))
|
||||
body = sr.ReadToEnd();
|
||||
|
||||
body = body.Trim();
|
||||
|
||||
//m_log.DebugFormat("[XXX]: query String: {0}", body);
|
||||
|
|
|
@ -39,7 +39,7 @@ namespace OpenSim.Groups
|
|||
bool UpdateGroup(string RequestingAgentID, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee,
|
||||
bool openEnrollment, bool allowPublish, bool maturePublish, out string reason);
|
||||
ExtendedGroupRecord GetGroupRecord(string RequestingAgentID, UUID GroupID, string GroupName);
|
||||
List<DirGroupsReplyData> FindGroups(string RequestingAgentID, string search);
|
||||
List<DirGroupsReplyData> FindGroups(string RequestingAgentIDstr, string search);
|
||||
List<GroupMembersData> GetGroupMembers(string RequestingAgentID, UUID GroupID);
|
||||
|
||||
bool AddGroupRole(string RequestingAgentID, UUID groupID, UUID roleID, string name, string description, string title, ulong powers, out string reason);
|
||||
|
|
|
@ -173,9 +173,9 @@ namespace OpenSim.Groups
|
|||
return null;
|
||||
}
|
||||
|
||||
public List<DirGroupsReplyData> FindGroups(string RequestingAgentID, string search)
|
||||
public List<DirGroupsReplyData> FindGroups(string RequestingAgentIDstr, string search)
|
||||
{
|
||||
return m_GroupsService.FindGroups(RequestingAgentID, search);
|
||||
return m_GroupsService.FindGroups(RequestingAgentIDstr, search);
|
||||
}
|
||||
|
||||
public List<GroupMembersData> GetGroupMembers(string RequestingAgentID, UUID GroupID)
|
||||
|
|
|
@ -153,7 +153,7 @@ namespace OpenSim.Groups
|
|||
return GroupsDataUtils.GroupRecord((Dictionary<string, object>)ret["RESULT"]);
|
||||
}
|
||||
|
||||
public List<DirGroupsReplyData> FindGroups(string RequestingAgentID, string query)
|
||||
public List<DirGroupsReplyData> FindGroups(string RequestingAgentIDstr, string query)
|
||||
{
|
||||
List<DirGroupsReplyData> hits = new List<DirGroupsReplyData>();
|
||||
if (string.IsNullOrEmpty(query))
|
||||
|
@ -161,7 +161,7 @@ namespace OpenSim.Groups
|
|||
|
||||
Dictionary<string, object> sendData = new Dictionary<string, object>();
|
||||
sendData["Query"] = query;
|
||||
sendData["RequestingAgentID"] = RequestingAgentID;
|
||||
sendData["RequestingAgentID"] = RequestingAgentIDstr;
|
||||
|
||||
Dictionary<string, object> ret = MakeRequest("FINDGROUPS", sendData);
|
||||
|
||||
|
|
|
@ -192,10 +192,10 @@ namespace OpenSim.Groups
|
|||
});
|
||||
}
|
||||
|
||||
public List<DirGroupsReplyData> FindGroups(string RequestingAgentID, string search)
|
||||
public List<DirGroupsReplyData> FindGroups(string RequestingAgentIDstr, string search)
|
||||
{
|
||||
// TODO!
|
||||
return m_GroupsService.FindGroups(RequestingAgentID, search);
|
||||
return m_GroupsService.FindGroups(RequestingAgentIDstr, search);
|
||||
}
|
||||
|
||||
public bool AddAgentToGroup(string RequestingAgentID, string AgentID, UUID GroupID, UUID RoleID, string token, out string reason)
|
||||
|
|
|
@ -91,9 +91,10 @@ namespace OpenSim.Groups
|
|||
protected override byte[] ProcessRequest(string path, Stream requestData,
|
||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
StreamReader sr = new StreamReader(requestData);
|
||||
string body = sr.ReadToEnd();
|
||||
sr.Close();
|
||||
string body;
|
||||
using(StreamReader sr = new StreamReader(requestData))
|
||||
body = sr.ReadToEnd();
|
||||
|
||||
body = body.Trim();
|
||||
|
||||
//m_log.DebugFormat("[XXX]: query String: {0}", body);
|
||||
|
|
|
@ -43,60 +43,63 @@ namespace OpenSim.Groups
|
|||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public const GroupPowers DefaultEveryonePowers = GroupPowers.AllowSetHome |
|
||||
GroupPowers.Accountable |
|
||||
GroupPowers.JoinChat |
|
||||
GroupPowers.AllowVoiceChat |
|
||||
GroupPowers.ReceiveNotices |
|
||||
GroupPowers.StartProposal |
|
||||
GroupPowers.VoteOnProposal;
|
||||
public const GroupPowers DefaultEveryonePowers =
|
||||
GroupPowers.AllowSetHome |
|
||||
GroupPowers.Accountable |
|
||||
GroupPowers.JoinChat |
|
||||
GroupPowers.AllowVoiceChat |
|
||||
GroupPowers.ReceiveNotices |
|
||||
GroupPowers.StartProposal |
|
||||
GroupPowers.VoteOnProposal;
|
||||
|
||||
public const GroupPowers OwnerPowers = GroupPowers.Accountable |
|
||||
GroupPowers.AllowEditLand |
|
||||
GroupPowers.AllowFly |
|
||||
GroupPowers.AllowLandmark |
|
||||
GroupPowers.AllowRez |
|
||||
GroupPowers.AllowSetHome |
|
||||
GroupPowers.AllowVoiceChat |
|
||||
GroupPowers.AssignMember |
|
||||
GroupPowers.AssignMemberLimited |
|
||||
GroupPowers.ChangeActions |
|
||||
GroupPowers.ChangeIdentity |
|
||||
GroupPowers.ChangeMedia |
|
||||
GroupPowers.ChangeOptions |
|
||||
GroupPowers.CreateRole |
|
||||
GroupPowers.DeedObject |
|
||||
GroupPowers.DeleteRole |
|
||||
GroupPowers.Eject |
|
||||
GroupPowers.FindPlaces |
|
||||
GroupPowers.HostEvent |
|
||||
GroupPowers.Invite |
|
||||
GroupPowers.JoinChat |
|
||||
GroupPowers.LandChangeIdentity |
|
||||
GroupPowers.LandDeed |
|
||||
GroupPowers.LandDivideJoin |
|
||||
GroupPowers.LandEdit |
|
||||
GroupPowers.LandEjectAndFreeze |
|
||||
GroupPowers.LandGardening |
|
||||
GroupPowers.LandManageAllowed |
|
||||
GroupPowers.LandManageBanned |
|
||||
GroupPowers.LandManagePasses |
|
||||
GroupPowers.LandOptions |
|
||||
GroupPowers.LandRelease |
|
||||
GroupPowers.LandSetSale |
|
||||
GroupPowers.ModerateChat |
|
||||
GroupPowers.ObjectManipulate |
|
||||
GroupPowers.ObjectSetForSale |
|
||||
GroupPowers.ReceiveNotices |
|
||||
GroupPowers.RemoveMember |
|
||||
GroupPowers.ReturnGroupOwned |
|
||||
GroupPowers.ReturnGroupSet |
|
||||
GroupPowers.ReturnNonGroup |
|
||||
GroupPowers.RoleProperties |
|
||||
GroupPowers.SendNotices |
|
||||
GroupPowers.SetLandingPoint |
|
||||
GroupPowers.StartProposal |
|
||||
GroupPowers.VoteOnProposal;
|
||||
public const GroupPowers OfficersPowers = DefaultEveryonePowers |
|
||||
GroupPowers.AllowFly |
|
||||
GroupPowers.AllowLandmark |
|
||||
GroupPowers.AllowRez |
|
||||
GroupPowers.AssignMemberLimited |
|
||||
GroupPowers.ChangeIdentity |
|
||||
GroupPowers.ChangeMedia |
|
||||
GroupPowers.ChangeOptions |
|
||||
GroupPowers.DeedObject |
|
||||
GroupPowers.Eject |
|
||||
GroupPowers.FindPlaces |
|
||||
GroupPowers.Invite |
|
||||
GroupPowers.LandChangeIdentity |
|
||||
GroupPowers.LandDeed |
|
||||
GroupPowers.LandDivideJoin |
|
||||
GroupPowers.LandEdit |
|
||||
GroupPowers.AllowEnvironment |
|
||||
GroupPowers.LandEjectAndFreeze |
|
||||
GroupPowers.LandGardening |
|
||||
GroupPowers.LandManageAllowed |
|
||||
GroupPowers.LandManageBanned |
|
||||
GroupPowers.LandManagePasses |
|
||||
GroupPowers.LandOptions |
|
||||
GroupPowers.LandRelease |
|
||||
GroupPowers.LandSetSale |
|
||||
GroupPowers.MemberVisible |
|
||||
GroupPowers.ModerateChat |
|
||||
GroupPowers.ObjectManipulate |
|
||||
GroupPowers.ObjectSetForSale |
|
||||
GroupPowers.ReturnGroupOwned |
|
||||
GroupPowers.ReturnGroupSet |
|
||||
GroupPowers.ReturnNonGroup |
|
||||
GroupPowers.RoleProperties |
|
||||
GroupPowers.SendNotices |
|
||||
GroupPowers.SetLandingPoint;
|
||||
|
||||
public const GroupPowers OwnerPowers = OfficersPowers |
|
||||
GroupPowers.Accountable |
|
||||
GroupPowers.AllowEditLand |
|
||||
GroupPowers.AssignMember |
|
||||
GroupPowers.ChangeActions |
|
||||
GroupPowers.CreateRole |
|
||||
GroupPowers.DeleteRole |
|
||||
GroupPowers.ExperienceAdmin |
|
||||
GroupPowers.ExperienceCreator |
|
||||
GroupPowers.GroupBanAccess |
|
||||
GroupPowers.HostEvent |
|
||||
GroupPowers.RemoveMember;
|
||||
|
||||
#region Daily Cleanup
|
||||
|
||||
|
@ -151,20 +154,25 @@ namespace OpenSim.Groups
|
|||
data.Data["ShowInList"] = showInList ? "1" : "0";
|
||||
data.Data["AllowPublish"] = allowPublish ? "1" : "0";
|
||||
data.Data["MaturePublish"] = maturePublish ? "1" : "0";
|
||||
UUID roleID = UUID.Random();
|
||||
data.Data["OwnerRoleID"] = roleID.ToString();
|
||||
UUID ownerRoleID = UUID.Random();
|
||||
data.Data["OwnerRoleID"] = ownerRoleID.ToString();
|
||||
|
||||
if (!m_Database.StoreGroup(data))
|
||||
return UUID.Zero;
|
||||
|
||||
// Create Everyone role
|
||||
_AddOrUpdateGroupRole(RequestingAgentID, data.GroupID, UUID.Zero, "Everyone", "Everyone in the group", "Member of " + name, (ulong)DefaultEveryonePowers, true);
|
||||
_AddOrUpdateGroupRole(RequestingAgentID, data.GroupID, UUID.Zero, "Everyone", "Everyone in the group is in the everyone role.", "Member of " + name, (ulong)DefaultEveryonePowers, true);
|
||||
|
||||
// Create Officers role
|
||||
UUID officersRoleID = UUID.Random();
|
||||
_AddOrUpdateGroupRole(RequestingAgentID, data.GroupID, officersRoleID, "Officers", "The officers of the group, with more powers than regular members.", "Officer of " + name, (ulong)OfficersPowers, true);
|
||||
|
||||
// Create Owner role
|
||||
_AddOrUpdateGroupRole(RequestingAgentID, data.GroupID, roleID, "Owners", "Owners of the group", "Owner of " + name, (ulong)OwnerPowers, true);
|
||||
_AddOrUpdateGroupRole(RequestingAgentID, data.GroupID, ownerRoleID, "Owners", "Owners of the group", "Owner of " + name, (ulong)OwnerPowers, true);
|
||||
|
||||
// Add founder to group
|
||||
_AddAgentToGroup(RequestingAgentID, founderID.ToString(), data.GroupID, roleID);
|
||||
_AddAgentToGroup(RequestingAgentID, founderID.ToString(), data.GroupID, ownerRoleID);
|
||||
_AddAgentToGroup(RequestingAgentID, founderID.ToString(), data.GroupID, officersRoleID);
|
||||
|
||||
return data.GroupID;
|
||||
}
|
||||
|
@ -223,15 +231,22 @@ namespace OpenSim.Groups
|
|||
if (d.Data.ContainsKey("Location") && d.Data["Location"] != string.Empty)
|
||||
continue;
|
||||
|
||||
int nmembers = m_Database.MemberCount(d.GroupID);
|
||||
if(nmembers == 0)
|
||||
continue;
|
||||
|
||||
DirGroupsReplyData g = new DirGroupsReplyData();
|
||||
g.groupID = d.GroupID;
|
||||
|
||||
if (d.Data.ContainsKey("Name"))
|
||||
g.groupName = d.Data["Name"];
|
||||
else
|
||||
{
|
||||
m_log.DebugFormat("[Groups]: Key Name not found");
|
||||
continue;
|
||||
}
|
||||
|
||||
g.members = m_Database.MemberCount(d.GroupID);
|
||||
g.groupID = d.GroupID;
|
||||
g.members = nmembers;
|
||||
|
||||
groups.Add(g);
|
||||
}
|
||||
|
@ -485,7 +500,7 @@ namespace OpenSim.Groups
|
|||
|
||||
// check permissions
|
||||
bool limited = HasPower(RequestingAgentID, GroupID, GroupPowers.AssignMemberLimited);
|
||||
bool unlimited = HasPower(RequestingAgentID, GroupID, GroupPowers.AssignMember) | IsOwner(RequestingAgentID, GroupID);
|
||||
bool unlimited = HasPower(RequestingAgentID, GroupID, GroupPowers.AssignMember) || IsOwner(RequestingAgentID, GroupID);
|
||||
if (!limited && !unlimited)
|
||||
{
|
||||
m_log.DebugFormat("[Groups]: ({0}) Attempt at assigning {1} to role {2} denied because of lack of permission", RequestingAgentID, AgentID, RoleID);
|
||||
|
@ -843,7 +858,7 @@ namespace OpenSim.Groups
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!add && data == null) // it deosn't exist, can't update
|
||||
if (!add && data == null) // it doesn't exist, can't update
|
||||
{
|
||||
m_log.DebugFormat("[Groups]: Group {0} doesn't exist. Can't update it", groupID);
|
||||
return false;
|
||||
|
|
|
@ -114,7 +114,6 @@ namespace OpenSim.OfflineIM
|
|||
scene.ForEachClient(delegate(IClientAPI client)
|
||||
{
|
||||
client.OnRetrieveInstantMessages -= RetrieveInstantMessages;
|
||||
client.OnMuteListRequest -= OnMuteListRequest;
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -162,7 +161,6 @@ namespace OpenSim.OfflineIM
|
|||
private void OnNewClient(IClientAPI client)
|
||||
{
|
||||
client.OnRetrieveInstantMessages += RetrieveInstantMessages;
|
||||
client.OnMuteListRequest += OnMuteListRequest;
|
||||
}
|
||||
|
||||
private void RetrieveInstantMessages(IClientAPI client)
|
||||
|
@ -194,20 +192,6 @@ namespace OpenSim.OfflineIM
|
|||
}
|
||||
}
|
||||
|
||||
// Apparently this is needed in order for the viewer to request the IMs.
|
||||
private void OnMuteListRequest(IClientAPI client, uint crc)
|
||||
{
|
||||
m_log.DebugFormat("[OfflineIM.V2] Got mute list request for crc {0}", crc);
|
||||
string filename = "mutes" + client.AgentId.ToString();
|
||||
|
||||
IXfer xfer = client.Scene.RequestModuleInterface<IXfer>();
|
||||
if (xfer != null)
|
||||
{
|
||||
xfer.AddNewFile(filename, new Byte[0]);
|
||||
client.SendMuteListUpdate(filename);
|
||||
}
|
||||
}
|
||||
|
||||
private void UndeliveredMessage(GridInstantMessage im)
|
||||
{
|
||||
if (im.dialog != (byte)InstantMessageDialog.MessageFromObject &&
|
||||
|
|
|
@ -110,9 +110,8 @@ namespace OpenSim.OfflineIM
|
|||
{
|
||||
m_serializer.Serialize(writer, im);
|
||||
writer.Flush();
|
||||
imXml = Util.UTF8NoBomEncoding.GetString(mstream.ToArray());
|
||||
}
|
||||
|
||||
imXml = Util.UTF8NoBomEncoding.GetString(mstream.ToArray());
|
||||
}
|
||||
|
||||
OfflineIMData data = new OfflineIMData();
|
||||
|
|
|
@ -122,7 +122,7 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
|
|||
throw ex;
|
||||
}
|
||||
|
||||
if (regionCount > 0 | allowRegionless)
|
||||
if (regionCount > 0 || allowRegionless)
|
||||
return regionInfos;
|
||||
|
||||
m_log.Debug("[WEBLOADER]: Request yielded no regions.");
|
||||
|
|
|
@ -1934,7 +1934,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
|||
GetSceneFromRegionParams(requestData, responseData, out scene);
|
||||
health = scene.GetHealth(out flags, out text);
|
||||
}
|
||||
catch (Exception e)
|
||||
catch
|
||||
{
|
||||
responseData["error"] = null;
|
||||
}
|
||||
|
@ -3087,15 +3087,13 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
|||
/// </summary>
|
||||
private void ApplyNextOwnerPermissions(InventoryItemBase item)
|
||||
{
|
||||
if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0)
|
||||
if (item.InvType == (int)InventoryType.Object)
|
||||
{
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0)
|
||||
item.CurrentPermissions &= ~(uint)PermissionMask.Copy;
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0)
|
||||
item.CurrentPermissions &= ~(uint)PermissionMask.Transfer;
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
|
||||
item.CurrentPermissions &= ~(uint)PermissionMask.Modify;
|
||||
uint perms = item.CurrentPermissions;
|
||||
PermissionsUtil.ApplyFoldedPermissions(item.CurrentPermissions, ref perms);
|
||||
item.CurrentPermissions = perms;
|
||||
}
|
||||
|
||||
item.CurrentPermissions &= item.NextPermissions;
|
||||
item.BasePermissions &= item.NextPermissions;
|
||||
item.EveryOnePermissions &= item.NextPermissions;
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Concurrent;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
|
@ -49,9 +50,9 @@ namespace OpenSim.Framework.Capabilities
|
|||
/// </summary>
|
||||
public delegate IClientAPI GetClientDelegate(UUID agentID);
|
||||
|
||||
public class Caps
|
||||
public class Caps : IDisposable
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private string m_httpListenerHostName;
|
||||
private uint m_httpListenPort;
|
||||
|
@ -64,8 +65,8 @@ namespace OpenSim.Framework.Capabilities
|
|||
|
||||
private CapsHandlers m_capsHandlers;
|
||||
|
||||
private Dictionary<string, PollServiceEventArgs> m_pollServiceHandlers
|
||||
= new Dictionary<string, PollServiceEventArgs>();
|
||||
private ConcurrentDictionary<string, PollServiceEventArgs> m_pollServiceHandlers
|
||||
= new ConcurrentDictionary<string, PollServiceEventArgs>();
|
||||
|
||||
private Dictionary<string, string> m_externalCapsHandlers = new Dictionary<string, string>();
|
||||
|
||||
|
@ -119,6 +120,19 @@ namespace OpenSim.Framework.Capabilities
|
|||
get { return m_externalCapsHandlers; }
|
||||
}
|
||||
|
||||
[Flags]
|
||||
public enum CapsFlags:uint
|
||||
{
|
||||
None = 0,
|
||||
SentSeeds = 1,
|
||||
|
||||
ObjectAnim = 0x100,
|
||||
WLEnv = 0x200,
|
||||
AdvEnv = 0x400
|
||||
}
|
||||
|
||||
public CapsFlags Flags { get; set;}
|
||||
|
||||
public Caps(IHttpServer httpServer, string httpListen, uint httpPort, string capsPath,
|
||||
UUID agent, string regionName)
|
||||
{
|
||||
|
@ -138,12 +152,35 @@ namespace OpenSim.Framework.Capabilities
|
|||
m_agentID = agent;
|
||||
m_capsHandlers = new CapsHandlers(httpServer, httpListen, httpPort);
|
||||
m_regionName = regionName;
|
||||
Flags = CapsFlags.None;
|
||||
m_capsActive.Reset();
|
||||
}
|
||||
|
||||
~Caps()
|
||||
{
|
||||
m_capsActive.Dispose();
|
||||
Flags = CapsFlags.None;
|
||||
if (m_capsActive!= null)
|
||||
{
|
||||
m_capsActive.Dispose();
|
||||
m_capsActive = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
public void Dispose(bool disposing)
|
||||
{
|
||||
Flags = CapsFlags.None;
|
||||
if (m_capsActive != null)
|
||||
{
|
||||
DeregisterHandlers();
|
||||
m_capsActive.Dispose();
|
||||
m_capsActive = null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -157,15 +194,27 @@ namespace OpenSim.Framework.Capabilities
|
|||
m_capsHandlers[capName] = handler;
|
||||
}
|
||||
|
||||
public void RegisterSimpleHandler(string capName, ISimpleStreamHandler handler, bool addToListener = true)
|
||||
{
|
||||
//m_log.DebugFormat("[CAPS]: Registering handler for \"{0}\": path {1}", capName, handler.Path);
|
||||
m_capsHandlers.AddSimpleHandler(capName, handler, addToListener);
|
||||
}
|
||||
|
||||
public void RegisterPollHandler(string capName, PollServiceEventArgs pollServiceHandler)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[CAPS]: Registering handler with name {0}, url {1} for {2}",
|
||||
// capName, pollServiceHandler.Url, m_agentID, m_regionName);
|
||||
|
||||
m_pollServiceHandlers.Add(capName, pollServiceHandler);
|
||||
if(!m_pollServiceHandlers.TryAdd(capName, pollServiceHandler))
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[CAPS]: Handler with name {0} already registered (ulr {1}, agent {2}, region {3}",
|
||||
capName, pollServiceHandler.Url, m_agentID, m_regionName);
|
||||
return;
|
||||
}
|
||||
|
||||
m_httpListener.AddPollServiceHTTPHandler(pollServiceHandler.Url, pollServiceHandler);
|
||||
m_httpListener.AddPollServiceHTTPHandler(pollServiceHandler);
|
||||
|
||||
// uint port = (MainServer.Instance == null) ? 0 : MainServer.Instance.Port;
|
||||
// string protocol = "http";
|
||||
|
@ -205,8 +254,9 @@ namespace OpenSim.Framework.Capabilities
|
|||
|
||||
foreach (PollServiceEventArgs handler in m_pollServiceHandlers.Values)
|
||||
{
|
||||
m_httpListener.RemovePollServiceHTTPHandler("", handler.Url);
|
||||
m_httpListener.RemovePollServiceHTTPHandler(handler.Url);
|
||||
}
|
||||
m_pollServiceHandlers.Clear();
|
||||
}
|
||||
|
||||
public bool TryGetPollHandler(string name, out PollServiceEventArgs pollHandler)
|
||||
|
@ -245,9 +295,6 @@ namespace OpenSim.Framework.Capabilities
|
|||
port = MainServer.Instance.SSLPort;
|
||||
protocol = "https";
|
||||
}
|
||||
//
|
||||
// caps.RegisterHandler("FetchInventoryDescendents2", String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, capUrl));
|
||||
|
||||
caps[kvp.Key] = string.Format("{0}://{1}:{2}{3}", protocol, hostName, port, kvp.Value.Url);
|
||||
}
|
||||
}
|
||||
|
@ -261,6 +308,7 @@ namespace OpenSim.Framework.Capabilities
|
|||
caps[kvp.Key] = kvp.Value;
|
||||
}
|
||||
|
||||
|
||||
return caps;
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Concurrent;
|
||||
using OpenSim.Framework.Servers;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
|
||||
|
@ -40,6 +41,7 @@ namespace OpenSim.Framework.Capabilities
|
|||
public class CapsHandlers
|
||||
{
|
||||
private Dictionary<string, IRequestHandler> m_capsHandlers = new Dictionary<string, IRequestHandler>();
|
||||
private ConcurrentDictionary<string, ISimpleStreamHandler> m_capsSimpleHandlers = new ConcurrentDictionary<string, ISimpleStreamHandler>();
|
||||
private IHttpServer m_httpListener;
|
||||
private string m_httpListenerHostName;
|
||||
private uint m_httpListenerPort;
|
||||
|
@ -73,17 +75,35 @@ namespace OpenSim.Framework.Capabilities
|
|||
{
|
||||
lock (m_capsHandlers)
|
||||
{
|
||||
m_httpListener.RemoveStreamHandler("POST", m_capsHandlers[capsName].Path);
|
||||
m_httpListener.RemoveStreamHandler("PUT", m_capsHandlers[capsName].Path);
|
||||
m_httpListener.RemoveStreamHandler("GET", m_capsHandlers[capsName].Path);
|
||||
m_capsHandlers.Remove(capsName);
|
||||
if(m_capsHandlers.ContainsKey(capsName))
|
||||
{
|
||||
m_httpListener.RemoveStreamHandler("POST", m_capsHandlers[capsName].Path);
|
||||
m_httpListener.RemoveStreamHandler("PUT", m_capsHandlers[capsName].Path);
|
||||
m_httpListener.RemoveStreamHandler("GET", m_capsHandlers[capsName].Path);
|
||||
m_httpListener.RemoveStreamHandler("DELETE", m_capsHandlers[capsName].Path);
|
||||
m_capsHandlers.Remove(capsName);
|
||||
}
|
||||
}
|
||||
if(m_capsSimpleHandlers.TryRemove(capsName, out ISimpleStreamHandler hdr))
|
||||
{
|
||||
m_httpListener.RemoveSimpleStreamHandler(hdr.Path);
|
||||
}
|
||||
}
|
||||
|
||||
public void AddSimpleHandler(string capName, ISimpleStreamHandler handler, bool addToListener = true)
|
||||
{
|
||||
if(ContainsCap(capName))
|
||||
Remove(capName);
|
||||
if(m_capsSimpleHandlers.TryAdd(capName, handler) && addToListener)
|
||||
m_httpListener.AddSimpleStreamHandler(handler);
|
||||
}
|
||||
|
||||
public bool ContainsCap(string cap)
|
||||
{
|
||||
lock (m_capsHandlers)
|
||||
return m_capsHandlers.ContainsKey(cap);
|
||||
if (m_capsHandlers.ContainsKey(cap))
|
||||
return true;
|
||||
return m_capsSimpleHandlers.ContainsKey(cap);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -110,6 +130,9 @@ namespace OpenSim.Framework.Capabilities
|
|||
if (m_capsHandlers.ContainsKey(idx))
|
||||
{
|
||||
m_httpListener.RemoveStreamHandler("POST", m_capsHandlers[idx].Path);
|
||||
m_httpListener.RemoveStreamHandler("PUT", m_capsHandlers[idx].Path);
|
||||
m_httpListener.RemoveStreamHandler("GET", m_capsHandlers[idx].Path);
|
||||
m_httpListener.RemoveStreamHandler("DELETE", m_capsHandlers[idx].Path);
|
||||
m_capsHandlers.Remove(idx);
|
||||
}
|
||||
|
||||
|
@ -131,8 +154,9 @@ namespace OpenSim.Framework.Capabilities
|
|||
{
|
||||
lock (m_capsHandlers)
|
||||
{
|
||||
string[] __keys = new string[m_capsHandlers.Keys.Count];
|
||||
string[] __keys = new string[m_capsHandlers.Keys.Count + m_capsSimpleHandlers.Keys.Count];
|
||||
m_capsHandlers.Keys.CopyTo(__keys, 0);
|
||||
m_capsSimpleHandlers.Keys.CopyTo(__keys, m_capsHandlers.Keys.Count);
|
||||
return __keys;
|
||||
}
|
||||
}
|
||||
|
@ -146,24 +170,39 @@ namespace OpenSim.Framework.Capabilities
|
|||
public Hashtable GetCapsDetails(bool excludeSeed, List<string> requestedCaps)
|
||||
{
|
||||
Hashtable caps = new Hashtable();
|
||||
string protocol = "http://";
|
||||
|
||||
if (m_useSSL)
|
||||
protocol = "https://";
|
||||
|
||||
string protocol = m_useSSL ? "https://" : "http://";
|
||||
string baseUrl = protocol + m_httpListenerHostName + ":" + m_httpListenerPort.ToString();
|
||||
|
||||
if (requestedCaps == null)
|
||||
{
|
||||
lock (m_capsHandlers)
|
||||
{
|
||||
foreach (KeyValuePair<string, ISimpleStreamHandler> kvp in m_capsSimpleHandlers)
|
||||
caps[kvp.Key] = baseUrl + kvp.Value.Path;
|
||||
foreach (KeyValuePair<string, IRequestHandler> kvp in m_capsHandlers)
|
||||
caps[kvp.Key] = baseUrl + kvp.Value.Path;
|
||||
}
|
||||
return caps;
|
||||
}
|
||||
|
||||
lock (m_capsHandlers)
|
||||
{
|
||||
foreach (string capsName in m_capsHandlers.Keys)
|
||||
for(int i = 0; i < requestedCaps.Count; ++i)
|
||||
{
|
||||
string capsName = requestedCaps[i];
|
||||
if (excludeSeed && "SEED" == capsName)
|
||||
continue;
|
||||
|
||||
if (requestedCaps != null && !requestedCaps.Contains(capsName))
|
||||
if (m_capsSimpleHandlers.TryGetValue(capsName, out ISimpleStreamHandler shdr))
|
||||
{
|
||||
caps[capsName] = baseUrl + shdr.Path;
|
||||
continue;
|
||||
|
||||
caps[capsName] = baseUrl + m_capsHandlers[capsName].Path;
|
||||
}
|
||||
if (m_capsHandlers.TryGetValue(capsName, out IRequestHandler chdr))
|
||||
{
|
||||
caps[capsName] = baseUrl + chdr.Path;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,116 +0,0 @@
|
|||
/*
|
||||
* 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.Collections.Specialized;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Web;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Capabilities;
|
||||
using OpenSim.Framework.Servers;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
//using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using Caps = OpenSim.Framework.Capabilities.Caps;
|
||||
|
||||
namespace OpenSim.Capabilities.Handlers
|
||||
{
|
||||
public class AvatarPickerSearchHandler : BaseStreamHandler
|
||||
{
|
||||
private static readonly ILog m_log =
|
||||
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
private IPeople m_PeopleService;
|
||||
|
||||
public AvatarPickerSearchHandler(string path, IPeople peopleService, string name, string description)
|
||||
: base("GET", path, name, description)
|
||||
{
|
||||
m_PeopleService = peopleService;
|
||||
}
|
||||
|
||||
protected override byte[] ProcessRequest(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);
|
||||
string names = query.GetOne("names");
|
||||
string psize = query.GetOne("page_size");
|
||||
string pnumber = query.GetOne("page");
|
||||
|
||||
if (m_PeopleService == null)
|
||||
return FailureResponse(names, (int)System.Net.HttpStatusCode.InternalServerError, httpResponse);
|
||||
|
||||
if (string.IsNullOrEmpty(names) || names.Length < 3)
|
||||
return FailureResponse(names, (int)System.Net.HttpStatusCode.BadRequest, httpResponse);
|
||||
|
||||
m_log.DebugFormat("[AVATAR PICKER SEARCH]: search for {0}", names);
|
||||
|
||||
int page_size = (string.IsNullOrEmpty(psize) ? 500 : Int32.Parse(psize));
|
||||
int page_number = (string.IsNullOrEmpty(pnumber) ? 1 : Int32.Parse(pnumber));
|
||||
|
||||
// Full content request
|
||||
httpResponse.StatusCode = (int)System.Net.HttpStatusCode.OK;
|
||||
//httpResponse.ContentLength = ??;
|
||||
httpResponse.ContentType = "application/llsd+xml";
|
||||
|
||||
List<UserData> users = m_PeopleService.GetUserData(names, page_size, page_number);
|
||||
|
||||
LLSDAvatarPicker osdReply = new LLSDAvatarPicker();
|
||||
osdReply.next_page_url = httpRequest.RawUrl;
|
||||
foreach (UserData u in users)
|
||||
osdReply.agents.Array.Add(ConvertUserData(u));
|
||||
|
||||
string reply = LLSDHelpers.SerialiseLLSDReply(osdReply);
|
||||
return System.Text.Encoding.UTF8.GetBytes(reply);
|
||||
}
|
||||
|
||||
private LLSDPerson ConvertUserData(UserData user)
|
||||
{
|
||||
LLSDPerson p = new LLSDPerson();
|
||||
p.legacy_first_name = user.FirstName;
|
||||
p.legacy_last_name = user.LastName;
|
||||
p.display_name = user.FirstName + " " + user.LastName;
|
||||
if (user.LastName.StartsWith("@"))
|
||||
p.username = user.FirstName.ToLower() + user.LastName.ToLower();
|
||||
else
|
||||
p.username = user.FirstName.ToLower() + "." + user.LastName.ToLower();
|
||||
p.id = user.Id;
|
||||
p.is_display_name_default = false;
|
||||
return p;
|
||||
}
|
||||
|
||||
private byte[] FailureResponse(string names, int statuscode, IOSHttpResponse httpResponse)
|
||||
{
|
||||
m_log.Error("[AVATAR PICKER SEARCH]: Error searching for " + names);
|
||||
httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
|
||||
return System.Text.Encoding.UTF8.GetBytes(string.Empty);
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -29,9 +29,12 @@ using System;
|
|||
using Nini.Config;
|
||||
using OpenSim.Server.Base;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using OpenSim.Server.Handlers.Base;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.StructuredData;
|
||||
|
||||
|
||||
namespace OpenSim.Capabilities.Handlers
|
||||
{
|
||||
|
@ -67,16 +70,16 @@ namespace OpenSim.Capabilities.Handlers
|
|||
m_LibraryService =
|
||||
ServerUtils.LoadPlugin<ILibraryService>(libService, args);
|
||||
|
||||
FetchInvDescHandler webFetchHandler = new FetchInvDescHandler(m_InventoryService, m_LibraryService, null);
|
||||
IRequestHandler reqHandler
|
||||
= new RestStreamHandler(
|
||||
"POST",
|
||||
"/CAPS/WebFetchInvDesc/" /*+ UUID.Random()*/,
|
||||
webFetchHandler.FetchInventoryDescendentsRequest,
|
||||
"FetchInvDescendents",
|
||||
null);
|
||||
server.AddStreamHandler(reqHandler);
|
||||
}
|
||||
ExpiringKey<UUID> m_badRequests = new ExpiringKey<UUID>(30000);
|
||||
|
||||
FetchInvDescHandler webFetchHandler = new FetchInvDescHandler(m_InventoryService, m_LibraryService, null);
|
||||
ISimpleStreamHandler reqHandler
|
||||
= new SimpleStreamHandler("/CAPS/WebFetchInvDesc/", delegate(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
webFetchHandler.FetchInventoryDescendentsRequest(httpRequest, httpResponse, m_badRequests);
|
||||
});
|
||||
|
||||
server.AddSimpleStreamHandler(reqHandler);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,11 +25,12 @@
|
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System.Net;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.StructuredData;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Capabilities;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using OSDArray = OpenMetaverse.StructuredData.OSDArray;
|
||||
|
@ -59,9 +60,6 @@ namespace OpenSim.Capabilities.Handlers
|
|||
OSDMap requestmap = (OSDMap)OSDParser.DeserializeLLSDXml(Utils.StringToBytes(request));
|
||||
OSDArray itemsRequested = (OSDArray)requestmap["items"];
|
||||
|
||||
string reply;
|
||||
LLSDFetchInventory llsdReply = new LLSDFetchInventory();
|
||||
|
||||
UUID[] itemIDs = new UUID[itemsRequested.Count];
|
||||
int i = 0;
|
||||
|
||||
|
@ -75,15 +73,6 @@ namespace OpenSim.Capabilities.Handlers
|
|||
if (m_agentID != UUID.Zero)
|
||||
{
|
||||
items = m_inventoryService.GetMultipleItems(m_agentID, itemIDs);
|
||||
|
||||
if (items == null)
|
||||
{
|
||||
// OMG!!! One by one!!! This is fallback code, in case the backend isn't updated
|
||||
m_log.WarnFormat("[FETCH INVENTORY HANDLER]: GetMultipleItems failed. Falling back to fetching inventory items one by one.");
|
||||
items = new InventoryItemBase[itemsRequested.Count];
|
||||
foreach (UUID id in itemIDs)
|
||||
items[i++] = m_inventoryService.GetItem(m_agentID, id);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -92,55 +81,86 @@ namespace OpenSim.Capabilities.Handlers
|
|||
items[i++] = m_inventoryService.GetItem(UUID.Zero, id);
|
||||
}
|
||||
|
||||
foreach (InventoryItemBase item in items)
|
||||
StringBuilder lsl = LLSDxmlEncode.Start(4096);
|
||||
LLSDxmlEncode.AddMap(lsl);
|
||||
|
||||
if(m_agentID == UUID.Zero && items.Length > 0)
|
||||
LLSDxmlEncode.AddElem("agent_id", items[0].Owner, lsl);
|
||||
else
|
||||
LLSDxmlEncode.AddElem("agent_id", m_agentID, lsl);
|
||||
|
||||
if(items == null || items.Length == 0)
|
||||
{
|
||||
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));
|
||||
}
|
||||
LLSDxmlEncode.AddEmptyArray("items", lsl);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLSDxmlEncode.AddArray("items", lsl);
|
||||
foreach (InventoryItemBase item in items)
|
||||
{
|
||||
if (item != null)
|
||||
item.ToLLSDxml(lsl, 0xff);
|
||||
}
|
||||
LLSDxmlEncode.AddEndArray(lsl);
|
||||
}
|
||||
|
||||
reply = LLSDHelpers.SerialiseLLSDReply(llsdReply);
|
||||
|
||||
return reply;
|
||||
LLSDxmlEncode.AddEndMap(lsl);
|
||||
return LLSDxmlEncode.End(lsl);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert an internal inventory item object into an LLSD object.
|
||||
/// </summary>
|
||||
/// <param name="invItem"></param>
|
||||
/// <returns></returns>
|
||||
private LLSDInventoryItem ConvertInventoryItem(InventoryItemBase invItem)
|
||||
public void FetchInventorySimpleRequest(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, OSDMap requestmap, ExpiringKey<UUID> BadRequests)
|
||||
{
|
||||
LLSDInventoryItem llsdItem = new LLSDInventoryItem();
|
||||
llsdItem.asset_id = invItem.AssetID;
|
||||
llsdItem.created_at = invItem.CreationDate;
|
||||
llsdItem.desc = invItem.Description;
|
||||
llsdItem.flags = ((int)invItem.Flags) & 0xff;
|
||||
llsdItem.item_id = invItem.ID;
|
||||
llsdItem.name = invItem.Name;
|
||||
llsdItem.parent_id = invItem.Folder;
|
||||
llsdItem.type = invItem.AssetType;
|
||||
llsdItem.inv_type = invItem.InvType;
|
||||
//m_log.DebugFormat("[FETCH INVENTORY HANDLER]: Received FetchInventory capability request {0}", request);
|
||||
|
||||
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;
|
||||
llsdItem.sale_info.sale_type = invItem.SaleType;
|
||||
if(BadRequests == null)
|
||||
{
|
||||
httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
|
||||
return;
|
||||
}
|
||||
|
||||
return llsdItem;
|
||||
OSDArray itemsRequested = (OSDArray)requestmap["items"];
|
||||
|
||||
UUID[] itemIDs = new UUID[itemsRequested.Count];
|
||||
int i = 0;
|
||||
foreach (OSDMap osdItemId in itemsRequested)
|
||||
{
|
||||
UUID id = osdItemId["item_id"].AsUUID();
|
||||
if(!BadRequests.ContainsKey(id))
|
||||
itemIDs[i++] = id;
|
||||
}
|
||||
|
||||
InventoryItemBase[] items = null;
|
||||
try
|
||||
{
|
||||
// badrequests still not filled
|
||||
items = m_inventoryService.GetMultipleItems(m_agentID, itemIDs);
|
||||
}
|
||||
catch{ }
|
||||
|
||||
StringBuilder lsl = LLSDxmlEncode.Start(4096);
|
||||
LLSDxmlEncode.AddMap(lsl);
|
||||
|
||||
LLSDxmlEncode.AddElem("agent_id", m_agentID, lsl);
|
||||
|
||||
if (items == null || items.Length == 0)
|
||||
{
|
||||
LLSDxmlEncode.AddEmptyArray("items", lsl);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLSDxmlEncode.AddArray("items", lsl);
|
||||
foreach (InventoryItemBase item in items)
|
||||
{
|
||||
if (item != null)
|
||||
item.ToLLSDxml(lsl, 0xff);
|
||||
}
|
||||
LLSDxmlEncode.AddEndArray(lsl);
|
||||
}
|
||||
|
||||
LLSDxmlEncode.AddEndMap(lsl);
|
||||
httpResponse.RawBuffer = Util.UTF8.GetBytes(LLSDxmlEncode.End(lsl));
|
||||
httpResponse.StatusCode = (int)HttpStatusCode.OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
using log4net;
|
||||
using log4net.Config;
|
||||
|
@ -46,7 +46,7 @@ namespace OpenSim.Capabilities.Handlers.FetchInventory.Tests
|
|||
[TestFixture]
|
||||
public class FetchInventoryDescendents2HandlerTests : OpenSimTestCase
|
||||
{
|
||||
private UUID m_userID = UUID.Zero;
|
||||
private UUID m_userID = new UUID("00000000-0000-0000-0000-000000000001");
|
||||
private Scene m_scene;
|
||||
private UUID m_rootFolderID;
|
||||
private int m_rootDescendents;
|
||||
|
@ -103,6 +103,7 @@ namespace OpenSim.Capabilities.Handlers.FetchInventory.Tests
|
|||
|
||||
// Add a folder
|
||||
InventoryFolderBase folder = new InventoryFolderBase(new UUID("f0000000-0000-0000-0000-00000000000f"), "Test Folder", m_userID, m_rootFolderID);
|
||||
folder.Type = (short)FolderType.None;
|
||||
m_scene.InventoryService.AddFolder(folder);
|
||||
|
||||
// Add a link to notecard 2 in Test Folder
|
||||
|
@ -126,6 +127,19 @@ namespace OpenSim.Capabilities.Handlers.FetchInventory.Tests
|
|||
Console.WriteLine("Number of descendents: " + m_rootDescendents);
|
||||
}
|
||||
|
||||
private string dorequest(FetchInvDescHandler handler, string request)
|
||||
{
|
||||
TestOSHttpRequest req = new TestOSHttpRequest();
|
||||
TestOSHttpResponse resp = new TestOSHttpResponse();
|
||||
using(ExpiringKey<UUID> bad = new ExpiringKey<UUID>(5000)) // bad but this is test
|
||||
using (MemoryStream ms = new MemoryStream(Utils.StringToBytes(request), false))
|
||||
{
|
||||
req.InputStream = ms;
|
||||
handler.FetchInventoryDescendentsRequest(req, resp, bad);
|
||||
}
|
||||
return Util.UTF8.GetString(resp.RawBuffer);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Test_001_SimpleFolder()
|
||||
{
|
||||
|
@ -134,18 +148,18 @@ namespace OpenSim.Capabilities.Handlers.FetchInventory.Tests
|
|||
Init();
|
||||
|
||||
FetchInvDescHandler handler = new FetchInvDescHandler(m_scene.InventoryService, null, m_scene);
|
||||
TestOSHttpRequest req = new TestOSHttpRequest();
|
||||
TestOSHttpResponse resp = new TestOSHttpResponse();
|
||||
|
||||
string request = "<llsd><map><key>folders</key><array><map><key>fetch_folders</key><integer>1</integer><key>fetch_items</key><boolean>1</boolean><key>folder_id</key><uuid>";
|
||||
request += m_rootFolderID;
|
||||
request += "</uuid><key>owner_id</key><uuid>00000000-0000-0000-0000-000000000000</uuid><key>sort_order</key><integer>1</integer></map></array></map></llsd>";
|
||||
request += "</uuid><key>owner_id</key><uuid>";
|
||||
request += m_userID.ToString();
|
||||
request += "</uuid><key>sort_order</key><integer>1</integer></map></array></map></llsd>";
|
||||
|
||||
string llsdresponse = handler.FetchInventoryDescendentsRequest(request, "/FETCH", string.Empty, req, resp);
|
||||
string llsdresponse = dorequest(handler, request);
|
||||
|
||||
Assert.That(llsdresponse != null, Is.True, "Incorrect null response");
|
||||
Assert.That(llsdresponse != string.Empty, Is.True, "Incorrect empty response");
|
||||
Assert.That(llsdresponse.Contains("00000000-0000-0000-0000-000000000000"), Is.True, "Response should contain userID");
|
||||
Assert.That(llsdresponse.Contains(m_userID.ToString()), Is.True, "Response should contain userID");
|
||||
|
||||
string descendents = "descendents</key><integer>" + m_rootDescendents + "</integer>";
|
||||
Assert.That(llsdresponse.Contains(descendents), Is.True, "Incorrect number of descendents");
|
||||
|
@ -158,19 +172,17 @@ namespace OpenSim.Capabilities.Handlers.FetchInventory.Tests
|
|||
TestHelpers.InMethod();
|
||||
|
||||
FetchInvDescHandler handler = new FetchInvDescHandler(m_scene.InventoryService, null, m_scene);
|
||||
TestOSHttpRequest req = new TestOSHttpRequest();
|
||||
TestOSHttpResponse resp = new TestOSHttpResponse();
|
||||
|
||||
string request = "<llsd><map><key>folders</key><array>";
|
||||
request += "<map><key>fetch_folders</key><integer>1</integer><key>fetch_items</key><boolean>1</boolean><key>folder_id</key><uuid>";
|
||||
request += m_rootFolderID;
|
||||
request += "</uuid><key>owner_id</key><uuid>00000000-0000-0000-0000-000000000000</uuid><key>sort_order</key><integer>1</integer></map>";
|
||||
request += "</uuid><key>owner_id</key><uuid>00000000-0000-0000-0000-000000000001</uuid><key>sort_order</key><integer>1</integer></map>";
|
||||
request += "<map><key>fetch_folders</key><integer>1</integer><key>fetch_items</key><boolean>1</boolean><key>folder_id</key><uuid>";
|
||||
request += m_notecardsFolder;
|
||||
request += "</uuid><key>owner_id</key><uuid>00000000-0000-0000-0000-000000000000</uuid><key>sort_order</key><integer>1</integer></map>";
|
||||
request += "</uuid><key>owner_id</key><uuid>00000000-0000-0000-0000-000000000001</uuid><key>sort_order</key><integer>1</integer></map>";
|
||||
request += "</array></map></llsd>";
|
||||
|
||||
string llsdresponse = handler.FetchInventoryDescendentsRequest(request, "/FETCH", string.Empty, req, resp);
|
||||
string llsdresponse = dorequest(handler, request);
|
||||
Console.WriteLine(llsdresponse);
|
||||
|
||||
string descendents = "descendents</key><integer>" + m_rootDescendents + "</integer>";
|
||||
|
@ -188,14 +200,12 @@ namespace OpenSim.Capabilities.Handlers.FetchInventory.Tests
|
|||
TestHelpers.InMethod();
|
||||
|
||||
FetchInvDescHandler handler = new FetchInvDescHandler(m_scene.InventoryService, null, m_scene);
|
||||
TestOSHttpRequest req = new TestOSHttpRequest();
|
||||
TestOSHttpResponse resp = new TestOSHttpResponse();
|
||||
|
||||
string request = "<llsd><map><key>folders</key><array><map><key>fetch_folders</key><integer>1</integer><key>fetch_items</key><boolean>1</boolean><key>folder_id</key><uuid>";
|
||||
request += "f0000000-0000-0000-0000-00000000000f";
|
||||
request += "</uuid><key>owner_id</key><uuid>00000000-0000-0000-0000-000000000000</uuid><key>sort_order</key><integer>1</integer></map></array></map></llsd>";
|
||||
request += "</uuid><key>owner_id</key><uuid>00000000-0000-0000-0000-000000000001</uuid><key>sort_order</key><integer>1</integer></map></array></map></llsd>";
|
||||
|
||||
string llsdresponse = handler.FetchInventoryDescendentsRequest(request, "/FETCH", string.Empty, req, resp);
|
||||
string llsdresponse = dorequest(handler, request);
|
||||
Console.WriteLine(llsdresponse);
|
||||
|
||||
string descendents = "descendents</key><integer>2</integer>";
|
||||
|
@ -232,8 +242,6 @@ namespace OpenSim.Capabilities.Handlers.FetchInventory.Tests
|
|||
TestHelpers.InMethod();
|
||||
|
||||
FetchInvDescHandler handler = new FetchInvDescHandler(m_scene.InventoryService, null, m_scene);
|
||||
TestOSHttpRequest req = new TestOSHttpRequest();
|
||||
TestOSHttpResponse resp = new TestOSHttpResponse();
|
||||
|
||||
string request = "<llsd><map><key>folders</key><array>";
|
||||
request += "<map><key>fetch_folders</key><integer>1</integer><key>fetch_items</key><boolean>1</boolean><key>folder_id</key><uuid>";
|
||||
|
@ -250,7 +258,7 @@ namespace OpenSim.Capabilities.Handlers.FetchInventory.Tests
|
|||
request += "</uuid><key>owner_id</key><uuid>00000000-0000-0000-0000-000000000000</uuid><key>sort_order</key><integer>1</integer></map>";
|
||||
request += "</array></map></llsd>";
|
||||
|
||||
string llsdresponse = handler.FetchInventoryDescendentsRequest(request, "/FETCH", string.Empty, req, resp);
|
||||
string llsdresponse = dorequest(handler, request);
|
||||
Console.WriteLine(llsdresponse);
|
||||
|
||||
string root_folder = "<key>folder_id</key><uuid>" + m_rootFolderID + "</uuid>";
|
||||
|
@ -267,27 +275,26 @@ namespace OpenSim.Capabilities.Handlers.FetchInventory.Tests
|
|||
[Test]
|
||||
public void Test_005_FolderZero()
|
||||
{
|
||||
|
||||
TestHelpers.InMethod();
|
||||
|
||||
Init();
|
||||
|
||||
FetchInvDescHandler handler = new FetchInvDescHandler(m_scene.InventoryService, null, m_scene);
|
||||
TestOSHttpRequest req = new TestOSHttpRequest();
|
||||
TestOSHttpResponse resp = new TestOSHttpResponse();
|
||||
|
||||
string request = "<llsd><map><key>folders</key><array><map><key>fetch_folders</key><integer>1</integer><key>fetch_items</key><boolean>1</boolean><key>folder_id</key><uuid>";
|
||||
request += UUID.Zero;
|
||||
request += "</uuid><key>owner_id</key><uuid>00000000-0000-0000-0000-000000000000</uuid><key>sort_order</key><integer>1</integer></map></array></map></llsd>";
|
||||
|
||||
string llsdresponse = handler.FetchInventoryDescendentsRequest(request, "/FETCH", string.Empty, req, resp);
|
||||
string llsdresponse = dorequest(handler, request);
|
||||
|
||||
Assert.That(llsdresponse != null, Is.True, "Incorrect null response");
|
||||
Assert.That(llsdresponse != string.Empty, Is.True, "Incorrect empty response");
|
||||
Assert.That(llsdresponse.Contains("bad_folders</key><array><uuid>00000000-0000-0000-0000-000000000000"), Is.True, "Folder Zero should be a bad folder");
|
||||
// we do return a answer now
|
||||
//Assert.That(llsdresponse.Contains("bad_folders</key><array><uuid>00000000-0000-0000-0000-000000000000"), Is.True, "Folder Zero should be a bad folder");
|
||||
|
||||
Console.WriteLine(llsdresponse);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,190 @@
|
|||
/*
|
||||
* 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.Net;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.StructuredData;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Servers;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using Caps = OpenSim.Framework.Capabilities.Caps;
|
||||
|
||||
namespace OpenSim.Capabilities.Handlers
|
||||
{
|
||||
public class GetAssetsHandler
|
||||
{
|
||||
private static readonly ILog m_log =
|
||||
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private static readonly Dictionary<string, AssetType> queryTypes = new Dictionary<string, AssetType>()
|
||||
{
|
||||
{"texture_id", AssetType.Texture},
|
||||
{"sound_id", AssetType.Sound},
|
||||
{"callcard_id", AssetType.CallingCard},
|
||||
{"landmark_id", AssetType.Landmark},
|
||||
{"script_id", AssetType.LSLText},
|
||||
{"clothing_id", AssetType.Clothing},
|
||||
{"object_id", AssetType.Object},
|
||||
{"notecard_id", AssetType.Notecard},
|
||||
{"lsltext_id", AssetType.LSLText},
|
||||
{"lslbyte_id", AssetType.LSLBytecode},
|
||||
{"txtr_tga_id", AssetType.TextureTGA},
|
||||
{"bodypart_id", AssetType.Bodypart},
|
||||
{"snd_wav_id", AssetType.SoundWAV},
|
||||
{"img_tga_id", AssetType.ImageTGA},
|
||||
{"jpeg_id", AssetType.ImageJPEG},
|
||||
{"animatn_id", AssetType.Animation},
|
||||
{"gesture_id", AssetType.Gesture},
|
||||
{"mesh_id", AssetType.Mesh},
|
||||
{"settings_id", AssetType.Settings}
|
||||
};
|
||||
|
||||
private IAssetService m_assetService;
|
||||
|
||||
public GetAssetsHandler(IAssetService assService)
|
||||
{
|
||||
m_assetService = assService;
|
||||
}
|
||||
|
||||
public void Handle(OSHttpRequest req, OSHttpResponse response)
|
||||
{
|
||||
response.ContentType = "text/plain";
|
||||
|
||||
if (m_assetService == null)
|
||||
{
|
||||
response.StatusCode = (int)HttpStatusCode.ServiceUnavailable;
|
||||
response.KeepAlive = false;
|
||||
return;
|
||||
}
|
||||
|
||||
response.StatusCode = (int)HttpStatusCode.BadRequest;
|
||||
|
||||
var queries = req.QueryAsDictionary;
|
||||
if(queries.Count == 0)
|
||||
return;
|
||||
|
||||
AssetType type = AssetType.Unknown;
|
||||
string assetStr = string.Empty;
|
||||
foreach (KeyValuePair<string,string> kvp in queries)
|
||||
{
|
||||
if (queryTypes.ContainsKey(kvp.Key))
|
||||
{
|
||||
type = queryTypes[kvp.Key];
|
||||
assetStr = kvp.Value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(type == AssetType.Unknown)
|
||||
{
|
||||
//m_log.Warn("[GETASSET]: Unknown type: " + query);
|
||||
m_log.Warn("[GETASSET]: Unknown type");
|
||||
response.StatusCode = (int)HttpStatusCode.NotFound;
|
||||
return;
|
||||
}
|
||||
|
||||
if (String.IsNullOrEmpty(assetStr))
|
||||
return;
|
||||
|
||||
UUID assetID = UUID.Zero;
|
||||
if(!UUID.TryParse(assetStr, out assetID))
|
||||
return;
|
||||
|
||||
AssetBase asset = m_assetService.Get(assetID.ToString());
|
||||
if(asset == null)
|
||||
{
|
||||
// m_log.Warn("[GETASSET]: not found: " + query + " " + assetStr);
|
||||
response.StatusCode = (int)HttpStatusCode.NotFound;
|
||||
return;
|
||||
}
|
||||
|
||||
if (asset.Type != (sbyte)type)
|
||||
return;
|
||||
|
||||
int len = asset.Data.Length;
|
||||
|
||||
string range = null;
|
||||
if (req.Headers["Range"] != null)
|
||||
range = req.Headers["Range"];
|
||||
else if (req.Headers["range"] != null)
|
||||
range = req.Headers["range"];
|
||||
|
||||
// range request
|
||||
int start, end;
|
||||
if (Util.TryParseHttpRange(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 >= asset.Data.Length)
|
||||
{
|
||||
response.StatusCode = (int)HttpStatusCode.RequestedRangeNotSatisfiable;
|
||||
return;
|
||||
}
|
||||
|
||||
if (end == -1)
|
||||
end = asset.Data.Length - 1;
|
||||
else
|
||||
end = Utils.Clamp(end, 0, asset.Data.Length - 1);
|
||||
|
||||
start = Utils.Clamp(start, 0, end);
|
||||
len = end - start + 1;
|
||||
|
||||
//m_log.Debug("Serving " + start + " to " + end + " of " + texture.Data.Length + " bytes for texture " + texture.ID);
|
||||
response.AddHeader("Content-Range", String.Format("bytes {0}-{1}/{2}", start, end, asset.Data.Length));
|
||||
response.StatusCode = (int)HttpStatusCode.PartialContent;
|
||||
response.RawBufferStart = start;
|
||||
}
|
||||
else
|
||||
response.StatusCode = (int)HttpStatusCode.OK;
|
||||
|
||||
response.ContentType = asset.Metadata.ContentType;
|
||||
response.RawBuffer = asset.Data;
|
||||
response.RawBufferLen = len;
|
||||
if (type == AssetType.Mesh || type == AssetType.Texture)
|
||||
{
|
||||
if(len > 8196)
|
||||
{
|
||||
//if(type == AssetType.Texture && ((asset.Flags & AssetFlags.AvatarBake)!= 0))
|
||||
// responsedata["prio"] = 1;
|
||||
//else
|
||||
response.Priority = 2;
|
||||
}
|
||||
else
|
||||
response.Priority = 1;
|
||||
}
|
||||
else
|
||||
response.Priority = -1;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,117 +0,0 @@
|
|||
/*
|
||||
* 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.Collections.Specialized;
|
||||
using System.Reflection;
|
||||
using System.IO;
|
||||
using System.Web;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.StructuredData;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using Caps = OpenSim.Framework.Capabilities.Caps;
|
||||
using OSDMap = OpenMetaverse.StructuredData.OSDMap;
|
||||
using OSDArray = OpenMetaverse.StructuredData.OSDArray;
|
||||
|
||||
namespace OpenSim.Capabilities.Handlers
|
||||
{
|
||||
public class GetDisplayNamesHandler : BaseStreamHandler
|
||||
{
|
||||
private static readonly ILog m_log =
|
||||
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
protected IUserManagement m_UserManagement;
|
||||
|
||||
public GetDisplayNamesHandler(string path, IUserManagement umService, string name, string description)
|
||||
: base("GET", path, name, description)
|
||||
{
|
||||
m_UserManagement = umService;
|
||||
}
|
||||
|
||||
protected override byte[] ProcessRequest(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
// m_log.DebugFormat("[GET_DISPLAY_NAMES]: called {0}", httpRequest.Url.Query);
|
||||
|
||||
NameValueCollection query = HttpUtility.ParseQueryString(httpRequest.Url.Query);
|
||||
string[] ids = query.GetValues("ids");
|
||||
|
||||
if (m_UserManagement == null)
|
||||
{
|
||||
m_log.Error("[GET_DISPLAY_NAMES]: Cannot fetch display names without a user management component");
|
||||
httpResponse.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
|
||||
return new byte[0];
|
||||
}
|
||||
|
||||
Dictionary<UUID,string> names = m_UserManagement.GetUsersNames(ids);
|
||||
|
||||
OSDMap osdReply = new OSDMap();
|
||||
OSDArray agents = new OSDArray();
|
||||
|
||||
osdReply["agents"] = agents;
|
||||
foreach (KeyValuePair<UUID,string> kvp in names)
|
||||
{
|
||||
if (string.IsNullOrEmpty(kvp.Value))
|
||||
continue;
|
||||
if(kvp.Key == UUID.Zero)
|
||||
continue;
|
||||
|
||||
string[] parts = kvp.Value.Split(new char[] {' '});
|
||||
OSDMap osdname = new OSDMap();
|
||||
if(parts[0] == "Unknown")
|
||||
{
|
||||
osdname["display_name_next_update"] = OSD.FromDate(DateTime.UtcNow.AddHours(1));
|
||||
osdname["display_name_expires"] = OSD.FromDate(DateTime.UtcNow.AddHours(2));
|
||||
}
|
||||
else
|
||||
{
|
||||
osdname["display_name_next_update"] = OSD.FromDate(DateTime.UtcNow.AddDays(8));
|
||||
osdname["display_name_expires"] = OSD.FromDate(DateTime.UtcNow.AddMonths(1));
|
||||
}
|
||||
osdname["display_name"] = OSD.FromString(kvp.Value);
|
||||
osdname["legacy_first_name"] = parts[0];
|
||||
osdname["legacy_last_name"] = parts[1];
|
||||
osdname["username"] = OSD.FromString(kvp.Value);
|
||||
osdname["id"] = OSD.FromUUID(kvp.Key);
|
||||
osdname["is_display_name_default"] = OSD.FromBoolean(true);
|
||||
|
||||
agents.Add(osdname);
|
||||
}
|
||||
|
||||
// Full content request
|
||||
httpResponse.StatusCode = (int)System.Net.HttpStatusCode.OK;
|
||||
//httpResponse.ContentLength = ??;
|
||||
httpResponse.ContentType = "application/llsd+xml";
|
||||
|
||||
string reply = OSDParser.SerializeLLSDXmlString(osdReply);
|
||||
return System.Text.Encoding.UTF8.GetBytes(reply);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -41,9 +41,6 @@ using OpenSim.Framework.Servers.HttpServer;
|
|||
using OpenSim.Services.Interfaces;
|
||||
using Caps = OpenSim.Framework.Capabilities.Caps;
|
||||
|
||||
|
||||
|
||||
|
||||
namespace OpenSim.Capabilities.Handlers
|
||||
{
|
||||
public class GetMeshHandler
|
||||
|
@ -61,211 +58,98 @@ namespace OpenSim.Capabilities.Handlers
|
|||
}
|
||||
public Hashtable Handle(Hashtable request)
|
||||
{
|
||||
Hashtable ret = new Hashtable();
|
||||
ret["int_response_code"] = (int)System.Net.HttpStatusCode.NotFound;
|
||||
ret["content_type"] = "text/plain";
|
||||
ret["keepalive"] = false;
|
||||
ret["reusecontext"] = false;
|
||||
ret["int_bytes"] = 0;
|
||||
ret["int_lod"] = 0;
|
||||
string MeshStr = (string)request["mesh_id"];
|
||||
|
||||
|
||||
//m_log.DebugFormat("[GETMESH]: called {0}", MeshStr);
|
||||
|
||||
if (m_assetService == null)
|
||||
{
|
||||
m_log.Error("[GETMESH]: Cannot fetch mesh " + MeshStr + " without an asset service");
|
||||
}
|
||||
|
||||
UUID meshID;
|
||||
if (!String.IsNullOrEmpty(MeshStr) && UUID.TryParse(MeshStr, out meshID))
|
||||
{
|
||||
// m_log.DebugFormat("[GETMESH]: Received request for mesh id {0}", meshID);
|
||||
|
||||
|
||||
ret = ProcessGetMesh(request, UUID.Zero, null);
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.Warn("[GETMESH]: Failed to parse a mesh_id from GetMesh request: " + (string)request["uri"]);
|
||||
}
|
||||
|
||||
|
||||
return ret;
|
||||
return ProcessGetMesh(request, UUID.Zero, null); ;
|
||||
}
|
||||
|
||||
public Hashtable ProcessGetMesh(Hashtable request, UUID AgentId, Caps cap)
|
||||
{
|
||||
Hashtable responsedata = new Hashtable();
|
||||
responsedata["int_response_code"] = 400; //501; //410; //404;
|
||||
if (m_assetService == null)
|
||||
{
|
||||
responsedata["int_response_code"] = (int)System.Net.HttpStatusCode.ServiceUnavailable;
|
||||
responsedata["str_response_string"] = "The asset service is unavailable";
|
||||
responsedata["keepalive"] = false;
|
||||
return responsedata;
|
||||
}
|
||||
|
||||
responsedata["int_response_code"] = (int)System.Net.HttpStatusCode.BadRequest;
|
||||
responsedata["content_type"] = "text/plain";
|
||||
responsedata["keepalive"] = false;
|
||||
responsedata["str_response_string"] = "Request wasn't what was expected";
|
||||
responsedata["reusecontext"] = false;
|
||||
responsedata["int_lod"] = 0;
|
||||
responsedata["int_bytes"] = 0;
|
||||
|
||||
string meshStr = string.Empty;
|
||||
|
||||
if (request.ContainsKey("mesh_id"))
|
||||
meshStr = request["mesh_id"].ToString();
|
||||
|
||||
if (String.IsNullOrEmpty(meshStr))
|
||||
return responsedata;
|
||||
|
||||
UUID meshID = UUID.Zero;
|
||||
if (!String.IsNullOrEmpty(meshStr) && UUID.TryParse(meshStr, out meshID))
|
||||
if(!UUID.TryParse(meshStr, out meshID))
|
||||
return responsedata;
|
||||
|
||||
AssetBase mesh = m_assetService.Get(meshID.ToString());
|
||||
if(mesh == null)
|
||||
{
|
||||
if (m_assetService == null)
|
||||
{
|
||||
responsedata["int_response_code"] = 404; //501; //410; //404;
|
||||
responsedata["content_type"] = "text/plain";
|
||||
responsedata["keepalive"] = false;
|
||||
responsedata["str_response_string"] = "The asset service is unavailable. So is your mesh.";
|
||||
responsedata["reusecontext"] = false;
|
||||
return responsedata;
|
||||
}
|
||||
|
||||
AssetBase mesh = m_assetService.Get(meshID.ToString());
|
||||
|
||||
if (mesh != null)
|
||||
{
|
||||
if (mesh.Type == (SByte)AssetType.Mesh)
|
||||
{
|
||||
|
||||
Hashtable headers = new Hashtable();
|
||||
responsedata["headers"] = headers;
|
||||
|
||||
string range = String.Empty;
|
||||
|
||||
if (((Hashtable)request["headers"])["range"] != null)
|
||||
range = (string)((Hashtable)request["headers"])["range"];
|
||||
|
||||
else if (((Hashtable)request["headers"])["Range"] != null)
|
||||
range = (string)((Hashtable)request["headers"])["Range"];
|
||||
|
||||
if (!String.IsNullOrEmpty(range)) // Mesh Asset LOD // Physics
|
||||
{
|
||||
// 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 >= mesh.Data.Length)
|
||||
{
|
||||
responsedata["int_response_code"] = 404; //501; //410; //404;
|
||||
responsedata["content_type"] = "text/plain";
|
||||
responsedata["keepalive"] = false;
|
||||
responsedata["str_response_string"] = "This range doesnt exist.";
|
||||
responsedata["reusecontext"] = false;
|
||||
responsedata["int_lod"] = 3;
|
||||
return responsedata;
|
||||
}
|
||||
else
|
||||
{
|
||||
end = Utils.Clamp(end, 0, mesh.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);
|
||||
|
||||
if (start > 20000)
|
||||
{
|
||||
responsedata["int_lod"] = 3;
|
||||
}
|
||||
else if (start < 4097)
|
||||
{
|
||||
responsedata["int_lod"] = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
responsedata["int_lod"] = 2;
|
||||
}
|
||||
|
||||
|
||||
if (start == 0 && len == mesh.Data.Length) // well redudante maybe
|
||||
{
|
||||
responsedata["int_response_code"] = (int)System.Net.HttpStatusCode.OK;
|
||||
responsedata["bin_response_data"] = mesh.Data;
|
||||
responsedata["int_bytes"] = mesh.Data.Length;
|
||||
responsedata["reusecontext"] = false;
|
||||
responsedata["int_lod"] = 3;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
responsedata["int_response_code"] =
|
||||
(int)System.Net.HttpStatusCode.PartialContent;
|
||||
headers["Content-Range"] = String.Format("bytes {0}-{1}/{2}", start, end,
|
||||
mesh.Data.Length);
|
||||
|
||||
byte[] d = new byte[len];
|
||||
Array.Copy(mesh.Data, start, d, 0, len);
|
||||
responsedata["bin_response_data"] = d;
|
||||
responsedata["int_bytes"] = len;
|
||||
responsedata["reusecontext"] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.Warn("[GETMESH]: Failed to parse a range from GetMesh request, sending full asset: " + (string)request["uri"]);
|
||||
responsedata["str_response_string"] = Convert.ToBase64String(mesh.Data);
|
||||
responsedata["content_type"] = "application/vnd.ll.mesh";
|
||||
responsedata["int_response_code"] = 200;
|
||||
responsedata["reusecontext"] = false;
|
||||
responsedata["int_lod"] = 3;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
responsedata["str_response_string"] = Convert.ToBase64String(mesh.Data);
|
||||
responsedata["content_type"] = "application/vnd.ll.mesh";
|
||||
responsedata["int_response_code"] = 200;
|
||||
responsedata["reusecontext"] = false;
|
||||
responsedata["int_lod"] = 3;
|
||||
}
|
||||
}
|
||||
// Optionally add additional mesh types here
|
||||
else
|
||||
{
|
||||
responsedata["int_response_code"] = 404; //501; //410; //404;
|
||||
responsedata["content_type"] = "text/plain";
|
||||
responsedata["keepalive"] = false;
|
||||
responsedata["str_response_string"] = "Unfortunately, this asset isn't a mesh.";
|
||||
responsedata["reusecontext"] = false;
|
||||
responsedata["int_lod"] = 1;
|
||||
return responsedata;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
responsedata["int_response_code"] = 404; //501; //410; //404;
|
||||
responsedata["content_type"] = "text/plain";
|
||||
responsedata["keepalive"] = false;
|
||||
responsedata["str_response_string"] = "Your Mesh wasn't found. Sorry!";
|
||||
responsedata["reusecontext"] = false;
|
||||
responsedata["int_lod"] = 0;
|
||||
return responsedata;
|
||||
}
|
||||
responsedata["int_response_code"] = (int)System.Net.HttpStatusCode.NotFound;
|
||||
responsedata["str_response_string"] = "Mesh not found.";
|
||||
return responsedata;
|
||||
}
|
||||
|
||||
if (mesh.Type != (SByte)AssetType.Mesh)
|
||||
{
|
||||
responsedata["str_response_string"] = "Asset isn't a mesh.";
|
||||
return responsedata;
|
||||
}
|
||||
|
||||
string range = String.Empty;
|
||||
|
||||
if (((Hashtable)request["headers"])["range"] != null)
|
||||
range = (string)((Hashtable)request["headers"])["range"];
|
||||
else if (((Hashtable)request["headers"])["Range"] != null)
|
||||
range = (string)((Hashtable)request["headers"])["Range"];
|
||||
|
||||
responsedata["content_type"] = "application/vnd.ll.mesh";
|
||||
if (String.IsNullOrEmpty(range))
|
||||
{
|
||||
// full mesh
|
||||
responsedata["str_response_string"] = Convert.ToBase64String(mesh.Data);
|
||||
responsedata["int_response_code"] = (int)System.Net.HttpStatusCode.OK;
|
||||
return responsedata;
|
||||
}
|
||||
|
||||
// range request
|
||||
int start, end;
|
||||
if (Util.TryParseHttpRange(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 >= mesh.Data.Length)
|
||||
{
|
||||
responsedata["str_response_string"] = "This range doesnt exist.";
|
||||
return responsedata;
|
||||
}
|
||||
|
||||
end = Utils.Clamp(end, 0, mesh.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);
|
||||
Hashtable headers = new Hashtable();
|
||||
headers["Content-Range"] = String.Format("bytes {0}-{1}/{2}", start, end, mesh.Data.Length);
|
||||
responsedata["headers"] = headers;
|
||||
responsedata["int_response_code"] = (int)System.Net.HttpStatusCode.PartialContent;
|
||||
|
||||
byte[] d = new byte[len];
|
||||
Array.Copy(mesh.Data, start, d, 0, len);
|
||||
responsedata["bin_response_data"] = d;
|
||||
responsedata["int_bytes"] = len;
|
||||
return responsedata;
|
||||
}
|
||||
|
||||
m_log.Warn("[GETMESH]: Failed to parse a range from GetMesh request, sending full asset: " + (string)request["uri"]);
|
||||
responsedata["str_response_string"] = Convert.ToBase64String(mesh.Data);
|
||||
responsedata["int_response_code"] = (int)System.Net.HttpStatusCode.OK;
|
||||
return responsedata;
|
||||
}
|
||||
private bool TryParseRange(string header, out int start, out int end)
|
||||
{
|
||||
if (header.StartsWith("bytes="))
|
||||
{
|
||||
string[] rangeValues = header.Substring(6).Split('-');
|
||||
if (rangeValues.Length == 2)
|
||||
{
|
||||
if (Int32.TryParse(rangeValues[0], out start) && Int32.TryParse(rangeValues[1], out end))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
start = end = 0;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -68,7 +68,7 @@ namespace OpenSim.Capabilities.Handlers
|
|||
IRequestHandler reqHandler
|
||||
= new RestHTTPHandler(
|
||||
"GET",
|
||||
"/CAPS/" + UUID.Random(),
|
||||
"/" + UUID.Random(),
|
||||
httpMethod => gmeshHandler.ProcessGetMesh(httpMethod, UUID.Zero, null),
|
||||
"GetMesh",
|
||||
null);
|
||||
|
|
|
@ -66,8 +66,6 @@ namespace OpenSim.Capabilities.Handlers
|
|||
Hashtable ret = new Hashtable();
|
||||
ret["int_response_code"] = (int)System.Net.HttpStatusCode.NotFound;
|
||||
ret["content_type"] = "text/plain";
|
||||
ret["keepalive"] = false;
|
||||
ret["reusecontext"] = false;
|
||||
ret["int_bytes"] = 0;
|
||||
string textureStr = (string)request["texture_id"];
|
||||
string format = (string)request["format"];
|
||||
|
@ -112,8 +110,6 @@ namespace OpenSim.Capabilities.Handlers
|
|||
ret["error_status_text"] = "not found";
|
||||
ret["str_response_string"] = "not found";
|
||||
ret["content_type"] = "text/plain";
|
||||
ret["keepalive"] = false;
|
||||
ret["reusecontext"] = false;
|
||||
ret["int_bytes"] = 0;
|
||||
}
|
||||
}
|
||||
|
@ -214,7 +210,7 @@ namespace OpenSim.Capabilities.Handlers
|
|||
{
|
||||
// Range request
|
||||
int start, end;
|
||||
if (TryParseRange(range, out start, out end))
|
||||
if (Util.TryParseHttpRange(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
|
||||
|
@ -253,24 +249,13 @@ namespace OpenSim.Capabilities.Handlers
|
|||
// m_log.Debug("Serving " + start + " to " + end + " of " + texture.Data.Length + " bytes for texture " + texture.ID);
|
||||
|
||||
response["content-type"] = texture.Metadata.ContentType;
|
||||
response["int_response_code"] = (int)System.Net.HttpStatusCode.PartialContent;
|
||||
headers["Content-Range"] = String.Format("bytes {0}-{1}/{2}", start, end, texture.Data.Length);
|
||||
|
||||
if (start == 0 && len == texture.Data.Length) // well redudante maybe
|
||||
{
|
||||
response["int_response_code"] = (int)System.Net.HttpStatusCode.OK;
|
||||
response["bin_response_data"] = texture.Data;
|
||||
response["int_bytes"] = texture.Data.Length;
|
||||
}
|
||||
else
|
||||
{
|
||||
response["int_response_code"] = (int)System.Net.HttpStatusCode.PartialContent;
|
||||
headers["Content-Range"] = String.Format("bytes {0}-{1}/{2}", start, end, texture.Data.Length);
|
||||
|
||||
byte[] d = new byte[len];
|
||||
Array.Copy(texture.Data, start, d, 0, len);
|
||||
response["bin_response_data"] = d;
|
||||
response["int_bytes"] = len;
|
||||
}
|
||||
// response.Body.Write(texture.Data, start, len);
|
||||
byte[] d = new byte[len];
|
||||
Array.Copy(texture.Data, start, d, 0, len);
|
||||
response["bin_response_data"] = d;
|
||||
response["int_bytes"] = len;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -304,50 +289,6 @@ namespace OpenSim.Capabilities.Handlers
|
|||
// texture.FullID, range, response.StatusCode, response.ContentLength, texture.Data.Length);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parse a range header.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// As per http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html,
|
||||
/// this obeys range headers with two values (e.g. 533-4165) and no second value (e.g. 533-).
|
||||
/// Where there is no value, -1 is returned.
|
||||
/// FIXME: Need to cover the case where only a second value is specified (e.g. -4165), probably by returning -1
|
||||
/// for start.</remarks>
|
||||
/// <returns></returns>
|
||||
/// <param name='header'></param>
|
||||
/// <param name='start'>Start of the range. Undefined if this was not a number.</param>
|
||||
/// <param name='end'>End of the range. Will be -1 if no end specified. Undefined if there was a raw string but this was not a number.</param>
|
||||
private bool TryParseRange(string header, out int start, out int end)
|
||||
{
|
||||
start = end = 0;
|
||||
|
||||
if (header.StartsWith("bytes="))
|
||||
{
|
||||
string[] rangeValues = header.Substring(6).Split('-');
|
||||
|
||||
if (rangeValues.Length == 2)
|
||||
{
|
||||
if (!Int32.TryParse(rangeValues[0], out start))
|
||||
return false;
|
||||
|
||||
string rawEnd = rangeValues[1];
|
||||
|
||||
if (rawEnd == "")
|
||||
{
|
||||
end = -1;
|
||||
return true;
|
||||
}
|
||||
else if (Int32.TryParse(rawEnd, out end))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
start = end = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
private byte[] ConvertTextureData(AssetBase texture, string format)
|
||||
{
|
||||
m_log.DebugFormat("[GETTEXTURE]: Converting texture {0} to {1}", texture.ID, format);
|
||||
|
@ -362,8 +303,6 @@ namespace OpenSim.Capabilities.Handlers
|
|||
{
|
||||
// Taking our jpeg2000 data, decoding it, then saving it to a byte array with regular data
|
||||
|
||||
imgstream = new MemoryStream();
|
||||
|
||||
// Decode image to System.Drawing.Image
|
||||
if (OpenJPEG.DecodeToImage(texture.Data, out managedImage, out image) && image != null)
|
||||
{
|
||||
|
@ -404,10 +343,7 @@ namespace OpenSim.Capabilities.Handlers
|
|||
if(managedImage != null)
|
||||
managedImage.Clear();
|
||||
if (imgstream != null)
|
||||
{
|
||||
imgstream.Close();
|
||||
imgstream.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
|
|
|
@ -32,6 +32,7 @@ using System.Drawing;
|
|||
using System.Drawing.Imaging;
|
||||
using System.Reflection;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Web;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
|
@ -131,87 +132,46 @@ namespace OpenSim.Capabilities.Handlers
|
|||
/// <returns>False for "caller try another codec"; true otherwise</returns>
|
||||
private bool FetchTexture(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, UUID textureID, string format)
|
||||
{
|
||||
// m_log.DebugFormat("[GETTEXTURE]: {0} with requested format {1}", textureID, format);
|
||||
AssetBase texture;
|
||||
|
||||
string fullID = textureID.ToString();
|
||||
if (format != DefaultFormat)
|
||||
fullID = fullID + "-" + format;
|
||||
|
||||
if (!String.IsNullOrEmpty(m_RedirectURL))
|
||||
// m_log.DebugFormat("[GETTEXTURE]: {0} with requested format {1}", textureID, format);
|
||||
if(!String.IsNullOrEmpty(m_RedirectURL))
|
||||
{
|
||||
// Only try to fetch locally cached textures. Misses are redirected
|
||||
texture = m_assetService.GetCached(fullID);
|
||||
string textureUrl = m_RedirectURL + "?texture_id=" + textureID.ToString();
|
||||
m_log.Debug("[GETTEXTURE]: Redirecting texture request to " + textureUrl);
|
||||
httpResponse.StatusCode = (int)HttpStatusCode.Moved;
|
||||
httpResponse.AddHeader("Location:", textureUrl);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (texture != null)
|
||||
// Fetch, Misses or invalid return a 404
|
||||
AssetBase texture = m_assetService.Get(textureID.ToString());
|
||||
if (texture != null)
|
||||
{
|
||||
if (texture.Type != (sbyte)AssetType.Texture)
|
||||
{
|
||||
httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
|
||||
return true;
|
||||
}
|
||||
if (format == DefaultFormat)
|
||||
{
|
||||
if (texture.Type != (sbyte)AssetType.Texture)
|
||||
{
|
||||
httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
|
||||
return true;
|
||||
}
|
||||
WriteTextureData(httpRequest, httpResponse, texture, format);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
string textureUrl = m_RedirectURL + "?texture_id="+ textureID.ToString();
|
||||
m_log.Debug("[GETTEXTURE]: Redirecting texture request to " + textureUrl);
|
||||
httpResponse.StatusCode = (int)OSHttpStatusCode.RedirectMovedPermanently;
|
||||
httpResponse.RedirectLocation = textureUrl;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else // no redirect
|
||||
{
|
||||
// try the cache
|
||||
texture = m_assetService.GetCached(fullID);
|
||||
|
||||
if (texture == null)
|
||||
{
|
||||
// m_log.DebugFormat("[GETTEXTURE]: texture was not in the cache");
|
||||
// need to convert format
|
||||
AssetBase newTexture = new AssetBase(texture.ID + "-" + format, texture.Name, (sbyte)AssetType.Texture, texture.Metadata.CreatorID);
|
||||
newTexture.Data = ConvertTextureData(texture, format);
|
||||
if (newTexture.Data.Length == 0)
|
||||
return false; // !!! Caller try another codec, please!
|
||||
|
||||
// Fetch locally or remotely. Misses return a 404
|
||||
texture = m_assetService.Get(textureID.ToString());
|
||||
|
||||
if (texture != null)
|
||||
{
|
||||
if (texture.Type != (sbyte)AssetType.Texture)
|
||||
{
|
||||
httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
|
||||
return true;
|
||||
}
|
||||
if (format == DefaultFormat)
|
||||
{
|
||||
WriteTextureData(httpRequest, httpResponse, texture, format);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
AssetBase newTexture = new AssetBase(texture.ID + "-" + format, texture.Name, (sbyte)AssetType.Texture, texture.Metadata.CreatorID);
|
||||
newTexture.Data = ConvertTextureData(texture, format);
|
||||
if (newTexture.Data.Length == 0)
|
||||
return false; // !!! Caller try another codec, please!
|
||||
|
||||
newTexture.Flags = AssetFlags.Collectable;
|
||||
newTexture.Temporary = true;
|
||||
newTexture.Local = true;
|
||||
m_assetService.Store(newTexture);
|
||||
WriteTextureData(httpRequest, httpResponse, newTexture, format);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else // it was on the cache
|
||||
{
|
||||
// m_log.DebugFormat("[GETTEXTURE]: texture was in the cache");
|
||||
WriteTextureData(httpRequest, httpResponse, texture, format);
|
||||
return true;
|
||||
}
|
||||
newTexture.Flags = AssetFlags.Collectable;
|
||||
newTexture.Temporary = true;
|
||||
newTexture.Local = true;
|
||||
WriteTextureData(httpRequest, httpResponse, newTexture, format);
|
||||
return true;
|
||||
}
|
||||
|
||||
// not found
|
||||
// m_log.Warn("[GETTEXTURE]: Texture " + textureID + " not found");
|
||||
// m_log.Warn("[GETTEXTURE]: Texture " + textureID + " not found");
|
||||
httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
|
||||
return true;
|
||||
}
|
||||
|
@ -279,8 +239,9 @@ namespace OpenSim.Capabilities.Handlers
|
|||
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.RawBuffer = texture.Data;
|
||||
response.RawBufferStart = start;
|
||||
response.RawBufferLen = len;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -298,17 +259,19 @@ namespace OpenSim.Capabilities.Handlers
|
|||
response.ContentType = texture.Metadata.ContentType;
|
||||
else
|
||||
response.ContentType = "image/" + format;
|
||||
response.Body.Write(texture.Data, 0, texture.Data.Length);
|
||||
response.RawBuffer = texture.Data;
|
||||
response.RawBufferStart = 0;
|
||||
response.RawBufferLen = 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);
|
||||
// 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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -368,9 +331,6 @@ namespace OpenSim.Capabilities.Handlers
|
|||
try
|
||||
{
|
||||
// Taking our jpeg2000 data, decoding it, then saving it to a byte array with regular data
|
||||
|
||||
imgstream = new MemoryStream();
|
||||
|
||||
// Decode image to System.Drawing.Image
|
||||
if (OpenJPEG.DecodeToImage(texture.Data, out managedImage, out image) && image != null)
|
||||
{
|
||||
|
@ -412,10 +372,7 @@ namespace OpenSim.Capabilities.Handlers
|
|||
managedImage.Clear();
|
||||
|
||||
if (imgstream != null)
|
||||
{
|
||||
imgstream.Close();
|
||||
imgstream.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
|
|
|
@ -66,7 +66,7 @@ namespace OpenSim.Capabilities.Handlers
|
|||
string rurl = serverConfig.GetString("GetTextureRedirectURL");
|
||||
;
|
||||
server.AddStreamHandler(
|
||||
new GetTextureRobustHandler("/CAPS/GetTexture/", m_AssetService, "GetTexture", null, rurl));
|
||||
new GetTextureRobustHandler("/CAPS/GetTexture", m_AssetService, "GetTexture", null, rurl));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,188 +0,0 @@
|
|||
/*
|
||||
* 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.Collections.Specialized;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Reflection;
|
||||
using System.IO;
|
||||
using System.Web;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.StructuredData;
|
||||
using OpenMetaverse.Imaging;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Capabilities;
|
||||
using OpenSim.Framework.Servers;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using Caps = OpenSim.Framework.Capabilities.Caps;
|
||||
|
||||
namespace OpenSim.Capabilities.Handlers
|
||||
{
|
||||
public class UploadBakedTextureHandler
|
||||
{
|
||||
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private Caps m_HostCapsObj;
|
||||
private IAssetService m_assetService;
|
||||
private bool m_persistBakedTextures;
|
||||
|
||||
public UploadBakedTextureHandler(Caps caps, IAssetService assetService, bool persistBakedTextures)
|
||||
{
|
||||
m_HostCapsObj = caps;
|
||||
m_assetService = assetService;
|
||||
m_persistBakedTextures = persistBakedTextures;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handle a request from the client for a Uri to upload a baked texture.
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <param name="path"></param>
|
||||
/// <param name="param"></param>
|
||||
/// <param name="httpRequest"></param>
|
||||
/// <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, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||
{
|
||||
try
|
||||
{
|
||||
string capsBase = "/CAPS/" + m_HostCapsObj.CapsObjectPath;
|
||||
string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000");
|
||||
|
||||
BakedTextureUploader uploader =
|
||||
new BakedTextureUploader(capsBase + uploaderPath, m_HostCapsObj.HttpListener, m_HostCapsObj.AgentID);
|
||||
uploader.OnUpLoad += BakedTextureUploaded;
|
||||
|
||||
m_HostCapsObj.HttpListener.AddStreamHandler(
|
||||
new BinaryStreamHandler(
|
||||
"POST", capsBase + uploaderPath, uploader.uploaderCaps, "UploadBakedTexture", null));
|
||||
|
||||
string protocol = "http://";
|
||||
|
||||
if (m_HostCapsObj.SSLCaps)
|
||||
protocol = "https://";
|
||||
|
||||
string uploaderURL = protocol + m_HostCapsObj.HostName + ":" +
|
||||
m_HostCapsObj.Port.ToString() + capsBase + uploaderPath;
|
||||
|
||||
LLSDAssetUploadResponse uploadResponse = new LLSDAssetUploadResponse();
|
||||
uploadResponse.uploader = uploaderURL;
|
||||
uploadResponse.state = "upload";
|
||||
|
||||
return LLSDHelpers.SerialiseLLSDReply(uploadResponse);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[UPLOAD BAKED TEXTURE HANDLER]: {0}{1}", e.Message, e.StackTrace);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Called when a baked texture has been successfully uploaded by a client.
|
||||
/// </summary>
|
||||
/// <param name="assetID"></param>
|
||||
/// <param name="data"></param>
|
||||
private void BakedTextureUploaded(UUID assetID, byte[] data)
|
||||
{
|
||||
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());
|
||||
asset.Data = data;
|
||||
asset.Temporary = true;
|
||||
asset.Local = !m_persistBakedTextures; // Local assets aren't persisted, non-local are
|
||||
m_assetService.Store(asset);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
class BakedTextureUploader
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public event Action<UUID, byte[]> OnUpLoad;
|
||||
|
||||
private string uploaderPath = String.Empty;
|
||||
private UUID newAssetID;
|
||||
private IHttpServer httpListener;
|
||||
private UUID AgentId = UUID.Zero;
|
||||
|
||||
public BakedTextureUploader(string path, IHttpServer httpServer, UUID uUID)
|
||||
{
|
||||
newAssetID = UUID.Random();
|
||||
uploaderPath = path;
|
||||
httpListener = httpServer;
|
||||
AgentId = uUID;
|
||||
// m_log.InfoFormat("[CAPS] baked texture upload starting for {0}",newAssetID);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Handle raw uploaded baked texture data.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <param name="path"></param>
|
||||
/// <param name="param"></param>
|
||||
/// <returns></returns>
|
||||
public string uploaderCaps(byte[] data, string path, string param)
|
||||
{
|
||||
Action<UUID, byte[]> handlerUpLoad = OnUpLoad;
|
||||
|
||||
// Don't do this asynchronously, otherwise it's possible for the client to send set appearance information
|
||||
// on another thread which might send out avatar updates before the asset has been put into the asset
|
||||
// service.
|
||||
if (handlerUpLoad != null)
|
||||
handlerUpLoad(newAssetID, data);
|
||||
|
||||
string res = String.Empty;
|
||||
LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete();
|
||||
uploadComplete.new_asset = newAssetID.ToString();
|
||||
uploadComplete.new_inventory_item = UUID.Zero;
|
||||
uploadComplete.state = "complete";
|
||||
|
||||
res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
|
||||
|
||||
httpListener.RemoveStreamHandler("POST", uploaderPath);
|
||||
|
||||
// m_log.DebugFormat("[BAKED TEXTURE UPLOADER]: baked texture upload completed for {0}", newAssetID);
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,76 +0,0 @@
|
|||
/*
|
||||
* 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 UploadBakedTextureServerConnector : ServiceConnector
|
||||
{
|
||||
private IAssetService m_AssetService;
|
||||
private string m_ConfigName = "CapsService";
|
||||
|
||||
public UploadBakedTextureServerConnector(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 assetService = serverConfig.GetString("AssetService", String.Empty);
|
||||
|
||||
if (assetService == String.Empty)
|
||||
throw new Exception("No AssetService in config file");
|
||||
|
||||
Object[] args = new Object[] { config };
|
||||
m_AssetService =
|
||||
ServerUtils.LoadPlugin<IAssetService>(assetService, args);
|
||||
|
||||
if (m_AssetService == null)
|
||||
throw new Exception(String.Format("Failed to load AssetService from {0}; config is {1}", assetService, m_ConfigName));
|
||||
|
||||
// NEED TO FIX THIS
|
||||
OpenSim.Framework.Capabilities.Caps caps = new OpenSim.Framework.Capabilities.Caps(server, "", server.Port, "", UUID.Zero, "");
|
||||
server.AddStreamHandler(new RestStreamHandler(
|
||||
"POST",
|
||||
"/CAPS/UploadBakedTexture/",
|
||||
new UploadBakedTextureHandler(caps, m_AssetService, true).UploadBakedTexture,
|
||||
"UploadBakedTexture",
|
||||
"Upload Baked Texture Capability"));
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -107,17 +107,17 @@ namespace OpenSim.Framework.Capabilities
|
|||
/// <returns></returns>
|
||||
public static byte[] LLSDSerialize(object obj)
|
||||
{
|
||||
StringWriter sw = new StringWriter();
|
||||
XmlTextWriter writer = new XmlTextWriter(sw);
|
||||
writer.Formatting = Formatting.None;
|
||||
using(StringWriter sw = new StringWriter())
|
||||
using(XmlTextWriter writer = new XmlTextWriter(sw))
|
||||
{
|
||||
writer.Formatting = Formatting.None;
|
||||
|
||||
writer.WriteStartElement(String.Empty, "llsd", String.Empty);
|
||||
LLSDWriteOne(writer, obj);
|
||||
writer.WriteEndElement();
|
||||
|
||||
writer.Close();
|
||||
|
||||
return Util.UTF8.GetBytes(sw.ToString());
|
||||
writer.WriteStartElement(String.Empty, "llsd", String.Empty);
|
||||
LLSDWriteOne(writer, obj);
|
||||
writer.WriteEndElement();
|
||||
writer.Flush();
|
||||
return Util.UTF8.GetBytes(sw.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -566,7 +566,7 @@ namespace OpenSim.Framework.Capabilities
|
|||
endPos = FindEnd(llsd, 1);
|
||||
|
||||
if (Double.TryParse(llsd.Substring(1, endPos - 1), NumberStyles.Float,
|
||||
Utils.EnUsCulture.NumberFormat, out value))
|
||||
Culture.NumberFormatInfo, out value))
|
||||
return value;
|
||||
else
|
||||
throw new LLSDParseException("Failed to parse double value type");
|
||||
|
|
|
@ -1,68 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
|
||||
namespace OpenSim.Framework.Capabilities
|
||||
{
|
||||
[OSDMap]
|
||||
public class LLSDEnvironmentRequest
|
||||
{
|
||||
public UUID messageID;
|
||||
public UUID regionID;
|
||||
}
|
||||
|
||||
[OSDMap]
|
||||
public class LLSDEnvironmentSetResponse
|
||||
{
|
||||
public UUID regionID;
|
||||
public UUID messageID;
|
||||
public Boolean success;
|
||||
public String fail_reason;
|
||||
}
|
||||
|
||||
public class EnvironmentSettings
|
||||
{
|
||||
/// <summary>
|
||||
/// generates a empty llsd settings response for viewer
|
||||
/// </summary>
|
||||
/// <param name="messageID">the message UUID</param>
|
||||
/// <param name="regionID">the region UUID</param>
|
||||
public static string EmptySettings(UUID messageID, UUID regionID)
|
||||
{
|
||||
OSDArray arr = new OSDArray();
|
||||
LLSDEnvironmentRequest msg = new LLSDEnvironmentRequest();
|
||||
msg.messageID = messageID;
|
||||
msg.regionID = regionID;
|
||||
arr.Array.Add(msg);
|
||||
return LLSDHelpers.SerialiseLLSDReply(arr);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -30,6 +30,7 @@ using System.Collections;
|
|||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Xml;
|
||||
using OpenMetaverse;
|
||||
|
||||
namespace OpenSim.Framework.Capabilities
|
||||
{
|
||||
|
@ -40,17 +41,32 @@ namespace OpenSim.Framework.Capabilities
|
|||
|
||||
public static string SerialiseLLSDReply(object obj)
|
||||
{
|
||||
StringWriter sw = new StringWriter();
|
||||
XmlTextWriter writer = new XmlTextWriter(sw);
|
||||
writer.Formatting = Formatting.None;
|
||||
writer.WriteStartElement(String.Empty, "llsd", String.Empty);
|
||||
SerializeOSDType(writer, obj);
|
||||
writer.WriteEndElement();
|
||||
writer.Close();
|
||||
|
||||
using(StringWriter sw = new StringWriter())
|
||||
using(XmlTextWriter writer = new XmlTextWriter(sw))
|
||||
{
|
||||
writer.Formatting = Formatting.None;
|
||||
writer.WriteStartElement(String.Empty, "llsd", String.Empty);
|
||||
SerializeOSDType(writer, obj);
|
||||
writer.WriteEndElement();
|
||||
writer.Flush();
|
||||
//m_log.DebugFormat("[LLSD Helpers]: Generated serialized LLSD reply {0}", sw.ToString());
|
||||
|
||||
return sw.ToString();
|
||||
return sw.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
public static string SerialiseLLSDReplyNoHeader(object obj)
|
||||
{
|
||||
using(StringWriter sw = new StringWriter())
|
||||
using(XmlTextWriter writer = new XmlTextWriter(sw))
|
||||
{
|
||||
writer.Formatting = Formatting.None;
|
||||
SerializeOSDType(writer, obj);
|
||||
writer.Flush();
|
||||
//m_log.DebugFormat("[LLSD Helpers]: Generated serialized LLSD reply {0}", sw.ToString());
|
||||
|
||||
return sw.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
private static void SerializeOSDType(XmlTextWriter writer, object obj)
|
||||
|
@ -157,6 +173,22 @@ namespace OpenSim.Framework.Capabilities
|
|||
// the LLSD map/array types in the array need to be deserialised
|
||||
// but first we need to know the right class to deserialise them into.
|
||||
}
|
||||
else if(enumerator.Value is Boolean && field.FieldType == typeof(int) )
|
||||
{
|
||||
int i = (bool)enumerator.Value ? 1 : 0;
|
||||
field.SetValue(obj, i);
|
||||
}
|
||||
else if(field.FieldType == typeof(bool) && enumerator.Value is int)
|
||||
{
|
||||
bool b = (int)enumerator.Value != 0;
|
||||
field.SetValue(obj, b);
|
||||
}
|
||||
else if(field.FieldType == typeof(UUID) && enumerator.Value is string)
|
||||
{
|
||||
UUID u;
|
||||
UUID.TryParse((string)enumerator.Value, out u);
|
||||
field.SetValue(obj, u);
|
||||
}
|
||||
else
|
||||
{
|
||||
field.SetValue(obj, enumerator.Value);
|
||||
|
|
|
@ -37,5 +37,6 @@ namespace OpenSim.Framework.Capabilities
|
|||
public string name;
|
||||
public int type;
|
||||
public int preferred_type;
|
||||
public int version;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,41 +0,0 @@
|
|||
/*
|
||||
* 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 OpenMetaverse;
|
||||
|
||||
namespace OpenSim.Framework.Capabilities
|
||||
{
|
||||
[OSDMap]
|
||||
public class LLSDItemUpdate
|
||||
{
|
||||
public UUID item_id;
|
||||
|
||||
public LLSDItemUpdate()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,51 +0,0 @@
|
|||
/*
|
||||
* 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.Collections;
|
||||
|
||||
namespace OpenSim.Framework.Capabilities
|
||||
{
|
||||
[OSDMap]
|
||||
public class LLSDParcelVoiceInfoResponse
|
||||
{
|
||||
public int parcel_local_id;
|
||||
public string region_name;
|
||||
public Hashtable voice_credentials;
|
||||
|
||||
public LLSDParcelVoiceInfoResponse()
|
||||
{
|
||||
}
|
||||
|
||||
public LLSDParcelVoiceInfoResponse(string region, int localID, Hashtable creds)
|
||||
{
|
||||
region_name = region;
|
||||
parcel_local_id = localID;
|
||||
voice_credentials = creds;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
/*
|
||||
* 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 OpenMetaverse;
|
||||
|
||||
namespace OpenSim.Framework.Capabilities
|
||||
{
|
||||
[LLSDType("MAP")]
|
||||
public class LLSDRemoteParcelResponse
|
||||
{
|
||||
public UUID parcel_id;
|
||||
|
||||
public LLSDRemoteParcelResponse()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
/*
|
||||
* 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 OpenMetaverse;
|
||||
|
||||
namespace OpenSim.Framework.Capabilities
|
||||
{
|
||||
[OSDMap]
|
||||
public class LLSDTaskScriptUpdate
|
||||
{
|
||||
/// <summary>
|
||||
/// The item containing the script to update
|
||||
/// </summary>
|
||||
public UUID item_id;
|
||||
|
||||
/// <summary>
|
||||
/// The task containing the script
|
||||
/// </summary>
|
||||
public UUID task_id;
|
||||
|
||||
/// <summary>
|
||||
/// Signals whether the script is currently active
|
||||
/// </summary>
|
||||
public int is_script_running;
|
||||
}
|
||||
}
|
|
@ -1,57 +0,0 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OpenSim.Framework.Capabilities
|
||||
{
|
||||
[OSDMap]
|
||||
public class LLSDVoiceAccountResponse
|
||||
{
|
||||
public string username;
|
||||
public string password;
|
||||
public string voice_sip_uri_hostname;
|
||||
public string voice_account_server_name;
|
||||
|
||||
public LLSDVoiceAccountResponse()
|
||||
{
|
||||
}
|
||||
|
||||
public LLSDVoiceAccountResponse(string user, string pass)
|
||||
{
|
||||
username = user;
|
||||
password = pass;
|
||||
}
|
||||
|
||||
public LLSDVoiceAccountResponse(string user, string pass, string sipUriHost, string accountServer)
|
||||
{
|
||||
username = user;
|
||||
password = pass;
|
||||
voice_sip_uri_hostname = sipUriHost;
|
||||
voice_account_server_name = accountServer;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -80,7 +80,7 @@ namespace OpenSim.ConsoleClient
|
|||
while (m_Server.Running)
|
||||
{
|
||||
System.Threading.Thread.Sleep(500);
|
||||
// MainConsole.Instance.Prompt();
|
||||
MainConsole.Instance.Prompt();
|
||||
}
|
||||
|
||||
if (pidFile != String.Empty)
|
||||
|
|
|
@ -47,24 +47,25 @@ namespace OpenSim.Data
|
|||
if ((id == null) || (id == DBNull.Value))
|
||||
return UUID.Zero;
|
||||
|
||||
if (id.GetType() == typeof(Guid))
|
||||
Type idtype = id.GetType();
|
||||
|
||||
if (idtype == typeof(Guid))
|
||||
return new UUID((Guid)id);
|
||||
|
||||
if (id.GetType() == typeof(byte[]))
|
||||
if (id.GetType() == typeof(string))
|
||||
{
|
||||
if (((byte[])id).Length == 0)
|
||||
return UUID.Zero;
|
||||
else if (((byte[])id).Length == 16)
|
||||
return new UUID((byte[])id, 0);
|
||||
}
|
||||
else if (id.GetType() == typeof(string))
|
||||
{
|
||||
if (((string)id).Length == 0)
|
||||
return UUID.Zero;
|
||||
else if (((string)id).Length == 36)
|
||||
return new UUID((string)id);
|
||||
Guid gg;
|
||||
if (Guid.TryParse((string)id, out gg))
|
||||
return new UUID(gg);
|
||||
return UUID.Zero;
|
||||
}
|
||||
|
||||
if (idtype == typeof(byte[]))
|
||||
{
|
||||
if (((byte[])id).Length < 16)
|
||||
return UUID.Zero;
|
||||
return new UUID((byte[])id, 0);
|
||||
}
|
||||
throw new Exception("Failed to convert db value to UUID: " + id.ToString());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,16 +27,18 @@
|
|||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
|
||||
namespace OpenSim.Region.OptionalModules.Scripting.Minimodule.Object
|
||||
namespace OpenSim.Data
|
||||
{
|
||||
/// <summary>
|
||||
/// This implements the methods neccesary to operate on the inventory of an object
|
||||
/// <summary>
|
||||
/// An interface for connecting to the Mute List datastore
|
||||
/// </summary>
|
||||
public interface IObjectInventory : IDictionary<UUID, IInventoryItem>
|
||||
public interface IMuteListData
|
||||
{
|
||||
IInventoryItem this[string name] { get; }
|
||||
bool Store(MuteData data);
|
||||
MuteData[] Get(UUID agentID);
|
||||
bool Delete(UUID agentID, UUID muteID, string muteName);
|
||||
}
|
||||
}
|
|
@ -71,6 +71,8 @@ namespace OpenSim.Data
|
|||
{
|
||||
RegionData Get(UUID regionID, UUID ScopeID);
|
||||
List<RegionData> Get(string regionName, UUID ScopeID);
|
||||
RegionData GetSpecific(string regionName, UUID ScopeID);
|
||||
|
||||
RegionData Get(int x, int y, UUID ScopeID);
|
||||
List<RegionData> Get(int xStart, int yStart, int xEnd, int yEnd, UUID ScopeID);
|
||||
|
||||
|
|
|
@ -75,6 +75,7 @@ namespace OpenSim.Data.MySQL
|
|||
dbcon.Open();
|
||||
Migration m = new Migration(dbcon, Assembly, "AssetStore");
|
||||
m.Update();
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -144,6 +145,7 @@ namespace OpenSim.Data.MySQL
|
|||
string.Format("[ASSETS DB]: MySql failure fetching asset {0}. Exception ", assetID), e);
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
|
||||
return asset;
|
||||
|
@ -156,28 +158,27 @@ namespace OpenSim.Data.MySQL
|
|||
/// <remarks>On failure : Throw an exception and attempt to reconnect to database</remarks>
|
||||
override public bool StoreAsset(AssetBase asset)
|
||||
{
|
||||
string assetName = asset.Name;
|
||||
if (asset.Name.Length > AssetBase.MAX_ASSET_NAME)
|
||||
{
|
||||
assetName = asset.Name.Substring(0, AssetBase.MAX_ASSET_NAME);
|
||||
m_log.WarnFormat(
|
||||
"[ASSET DB]: Name '{0}' for asset {1} truncated from {2} to {3} characters on add",
|
||||
asset.Name, asset.ID, asset.Name.Length, assetName.Length);
|
||||
}
|
||||
|
||||
string assetDescription = asset.Description;
|
||||
if (asset.Description.Length > AssetBase.MAX_ASSET_DESC)
|
||||
{
|
||||
assetDescription = asset.Description.Substring(0, AssetBase.MAX_ASSET_DESC);
|
||||
m_log.WarnFormat(
|
||||
"[ASSET DB]: Description '{0}' for asset {1} truncated from {2} to {3} characters on add",
|
||||
asset.Description, asset.ID, asset.Description.Length, assetDescription.Length);
|
||||
}
|
||||
|
||||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
{
|
||||
dbcon.Open();
|
||||
|
||||
string assetName = asset.Name;
|
||||
if (asset.Name.Length > AssetBase.MAX_ASSET_NAME)
|
||||
{
|
||||
assetName = asset.Name.Substring(0, AssetBase.MAX_ASSET_NAME);
|
||||
m_log.WarnFormat(
|
||||
"[ASSET DB]: Name '{0}' for asset {1} truncated from {2} to {3} characters on add",
|
||||
asset.Name, asset.ID, asset.Name.Length, assetName.Length);
|
||||
}
|
||||
|
||||
string assetDescription = asset.Description;
|
||||
if (asset.Description.Length > AssetBase.MAX_ASSET_DESC)
|
||||
{
|
||||
assetDescription = asset.Description.Substring(0, AssetBase.MAX_ASSET_DESC);
|
||||
m_log.WarnFormat(
|
||||
"[ASSET DB]: Description '{0}' for asset {1} truncated from {2} to {3} characters on add",
|
||||
asset.Description, asset.ID, asset.Description.Length, assetDescription.Length);
|
||||
}
|
||||
|
||||
using (MySqlCommand cmd =
|
||||
new MySqlCommand(
|
||||
"replace INTO assets(id, name, description, assetType, local, temporary, create_time, access_time, asset_flags, CreatorID, data)" +
|
||||
|
@ -200,15 +201,17 @@ namespace OpenSim.Data.MySQL
|
|||
cmd.Parameters.AddWithValue("?asset_flags", (int)asset.Flags);
|
||||
cmd.Parameters.AddWithValue("?data", asset.Data);
|
||||
cmd.ExecuteNonQuery();
|
||||
dbcon.Close();
|
||||
return true;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[ASSET DB]: MySQL failure creating asset {0} with name \"{1}\". Error: {2}",
|
||||
asset.FullID, asset.Name, e.Message);
|
||||
dbcon.Close();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -238,6 +241,7 @@ namespace OpenSim.Data.MySQL
|
|||
e);
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -270,6 +274,7 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
|
||||
bool[] results = new bool[uuids.Length];
|
||||
|
@ -334,6 +339,7 @@ namespace OpenSim.Data.MySQL
|
|||
e);
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
|
||||
return retList;
|
||||
|
@ -350,6 +356,7 @@ namespace OpenSim.Data.MySQL
|
|||
cmd.Parameters.AddWithValue("?id", id);
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
@ -59,6 +59,7 @@ namespace OpenSim.Data.MySQL
|
|||
dbcon.Open();
|
||||
Migration m = new Migration(dbcon, Assembly, "AuthStore");
|
||||
m.Update();
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -76,27 +77,30 @@ namespace OpenSim.Data.MySQL
|
|||
{
|
||||
cmd.Parameters.AddWithValue("?principalID", principalID.ToString());
|
||||
|
||||
IDataReader result = cmd.ExecuteReader();
|
||||
|
||||
if (result.Read())
|
||||
using(IDataReader result = cmd.ExecuteReader())
|
||||
{
|
||||
ret.PrincipalID = principalID;
|
||||
|
||||
CheckColumnNames(result);
|
||||
|
||||
foreach (string s in m_ColumnNames)
|
||||
if(result.Read())
|
||||
{
|
||||
if (s == "UUID")
|
||||
continue;
|
||||
ret.PrincipalID = principalID;
|
||||
|
||||
ret.Data[s] = result[s].ToString();
|
||||
CheckColumnNames(result);
|
||||
|
||||
foreach(string s in m_ColumnNames)
|
||||
{
|
||||
if(s == "UUID")
|
||||
continue;
|
||||
|
||||
ret.Data[s] = result[s].ToString();
|
||||
}
|
||||
|
||||
dbcon.Close();
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
{
|
||||
dbcon.Close();
|
||||
return null;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -82,6 +82,7 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
Migration m = new Migration(dbcon, Assembly, "EstateStore");
|
||||
m.Update();
|
||||
dbcon.Close();
|
||||
|
||||
Type t = typeof(EstateSettings);
|
||||
m_Fields = t.GetFields(BindingFlags.NonPublic |
|
||||
|
@ -143,7 +144,6 @@ namespace OpenSim.Data.MySQL
|
|||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
{
|
||||
dbcon.Open();
|
||||
|
||||
cmd.Connection = dbcon;
|
||||
|
||||
bool found = false;
|
||||
|
@ -171,6 +171,8 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
cmd.Connection = null;
|
||||
|
||||
if (!found && create)
|
||||
{
|
||||
|
@ -231,6 +233,7 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
es.Save();
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -263,6 +266,7 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
|
||||
SaveBanList(es);
|
||||
|
@ -281,7 +285,7 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
using (MySqlCommand cmd = dbcon.CreateCommand())
|
||||
{
|
||||
cmd.CommandText = "select bannedUUID from estateban where EstateID = ?EstateID";
|
||||
cmd.CommandText = "select * from estateban where EstateID = ?EstateID";
|
||||
cmd.Parameters.AddWithValue("?EstateID", es.EstateID);
|
||||
|
||||
using (IDataReader r = cmd.ExecuteReader())
|
||||
|
@ -289,17 +293,16 @@ namespace OpenSim.Data.MySQL
|
|||
while (r.Read())
|
||||
{
|
||||
EstateBan eb = new EstateBan();
|
||||
|
||||
UUID uuid = new UUID();
|
||||
UUID.TryParse(r["bannedUUID"].ToString(), out uuid);
|
||||
|
||||
eb.BannedUserID = uuid;
|
||||
eb.BannedUserID = DBGuid.FromDB(r["bannedUUID"]); ;
|
||||
eb.BannedHostAddress = "0.0.0.0";
|
||||
eb.BannedHostIPMask = "0.0.0.0";
|
||||
eb.BanningUserID = DBGuid.FromDB(r["banningUUID"]);
|
||||
eb.BanTime = Convert.ToInt32(r["banTime"]);
|
||||
es.AddBan(eb);
|
||||
}
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -318,17 +321,20 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
cmd.Parameters.Clear();
|
||||
|
||||
cmd.CommandText = "insert into estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) values ( ?EstateID, ?bannedUUID, '', '', '' )";
|
||||
cmd.CommandText = "insert into estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask, banningUUID, banTime) values ( ?EstateID, ?bannedUUID, '', '', '', ?banningUUID, ?banTime)";
|
||||
|
||||
foreach (EstateBan b in es.EstateBans)
|
||||
{
|
||||
cmd.Parameters.AddWithValue("?EstateID", es.EstateID.ToString());
|
||||
cmd.Parameters.AddWithValue("?bannedUUID", b.BannedUserID.ToString());
|
||||
cmd.Parameters.AddWithValue("?banningUUID", b.BanningUserID.ToString());
|
||||
cmd.Parameters.AddWithValue("?banTime", b.BanTime);
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
cmd.Parameters.Clear();
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -358,6 +364,7 @@ namespace OpenSim.Data.MySQL
|
|||
cmd.Parameters.Clear();
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -383,6 +390,7 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
|
||||
return uuids.ToArray();
|
||||
|
@ -437,7 +445,6 @@ namespace OpenSim.Data.MySQL
|
|||
reader.Close();
|
||||
}
|
||||
}
|
||||
|
||||
dbcon.Close();
|
||||
}
|
||||
|
||||
|
@ -466,7 +473,6 @@ namespace OpenSim.Data.MySQL
|
|||
reader.Close();
|
||||
}
|
||||
}
|
||||
|
||||
dbcon.Close();
|
||||
}
|
||||
|
||||
|
|
|
@ -78,6 +78,7 @@ namespace OpenSim.Data.MySQL
|
|||
conn.Open();
|
||||
Migration m = new Migration(conn, Assembly, "FSAssetStore");
|
||||
m.Update();
|
||||
conn.Close();
|
||||
}
|
||||
}
|
||||
catch (MySqlException e)
|
||||
|
@ -121,9 +122,13 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
catch (MySqlException e)
|
||||
{
|
||||
cmd.Connection = null;
|
||||
conn.Close();
|
||||
m_log.ErrorFormat("[FSASSETS]: Query {0} failed with {1}", cmd.CommandText, e.ToString());
|
||||
return false;
|
||||
}
|
||||
conn.Close();
|
||||
cmd.Connection = null;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -175,7 +180,7 @@ namespace OpenSim.Data.MySQL
|
|||
UpdateAccessTime(id, AccessTime);
|
||||
}
|
||||
}
|
||||
|
||||
conn.Close();
|
||||
}
|
||||
|
||||
return meta;
|
||||
|
@ -206,6 +211,7 @@ namespace OpenSim.Data.MySQL
|
|||
cmd.Parameters.AddWithValue("?id", AssetID);
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
conn.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -299,6 +305,7 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
}
|
||||
}
|
||||
conn.Close();
|
||||
}
|
||||
|
||||
for (int i = 0; i < uuids.Length; i++)
|
||||
|
@ -333,6 +340,7 @@ namespace OpenSim.Data.MySQL
|
|||
count = Convert.ToInt32(reader["count"]);
|
||||
}
|
||||
}
|
||||
conn.Close();
|
||||
}
|
||||
|
||||
return count;
|
||||
|
@ -413,8 +421,8 @@ namespace OpenSim.Data.MySQL
|
|||
imported++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
importConn.Close();
|
||||
}
|
||||
|
||||
MainConsole.Instance.Output(String.Format("Import done, {0} assets imported", imported));
|
||||
|
|
|
@ -74,7 +74,9 @@ namespace OpenSim.Data.MySQL
|
|||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
{
|
||||
dbcon.Open();
|
||||
return ExecuteNonQueryWithConnection(cmd, dbcon);
|
||||
int ret = ExecuteNonQueryWithConnection(cmd, dbcon);
|
||||
dbcon.Close();
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -97,12 +99,15 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
try
|
||||
{
|
||||
return cmd.ExecuteNonQuery();
|
||||
int ret = cmd.ExecuteNonQuery();
|
||||
cmd.Connection = null;
|
||||
return ret;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.Error(e.Message, e);
|
||||
m_log.Error(Environment.StackTrace.ToString());
|
||||
cmd.Connection = null;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,11 +29,9 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using System.Text;
|
||||
using MySql.Data.MySqlClient;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
|
||||
namespace OpenSim.Data.MySQL
|
||||
{
|
||||
|
@ -118,8 +116,40 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
|
||||
public virtual T[] Get(string field, string key)
|
||||
{
|
||||
using (MySqlCommand cmd = new MySqlCommand())
|
||||
{
|
||||
cmd.Parameters.AddWithValue(field, key);
|
||||
cmd.CommandText = string.Format("select * from {0} where `{1}` = ?{1}", m_Realm, field);
|
||||
return DoQuery(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual T[] Get(string field, string[] keys)
|
||||
{
|
||||
return Get(new string[] { field }, new string[] { key });
|
||||
int flen = keys.Length;
|
||||
if(flen == 0)
|
||||
return new T[0];
|
||||
|
||||
int flast = flen - 1;
|
||||
StringBuilder sb = new StringBuilder(1024);
|
||||
sb.AppendFormat("select * from {0} where {1} IN (?", m_Realm, field);
|
||||
using (MySqlCommand cmd = new MySqlCommand())
|
||||
{
|
||||
for (int i = 0 ; i < flen ; i++)
|
||||
{
|
||||
string fname = field + i.ToString();
|
||||
cmd.Parameters.AddWithValue(fname, keys[i]);
|
||||
|
||||
sb.Append(fname);
|
||||
if(i < flast)
|
||||
sb.Append(",?");
|
||||
else
|
||||
sb.Append(")");
|
||||
}
|
||||
cmd.CommandText = sb.ToString();
|
||||
return DoQuery(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual T[] Get(string[] fields, string[] keys)
|
||||
|
@ -129,25 +159,27 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
public virtual T[] Get(string[] fields, string[] keys, string options)
|
||||
{
|
||||
if (fields.Length != keys.Length)
|
||||
int flen = fields.Length;
|
||||
if (flen == 0 || flen != keys.Length)
|
||||
return new T[0];
|
||||
|
||||
List<string> terms = new List<string>();
|
||||
int flast = flen - 1;
|
||||
StringBuilder sb = new StringBuilder(1024);
|
||||
sb.AppendFormat("select * from {0} where ", m_Realm);
|
||||
|
||||
using (MySqlCommand cmd = new MySqlCommand())
|
||||
{
|
||||
for (int i = 0 ; i < fields.Length ; i++)
|
||||
for (int i = 0 ; i < flen ; i++)
|
||||
{
|
||||
cmd.Parameters.AddWithValue(fields[i], keys[i]);
|
||||
terms.Add("`" + fields[i] + "` = ?" + fields[i]);
|
||||
if(i < flast)
|
||||
sb.AppendFormat("`{0}` = ?{0} and ", fields[i]);
|
||||
else
|
||||
sb.AppendFormat("`{0}` = ?{0} ", fields[i]);
|
||||
}
|
||||
|
||||
string where = String.Join(" and ", terms.ToArray());
|
||||
|
||||
string query = String.Format("select * from {0} where {1} {2}",
|
||||
m_Realm, where, options);
|
||||
|
||||
cmd.CommandText = query;
|
||||
sb.Append(options);
|
||||
cmd.CommandText = sb.ToString();
|
||||
|
||||
return DoQuery(cmd);
|
||||
}
|
||||
|
@ -160,8 +192,9 @@ namespace OpenSim.Data.MySQL
|
|||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
{
|
||||
dbcon.Open();
|
||||
|
||||
return DoQueryWithConnection(cmd, dbcon);
|
||||
T[] ret = DoQueryWithConnection(cmd, dbcon);
|
||||
dbcon.Close();
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -203,7 +236,7 @@ namespace OpenSim.Data.MySQL
|
|||
if (m_Fields[name].FieldType == typeof(bool))
|
||||
{
|
||||
int v = Convert.ToInt32(reader[name]);
|
||||
m_Fields[name].SetValue(row, v != 0 ? true : false);
|
||||
m_Fields[name].SetValue(row, v != 0);
|
||||
}
|
||||
else if (m_Fields[name].FieldType == typeof(UUID))
|
||||
{
|
||||
|
@ -243,7 +276,7 @@ namespace OpenSim.Data.MySQL
|
|||
result.Add(row);
|
||||
}
|
||||
}
|
||||
|
||||
cmd.Connection = null;
|
||||
return result.ToArray();
|
||||
}
|
||||
|
||||
|
@ -322,25 +355,26 @@ namespace OpenSim.Data.MySQL
|
|||
// "[MYSQL GENERIC TABLE HANDLER]: Delete(string[] fields, string[] keys) invoked with {0}:{1}",
|
||||
// string.Join(",", fields), string.Join(",", keys));
|
||||
|
||||
if (fields.Length != keys.Length)
|
||||
int flen = fields.Length;
|
||||
if (flen == 0 || flen != keys.Length)
|
||||
return false;
|
||||
|
||||
List<string> terms = new List<string>();
|
||||
int flast = flen - 1;
|
||||
StringBuilder sb = new StringBuilder(1024);
|
||||
sb.AppendFormat("delete from {0} where ", m_Realm);
|
||||
|
||||
using (MySqlCommand cmd = new MySqlCommand())
|
||||
{
|
||||
for (int i = 0 ; i < fields.Length ; i++)
|
||||
for (int i = 0 ; i < flen ; i++)
|
||||
{
|
||||
cmd.Parameters.AddWithValue(fields[i], keys[i]);
|
||||
terms.Add("`" + fields[i] + "` = ?" + fields[i]);
|
||||
if(i < flast)
|
||||
sb.AppendFormat("`{0}` = ?{0} and ", fields[i]);
|
||||
else
|
||||
sb.AppendFormat("`{0}` = ?{0}", fields[i]);
|
||||
}
|
||||
|
||||
string where = String.Join(" and ", terms.ToArray());
|
||||
|
||||
string query = String.Format("delete from {0} where {1}", m_Realm, where);
|
||||
|
||||
cmd.CommandText = query;
|
||||
|
||||
cmd.CommandText = sb.ToString();
|
||||
return ExecuteNonQuery(cmd) > 0;
|
||||
}
|
||||
}
|
||||
|
@ -352,27 +386,27 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
public long GetCount(string[] fields, string[] keys)
|
||||
{
|
||||
if (fields.Length != keys.Length)
|
||||
int flen = fields.Length;
|
||||
if (flen == 0 || flen != keys.Length)
|
||||
return 0;
|
||||
|
||||
List<string> terms = new List<string>();
|
||||
int flast = flen - 1;
|
||||
StringBuilder sb = new StringBuilder(1024);
|
||||
sb.AppendFormat("select count(*) from {0} where ", m_Realm);
|
||||
|
||||
using (MySqlCommand cmd = new MySqlCommand())
|
||||
{
|
||||
for (int i = 0; i < fields.Length; i++)
|
||||
for (int i = 0 ; i < flen ; i++)
|
||||
{
|
||||
cmd.Parameters.AddWithValue(fields[i], keys[i]);
|
||||
terms.Add("`" + fields[i] + "` = ?" + fields[i]);
|
||||
if(i < flast)
|
||||
sb.AppendFormat("`{0}` = ?{0} and ", fields[i]);
|
||||
else
|
||||
sb.AppendFormat("`{0}` = ?{0}", fields[i]);
|
||||
}
|
||||
|
||||
string where = String.Join(" and ", terms.ToArray());
|
||||
|
||||
string query = String.Format("select count(*) from {0} where {1}",
|
||||
m_Realm, where);
|
||||
|
||||
cmd.CommandText = query;
|
||||
|
||||
Object result = DoQueryScalar(cmd);
|
||||
cmd.CommandText = sb.ToString();
|
||||
object result = DoQueryScalar(cmd);
|
||||
|
||||
return Convert.ToInt64(result);
|
||||
}
|
||||
|
@ -402,7 +436,10 @@ namespace OpenSim.Data.MySQL
|
|||
dbcon.Open();
|
||||
cmd.Connection = dbcon;
|
||||
|
||||
return cmd.ExecuteScalar();
|
||||
object ret = cmd.ExecuteScalar();
|
||||
cmd.Connection = null;
|
||||
dbcon.Close();
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
@ -90,7 +90,7 @@ namespace OpenSim.Data.MySQL
|
|||
else
|
||||
pattern = string.Format("Name LIKE '%{0}%'", MySqlHelper.EscapeString(pattern));
|
||||
|
||||
return m_Groups.Get(string.Format("ShowInList=1 AND ({0}) ORDER BY Name LIMIT 100", pattern));
|
||||
return m_Groups.Get(string.Format("ShowInList=1 AND ({0})", pattern));
|
||||
}
|
||||
|
||||
public bool DeleteGroup(UUID groupID)
|
||||
|
|
|
@ -78,6 +78,7 @@ namespace OpenSim.Data.MySQL
|
|||
dbcon.Open();
|
||||
Migration m = new Migration(dbcon, assem, "InventoryStore");
|
||||
m.Update();
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -130,6 +131,7 @@ namespace OpenSim.Data.MySQL
|
|||
items.Add(item);
|
||||
}
|
||||
|
||||
dbcon.Close();
|
||||
return items;
|
||||
}
|
||||
}
|
||||
|
@ -170,6 +172,7 @@ namespace OpenSim.Data.MySQL
|
|||
while (reader.Read())
|
||||
items.Add(readInventoryFolder(reader));
|
||||
|
||||
dbcon.Close();
|
||||
return items;
|
||||
}
|
||||
}
|
||||
|
@ -221,6 +224,7 @@ namespace OpenSim.Data.MySQL
|
|||
if (items.Count > 0)
|
||||
rootFolder = items[0];
|
||||
|
||||
dbcon.Close();
|
||||
return rootFolder;
|
||||
}
|
||||
}
|
||||
|
@ -261,6 +265,7 @@ namespace OpenSim.Data.MySQL
|
|||
while (reader.Read())
|
||||
items.Add(readInventoryFolder(reader));
|
||||
|
||||
dbcon.Close();
|
||||
return items;
|
||||
}
|
||||
}
|
||||
|
@ -352,6 +357,7 @@ namespace OpenSim.Data.MySQL
|
|||
if (reader.Read())
|
||||
item = readInventoryItem(reader);
|
||||
|
||||
dbcon.Close();
|
||||
return item;
|
||||
}
|
||||
}
|
||||
|
@ -417,6 +423,7 @@ namespace OpenSim.Data.MySQL
|
|||
if (reader.Read())
|
||||
folder = readInventoryFolder(reader);
|
||||
|
||||
dbcon.Close();
|
||||
return folder;
|
||||
}
|
||||
}
|
||||
|
@ -504,6 +511,7 @@ namespace OpenSim.Data.MySQL
|
|||
lock (m_dbLock)
|
||||
result.ExecuteNonQuery();
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (MySqlException e)
|
||||
|
@ -540,6 +548,7 @@ namespace OpenSim.Data.MySQL
|
|||
lock (m_dbLock)
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (MySqlException e)
|
||||
|
@ -600,6 +609,7 @@ namespace OpenSim.Data.MySQL
|
|||
m_log.Error(e.ToString());
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -643,6 +653,7 @@ namespace OpenSim.Data.MySQL
|
|||
m_log.Error(e.ToString());
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -806,6 +817,7 @@ namespace OpenSim.Data.MySQL
|
|||
lock (m_dbLock)
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (MySqlException e)
|
||||
|
@ -833,6 +845,7 @@ namespace OpenSim.Data.MySQL
|
|||
lock (m_dbLock)
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (MySqlException e)
|
||||
|
@ -886,6 +899,7 @@ namespace OpenSim.Data.MySQL
|
|||
if (item != null)
|
||||
list.Add(item);
|
||||
}
|
||||
dbcon.Close();
|
||||
return list;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,41 +26,42 @@
|
|||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using OpenSim.Region.OptionalModules.Scripting.Minimodule.Interfaces;
|
||||
using System.Data;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using MySql.Data.MySqlClient;
|
||||
|
||||
namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
||||
namespace OpenSim.Data.MySQL
|
||||
{
|
||||
class ExtensionHandler : IExtension
|
||||
public class MySqlMuteListData : MySQLGenericTableHandler<MuteData>, IMuteListData
|
||||
{
|
||||
private readonly Dictionary<Type, object> m_instances;
|
||||
|
||||
public ExtensionHandler(Dictionary<Type, object> instances)
|
||||
public MySqlMuteListData(string connectionString)
|
||||
: base(connectionString, "MuteList", "MuteListStore")
|
||||
{
|
||||
m_instances = instances;
|
||||
}
|
||||
|
||||
public T Get<T>()
|
||||
public MuteData[] Get(UUID agentID)
|
||||
{
|
||||
return (T) m_instances[typeof (T)];
|
||||
MuteData[] data = base.Get("AgentID", agentID.ToString());
|
||||
return data;
|
||||
}
|
||||
|
||||
public bool TryGet<T>(out T extension)
|
||||
public bool Delete(UUID agentID, UUID muteID, string muteName)
|
||||
{
|
||||
if (!m_instances.ContainsKey(typeof(T)))
|
||||
string cmnd ="delete from MuteList where AgentID = ?AgentID and MuteID = ?MuteID and MuteName = ?MuteName";
|
||||
|
||||
using (MySqlCommand cmd = new MySqlCommand(cmnd))
|
||||
{
|
||||
extension = default(T);
|
||||
cmd.Parameters.AddWithValue("?AgentID", agentID.ToString());
|
||||
cmd.Parameters.AddWithValue("?MuteID", muteID.ToString());
|
||||
cmd.Parameters.AddWithValue("?MuteName", muteName);
|
||||
|
||||
if (ExecuteNonQuery(cmd) > 0)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
extension = Get<T>();
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool Has<T>()
|
||||
{
|
||||
return m_instances.ContainsKey(typeof (T));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -60,6 +60,7 @@ namespace OpenSim.Data.MySQL
|
|||
dbcon.Open();
|
||||
Migration m = new Migration(dbcon, Assembly, "GridStore");
|
||||
m.Update();
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -80,17 +81,15 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
}
|
||||
|
||||
public RegionData Get(int posX, int posY, UUID scopeID)
|
||||
public RegionData GetSpecific(string regionName, UUID scopeID)
|
||||
{
|
||||
/* fixed size regions
|
||||
string command = "select * from `"+m_Realm+"` where locX = ?posX and locY = ?posY";
|
||||
string command = "select * from `" + m_Realm + "` where regionName = ?regionName";
|
||||
if (scopeID != UUID.Zero)
|
||||
command += " and ScopeID = ?scopeID";
|
||||
|
||||
using (MySqlCommand cmd = new MySqlCommand(command))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("?posX", posX.ToString());
|
||||
cmd.Parameters.AddWithValue("?posY", posY.ToString());
|
||||
cmd.Parameters.AddWithValue("?regionName", regionName);
|
||||
cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
|
||||
|
||||
List<RegionData> ret = RunCommand(cmd);
|
||||
|
@ -99,8 +98,11 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
return ret[0];
|
||||
}
|
||||
*/
|
||||
// extend database search for maximum region size area
|
||||
|
||||
}
|
||||
|
||||
public RegionData Get(int posX, int posY, UUID scopeID)
|
||||
{
|
||||
string command = "select * from `" + m_Realm + "` where locX between ?startX and ?endX and locY between ?startY and ?endY";
|
||||
if (scopeID != UUID.Zero)
|
||||
command += " and ScopeID = ?scopeID";
|
||||
|
@ -260,6 +262,8 @@ namespace OpenSim.Data.MySQL
|
|||
retList.Add(ret);
|
||||
}
|
||||
}
|
||||
cmd.Connection = null;
|
||||
dbcon.Close();
|
||||
}
|
||||
|
||||
return retList;
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -69,6 +69,7 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
Migration m = new Migration(dbcon, Assembly, "UserProfiles");
|
||||
m.Update();
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
#endregion Member Functions
|
||||
|
@ -89,7 +90,7 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
|
||||
{
|
||||
string query = "SELECT classifieduuid, name FROM classifieds WHERE creatoruuid = ?Id";
|
||||
const string query = "SELECT classifieduuid, name FROM classifieds WHERE creatoruuid = ?Id";
|
||||
dbcon.Open();
|
||||
using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
|
||||
{
|
||||
|
@ -111,8 +112,7 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": UserAccount exception {0}", e.Message);
|
||||
m_log.ErrorFormat("[PROFILES_DATA] GetClassifiedRecords exception {0}", e.Message);
|
||||
}
|
||||
n.Add("classifieduuid", OSD.FromUUID(Id));
|
||||
n.Add("name", OSD.FromString(Name));
|
||||
|
@ -121,58 +121,58 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
public bool UpdateClassifiedRecord(UserClassifiedAdd ad, ref string result)
|
||||
{
|
||||
string query = string.Empty;
|
||||
|
||||
|
||||
query += "INSERT INTO classifieds (";
|
||||
query += "`classifieduuid`,";
|
||||
query += "`creatoruuid`,";
|
||||
query += "`creationdate`,";
|
||||
query += "`expirationdate`,";
|
||||
query += "`category`,";
|
||||
query += "`name`,";
|
||||
query += "`description`,";
|
||||
query += "`parceluuid`,";
|
||||
query += "`parentestate`,";
|
||||
query += "`snapshotuuid`,";
|
||||
query += "`simname`,";
|
||||
query += "`posglobal`,";
|
||||
query += "`parcelname`,";
|
||||
query += "`classifiedflags`,";
|
||||
query += "`priceforlisting`) ";
|
||||
query += "VALUES (";
|
||||
query += "?ClassifiedId,";
|
||||
query += "?CreatorId,";
|
||||
query += "?CreatedDate,";
|
||||
query += "?ExpirationDate,";
|
||||
query += "?Category,";
|
||||
query += "?Name,";
|
||||
query += "?Description,";
|
||||
query += "?ParcelId,";
|
||||
query += "?ParentEstate,";
|
||||
query += "?SnapshotId,";
|
||||
query += "?SimName,";
|
||||
query += "?GlobalPos,";
|
||||
query += "?ParcelName,";
|
||||
query += "?Flags,";
|
||||
query += "?ListingPrice ) ";
|
||||
query += "ON DUPLICATE KEY UPDATE ";
|
||||
query += "category=?Category, ";
|
||||
query += "expirationdate=?ExpirationDate, ";
|
||||
query += "name=?Name, ";
|
||||
query += "description=?Description, ";
|
||||
query += "parentestate=?ParentEstate, ";
|
||||
query += "posglobal=?GlobalPos, ";
|
||||
query += "parcelname=?ParcelName, ";
|
||||
query += "classifiedflags=?Flags, ";
|
||||
query += "priceforlisting=?ListingPrice, ";
|
||||
query += "snapshotuuid=?SnapshotId";
|
||||
const string query =
|
||||
"INSERT INTO classifieds ("
|
||||
+ "`classifieduuid`,"
|
||||
+ "`creatoruuid`,"
|
||||
+ "`creationdate`,"
|
||||
+ "`expirationdate`,"
|
||||
+ "`category`,"
|
||||
+ "`name`,"
|
||||
+ "`description`,"
|
||||
+ "`parceluuid`,"
|
||||
+ "`parentestate`,"
|
||||
+ "`snapshotuuid`,"
|
||||
+ "`simname`,"
|
||||
+ "`posglobal`,"
|
||||
+ "`parcelname`,"
|
||||
+ "`classifiedflags`,"
|
||||
+ "`priceforlisting`) "
|
||||
+ "VALUES ("
|
||||
+ "?ClassifiedId,"
|
||||
+ "?CreatorId,"
|
||||
+ "?CreatedDate,"
|
||||
+ "?ExpirationDate,"
|
||||
+ "?Category,"
|
||||
+ "?Name,"
|
||||
+ "?Description,"
|
||||
+ "?ParcelId,"
|
||||
+ "?ParentEstate,"
|
||||
+ "?SnapshotId,"
|
||||
+ "?SimName,"
|
||||
+ "?GlobalPos,"
|
||||
+ "?ParcelName,"
|
||||
+ "?Flags,"
|
||||
+ "?ListingPrice ) "
|
||||
+ "ON DUPLICATE KEY UPDATE "
|
||||
+ "category=?Category, "
|
||||
+ "expirationdate=?ExpirationDate, "
|
||||
+ "name=?Name, "
|
||||
+ "description=?Description, "
|
||||
+ "parentestate=?ParentEstate, "
|
||||
+ "posglobal=?GlobalPos, "
|
||||
+ "parcelname=?ParcelName, "
|
||||
+ "classifiedflags=?Flags, "
|
||||
+ "priceforlisting=?ListingPrice, "
|
||||
+ "snapshotuuid=?SnapshotId"
|
||||
;
|
||||
|
||||
if(string.IsNullOrEmpty(ad.ParcelName))
|
||||
ad.ParcelName = "Unknown";
|
||||
|
@ -228,12 +228,12 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": ClassifiedesUpdate exception {0}", e.Message);
|
||||
m_log.ErrorFormat("[PROFILES_DATA]: UpdateClassifiedRecord exception {0}", e.Message);
|
||||
result = e.Message;
|
||||
return false;
|
||||
}
|
||||
|
@ -242,10 +242,7 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
public bool DeleteClassifiedRecord(UUID recordId)
|
||||
{
|
||||
string query = string.Empty;
|
||||
|
||||
query += "DELETE FROM classifieds WHERE ";
|
||||
query += "classifieduuid = ?recordId";
|
||||
const string query = "DELETE FROM classifieds WHERE classifieduuid = ?recordId";
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -258,12 +255,12 @@ namespace OpenSim.Data.MySQL
|
|||
cmd.Parameters.AddWithValue("?recordId", recordId.ToString());
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": DeleteClassifiedRecord exception {0}", e.Message);
|
||||
m_log.ErrorFormat("[PROFILES_DATA]: DeleteClassifiedRecord exception {0}", e.Message);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
@ -271,10 +268,8 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
public bool GetClassifiedInfo(ref UserClassifiedAdd ad, ref string result)
|
||||
{
|
||||
string query = string.Empty;
|
||||
|
||||
query += "SELECT * FROM classifieds WHERE ";
|
||||
query += "classifieduuid = ?AdId";
|
||||
const string query = "SELECT * FROM classifieds WHERE classifieduuid = ?AdId";
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -312,8 +307,7 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": GetPickInfo exception {0}", e.Message);
|
||||
m_log.ErrorFormat("[PROFILES_DATA]: GetClassifiedInfo exception {0}", e.Message);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -322,10 +316,8 @@ namespace OpenSim.Data.MySQL
|
|||
#region Picks Queries
|
||||
public OSDArray GetAvatarPicks(UUID avatarId)
|
||||
{
|
||||
string query = string.Empty;
|
||||
const string query = "SELECT `pickuuid`,`name` FROM userpicks WHERE creatoruuid = ?Id";
|
||||
|
||||
query += "SELECT `pickuuid`,`name` FROM userpicks WHERE ";
|
||||
query += "creatoruuid = ?Id";
|
||||
OSDArray data = new OSDArray();
|
||||
|
||||
try
|
||||
|
@ -352,24 +344,20 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": GetAvatarPicks exception {0}", e.Message);
|
||||
m_log.ErrorFormat("[PROFILES_DATA]: GetAvatarPicks exception {0}", e.Message);
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
public UserProfilePick GetPickInfo(UUID avatarId, UUID pickId)
|
||||
{
|
||||
string query = string.Empty;
|
||||
UserProfilePick pick = new UserProfilePick();
|
||||
|
||||
query += "SELECT * FROM userpicks WHERE ";
|
||||
query += "creatoruuid = ?CreatorId AND ";
|
||||
query += "pickuuid = ?PickId";
|
||||
const string query = "SELECT * FROM userpicks WHERE creatoruuid = ?CreatorId AND pickuuid = ?PickId";
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -414,41 +402,40 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": GetPickInfo exception {0}", e.Message);
|
||||
m_log.ErrorFormat("[PROFILES_DATA]: GetPickInfo exception {0}", e.Message);
|
||||
}
|
||||
return pick;
|
||||
}
|
||||
|
||||
public bool UpdatePicksRecord(UserProfilePick pick)
|
||||
{
|
||||
string query = string.Empty;
|
||||
|
||||
query += "INSERT INTO userpicks VALUES (";
|
||||
query += "?PickId,";
|
||||
query += "?CreatorId,";
|
||||
query += "?TopPick,";
|
||||
query += "?ParcelId,";
|
||||
query += "?Name,";
|
||||
query += "?Desc,";
|
||||
query += "?SnapshotId,";
|
||||
query += "?User,";
|
||||
query += "?Original,";
|
||||
query += "?SimName,";
|
||||
query += "?GlobalPos,";
|
||||
query += "?SortOrder,";
|
||||
query += "?Enabled,";
|
||||
query += "?Gatekeeper)";
|
||||
query += "ON DUPLICATE KEY UPDATE ";
|
||||
query += "parceluuid=?ParcelId,";
|
||||
query += "name=?Name,";
|
||||
query += "description=?Desc,";
|
||||
query += "user=?User,";
|
||||
query += "simname=?SimName,";
|
||||
query += "snapshotuuid=?SnapshotId,";
|
||||
query += "pickuuid=?PickId,";
|
||||
query += "posglobal=?GlobalPos,";
|
||||
query += "gatekeeper=?Gatekeeper";
|
||||
const string query =
|
||||
"INSERT INTO userpicks VALUES ("
|
||||
+ "?PickId,"
|
||||
+ "?CreatorId,"
|
||||
+ "?TopPick,"
|
||||
+ "?ParcelId,"
|
||||
+ "?Name,"
|
||||
+ "?Desc,"
|
||||
+ "?SnapshotId,"
|
||||
+ "?User,"
|
||||
+ "?Original,"
|
||||
+ "?SimName,"
|
||||
+ "?GlobalPos,"
|
||||
+ "?SortOrder,"
|
||||
+ "?Enabled,"
|
||||
+ "?Gatekeeper)"
|
||||
+ "ON DUPLICATE KEY UPDATE "
|
||||
+ "parceluuid=?ParcelId,"
|
||||
+ "name=?Name,"
|
||||
+ "description=?Desc,"
|
||||
+ "user=?User,"
|
||||
+ "simname=?SimName,"
|
||||
+ "snapshotuuid=?SnapshotId,"
|
||||
+ "pickuuid=?PickId,"
|
||||
+ "posglobal=?GlobalPos,"
|
||||
+ "gatekeeper=?Gatekeeper"
|
||||
;
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -474,12 +461,12 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": UpdateAvatarNotes exception {0}", e.Message);
|
||||
m_log.ErrorFormat("[PROFILES_DATA]: UpdatePicksRecord exception {0}", e.Message);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
@ -487,10 +474,7 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
public bool DeletePicksRecord(UUID pickId)
|
||||
{
|
||||
string query = string.Empty;
|
||||
|
||||
query += "DELETE FROM userpicks WHERE ";
|
||||
query += "pickuuid = ?PickId";
|
||||
string query = "DELETE FROM userpicks WHERE pickuuid = ?PickId";
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -504,12 +488,12 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": DeleteUserPickRecord exception {0}", e.Message);
|
||||
m_log.ErrorFormat("[PROFILES_DATA]: DeletePicksRecord exception {0}", e.Message);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
@ -519,11 +503,7 @@ namespace OpenSim.Data.MySQL
|
|||
#region Avatar Notes Queries
|
||||
public bool GetAvatarNotes(ref UserProfileNotes notes)
|
||||
{ // WIP
|
||||
string query = string.Empty;
|
||||
|
||||
query += "SELECT `notes` FROM usernotes WHERE ";
|
||||
query += "useruuid = ?Id AND ";
|
||||
query += "targetuuid = ?TargetId";
|
||||
const string query = "SELECT `notes` FROM usernotes WHERE useruuid = ?Id AND targetuuid = ?TargetId";
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -548,38 +528,37 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": GetAvatarNotes exception {0}", e.Message);
|
||||
m_log.ErrorFormat("[PROFILES_DATA]: GetAvatarNotes exception {0}", e.Message);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool UpdateAvatarNotes(ref UserProfileNotes note, ref string result)
|
||||
{
|
||||
string query = string.Empty;
|
||||
string query;
|
||||
bool remove;
|
||||
|
||||
if(string.IsNullOrEmpty(note.Notes))
|
||||
{
|
||||
remove = true;
|
||||
query += "DELETE FROM usernotes WHERE ";
|
||||
query += "useruuid=?UserId AND ";
|
||||
query += "targetuuid=?TargetId";
|
||||
query = "DELETE FROM usernotes WHERE useruuid=?UserId AND targetuuid=?TargetId";
|
||||
}
|
||||
else
|
||||
{
|
||||
remove = false;
|
||||
query += "INSERT INTO usernotes VALUES ( ";
|
||||
query += "?UserId,";
|
||||
query += "?TargetId,";
|
||||
query += "?Notes )";
|
||||
query += "ON DUPLICATE KEY ";
|
||||
query += "UPDATE ";
|
||||
query += "notes=?Notes";
|
||||
query = "INSERT INTO usernotes VALUES ("
|
||||
+ "?UserId,"
|
||||
+ "?TargetId,"
|
||||
+ "?Notes )"
|
||||
+ "ON DUPLICATE KEY "
|
||||
+ "UPDATE "
|
||||
+ "notes=?Notes"
|
||||
;
|
||||
}
|
||||
|
||||
try
|
||||
|
@ -596,12 +575,12 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": UpdateAvatarNotes exception {0}", e.Message);
|
||||
m_log.ErrorFormat("[PROFILES_DATA]: UpdateAvatarNotes exception {0}", e.Message);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
@ -612,10 +591,7 @@ namespace OpenSim.Data.MySQL
|
|||
#region Avatar Properties
|
||||
public bool GetAvatarProperties(ref UserProfileProperties props, ref string result)
|
||||
{
|
||||
string query = string.Empty;
|
||||
|
||||
query += "SELECT * FROM userprofile WHERE ";
|
||||
query += "useruuid = ?Id";
|
||||
string query = "SELECT * FROM userprofile WHERE useruuid = ?Id";
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -664,35 +640,36 @@ namespace OpenSim.Data.MySQL
|
|||
props.PublishProfile = false;
|
||||
props.PublishMature = false;
|
||||
|
||||
query = "INSERT INTO userprofile (";
|
||||
query += "useruuid, ";
|
||||
query += "profilePartner, ";
|
||||
query += "profileAllowPublish, ";
|
||||
query += "profileMaturePublish, ";
|
||||
query += "profileURL, ";
|
||||
query += "profileWantToMask, ";
|
||||
query += "profileWantToText, ";
|
||||
query += "profileSkillsMask, ";
|
||||
query += "profileSkillsText, ";
|
||||
query += "profileLanguages, ";
|
||||
query += "profileImage, ";
|
||||
query += "profileAboutText, ";
|
||||
query += "profileFirstImage, ";
|
||||
query += "profileFirstText) VALUES (";
|
||||
query += "?userId, ";
|
||||
query += "?profilePartner, ";
|
||||
query += "?profileAllowPublish, ";
|
||||
query += "?profileMaturePublish, ";
|
||||
query += "?profileURL, ";
|
||||
query += "?profileWantToMask, ";
|
||||
query += "?profileWantToText, ";
|
||||
query += "?profileSkillsMask, ";
|
||||
query += "?profileSkillsText, ";
|
||||
query += "?profileLanguages, ";
|
||||
query += "?profileImage, ";
|
||||
query += "?profileAboutText, ";
|
||||
query += "?profileFirstImage, ";
|
||||
query += "?profileFirstText)";
|
||||
query = "INSERT INTO userprofile ("
|
||||
+ "useruuid, "
|
||||
+ "profilePartner, "
|
||||
+ "profileAllowPublish, "
|
||||
+ "profileMaturePublish, "
|
||||
+ "profileURL, "
|
||||
+ "profileWantToMask, "
|
||||
+ "profileWantToText, "
|
||||
+ "profileSkillsMask, "
|
||||
+ "profileSkillsText, "
|
||||
+ "profileLanguages, "
|
||||
+ "profileImage, "
|
||||
+ "profileAboutText, "
|
||||
+ "profileFirstImage, "
|
||||
+ "profileFirstText) VALUES ("
|
||||
+ "?userId, "
|
||||
+ "?profilePartner, "
|
||||
+ "?profileAllowPublish, "
|
||||
+ "?profileMaturePublish, "
|
||||
+ "?profileURL, "
|
||||
+ "?profileWantToMask, "
|
||||
+ "?profileWantToText, "
|
||||
+ "?profileSkillsMask, "
|
||||
+ "?profileSkillsText, "
|
||||
+ "?profileLanguages, "
|
||||
+ "?profileImage, "
|
||||
+ "?profileAboutText, "
|
||||
+ "?profileFirstImage, "
|
||||
+ "?profileFirstText)"
|
||||
;
|
||||
|
||||
dbcon.Close();
|
||||
dbcon.Open();
|
||||
|
@ -719,12 +696,12 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": Requst properties exception {0}", e.Message);
|
||||
m_log.ErrorFormat("[PROFILES_DATA]: GetAvatarProperties exception {0}", e.Message);
|
||||
result = e.Message;
|
||||
return false;
|
||||
}
|
||||
|
@ -733,15 +710,10 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
public bool UpdateAvatarProperties(ref UserProfileProperties props, ref string result)
|
||||
{
|
||||
string query = string.Empty;
|
||||
|
||||
query += "UPDATE userprofile SET ";
|
||||
query += "profileURL=?profileURL, ";
|
||||
query += "profileImage=?image, ";
|
||||
query += "profileAboutText=?abouttext,";
|
||||
query += "profileFirstImage=?firstlifeimage,";
|
||||
query += "profileFirstText=?firstlifetext ";
|
||||
query += "WHERE useruuid=?uuid";
|
||||
const string query = "UPDATE userprofile SET profileURL=?profileURL,"
|
||||
+ "profileImage=?image, profileAboutText=?abouttext,"
|
||||
+ "profileFirstImage=?firstlifeimage, profileFirstText=?firstlifetext "
|
||||
+ "WHERE useruuid=?uuid";
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -759,12 +731,12 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": AgentPropertiesUpdate exception {0}", e.Message);
|
||||
m_log.ErrorFormat("[PROFILES_DATA]: UpdateAvatarProperties exception {0}", e.Message);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -775,15 +747,13 @@ namespace OpenSim.Data.MySQL
|
|||
#region Avatar Interests
|
||||
public bool UpdateAvatarInterests(UserProfileProperties up, ref string result)
|
||||
{
|
||||
string query = string.Empty;
|
||||
|
||||
query += "UPDATE userprofile SET ";
|
||||
query += "profileWantToMask=?WantMask, ";
|
||||
query += "profileWantToText=?WantText,";
|
||||
query += "profileSkillsMask=?SkillsMask,";
|
||||
query += "profileSkillsText=?SkillsText, ";
|
||||
query += "profileLanguages=?Languages ";
|
||||
query += "WHERE useruuid=?uuid";
|
||||
const string query = "UPDATE userprofile SET "
|
||||
+ "profileWantToMask=?WantMask, "
|
||||
+ "profileWantToText=?WantText,"
|
||||
+ "profileSkillsMask=?SkillsMask,"
|
||||
+ "profileSkillsText=?SkillsText, "
|
||||
+ "profileLanguages=?Languages "
|
||||
+ "WHERE useruuid=?uuid";
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -805,8 +775,7 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": AgentInterestsUpdate exception {0}", e.Message);
|
||||
m_log.ErrorFormat("[PROFILES_DATA]: UpdateAvatarInterests exception {0}", e.Message);
|
||||
result = e.Message;
|
||||
return false;
|
||||
}
|
||||
|
@ -817,18 +786,17 @@ namespace OpenSim.Data.MySQL
|
|||
public OSDArray GetUserImageAssets(UUID avatarId)
|
||||
{
|
||||
OSDArray data = new OSDArray();
|
||||
string query = "SELECT `snapshotuuid` FROM {0} WHERE `creatoruuid` = ?Id";
|
||||
const string queryA = "SELECT `snapshotuuid` FROM {0} WHERE `creatoruuid` = ?Id";
|
||||
|
||||
// Get classified image assets
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
|
||||
{
|
||||
dbcon.Open();
|
||||
|
||||
using (MySqlCommand cmd = new MySqlCommand(string.Format (query,"`classifieds`"), dbcon))
|
||||
using (MySqlCommand cmd = new MySqlCommand(string.Format (queryA,"`classifieds`"), dbcon))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("?Id", avatarId.ToString());
|
||||
|
||||
|
@ -847,7 +815,7 @@ namespace OpenSim.Data.MySQL
|
|||
dbcon.Close();
|
||||
dbcon.Open();
|
||||
|
||||
using (MySqlCommand cmd = new MySqlCommand(string.Format (query,"`userpicks`"), dbcon))
|
||||
using (MySqlCommand cmd = new MySqlCommand(string.Format (queryA,"`userpicks`"), dbcon))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("?Id", avatarId.ToString());
|
||||
|
||||
|
@ -866,9 +834,9 @@ namespace OpenSim.Data.MySQL
|
|||
dbcon.Close();
|
||||
dbcon.Open();
|
||||
|
||||
query = "SELECT `profileImage`, `profileFirstImage` FROM `userprofile` WHERE `useruuid` = ?Id";
|
||||
const string queryB = "SELECT `profileImage`, `profileFirstImage` FROM `userprofile` WHERE `useruuid` = ?Id";
|
||||
|
||||
using (MySqlCommand cmd = new MySqlCommand(string.Format (query,"`userpicks`"), dbcon))
|
||||
using (MySqlCommand cmd = new MySqlCommand(queryB, dbcon))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("?Id", avatarId.ToString());
|
||||
|
||||
|
@ -884,12 +852,12 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": GetAvatarNotes exception {0}", e.Message);
|
||||
m_log.ErrorFormat("[PROFILES_DATA]: GetUserImageAssets exception {0}", e.Message);
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
@ -897,11 +865,7 @@ namespace OpenSim.Data.MySQL
|
|||
#region User Preferences
|
||||
public bool GetUserPreferences(ref UserPreferences pref, ref string result)
|
||||
{
|
||||
string query = string.Empty;
|
||||
|
||||
query += "SELECT imviaemail,visible,email FROM ";
|
||||
query += "usersettings WHERE ";
|
||||
query += "useruuid = ?Id";
|
||||
const string query = "SELECT imviaemail,visible,email FROM usersettings WHERE useruuid = ?Id";
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -925,10 +889,9 @@ namespace OpenSim.Data.MySQL
|
|||
dbcon.Close();
|
||||
dbcon.Open();
|
||||
|
||||
query = "INSERT INTO usersettings VALUES ";
|
||||
query += "(?uuid,'false','false', ?Email)";
|
||||
const string queryB = "INSERT INTO usersettings VALUES (?uuid,'false','false', ?Email)";
|
||||
|
||||
using (MySqlCommand put = new MySqlCommand(query, dbcon))
|
||||
using (MySqlCommand put = new MySqlCommand(queryB, dbcon))
|
||||
{
|
||||
|
||||
put.Parameters.AddWithValue("?Email", pref.EMail);
|
||||
|
@ -939,12 +902,12 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": Get preferences exception {0}", e.Message);
|
||||
m_log.ErrorFormat("[PROFILES_DATA]: GetUserPreferences exception {0}", e.Message);
|
||||
result = e.Message;
|
||||
return false;
|
||||
}
|
||||
|
@ -953,13 +916,9 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
public bool UpdateUserPreferences(ref UserPreferences pref, ref string result)
|
||||
{
|
||||
string query = string.Empty;
|
||||
|
||||
query += "UPDATE usersettings SET ";
|
||||
query += "imviaemail=?ImViaEmail, ";
|
||||
query += "visible=?Visible, ";
|
||||
query += "email=?EMail ";
|
||||
query += "WHERE useruuid=?uuid";
|
||||
const string query = "UPDATE usersettings SET imviaemail=?ImViaEmail,"
|
||||
+ "visible=?Visible, email=?EMail "
|
||||
+ "WHERE useruuid=?uuid";
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -975,12 +934,12 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": UserPreferencesUpdate exception {0} {1}", e.Message, e.InnerException);
|
||||
m_log.ErrorFormat("[PROFILES_DATA]: UpdateUserPreferences exception {0} {1}", e.Message, e.InnerException);
|
||||
result = e.Message;
|
||||
return false;
|
||||
}
|
||||
|
@ -991,11 +950,7 @@ namespace OpenSim.Data.MySQL
|
|||
#region Integration
|
||||
public bool GetUserAppData(ref UserAppData props, ref string result)
|
||||
{
|
||||
string query = string.Empty;
|
||||
|
||||
query += "SELECT * FROM `userdata` WHERE ";
|
||||
query += "UserId = ?Id AND ";
|
||||
query += "TagId = ?TagId";
|
||||
const string query = "SELECT * FROM `userdata` WHERE UserId = ?Id AND TagId = ?TagId";
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -1017,13 +972,8 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
else
|
||||
{
|
||||
query += "INSERT INTO userdata VALUES ( ";
|
||||
query += "?UserId,";
|
||||
query += "?TagId,";
|
||||
query += "?DataKey,";
|
||||
query += "?DataVal) ";
|
||||
|
||||
using (MySqlCommand put = new MySqlCommand(query, dbcon))
|
||||
const string queryB = "INSERT INTO userdata VALUES (?UserId, ?TagId, ?DataKey, ?DataVal)";
|
||||
using (MySqlCommand put = new MySqlCommand(queryB, dbcon))
|
||||
{
|
||||
put.Parameters.AddWithValue("?UserId", props.UserId.ToString());
|
||||
put.Parameters.AddWithValue("?TagId", props.TagId.ToString());
|
||||
|
@ -1035,12 +985,12 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": Requst application data exception {0}", e.Message);
|
||||
m_log.ErrorFormat("[PROFILES_DATA]: GetUserAppData exception {0}", e.Message);
|
||||
result = e.Message;
|
||||
return false;
|
||||
}
|
||||
|
@ -1049,14 +999,7 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
public bool SetUserAppData(UserAppData props, ref string result)
|
||||
{
|
||||
string query = string.Empty;
|
||||
|
||||
query += "UPDATE userdata SET ";
|
||||
query += "TagId = ?TagId, ";
|
||||
query += "DataKey = ?DataKey, ";
|
||||
query += "DataVal = ?DataVal WHERE ";
|
||||
query += "UserId = ?UserId AND ";
|
||||
query += "TagId = ?TagId";
|
||||
const string query = "UPDATE userdata SET TagId = ?TagId, DataKey = ?DataKey, DataVal = ?DataVal WHERE UserId = ?UserId AND TagId = ?TagId";
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -1072,12 +1015,12 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PROFILES_DATA]" +
|
||||
": SetUserData exception {0}", e.Message);
|
||||
m_log.ErrorFormat("[PROFILES_DATA]: SetUserAppData exception {0}", e.Message);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -58,11 +58,6 @@ namespace OpenSim.Data.MySQL
|
|||
private bool m_enableCompression = false;
|
||||
private string m_connectionString;
|
||||
|
||||
/// <summary>
|
||||
/// We can reuse this for all hashing since all methods are single-threaded through m_dbBLock
|
||||
/// </summary>
|
||||
private HashAlgorithm hasher = new SHA256CryptoServiceProvider();
|
||||
|
||||
#region IPlugin Members
|
||||
|
||||
public string Version { get { return "1.0.0.0"; } }
|
||||
|
@ -97,6 +92,7 @@ namespace OpenSim.Data.MySQL
|
|||
dbcon.Open();
|
||||
Migration m = new Migration(dbcon, Assembly, "XAssetStore");
|
||||
m.Update();
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -130,6 +126,7 @@ namespace OpenSim.Data.MySQL
|
|||
// m_log.DebugFormat("[MYSQL XASSET DATA]: Looking for asset {0}", assetID);
|
||||
|
||||
AssetBase asset = null;
|
||||
int accessTime = 0;
|
||||
|
||||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
{
|
||||
|
@ -140,7 +137,6 @@ namespace OpenSim.Data.MySQL
|
|||
dbcon))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("?ID", assetID.ToString());
|
||||
|
||||
try
|
||||
{
|
||||
using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
|
||||
|
@ -159,23 +155,7 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
asset.Temporary = Convert.ToBoolean(dbReader["Temporary"]);
|
||||
asset.Flags = (AssetFlags)Convert.ToInt32(dbReader["AssetFlags"]);
|
||||
|
||||
if (m_enableCompression)
|
||||
{
|
||||
using (GZipStream decompressionStream = new GZipStream(new MemoryStream(asset.Data), CompressionMode.Decompress))
|
||||
{
|
||||
MemoryStream outputStream = new MemoryStream();
|
||||
WebUtil.CopyStream(decompressionStream, outputStream, int.MaxValue);
|
||||
// int compressedLength = asset.Data.Length;
|
||||
asset.Data = outputStream.ToArray();
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[XASSET DB]: Decompressed {0} {1} to {2} bytes from {3}",
|
||||
// asset.ID, asset.Name, asset.Data.Length, compressedLength);
|
||||
}
|
||||
}
|
||||
|
||||
UpdateAccessTime(asset.Metadata, (int)dbReader["AccessTime"]);
|
||||
accessTime = (int)dbReader["AccessTime"];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -184,9 +164,38 @@ namespace OpenSim.Data.MySQL
|
|||
m_log.Error(string.Format("[MYSQL XASSET DATA]: Failure fetching asset {0}", assetID), e);
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
|
||||
return asset;
|
||||
if(asset == null)
|
||||
return asset;
|
||||
|
||||
if(accessTime > 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
UpdateAccessTime(asset.Metadata, accessTime);
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
if (m_enableCompression && asset.Data != null)
|
||||
{
|
||||
using(MemoryStream ms = new MemoryStream(asset.Data))
|
||||
using(GZipStream decompressionStream = new GZipStream(ms, CompressionMode.Decompress))
|
||||
{
|
||||
using(MemoryStream outputStream = new MemoryStream())
|
||||
{
|
||||
decompressionStream.CopyTo(outputStream, int.MaxValue);
|
||||
// int compressedLength = asset.Data.Length;
|
||||
asset.Data = outputStream.ToArray();
|
||||
}
|
||||
// m_log.DebugFormat(
|
||||
// "[XASSET DB]: Decompressed {0} {1} to {2} bytes from {3}",
|
||||
// asset.ID, asset.Name, asset.Data.Length, compressedLength);
|
||||
}
|
||||
}
|
||||
return asset;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -236,7 +245,9 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
}
|
||||
|
||||
byte[] hash = hasher.ComputeHash(asset.Data);
|
||||
byte[] hash;
|
||||
using (HashAlgorithm hasher = new SHA256CryptoServiceProvider())
|
||||
hash = hasher.ComputeHash(asset.Data);
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[XASSET DB]: Compressed data size for {0} {1}, hash {2} is {3}",
|
||||
|
@ -303,6 +314,7 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
transaction.Commit();
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -344,6 +356,7 @@ namespace OpenSim.Data.MySQL
|
|||
"[XASSET MYSQL DB]: Failure updating access_time for asset {0} with name {1}",
|
||||
assetMetadata.ID, assetMetadata.Name);
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -474,6 +487,7 @@ namespace OpenSim.Data.MySQL
|
|||
m_log.Error("[XASSETS DB]: MySql failure fetching asset set" + Environment.NewLine + e.ToString());
|
||||
}
|
||||
}
|
||||
dbcon.Close();
|
||||
}
|
||||
|
||||
return retList;
|
||||
|
@ -492,9 +506,9 @@ namespace OpenSim.Data.MySQL
|
|||
cmd.Parameters.AddWithValue("?ID", id);
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
// TODO: How do we deal with data from deleted assets? Probably not easily reapable unless we
|
||||
// keep a reference count (?)
|
||||
dbcon.Close();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
@ -328,7 +328,6 @@ namespace OpenSim.Data.MySQL
|
|||
{
|
||||
return false;
|
||||
}
|
||||
cmd.Dispose();
|
||||
}
|
||||
|
||||
dbcon.Close();
|
||||
|
|
|
@ -69,3 +69,15 @@ CREATE TABLE IF NOT EXISTS `estateban` (
|
|||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 35
|
||||
BEGIN;
|
||||
ALTER TABLE `estateban`
|
||||
ADD COLUMN `banningUUID` varchar(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
||||
ADD COLUMN `banTime` int(11) NOT NULL DEFAULT 0;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 36
|
||||
BEGIN;
|
||||
ALTER TABLE `estate_settings`
|
||||
ADD COLUMN `AllowEnviromentOverride` tinyint(4) NOT NULL DEFAULT '0';
|
||||
COMMIT;
|
||||
|
|
|
@ -16,3 +16,9 @@ CREATE TABLE `hg_traveling_data` (
|
|||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 2 # --------------------------
|
||||
|
||||
ALTER TABLE `hg_traveling_data` MODIFY `TMStamp` timestamp NOT NULL default CURRENT_TIMESTAMP;
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
:VERSION 1
|
||||
|
||||
BEGIN;
|
||||
|
||||
CREATE TABLE `MuteList` (
|
||||
`AgentID` char(36) NOT NULL,
|
||||
`MuteID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
||||
`MuteName` varchar(64) NOT NULL DEFAULT '',
|
||||
`MuteType` int(11) NOT NULL DEFAULT '1',
|
||||
`MuteFlags` int(11) NOT NULL DEFAULT '0',
|
||||
`Stamp` int(11) NOT NULL,
|
||||
UNIQUE KEY `AgentID_2` (`AgentID`,`MuteID`,`MuteName`),
|
||||
KEY `AgentID` (`AgentID`)
|
||||
);
|
||||
|
||||
COMMIT;
|
|
@ -461,3 +461,92 @@ BEGIN;
|
|||
ALTER TABLE `prims` ADD COLUMN `RezzerID` char(36) DEFAULT NULL;
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 57 #----- Add physics inertia data
|
||||
|
||||
BEGIN;
|
||||
ALTER TABLE `prims` ADD COLUMN `PhysInertia` TEXT default NULL;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 58 #----- Add sop animations
|
||||
|
||||
BEGIN;
|
||||
ALTER TABLE `prims` ADD COLUMN `sopanims` blob default NULL;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 59 #----- Add standtarget and sit range
|
||||
|
||||
BEGIN;
|
||||
ALTER TABLE `prims`
|
||||
ADD COLUMN `standtargetx` float DEFAULT '0.0',
|
||||
ADD COLUMN `standtargety` float DEFAULT '0.0',
|
||||
ADD COLUMN `standtargetz` float DEFAULT '0.0',
|
||||
ADD COLUMN `sitactrange` float DEFAULT '0.0';
|
||||
COMMIT;
|
||||
|
||||
:VERSION 60 #----- don't store float on double
|
||||
|
||||
BEGIN;
|
||||
ALTER TABLE `prims`
|
||||
MODIFY `PositionX` float DEFAULT '0.0',
|
||||
MODIFY `PositionY` float DEFAULT '0.0',
|
||||
MODIFY `PositionZ` float DEFAULT '0.0',
|
||||
MODIFY `GroupPositionX` float DEFAULT '0.0',
|
||||
MODIFY `GroupPositionY` float DEFAULT '0.0',
|
||||
MODIFY `GroupPositionZ` float DEFAULT '0.0',
|
||||
MODIFY `VelocityX` float DEFAULT '0.0',
|
||||
MODIFY `VelocityY` float DEFAULT '0.0',
|
||||
MODIFY `VelocityZ` float DEFAULT '0.0',
|
||||
MODIFY `AngularVelocityX` float DEFAULT '0.0',
|
||||
MODIFY `AngularVelocityY` float DEFAULT '0.0',
|
||||
MODIFY `AngularVelocityZ` float DEFAULT '0.0',
|
||||
MODIFY `AccelerationX` float DEFAULT '0.0',
|
||||
MODIFY `AccelerationY` float DEFAULT '0.0',
|
||||
MODIFY `AccelerationZ` float DEFAULT '0.0',
|
||||
MODIFY `RotationX` float DEFAULT '0.0',
|
||||
MODIFY `RotationY` float DEFAULT '0.0',
|
||||
MODIFY `RotationZ` float DEFAULT '0.0',
|
||||
MODIFY `RotationW` float DEFAULT '0.0',
|
||||
MODIFY `SitTargetOffsetX` float DEFAULT '0.0',
|
||||
MODIFY `SitTargetOffsetY` float DEFAULT '0.0',
|
||||
MODIFY `SitTargetOffsetZ` float DEFAULT '0.0',
|
||||
MODIFY `SitTargetOrientX` float DEFAULT '0.0',
|
||||
MODIFY `SitTargetOrientY` float DEFAULT '0.0',
|
||||
MODIFY `SitTargetOrientZ` float DEFAULT '0.0',
|
||||
MODIFY `SitTargetOrientW` float DEFAULT '0.0',
|
||||
MODIFY `OmegaX` float DEFAULT '0.0',
|
||||
MODIFY `OmegaY` float DEFAULT '0.0',
|
||||
MODIFY `OmegaZ` float DEFAULT '0.0',
|
||||
MODIFY `CameraEyeOffsetX` float DEFAULT '0.0',
|
||||
MODIFY `CameraEyeOffsetY` float DEFAULT '0.0',
|
||||
MODIFY `CameraEyeOffsetZ` float DEFAULT '0.0',
|
||||
MODIFY `CameraAtOffsetX` float DEFAULT '0.0',
|
||||
MODIFY `CameraAtOffsetY` float DEFAULT '0.0',
|
||||
MODIFY `CameraAtOffsetZ` float DEFAULT '0.0',
|
||||
MODIFY `Density` float DEFAULT '1000.0',
|
||||
MODIFY `GravityModifier` float DEFAULT '1.0',
|
||||
MODIFY `Friction` float DEFAULT '0.6',
|
||||
MODIFY `Restitution` float DEFAULT '0.5',
|
||||
MODIFY `AttachedPosX` float DEFAULT '0',
|
||||
MODIFY `AttachedPosY` float DEFAULT '0',
|
||||
MODIFY `AttachedPosZ` float DEFAULT '0',
|
||||
MODIFY `LoopedSoundGain` float DEFAULT '0';
|
||||
COMMIT;
|
||||
|
||||
:VERSION 61 #----- Add pseudo CRC and region cache id
|
||||
|
||||
BEGIN;
|
||||
ALTER TABLE `prims` ADD COLUMN `pseudocrc` int DEFAULT '0';
|
||||
ALTER TABLE `regionsettings` ADD COLUMN `cacheID` char(36) DEFAULT NULL;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 62 #----- increase size of environment settings
|
||||
BEGIN;
|
||||
ALTER TABLE `regionenvironment` MODIFY `llsd_settings` MEDIUMTEXT;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 63 #----- parcel environment store
|
||||
BEGIN;
|
||||
ALTER TABLE `land` ADD COLUMN `environment` MEDIUMTEXT default NULL;
|
||||
COMMIT;
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ CREATE TABLE `os_groups_groups` (
|
|||
PRIMARY KEY (`GroupID`),
|
||||
UNIQUE KEY `Name` (`Name`),
|
||||
FULLTEXT KEY `Name_2` (`Name`)
|
||||
) ENGINE=InnoDB;
|
||||
) ENGINE=MyISAM;
|
||||
|
||||
|
||||
CREATE TABLE `os_groups_membership` (
|
||||
|
@ -113,3 +113,11 @@ DROP TABLE `diva_groups_principals`;
|
|||
DELETE FROM `migrations` WHERE name='diva_im_Store';
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 3 # --------------------------
|
||||
|
||||
ALTER TABLE `os_groups_invites`
|
||||
|
||||
MODIFY `TMStamp` timestamp NOT NULL default CURRENT_TIMESTAMP;
|
||||
|
||||
COMMIT;
|
||||
|
|
|
@ -42,6 +42,47 @@ namespace OpenSim.Data.Null
|
|||
/// </summary>
|
||||
public class NullGenericDataHandler
|
||||
{
|
||||
protected List<T> Get<T>(string field, string val, List<T> inputEntities)
|
||||
{
|
||||
List<T> entities = inputEntities;
|
||||
|
||||
entities
|
||||
= entities.Where(
|
||||
e =>
|
||||
{
|
||||
FieldInfo fi = typeof(T).GetField(field);
|
||||
if (fi == null)
|
||||
throw new NotImplementedException(string.Format("No field {0} for val {1}", field, val));
|
||||
|
||||
return fi.GetValue(e).ToString() == val;
|
||||
}
|
||||
).ToList();
|
||||
|
||||
return entities;
|
||||
}
|
||||
|
||||
protected List<T> Get<T>(string field, string[] vals, List<T> inputEntities)
|
||||
{
|
||||
List<T> entities = new List<T>();
|
||||
|
||||
for (int i = 0; i < vals.Length; i++)
|
||||
{
|
||||
entities.AddRange (inputEntities.Where(
|
||||
e =>
|
||||
{
|
||||
FieldInfo fi = typeof(T).GetField(field);
|
||||
if (fi == null)
|
||||
throw new NotImplementedException(string.Format("No field {0} for val {1}", field, vals[i]));
|
||||
|
||||
return fi.GetValue(e).ToString() == vals[i];
|
||||
}
|
||||
).ToList()
|
||||
);
|
||||
}
|
||||
return entities;
|
||||
}
|
||||
|
||||
|
||||
protected List<T> Get<T>(string[] fields, string[] vals, List<T> inputEntities)
|
||||
{
|
||||
List<T> entities = inputEntities;
|
||||
|
|
|
@ -68,12 +68,34 @@ namespace OpenSim.Data.Null
|
|||
|
||||
private delegate bool Matcher(string value);
|
||||
|
||||
public RegionData GetSpecific(string regionName, UUID scopeID)
|
||||
{
|
||||
if (m_useStaticInstance && Instance != this)
|
||||
return Instance.GetSpecific(regionName, scopeID);
|
||||
|
||||
string cleanName = regionName.ToLower();
|
||||
Matcher queryMatch;
|
||||
queryMatch = delegate (string s) { return s.Equals(cleanName); };
|
||||
|
||||
lock (m_regionData)
|
||||
{
|
||||
foreach (RegionData r in m_regionData.Values)
|
||||
{
|
||||
// m_log.DebugFormat("[NULL REGION DATA]: comparing {0} to {1}", cleanName, r.RegionName.ToLower());
|
||||
if (queryMatch(r.RegionName.ToLower()))
|
||||
return(r);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public List<RegionData> Get(string regionName, UUID scopeID)
|
||||
{
|
||||
if (m_useStaticInstance && Instance != this)
|
||||
return Instance.Get(regionName, scopeID);
|
||||
|
||||
// m_log.DebugFormat("[NULL REGION DATA]: Getting region {0}, scope {1}", regionName, scopeID);
|
||||
// m_log.DebugFormat("[NULL REGION DATA]: Getting region {0}, scope {1}", regionName, scopeID);
|
||||
|
||||
string cleanName = regionName.ToLower();
|
||||
|
||||
|
|
|
@ -151,7 +151,7 @@ namespace OpenSim.Data.Null
|
|||
// Legacy. Just don't do this.
|
||||
public void StoreTerrain(double[,] ter, UUID regionID)
|
||||
{
|
||||
TerrainData terrData = new HeightmapTerrainData(ter);
|
||||
TerrainData terrData = new TerrainData(ter);
|
||||
StoreTerrain(terrData, regionID);
|
||||
}
|
||||
|
||||
|
|
|
@ -286,7 +286,7 @@ namespace OpenSim.Data.PGSQL
|
|||
{
|
||||
es.ClearBans();
|
||||
|
||||
string sql = "select \"bannedUUID\" from estateban where \"EstateID\" = :EstateID";
|
||||
string sql = "select * from estateban where \"EstateID\" = :EstateID";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
|
@ -302,6 +302,8 @@ namespace OpenSim.Data.PGSQL
|
|||
EstateBan eb = new EstateBan();
|
||||
|
||||
eb.BannedUserID = new UUID((Guid)reader["bannedUUID"]); //uuid;
|
||||
eb.BanningUserID = new UUID((Guid)reader["banningUUID"]); //uuid;
|
||||
eb.BanTime = Convert.ToInt32(reader["banTime"]);
|
||||
eb.BannedHostAddress = "0.0.0.0";
|
||||
eb.BannedHostIPMask = "0.0.0.0";
|
||||
es.AddBan(eb);
|
||||
|
@ -346,11 +348,15 @@ namespace OpenSim.Data.PGSQL
|
|||
cmd.ExecuteNonQuery();
|
||||
|
||||
//Insert after
|
||||
cmd.CommandText = "insert into estateban (\"EstateID\", \"bannedUUID\",\"bannedIp\", \"bannedIpHostMask\", \"bannedNameMask\") values ( :EstateID, :bannedUUID, '','','' )";
|
||||
cmd.CommandText = "insert into estateban (\"EstateID\", \"bannedUUID\",\"bannedIp\", \"bannedIpHostMask\", \"bannedNameMask\", \"banningUUID\",\"banTime\" ) values ( :EstateID, :bannedUUID, '','','', :banningUUID, :banTime )";
|
||||
cmd.Parameters.AddWithValue("bannedUUID", Guid.Empty);
|
||||
foreach (EstateBan b in es.EstateBans)
|
||||
{
|
||||
cmd.Parameters["EstateID"].Value = b.EstateID;
|
||||
cmd.Parameters["bannedUUID"].Value = b.BannedUserID.Guid;
|
||||
cmd.Parameters["banningUUID"].Value = b.BanningUserID.Guid;
|
||||
cmd.Parameters["banTime"].Value = b.BanTime;
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,316 @@
|
|||
/*
|
||||
* 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.Reflection;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Console;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
using Npgsql;
|
||||
using NpgsqlTypes;
|
||||
|
||||
namespace OpenSim.Data.PGSQL
|
||||
{
|
||||
public class PGSQLFSAssetData : IFSAssetDataPlugin
|
||||
{
|
||||
private const string _migrationStore = "FSAssetStore";
|
||||
private static string m_Table = "fsassets";
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
private long m_ticksToEpoch;
|
||||
|
||||
private PGSQLManager m_database;
|
||||
private string m_connectionString;
|
||||
|
||||
public PGSQLFSAssetData()
|
||||
{
|
||||
}
|
||||
|
||||
public void Initialise(string connect, string realm, int UpdateAccessTime)
|
||||
{
|
||||
DaysBetweenAccessTimeUpdates = UpdateAccessTime;
|
||||
|
||||
m_ticksToEpoch = new System.DateTime(1970, 1, 1).Ticks;
|
||||
|
||||
m_connectionString = connect;
|
||||
m_database = new PGSQLManager(m_connectionString);
|
||||
|
||||
//New migration to check for DB changes
|
||||
m_database.CheckMigration(_migrationStore);
|
||||
}
|
||||
|
||||
public void Initialise()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Number of days that must pass before we update the access time on an asset when it has been fetched
|
||||
/// Config option to change this is "DaysBetweenAccessTimeUpdates"
|
||||
/// </summary>
|
||||
private int DaysBetweenAccessTimeUpdates = 0;
|
||||
|
||||
protected virtual Assembly Assembly
|
||||
{
|
||||
get { return GetType().Assembly; }
|
||||
}
|
||||
|
||||
#region IPlugin Members
|
||||
|
||||
public string Version { get { return "1.0.0.0"; } }
|
||||
|
||||
public void Dispose() { }
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return "PGSQL FSAsset storage engine"; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IFSAssetDataPlugin Members
|
||||
|
||||
public AssetMetadata Get(string id, out string hash)
|
||||
{
|
||||
hash = String.Empty;
|
||||
AssetMetadata meta = null;
|
||||
UUID uuid = new UUID(id);
|
||||
|
||||
string query = String.Format("select \"id\", \"type\", \"hash\", \"create_time\", \"access_time\", \"asset_flags\" from {0} where \"id\" = :id", m_Table);
|
||||
using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
|
||||
{
|
||||
dbcon.Open();
|
||||
cmd.Parameters.Add(m_database.CreateParameter("id", uuid));
|
||||
using (NpgsqlDataReader reader = cmd.ExecuteReader(CommandBehavior.Default))
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
meta = new AssetMetadata();
|
||||
hash = reader["hash"].ToString();
|
||||
meta.ID = id;
|
||||
meta.FullID = uuid;
|
||||
meta.Name = String.Empty;
|
||||
meta.Description = String.Empty;
|
||||
meta.Type = (sbyte)Convert.ToInt32(reader["type"]);
|
||||
meta.ContentType = SLUtil.SLAssetTypeToContentType(meta.Type);
|
||||
meta.CreationDate = Util.ToDateTime(Convert.ToInt32(reader["create_time"]));
|
||||
meta.Flags = (AssetFlags)Convert.ToInt32(reader["asset_flags"]);
|
||||
int atime = Convert.ToInt32(reader["access_time"]);
|
||||
UpdateAccessTime(atime, uuid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return meta;
|
||||
}
|
||||
|
||||
private void UpdateAccessTime(int AccessTime, UUID id)
|
||||
{
|
||||
// Reduce DB work by only updating access time if asset hasn't recently been accessed
|
||||
// 0 By Default, Config option is "DaysBetweenAccessTimeUpdates"
|
||||
if (DaysBetweenAccessTimeUpdates > 0 && (DateTime.UtcNow - Utils.UnixTimeToDateTime(AccessTime)).TotalDays < DaysBetweenAccessTimeUpdates)
|
||||
return;
|
||||
|
||||
string query = String.Format("UPDATE {0} SET \"access_time\" = :access_time WHERE \"id\" = :id", m_Table);
|
||||
using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
|
||||
{
|
||||
dbcon.Open();
|
||||
int now = (int)((System.DateTime.Now.Ticks - m_ticksToEpoch) / 10000000);
|
||||
cmd.Parameters.Add(m_database.CreateParameter("id", id));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("access_time", now));
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
|
||||
public bool Store(AssetMetadata meta, string hash)
|
||||
{
|
||||
try
|
||||
{
|
||||
bool found = false;
|
||||
string oldhash;
|
||||
AssetMetadata existingAsset = Get(meta.ID, out oldhash);
|
||||
|
||||
string query = String.Format("UPDATE {0} SET \"access_time\" = :access_time WHERE \"id\" = :id", m_Table);
|
||||
if (existingAsset == null)
|
||||
{
|
||||
query = String.Format("insert into {0} (\"id\", \"type\", \"hash\", \"asset_flags\", \"create_time\", \"access_time\") values ( :id, :type, :hash, :asset_flags, :create_time, :access_time)", m_Table);
|
||||
found = true;
|
||||
}
|
||||
|
||||
using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
|
||||
{
|
||||
dbcon.Open();
|
||||
int now = (int)((System.DateTime.Now.Ticks - m_ticksToEpoch) / 10000000);
|
||||
cmd.Parameters.Add(m_database.CreateParameter("id", meta.FullID));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("type", meta.Type));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("hash", hash));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("asset_flags", Convert.ToInt32(meta.Flags)));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("create_time", now));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("access_time", now));
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
return found;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
m_log.Error("[PGSQL FSASSETS] Failed to store asset with ID " + meta.ID);
|
||||
m_log.Error(e.ToString());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check if the assets exist in the database.
|
||||
/// </summary>
|
||||
/// <param name="uuids">The asset UUID's</param>
|
||||
/// <returns>For each asset: true if it exists, false otherwise</returns>
|
||||
public bool[] AssetsExist(UUID[] uuids)
|
||||
{
|
||||
if (uuids.Length == 0)
|
||||
return new bool[0];
|
||||
|
||||
HashSet<UUID> exists = new HashSet<UUID>();
|
||||
|
||||
string ids = "'" + string.Join("','", uuids) + "'";
|
||||
string query = string.Format("select \"id\" from {1} where id in ({0})", ids, m_Table);
|
||||
using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
|
||||
{
|
||||
dbcon.Open();
|
||||
using (NpgsqlDataReader reader = cmd.ExecuteReader(CommandBehavior.Default))
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
UUID id = DBGuid.FromDB(reader["id"]);;
|
||||
exists.Add(id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool[] results = new bool[uuids.Length];
|
||||
for (int i = 0; i < uuids.Length; i++)
|
||||
results[i] = exists.Contains(uuids[i]);
|
||||
return results;
|
||||
}
|
||||
|
||||
public int Count()
|
||||
{
|
||||
int count = 0;
|
||||
string query = String.Format("select count(*) as count from {0}", m_Table);
|
||||
using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
|
||||
{
|
||||
dbcon.Open();
|
||||
IDataReader reader = cmd.ExecuteReader();
|
||||
reader.Read();
|
||||
count = Convert.ToInt32(reader["count"]);
|
||||
reader.Close();
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
public bool Delete(string id)
|
||||
{
|
||||
string query = String.Format("delete from {0} where \"id\" = :id", m_Table);
|
||||
using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
|
||||
{
|
||||
dbcon.Open();
|
||||
cmd.Parameters.Add(m_database.CreateParameter("id", new UUID(id)));
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void Import(string conn, string table, int start, int count, bool force, FSStoreDelegate store)
|
||||
{
|
||||
int imported = 0;
|
||||
string limit = String.Empty;
|
||||
if(count != -1)
|
||||
{
|
||||
limit = String.Format(" limit {0} offset {1}", start, count);
|
||||
}
|
||||
string query = String.Format("select * from {0}{1}", table, limit);
|
||||
try
|
||||
{
|
||||
using (NpgsqlConnection remote = new NpgsqlConnection(conn))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(query, remote))
|
||||
{
|
||||
remote.Open();
|
||||
MainConsole.Instance.Output("Querying database");
|
||||
MainConsole.Instance.Output("Reading data");
|
||||
using (NpgsqlDataReader reader = cmd.ExecuteReader(CommandBehavior.Default))
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
if ((imported % 100) == 0)
|
||||
{
|
||||
MainConsole.Instance.Output(String.Format("{0} assets imported so far", imported));
|
||||
}
|
||||
|
||||
AssetBase asset = new AssetBase();
|
||||
AssetMetadata meta = new AssetMetadata();
|
||||
|
||||
meta.ID = reader["id"].ToString();
|
||||
meta.FullID = new UUID(meta.ID);
|
||||
|
||||
meta.Name = String.Empty;
|
||||
meta.Description = String.Empty;
|
||||
meta.Type = (sbyte)Convert.ToInt32(reader["assetType"]);
|
||||
meta.ContentType = SLUtil.SLAssetTypeToContentType(meta.Type);
|
||||
meta.CreationDate = Util.ToDateTime(Convert.ToInt32(reader["create_time"]));
|
||||
|
||||
asset.Metadata = meta;
|
||||
asset.Data = (byte[])reader["data"];
|
||||
|
||||
store(asset, force);
|
||||
|
||||
imported++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[PGSQL FSASSETS]: Error importing assets: {0}",
|
||||
e.Message.ToString());
|
||||
return;
|
||||
}
|
||||
|
||||
MainConsole.Instance.Output(String.Format("Import done, {0} assets imported", imported));
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -180,7 +180,54 @@ namespace OpenSim.Data.PGSQL
|
|||
|
||||
public virtual T[] Get(string field, string key)
|
||||
{
|
||||
return Get(new string[] { field }, new string[] { key });
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
if ( m_FieldTypes.ContainsKey(field) )
|
||||
cmd.Parameters.Add(m_database.CreateParameter(field, key, m_FieldTypes[field]));
|
||||
else
|
||||
cmd.Parameters.Add(m_database.CreateParameter(field, key));
|
||||
|
||||
string query = String.Format("SELECT * FROM {0} WHERE \"{1}\" = :{1}", m_Realm, field, field);
|
||||
|
||||
cmd.Connection = conn;
|
||||
cmd.CommandText = query;
|
||||
conn.Open();
|
||||
return DoQuery(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual T[] Get(string field, string[] keys)
|
||||
{
|
||||
|
||||
int flen = keys.Length;
|
||||
if(flen == 0)
|
||||
return new T[0];
|
||||
|
||||
int flast = flen - 1;
|
||||
StringBuilder sb = new StringBuilder(1024);
|
||||
sb.AppendFormat("select * from {0} where {1} IN ('", m_Realm, field);
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
|
||||
for (int i = 0 ; i < flen ; i++)
|
||||
{
|
||||
sb.Append(keys[i]);
|
||||
if(i < flast)
|
||||
sb.Append("','");
|
||||
else
|
||||
sb.Append("')");
|
||||
}
|
||||
|
||||
string query = sb.ToString();
|
||||
|
||||
cmd.Connection = conn;
|
||||
cmd.CommandText = query;
|
||||
conn.Open();
|
||||
return DoQuery(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual T[] Get(string[] fields, string[] keys)
|
||||
|
|
|
@ -86,13 +86,13 @@ namespace OpenSim.Data.PGSQL
|
|||
|
||||
if (string.IsNullOrEmpty(pattern)) // True for where clause
|
||||
{
|
||||
pattern = " 1 ORDER BY lower(\"Name\") LIMIT 100";
|
||||
pattern = "1";
|
||||
|
||||
return m_Groups.Get(pattern);
|
||||
}
|
||||
else
|
||||
{
|
||||
pattern = " \"ShowInList\" = 1 AND lower(\"Name\") LIKE lower('%" + pattern + "%') ORDER BY lower(\"Name\") LIMIT 100";
|
||||
pattern = " \"ShowInList\" = 1 AND lower(\"Name\") LIKE lower('%" + pattern + "%')";
|
||||
|
||||
return m_Groups.Get(pattern, new NpgsqlParameter("pattern", pattern));
|
||||
}
|
||||
|
@ -435,7 +435,7 @@ namespace OpenSim.Data.PGSQL
|
|||
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
cmd.CommandText = String.Format("delete from {0} where \"TMStamp\" < CURRENT_DATE - INTERVAL '2 week'", m_Realm);
|
||||
cmd.CommandText = String.Format("delete from {0} where \"TMStamp\"::abstime::timestamp < now() - INTERVAL '2 week'", m_Realm);
|
||||
|
||||
ExecuteNonQuery(cmd);
|
||||
}
|
||||
|
@ -461,7 +461,7 @@ namespace OpenSim.Data.PGSQL
|
|||
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
cmd.CommandText = String.Format("delete from {0} where \"TMStamp\" < CURRENT_DATE - INTERVAL '2 week'", m_Realm);
|
||||
cmd.CommandText = String.Format("delete from {0} where \"TMStamp\"::abstime::timestamp < now() - INTERVAL '2 week'", m_Realm);
|
||||
|
||||
ExecuteNonQuery(cmd);
|
||||
}
|
||||
|
|
|
@ -114,6 +114,27 @@ namespace OpenSim.Data.PGSQL
|
|||
}
|
||||
}
|
||||
|
||||
public RegionData GetSpecific(string regionName, UUID scopeID)
|
||||
{
|
||||
string sql = "select * from " + m_Realm + " where lower(\"regionName\") = lower(:regionName) ";
|
||||
if (scopeID != UUID.Zero)
|
||||
sql += " and \"ScopeID\" = :scopeID";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(m_database.CreateParameter("regionName", regionName));
|
||||
if (scopeID != UUID.Zero)
|
||||
cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
|
||||
conn.Open();
|
||||
List<RegionData> ret = RunCommand(cmd);
|
||||
if (ret.Count == 0)
|
||||
return null;
|
||||
|
||||
return ret[0];
|
||||
}
|
||||
}
|
||||
|
||||
public RegionData Get(int posX, int posY, UUID scopeID)
|
||||
{
|
||||
// extend database search for maximum region size area
|
||||
|
|
|
@ -350,10 +350,13 @@ namespace OpenSim.Data.PGSQL
|
|||
""CameraEyeOffsetY"" = :CameraEyeOffsetY, ""CameraEyeOffsetZ"" = :CameraEyeOffsetZ, ""CameraAtOffsetX"" = :CameraAtOffsetX,
|
||||
""CameraAtOffsetY"" = :CameraAtOffsetY, ""CameraAtOffsetZ"" = :CameraAtOffsetZ, ""ForceMouselook"" = :ForceMouselook,
|
||||
""ScriptAccessPin"" = :ScriptAccessPin, ""AllowedDrop"" = :AllowedDrop, ""DieAtEdge"" = :DieAtEdge, ""SalePrice"" = :SalePrice,
|
||||
""SaleType"" = :SaleType, ""ColorR"" = :ColorR, ""ColorG"" = :ColorG, ""ColorB"" = :ColorB, ""ColorA"" = :ColorA, ""ParticleSystem"" = :ParticleSystem,
|
||||
""PhysicsShapeType"" = :PhysicsShapeType, ""Density"" = :Density, ""GravityModifier"" = :GravityModifier, ""Friction"" = :Friction, ""Restitution"" = :Restitution,
|
||||
""PassCollisions"" = :PassCollisions, ""RotationAxisLocks"" = :RotationAxisLocks, ""RezzerID"" = :RezzerID,
|
||||
""ClickAction"" = :ClickAction, ""Material"" = :Material, ""CollisionSound"" = :CollisionSound, ""CollisionSoundVolume"" = :CollisionSoundVolume, ""PassTouches"" = :PassTouches,
|
||||
""LinkNumber"" = :LinkNumber, ""MediaURL"" = :MediaURL, ""DynAttrs"" = :DynAttrs,
|
||||
""PhysicsShapeType"" = :PhysicsShapeType, ""Density"" = :Density, ""GravityModifier"" = :GravityModifier, ""Friction"" = :Friction, ""Restitution"" = :Restitution
|
||||
""LinkNumber"" = :LinkNumber, ""MediaURL"" = :MediaURL, ""DynAttrs"" = :DynAttrs, ""Vehicle"" = :Vehicle,
|
||||
""PhysInertia"" = :PhysInertia, ""standtargetx"" =:standtargetx, ""standtargety"" =:standtargety, ""standtargetz"" =:standtargetz,
|
||||
""sitactrange"" =:sitactrange, ""pseudocrc"" = :pseudocrc
|
||||
|
||||
WHERE ""UUID"" = :UUID ;
|
||||
|
||||
INSERT INTO
|
||||
|
@ -367,7 +370,8 @@ namespace OpenSim.Data.PGSQL
|
|||
""OmegaY"", ""OmegaZ"", ""CameraEyeOffsetX"", ""CameraEyeOffsetY"", ""CameraEyeOffsetZ"", ""CameraAtOffsetX"", ""CameraAtOffsetY"", ""CameraAtOffsetZ"",
|
||||
""ForceMouselook"", ""ScriptAccessPin"", ""AllowedDrop"", ""DieAtEdge"", ""SalePrice"", ""SaleType"", ""ColorR"", ""ColorG"", ""ColorB"", ""ColorA"",
|
||||
""ParticleSystem"", ""ClickAction"", ""Material"", ""CollisionSound"", ""CollisionSoundVolume"", ""PassTouches"", ""LinkNumber"", ""MediaURL"", ""DynAttrs"",
|
||||
""PhysicsShapeType"", ""Density"", ""GravityModifier"", ""Friction"", ""Restitution""
|
||||
""PhysicsShapeType"", ""Density"", ""GravityModifier"", ""Friction"", ""Restitution"", ""PassCollisions"", ""RotationAxisLocks"", ""RezzerID"" , ""Vehicle"", ""PhysInertia"",
|
||||
""standtargetx"", ""standtargety"", ""standtargetz"", ""sitactrange"", ""pseudocrc""
|
||||
) Select
|
||||
:UUID, :CreationDate, :Name, :Text, :Description, :SitName, :TouchName, :ObjectFlags, :OwnerMask, :NextOwnerMask, :GroupMask,
|
||||
:EveryoneMask, :BaseMask, :PositionX, :PositionY, :PositionZ, :GroupPositionX, :GroupPositionY, :GroupPositionZ, :VelocityX,
|
||||
|
@ -378,7 +382,8 @@ namespace OpenSim.Data.PGSQL
|
|||
:OmegaY, :OmegaZ, :CameraEyeOffsetX, :CameraEyeOffsetY, :CameraEyeOffsetZ, :CameraAtOffsetX, :CameraAtOffsetY, :CameraAtOffsetZ,
|
||||
:ForceMouselook, :ScriptAccessPin, :AllowedDrop, :DieAtEdge, :SalePrice, :SaleType, :ColorR, :ColorG, :ColorB, :ColorA,
|
||||
:ParticleSystem, :ClickAction, :Material, :CollisionSound, :CollisionSoundVolume, :PassTouches, :LinkNumber, :MediaURL, :DynAttrs,
|
||||
:PhysicsShapeType, :Density, :GravityModifier, :Friction, :Restitution
|
||||
:PhysicsShapeType, :Density, :GravityModifier, :Friction, :Restitution, :PassCollisions, :RotationAxisLocks, :RezzerID, :Vehicle, :PhysInertia,
|
||||
:standtargetx, :standtargety, :standtargetz,:sitactrange, :pseudocrc
|
||||
where not EXISTS (SELECT ""UUID"" FROM prims WHERE ""UUID"" = :UUID);
|
||||
";
|
||||
|
||||
|
@ -609,7 +614,7 @@ namespace OpenSim.Data.PGSQL
|
|||
// Legacy entry point for when terrain was always a 256x256 heightmap
|
||||
public void StoreTerrain(double[,] terrain, UUID regionID)
|
||||
{
|
||||
StoreTerrain(new HeightmapTerrainData(terrain), regionID);
|
||||
StoreTerrain(new TerrainData(terrain), regionID);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -765,13 +770,14 @@ namespace OpenSim.Data.PGSQL
|
|||
(""UUID"",""RegionUUID"",""LocalLandID"",""Bitmap"",""Name"",""Description"",""OwnerUUID"",""IsGroupOwned"",""Area"",""AuctionID"",""Category"",""ClaimDate"",""ClaimPrice"",
|
||||
""GroupUUID"",""SalePrice"",""LandStatus"",""LandFlags"",""LandingType"",""MediaAutoScale"",""MediaTextureUUID"",""MediaURL"",""MusicURL"",""PassHours"",""PassPrice"",
|
||||
""SnapshotUUID"",""UserLocationX"",""UserLocationY"",""UserLocationZ"",""UserLookAtX"",""UserLookAtY"",""UserLookAtZ"",""AuthbuyerID"",""OtherCleanTime"",""Dwell"",
|
||||
""MediaType"",""MediaDescription"",""MediaSize"",""MediaLoop"",""ObscureMusic"",""ObscureMedia"",""SeeAVs"",""AnyAVSounds"",""GroupAVSounds"")
|
||||
""MediaType"",""MediaDescription"",""MediaSize"",""MediaLoop"",""ObscureMusic"",""ObscureMedia"",""SeeAVs"",""AnyAVSounds"",""GroupAVSounds"",
|
||||
""environment"")
|
||||
VALUES
|
||||
(:UUID,:RegionUUID,:LocalLandID,:Bitmap,:Name,:Description,:OwnerUUID,:IsGroupOwned,:Area,:AuctionID,:Category,:ClaimDate,:ClaimPrice,
|
||||
:GroupUUID,:SalePrice,:LandStatus,:LandFlags,:LandingType,:MediaAutoScale,:MediaTextureUUID,:MediaURL,:MusicURL,:PassHours,:PassPrice,
|
||||
:SnapshotUUID,:UserLocationX,:UserLocationY,:UserLocationZ,:UserLookAtX,:UserLookAtY,:UserLookAtZ,:AuthbuyerID,:OtherCleanTime,:Dwell,
|
||||
:MediaType,:MediaDescription,:MediaWidth::text || ',' || :MediaHeight::text,:MediaLoop,:ObscureMusic,:ObscureMedia,:SeeAVs::int::smallint,
|
||||
:AnyAVSounds::int::smallint,:GroupAVSounds::int::smallint)";
|
||||
:AnyAVSounds::int::smallint,:GroupAVSounds::int::smallint,:environment)";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
|
@ -820,477 +826,6 @@ namespace OpenSim.Data.PGSQL
|
|||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID)
|
||||
{
|
||||
RegionLightShareData nWP = new RegionLightShareData();
|
||||
nWP.OnSave += StoreRegionWindlightSettings;
|
||||
|
||||
string sql = @"select * from regionwindlight where ""region_id"" = :regionID";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(_Database.CreateParameter("regionID", regionUUID.ToString() ));
|
||||
conn.Open();
|
||||
using (NpgsqlDataReader result = cmd.ExecuteReader())
|
||||
{
|
||||
if (!result.Read())
|
||||
{
|
||||
//No result, so store our default windlight profile and return it
|
||||
nWP.regionID = regionUUID;
|
||||
StoreRegionWindlightSettings(nWP);
|
||||
return nWP;
|
||||
}
|
||||
else
|
||||
{
|
||||
nWP.regionID = DBGuid.FromDB(result["region_id"]);
|
||||
nWP.waterColor.X = Convert.ToSingle(result["water_color_r"]);
|
||||
nWP.waterColor.Y = Convert.ToSingle(result["water_color_g"]);
|
||||
nWP.waterColor.Z = Convert.ToSingle(result["water_color_b"]);
|
||||
nWP.waterFogDensityExponent = Convert.ToSingle(result["water_fog_density_exponent"]);
|
||||
nWP.underwaterFogModifier = Convert.ToSingle(result["underwater_fog_modifier"]);
|
||||
nWP.reflectionWaveletScale.X = Convert.ToSingle(result["reflection_wavelet_scale_1"]);
|
||||
nWP.reflectionWaveletScale.Y = Convert.ToSingle(result["reflection_wavelet_scale_2"]);
|
||||
nWP.reflectionWaveletScale.Z = Convert.ToSingle(result["reflection_wavelet_scale_3"]);
|
||||
nWP.fresnelScale = Convert.ToSingle(result["fresnel_scale"]);
|
||||
nWP.fresnelOffset = Convert.ToSingle(result["fresnel_offset"]);
|
||||
nWP.refractScaleAbove = Convert.ToSingle(result["refract_scale_above"]);
|
||||
nWP.refractScaleBelow = Convert.ToSingle(result["refract_scale_below"]);
|
||||
nWP.blurMultiplier = Convert.ToSingle(result["blur_multiplier"]);
|
||||
nWP.bigWaveDirection.X = Convert.ToSingle(result["big_wave_direction_x"]);
|
||||
nWP.bigWaveDirection.Y = Convert.ToSingle(result["big_wave_direction_y"]);
|
||||
nWP.littleWaveDirection.X = Convert.ToSingle(result["little_wave_direction_x"]);
|
||||
nWP.littleWaveDirection.Y = Convert.ToSingle(result["little_wave_direction_y"]);
|
||||
UUID.TryParse(result["normal_map_texture"].ToString(), out nWP.normalMapTexture);
|
||||
nWP.horizon.X = Convert.ToSingle(result["horizon_r"]);
|
||||
nWP.horizon.Y = Convert.ToSingle(result["horizon_g"]);
|
||||
nWP.horizon.Z = Convert.ToSingle(result["horizon_b"]);
|
||||
nWP.horizon.W = Convert.ToSingle(result["horizon_i"]);
|
||||
nWP.hazeHorizon = Convert.ToSingle(result["haze_horizon"]);
|
||||
nWP.blueDensity.X = Convert.ToSingle(result["blue_density_r"]);
|
||||
nWP.blueDensity.Y = Convert.ToSingle(result["blue_density_g"]);
|
||||
nWP.blueDensity.Z = Convert.ToSingle(result["blue_density_b"]);
|
||||
nWP.blueDensity.W = Convert.ToSingle(result["blue_density_i"]);
|
||||
nWP.hazeDensity = Convert.ToSingle(result["haze_density"]);
|
||||
nWP.densityMultiplier = Convert.ToSingle(result["density_multiplier"]);
|
||||
nWP.distanceMultiplier = Convert.ToSingle(result["distance_multiplier"]);
|
||||
nWP.maxAltitude = Convert.ToUInt16(result["max_altitude"]);
|
||||
nWP.sunMoonColor.X = Convert.ToSingle(result["sun_moon_color_r"]);
|
||||
nWP.sunMoonColor.Y = Convert.ToSingle(result["sun_moon_color_g"]);
|
||||
nWP.sunMoonColor.Z = Convert.ToSingle(result["sun_moon_color_b"]);
|
||||
nWP.sunMoonColor.W = Convert.ToSingle(result["sun_moon_color_i"]);
|
||||
nWP.sunMoonPosition = Convert.ToSingle(result["sun_moon_position"]);
|
||||
nWP.ambient.X = Convert.ToSingle(result["ambient_r"]);
|
||||
nWP.ambient.Y = Convert.ToSingle(result["ambient_g"]);
|
||||
nWP.ambient.Z = Convert.ToSingle(result["ambient_b"]);
|
||||
nWP.ambient.W = Convert.ToSingle(result["ambient_i"]);
|
||||
nWP.eastAngle = Convert.ToSingle(result["east_angle"]);
|
||||
nWP.sunGlowFocus = Convert.ToSingle(result["sun_glow_focus"]);
|
||||
nWP.sunGlowSize = Convert.ToSingle(result["sun_glow_size"]);
|
||||
nWP.sceneGamma = Convert.ToSingle(result["scene_gamma"]);
|
||||
nWP.starBrightness = Convert.ToSingle(result["star_brightness"]);
|
||||
nWP.cloudColor.X = Convert.ToSingle(result["cloud_color_r"]);
|
||||
nWP.cloudColor.Y = Convert.ToSingle(result["cloud_color_g"]);
|
||||
nWP.cloudColor.Z = Convert.ToSingle(result["cloud_color_b"]);
|
||||
nWP.cloudColor.W = Convert.ToSingle(result["cloud_color_i"]);
|
||||
nWP.cloudXYDensity.X = Convert.ToSingle(result["cloud_x"]);
|
||||
nWP.cloudXYDensity.Y = Convert.ToSingle(result["cloud_y"]);
|
||||
nWP.cloudXYDensity.Z = Convert.ToSingle(result["cloud_density"]);
|
||||
nWP.cloudCoverage = Convert.ToSingle(result["cloud_coverage"]);
|
||||
nWP.cloudScale = Convert.ToSingle(result["cloud_scale"]);
|
||||
nWP.cloudDetailXYDensity.X = Convert.ToSingle(result["cloud_detail_x"]);
|
||||
nWP.cloudDetailXYDensity.Y = Convert.ToSingle(result["cloud_detail_y"]);
|
||||
nWP.cloudDetailXYDensity.Z = Convert.ToSingle(result["cloud_detail_density"]);
|
||||
nWP.cloudScrollX = Convert.ToSingle(result["cloud_scroll_x"]);
|
||||
nWP.cloudScrollXLock = Convert.ToBoolean(result["cloud_scroll_x_lock"]);
|
||||
nWP.cloudScrollY = Convert.ToSingle(result["cloud_scroll_y"]);
|
||||
nWP.cloudScrollYLock = Convert.ToBoolean(result["cloud_scroll_y_lock"]);
|
||||
nWP.drawClassicClouds = Convert.ToBoolean(result["draw_classic_clouds"]);
|
||||
nWP.valid = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return nWP;
|
||||
}
|
||||
|
||||
public void RemoveRegionWindlightSettings(UUID regionID)
|
||||
{
|
||||
string sql = @"delete from regionwindlight where ""region_id"" = :region_id";
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
conn.Open();
|
||||
cmd.Parameters.Add(_Database.CreateParameter("region_id", regionID.ToString()));
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
|
||||
public void StoreRegionWindlightSettings(RegionLightShareData wl)
|
||||
{
|
||||
string sql = @"select region_id from regionwindlight where ""region_id"" = :region_id limit 1;";
|
||||
bool exists = false;
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
{
|
||||
conn.Open();
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(_Database.CreateParameter("region_id", wl.regionID.ToString() ));
|
||||
NpgsqlDataReader dr = cmd.ExecuteReader();
|
||||
exists = dr.Read();
|
||||
}
|
||||
}
|
||||
if (exists)
|
||||
{
|
||||
RemoveRegionWindlightSettings(wl.regionID);
|
||||
}
|
||||
|
||||
// sql insert
|
||||
sql = @"INSERT INTO regionwindlight
|
||||
(region_id
|
||||
,water_color_r
|
||||
,water_color_g
|
||||
,water_color_b
|
||||
,water_fog_density_exponent
|
||||
,underwater_fog_modifier
|
||||
,reflection_wavelet_scale_1
|
||||
,reflection_wavelet_scale_2
|
||||
,reflection_wavelet_scale_3
|
||||
,fresnel_scale
|
||||
,fresnel_offset
|
||||
,refract_scale_above
|
||||
,refract_scale_below
|
||||
,blur_multiplier
|
||||
,big_wave_direction_x
|
||||
,big_wave_direction_y
|
||||
,little_wave_direction_x
|
||||
,little_wave_direction_y
|
||||
,normal_map_texture
|
||||
,horizon_r
|
||||
,horizon_g
|
||||
,horizon_b
|
||||
,horizon_i
|
||||
,haze_horizon
|
||||
,blue_density_r
|
||||
,blue_density_g
|
||||
,blue_density_b
|
||||
,blue_density_i
|
||||
,haze_density
|
||||
,density_multiplier
|
||||
,distance_multiplier
|
||||
,max_altitude
|
||||
,sun_moon_color_r
|
||||
,sun_moon_color_g
|
||||
,sun_moon_color_b
|
||||
,sun_moon_color_i
|
||||
,sun_moon_position
|
||||
,ambient_r
|
||||
,ambient_g
|
||||
,ambient_b
|
||||
,ambient_i
|
||||
,east_angle
|
||||
,sun_glow_focus
|
||||
,sun_glow_size
|
||||
,scene_gamma
|
||||
,star_brightness
|
||||
,cloud_color_r
|
||||
,cloud_color_g
|
||||
,cloud_color_b
|
||||
,cloud_color_i
|
||||
,cloud_x
|
||||
,cloud_y
|
||||
,cloud_density
|
||||
,cloud_coverage
|
||||
,cloud_scale
|
||||
,cloud_detail_x
|
||||
,cloud_detail_y
|
||||
,cloud_detail_density
|
||||
,cloud_scroll_x
|
||||
,cloud_scroll_x_lock
|
||||
,cloud_scroll_y
|
||||
,cloud_scroll_y_lock
|
||||
,draw_classic_clouds)
|
||||
VALUES
|
||||
(:region_id
|
||||
,:water_color_r
|
||||
,:water_color_g
|
||||
,:water_color_b
|
||||
,:water_fog_density_exponent
|
||||
,:underwater_fog_modifier
|
||||
,:reflection_wavelet_scale_1
|
||||
,:reflection_wavelet_scale_2
|
||||
,:reflection_wavelet_scale_3
|
||||
,:fresnel_scale
|
||||
,:fresnel_offset
|
||||
,:refract_scale_above
|
||||
,:refract_scale_below
|
||||
,:blur_multiplier
|
||||
,:big_wave_direction_x
|
||||
,:big_wave_direction_y
|
||||
,:little_wave_direction_x
|
||||
,:little_wave_direction_y
|
||||
,:normal_map_texture
|
||||
,:horizon_r
|
||||
,:horizon_g
|
||||
,:horizon_b
|
||||
,:horizon_i
|
||||
,:haze_horizon
|
||||
,:blue_density_r
|
||||
,:blue_density_g
|
||||
,:blue_density_b
|
||||
,:blue_density_i
|
||||
,:haze_density
|
||||
,:density_multiplier
|
||||
,:distance_multiplier
|
||||
,:max_altitude
|
||||
,:sun_moon_color_r
|
||||
,:sun_moon_color_g
|
||||
,:sun_moon_color_b
|
||||
,:sun_moon_color_i
|
||||
,:sun_moon_position
|
||||
,:ambient_r
|
||||
,:ambient_g
|
||||
,:ambient_b
|
||||
,:ambient_i
|
||||
,:east_angle
|
||||
,:sun_glow_focus
|
||||
,:sun_glow_size
|
||||
,:scene_gamma
|
||||
,:star_brightness
|
||||
,:cloud_color_r
|
||||
,:cloud_color_g
|
||||
,:cloud_color_b
|
||||
,:cloud_color_i
|
||||
,:cloud_x
|
||||
,:cloud_y
|
||||
,:cloud_density
|
||||
,:cloud_coverage
|
||||
,:cloud_scale
|
||||
,:cloud_detail_x
|
||||
,:cloud_detail_y
|
||||
,:cloud_detail_density
|
||||
,:cloud_scroll_x
|
||||
,:cloud_scroll_x_lock
|
||||
,:cloud_scroll_y
|
||||
,:cloud_scroll_y_lock
|
||||
,:draw_classic_clouds);";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
{
|
||||
conn.Open();
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.Add(_Database.CreateParameter("region_id", wl.regionID.ToString()));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("water_color_r", wl.waterColor.X));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("water_color_g", wl.waterColor.Y));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("water_color_b", wl.waterColor.Z));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("water_fog_density_exponent", wl.waterFogDensityExponent));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("underwater_fog_modifier", wl.underwaterFogModifier));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("reflection_wavelet_scale_1", wl.reflectionWaveletScale.X));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("reflection_wavelet_scale_2", wl.reflectionWaveletScale.Y));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("reflection_wavelet_scale_3", wl.reflectionWaveletScale.Z));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("fresnel_scale", wl.fresnelScale));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("fresnel_offset", wl.fresnelOffset));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("refract_scale_above", wl.refractScaleAbove));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("refract_scale_below", wl.refractScaleBelow));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("blur_multiplier", wl.blurMultiplier));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("big_wave_direction_x", wl.bigWaveDirection.X));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("big_wave_direction_y", wl.bigWaveDirection.Y));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("little_wave_direction_x", wl.littleWaveDirection.X));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("little_wave_direction_y", wl.littleWaveDirection.Y));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("normal_map_texture", wl.normalMapTexture.ToString()));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("horizon_r", wl.horizon.X));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("horizon_g", wl.horizon.Y));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("horizon_b", wl.horizon.Z));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("horizon_i", wl.horizon.W));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("haze_horizon", wl.hazeHorizon));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("blue_density_r", wl.blueDensity.X));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("blue_density_g", wl.blueDensity.Y));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("blue_density_b", wl.blueDensity.Z));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("blue_density_i", wl.blueDensity.W));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("haze_density", wl.hazeDensity));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("density_multiplier", wl.densityMultiplier));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("distance_multiplier", wl.distanceMultiplier));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("max_altitude", wl.maxAltitude));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("sun_moon_color_r", wl.sunMoonColor.X));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("sun_moon_color_g", wl.sunMoonColor.Y));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("sun_moon_color_b", wl.sunMoonColor.Z));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("sun_moon_color_i", wl.sunMoonColor.W));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("sun_moon_position", wl.sunMoonPosition));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("ambient_r", wl.ambient.X));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("ambient_g", wl.ambient.Y));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("ambient_b", wl.ambient.Z));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("ambient_i", wl.ambient.W));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("east_angle", wl.eastAngle));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("sun_glow_focus", wl.sunGlowFocus));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("sun_glow_size", wl.sunGlowSize));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("scene_gamma", wl.sceneGamma));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("star_brightness", wl.starBrightness));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("cloud_color_r", wl.cloudColor.X));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("cloud_color_g", wl.cloudColor.Y));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("cloud_color_b", wl.cloudColor.Z));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("cloud_color_i", wl.cloudColor.W));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("cloud_x", wl.cloudXYDensity.X));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("cloud_y", wl.cloudXYDensity.Y));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("cloud_density", wl.cloudXYDensity.Z));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("cloud_coverage", wl.cloudCoverage));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("cloud_scale", wl.cloudScale));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("cloud_detail_x", wl.cloudDetailXYDensity.X));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("cloud_detail_y", wl.cloudDetailXYDensity.Y));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("cloud_detail_density", wl.cloudDetailXYDensity.Z));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("cloud_scroll_x", wl.cloudScrollX));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("cloud_scroll_x_lock", wl.cloudScrollXLock));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("cloud_scroll_y", wl.cloudScrollY));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("cloud_scroll_y_lock", wl.cloudScrollYLock));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("draw_classic_clouds", wl.drawClassicClouds));
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
#region update
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// // sql update
|
||||
// sql = @"UPDATE [OpenSim].[dbo].[regionwindlight]
|
||||
// SET [region_id] = @region_id
|
||||
// ,[water_color_r] = @water_color_r
|
||||
// ,[water_color_g] = @water_color_g
|
||||
// ,[water_color_b] = @water_color_b
|
||||
// ,[water_fog_density_exponent] = @water_fog_density_exponent
|
||||
// ,[underwater_fog_modifier] = @underwater_fog_modifier
|
||||
// ,[reflection_wavelet_scale_1] = @reflection_wavelet_scale_1
|
||||
// ,[reflection_wavelet_scale_2] = @reflection_wavelet_scale_2
|
||||
// ,[reflection_wavelet_scale_3] = @reflection_wavelet_scale_3
|
||||
// ,[fresnel_scale] = @fresnel_scale
|
||||
// ,[fresnel_offset] = @fresnel_offset
|
||||
// ,[refract_scale_above] = @refract_scale_above
|
||||
// ,[refract_scale_below] = @refract_scale_below
|
||||
// ,[blur_multiplier] = @blur_multiplier
|
||||
// ,[big_wave_direction_x] = @big_wave_direction_x
|
||||
// ,[big_wave_direction_y] = @big_wave_direction_y
|
||||
// ,[little_wave_direction_x] = @little_wave_direction_x
|
||||
// ,[little_wave_direction_y] = @little_wave_direction_y
|
||||
// ,[normal_map_texture] = @normal_map_texture
|
||||
// ,[horizon_r] = @horizon_r
|
||||
// ,[horizon_g] = @horizon_g
|
||||
// ,[horizon_b] = @horizon_b
|
||||
// ,[horizon_i] = @horizon_i
|
||||
// ,[haze_horizon] = @haze_horizon
|
||||
// ,[blue_density_r] = @blue_density_r
|
||||
// ,[blue_density_g] = @blue_density_g
|
||||
// ,[blue_density_b] = @blue_density_b
|
||||
// ,[blue_density_i] = @blue_density_i
|
||||
// ,[haze_density] = @haze_density
|
||||
// ,[density_multiplier] = @density_multiplier
|
||||
// ,[distance_multiplier] = @distance_multiplier
|
||||
// ,[max_altitude] = @max_altitude
|
||||
// ,[sun_moon_color_r] = @sun_moon_color_r
|
||||
// ,[sun_moon_color_g] = @sun_moon_color_g
|
||||
// ,[sun_moon_color_b] = @sun_moon_color_b
|
||||
// ,[sun_moon_color_i] = @sun_moon_color_i
|
||||
// ,[sun_moon_position] = @sun_moon_position
|
||||
// ,[ambient_r] = @ambient_r
|
||||
// ,[ambient_g] = @ambient_g
|
||||
// ,[ambient_b] = @ambient_b
|
||||
// ,[ambient_i] = @ambient_i
|
||||
// ,[east_angle] = @east_angle
|
||||
// ,[sun_glow_focus] = @sun_glow_focus
|
||||
// ,[sun_glow_size] = @sun_glow_size
|
||||
// ,[scene_gamma] = @scene_gamma
|
||||
// ,[star_brightness] = @star_brightness
|
||||
// ,[cloud_color_r] = @cloud_color_r
|
||||
// ,[cloud_color_g] = @cloud_color_g
|
||||
// ,[cloud_color_b] = @cloud_color_b
|
||||
// ,[cloud_color_i] = @cloud_color_i
|
||||
// ,[cloud_x] = @cloud_x
|
||||
// ,[cloud_y] = @cloud_y
|
||||
// ,[cloud_density] = @cloud_density
|
||||
// ,[cloud_coverage] = @cloud_coverage
|
||||
// ,[cloud_scale] = @cloud_scale
|
||||
// ,[cloud_detail_x] = @cloud_detail_x
|
||||
// ,[cloud_detail_y] = @cloud_detail_y
|
||||
// ,[cloud_detail_density] = @cloud_detail_density
|
||||
// ,[cloud_scroll_x] = @cloud_scroll_x
|
||||
// ,[cloud_scroll_x_lock] = @cloud_scroll_x_lock
|
||||
// ,[cloud_scroll_y] = @cloud_scroll_y
|
||||
// ,[cloud_scroll_y_lock] = @cloud_scroll_y_lock
|
||||
// ,[draw_classic_clouds] = @draw_classic_clouds
|
||||
// WHERE region_id = @region_id";
|
||||
// using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||
// {
|
||||
// conn.Open();
|
||||
// using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||
// {
|
||||
// cmd.Parameters.AddWithValue("region_id", wl.regionID);
|
||||
// cmd.Parameters.AddWithValue("water_color_r", wl.waterColor.X);
|
||||
// cmd.Parameters.AddWithValue("water_color_g", wl.waterColor.Y);
|
||||
// cmd.Parameters.AddWithValue("water_color_b", wl.waterColor.Z);
|
||||
// cmd.Parameters.AddWithValue("water_fog_density_exponent", wl.waterFogDensityExponent);
|
||||
// cmd.Parameters.AddWithValue("underwater_fog_modifier", wl.underwaterFogModifier);
|
||||
// cmd.Parameters.AddWithValue("reflection_wavelet_scale_1", wl.reflectionWaveletScale.X);
|
||||
// cmd.Parameters.AddWithValue("reflection_wavelet_scale_2", wl.reflectionWaveletScale.Y);
|
||||
// cmd.Parameters.AddWithValue("reflection_wavelet_scale_3", wl.reflectionWaveletScale.Z);
|
||||
// cmd.Parameters.AddWithValue("fresnel_scale", wl.fresnelScale);
|
||||
// cmd.Parameters.AddWithValue("fresnel_offset", wl.fresnelOffset);
|
||||
// cmd.Parameters.AddWithValue("refract_scale_above", wl.refractScaleAbove);
|
||||
// cmd.Parameters.AddWithValue("refract_scale_below", wl.refractScaleBelow);
|
||||
// cmd.Parameters.AddWithValue("blur_multiplier", wl.blurMultiplier);
|
||||
// cmd.Parameters.AddWithValue("big_wave_direction_x", wl.bigWaveDirection.X);
|
||||
// cmd.Parameters.AddWithValue("big_wave_direction_y", wl.bigWaveDirection.Y);
|
||||
// cmd.Parameters.AddWithValue("little_wave_direction_x", wl.littleWaveDirection.X);
|
||||
// cmd.Parameters.AddWithValue("little_wave_direction_y", wl.littleWaveDirection.Y);
|
||||
// cmd.Parameters.AddWithValue("normal_map_texture", wl.normalMapTexture);
|
||||
// cmd.Parameters.AddWithValue("horizon_r", wl.horizon.X);
|
||||
// cmd.Parameters.AddWithValue("horizon_g", wl.horizon.Y);
|
||||
// cmd.Parameters.AddWithValue("horizon_b", wl.horizon.Z);
|
||||
// cmd.Parameters.AddWithValue("horizon_i", wl.horizon.W);
|
||||
// cmd.Parameters.AddWithValue("haze_horizon", wl.hazeHorizon);
|
||||
// cmd.Parameters.AddWithValue("blue_density_r", wl.blueDensity.X);
|
||||
// cmd.Parameters.AddWithValue("blue_density_g", wl.blueDensity.Y);
|
||||
// cmd.Parameters.AddWithValue("blue_density_b", wl.blueDensity.Z);
|
||||
// cmd.Parameters.AddWithValue("blue_density_i", wl.blueDensity.W);
|
||||
// cmd.Parameters.AddWithValue("haze_density", wl.hazeDensity);
|
||||
// cmd.Parameters.AddWithValue("density_multiplier", wl.densityMultiplier);
|
||||
// cmd.Parameters.AddWithValue("distance_multiplier", wl.distanceMultiplier);
|
||||
// cmd.Parameters.AddWithValue("max_altitude", wl.maxAltitude);
|
||||
// cmd.Parameters.AddWithValue("sun_moon_color_r", wl.sunMoonColor.X);
|
||||
// cmd.Parameters.AddWithValue("sun_moon_color_g", wl.sunMoonColor.Y);
|
||||
// cmd.Parameters.AddWithValue("sun_moon_color_b", wl.sunMoonColor.Z);
|
||||
// cmd.Parameters.AddWithValue("sun_moon_color_i", wl.sunMoonColor.W);
|
||||
// cmd.Parameters.AddWithValue("sun_moon_position", wl.sunMoonPosition);
|
||||
// cmd.Parameters.AddWithValue("ambient_r", wl.ambient.X);
|
||||
// cmd.Parameters.AddWithValue("ambient_g", wl.ambient.Y);
|
||||
// cmd.Parameters.AddWithValue("ambient_b", wl.ambient.Z);
|
||||
// cmd.Parameters.AddWithValue("ambient_i", wl.ambient.W);
|
||||
// cmd.Parameters.AddWithValue("east_angle", wl.eastAngle);
|
||||
// cmd.Parameters.AddWithValue("sun_glow_focus", wl.sunGlowFocus);
|
||||
// cmd.Parameters.AddWithValue("sun_glow_size", wl.sunGlowSize);
|
||||
// cmd.Parameters.AddWithValue("scene_gamma", wl.sceneGamma);
|
||||
// cmd.Parameters.AddWithValue("star_brightness", wl.starBrightness);
|
||||
// cmd.Parameters.AddWithValue("cloud_color_r", wl.cloudColor.X);
|
||||
// cmd.Parameters.AddWithValue("cloud_color_g", wl.cloudColor.Y);
|
||||
// cmd.Parameters.AddWithValue("cloud_color_b", wl.cloudColor.Z);
|
||||
// cmd.Parameters.AddWithValue("cloud_color_i", wl.cloudColor.W);
|
||||
// cmd.Parameters.AddWithValue("cloud_x", wl.cloudXYDensity.X);
|
||||
// cmd.Parameters.AddWithValue("cloud_y", wl.cloudXYDensity.Y);
|
||||
// cmd.Parameters.AddWithValue("cloud_density", wl.cloudXYDensity.Z);
|
||||
// cmd.Parameters.AddWithValue("cloud_coverage", wl.cloudCoverage);
|
||||
// cmd.Parameters.AddWithValue("cloud_scale", wl.cloudScale);
|
||||
// cmd.Parameters.AddWithValue("cloud_detail_x", wl.cloudDetailXYDensity.X);
|
||||
// cmd.Parameters.AddWithValue("cloud_detail_y", wl.cloudDetailXYDensity.Y);
|
||||
// cmd.Parameters.AddWithValue("cloud_detail_density", wl.cloudDetailXYDensity.Z);
|
||||
// cmd.Parameters.AddWithValue("cloud_scroll_x", wl.cloudScrollX);
|
||||
// cmd.Parameters.AddWithValue("cloud_scroll_x_lock", wl.cloudScrollXLock);
|
||||
// cmd.Parameters.AddWithValue("cloud_scroll_y", wl.cloudScrollY);
|
||||
// cmd.Parameters.AddWithValue("cloud_scroll_y_lock", wl.cloudScrollYLock);
|
||||
// cmd.Parameters.AddWithValue("draw_classic_clouds", wl.drawClassicClouds);
|
||||
|
||||
// cmd.ExecuteNonQuery();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
#endregion
|
||||
}
|
||||
|
||||
#region Environment Settings
|
||||
public string LoadRegionEnvironmentSettings(UUID regionUUID)
|
||||
|
@ -1431,7 +966,7 @@ namespace OpenSim.Data.PGSQL
|
|||
,terrain_lower_limit = :terrain_lower_limit ,use_estate_sun = :use_estate_sun ,fixed_sun = :fixed_sun ,sun_position = :sun_position
|
||||
,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, ""map_tile_ID"" = :TerrainImageID,
|
||||
""TelehubObject"" = :telehubobject, ""parcel_tile_ID"" = :ParcelImageID
|
||||
""TelehubObject"" = :telehubobject, ""parcel_tile_ID"" = :ParcelImageID, ""cacheID"" = :cacheID
|
||||
WHERE ""regionUUID"" = :regionUUID";
|
||||
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
|
||||
|
@ -1546,6 +1081,8 @@ namespace OpenSim.Data.PGSQL
|
|||
newSettings.ParcelImageID = new UUID((Guid)row["parcel_tile_ID"]);
|
||||
newSettings.TelehubObject = new UUID((Guid)row["TelehubObject"]);
|
||||
|
||||
if (!(row["cacheID"] is DBNull))
|
||||
newSettings.CacheID = new UUID((Guid)row["cacheID"]);
|
||||
return newSettings;
|
||||
}
|
||||
|
||||
|
@ -1601,7 +1138,6 @@ namespace OpenSim.Data.PGSQL
|
|||
newData.OtherCleanTime = Convert.ToInt32(row["OtherCleanTime"]);
|
||||
newData.Dwell = Convert.ToSingle(row["Dwell"]);
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
newData.UserLocation =
|
||||
|
@ -1631,6 +1167,35 @@ namespace OpenSim.Data.PGSQL
|
|||
newData.AnyAVSounds = Convert.ToBoolean(row["AnyAVSounds"]);
|
||||
newData.GroupAVSounds = Convert.ToBoolean(row["GroupAVSounds"]);
|
||||
|
||||
if (row["environment"] is DBNull)
|
||||
{
|
||||
newData.Environment = null;
|
||||
newData.EnvironmentVersion = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
string env = (string)row["environment"];
|
||||
if (string.IsNullOrEmpty(env))
|
||||
{
|
||||
newData.Environment = null;
|
||||
newData.EnvironmentVersion = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
ViewerEnvironment VEnv = ViewerEnvironment.FromOSDString(env);
|
||||
newData.Environment = VEnv;
|
||||
newData.EnvironmentVersion = VEnv.version;
|
||||
}
|
||||
catch
|
||||
{
|
||||
newData.Environment = null;
|
||||
newData.EnvironmentVersion = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return newData;
|
||||
}
|
||||
|
||||
|
@ -1678,6 +1243,12 @@ namespace OpenSim.Data.PGSQL
|
|||
prim.OwnerID = new UUID((Guid)primRow["OwnerID"]);
|
||||
prim.GroupID = new UUID((Guid)primRow["GroupID"]);
|
||||
prim.LastOwnerID = new UUID((Guid)primRow["LastOwnerID"]);
|
||||
|
||||
if (primRow["RezzerID"] != DBNull.Value)
|
||||
prim.RezzerID = new UUID((Guid)primRow["RezzerID"]);
|
||||
else
|
||||
prim.RezzerID = UUID.Zero;
|
||||
|
||||
prim.OwnerMask = Convert.ToUInt32(primRow["OwnerMask"]);
|
||||
prim.NextOwnerMask = Convert.ToUInt32(primRow["NextOwnerMask"]);
|
||||
prim.GroupMask = Convert.ToUInt32(primRow["GroupMask"]);
|
||||
|
@ -1685,9 +1256,9 @@ namespace OpenSim.Data.PGSQL
|
|||
prim.BaseMask = Convert.ToUInt32(primRow["BaseMask"]);
|
||||
// vectors
|
||||
prim.OffsetPosition = new Vector3(
|
||||
Convert.ToSingle(primRow["PositionX"]),
|
||||
Convert.ToSingle(primRow["PositionY"]),
|
||||
Convert.ToSingle(primRow["PositionZ"]));
|
||||
Convert.ToSingle(primRow["PositionX"]),
|
||||
Convert.ToSingle(primRow["PositionY"]),
|
||||
Convert.ToSingle(primRow["PositionZ"]));
|
||||
|
||||
prim.GroupPosition = new Vector3(
|
||||
Convert.ToSingle(primRow["GroupPositionX"]),
|
||||
|
@ -1700,9 +1271,9 @@ namespace OpenSim.Data.PGSQL
|
|||
Convert.ToSingle(primRow["VelocityZ"]));
|
||||
|
||||
prim.AngularVelocity = new Vector3(
|
||||
Convert.ToSingle(primRow["AngularVelocityX"]),
|
||||
Convert.ToSingle(primRow["AngularVelocityY"]),
|
||||
Convert.ToSingle(primRow["AngularVelocityZ"]));
|
||||
Convert.ToSingle(primRow["AngularVelocityX"]),
|
||||
Convert.ToSingle(primRow["AngularVelocityY"]),
|
||||
Convert.ToSingle(primRow["AngularVelocityZ"]));
|
||||
|
||||
prim.Acceleration = new Vector3(
|
||||
Convert.ToSingle(primRow["AccelerationX"]),
|
||||
|
@ -1721,12 +1292,20 @@ namespace OpenSim.Data.PGSQL
|
|||
Convert.ToSingle(primRow["SitTargetOffsetY"]),
|
||||
Convert.ToSingle(primRow["SitTargetOffsetZ"]));
|
||||
|
||||
|
||||
prim.SitTargetOrientationLL = new Quaternion(
|
||||
Convert.ToSingle(primRow["SitTargetOrientX"]),
|
||||
Convert.ToSingle(primRow["SitTargetOrientY"]),
|
||||
Convert.ToSingle(primRow["SitTargetOrientZ"]),
|
||||
Convert.ToSingle(primRow["SitTargetOrientW"]));
|
||||
|
||||
prim.StandOffset = new Vector3(
|
||||
Convert.ToSingle(primRow["standtargetx"]),
|
||||
Convert.ToSingle(primRow["standtargety"]),
|
||||
Convert.ToSingle(primRow["standtargetz"]));
|
||||
|
||||
prim.SitActiveRange = Convert.ToSingle(primRow["sitactrange"]);
|
||||
|
||||
prim.PayPrice[0] = Convert.ToInt32(primRow["PayPrice"]);
|
||||
prim.PayPrice[1] = Convert.ToInt32(primRow["PayButton1"]);
|
||||
prim.PayPrice[2] = Convert.ToInt32(primRow["PayButton2"]);
|
||||
|
@ -1735,7 +1314,10 @@ namespace OpenSim.Data.PGSQL
|
|||
|
||||
prim.Sound = new UUID((Guid)primRow["LoopedSound"]);
|
||||
prim.SoundGain = Convert.ToSingle(primRow["LoopedSoundGain"]);
|
||||
prim.SoundFlags = 1; // If it's persisted at all, it's looped
|
||||
if (prim.Sound != UUID.Zero)
|
||||
prim.SoundFlags = 1; // If it's persisted at all, it's looped
|
||||
else
|
||||
prim.SoundFlags = 0;
|
||||
|
||||
if (!(primRow["TextureAnimation"] is DBNull))
|
||||
prim.TextureAnimation = (Byte[])primRow["TextureAnimation"];
|
||||
|
@ -1782,6 +1364,7 @@ namespace OpenSim.Data.PGSQL
|
|||
prim.CollisionSoundVolume = Convert.ToSingle(primRow["CollisionSoundVolume"]);
|
||||
|
||||
prim.PassTouches = (bool)primRow["PassTouches"];
|
||||
prim.PassCollisions = (bool)primRow["PassCollisions"];
|
||||
|
||||
if (!(primRow["MediaURL"] is System.DBNull))
|
||||
prim.MediaUrl = (string)primRow["MediaURL"];
|
||||
|
@ -1789,13 +1372,31 @@ namespace OpenSim.Data.PGSQL
|
|||
if (!(primRow["DynAttrs"] is System.DBNull) && (string)primRow["DynAttrs"] != "")
|
||||
prim.DynAttrs = DAMap.FromXml((string)primRow["DynAttrs"]);
|
||||
else
|
||||
prim.DynAttrs = new DAMap();
|
||||
prim.DynAttrs = null;
|
||||
|
||||
prim.PhysicsShapeType = Convert.ToByte(primRow["PhysicsShapeType"]);
|
||||
prim.Density = Convert.ToSingle(primRow["Density"]);
|
||||
prim.GravityModifier = Convert.ToSingle(primRow["GravityModifier"]);
|
||||
prim.Friction = Convert.ToSingle(primRow["Friction"]);
|
||||
prim.Restitution = Convert.ToSingle(primRow["Restitution"]);
|
||||
prim.RotationAxisLocks = Convert.ToByte(primRow["RotationAxisLocks"]);
|
||||
|
||||
SOPVehicle vehicle = null;
|
||||
if (!(primRow["Vehicle"] is System.DBNull))
|
||||
{
|
||||
vehicle = SOPVehicle.FromXml2(primRow["Vehicle"].ToString());
|
||||
if (vehicle != null)
|
||||
prim.VehicleParams = vehicle;
|
||||
}
|
||||
|
||||
PhysicsInertiaData pdata = null;
|
||||
if (!(primRow["PhysInertia"] is System.DBNull))
|
||||
pdata = PhysicsInertiaData.FromXml2(primRow["PhysInertia"].ToString());
|
||||
prim.PhysicsInertia = pdata;
|
||||
|
||||
int pseudocrc = Convert.ToInt32(primRow["pseudocrc"]);
|
||||
if(pseudocrc != 0)
|
||||
prim.PseudoCRC = pseudocrc;
|
||||
|
||||
return prim;
|
||||
}
|
||||
|
@ -1983,6 +1584,8 @@ namespace OpenSim.Data.PGSQL
|
|||
parameters.Add(_Database.CreateParameter("ParcelImageID", settings.ParcelImageID));
|
||||
parameters.Add(_Database.CreateParameter("TelehubObject", settings.TelehubObject));
|
||||
|
||||
parameters.Add(_Database.CreateParameter("cacheID", settings.CacheID));
|
||||
|
||||
return parameters.ToArray();
|
||||
}
|
||||
|
||||
|
@ -2044,6 +1647,20 @@ namespace OpenSim.Data.PGSQL
|
|||
parameters.Add(_Database.CreateParameter("AnyAVSounds", land.AnyAVSounds));
|
||||
parameters.Add(_Database.CreateParameter("GroupAVSounds", land.GroupAVSounds));
|
||||
|
||||
if (land.Environment == null)
|
||||
parameters.Add(_Database.CreateParameter("environment", ""));
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
parameters.Add(_Database.CreateParameter("environment", ViewerEnvironment.ToOSDString(land.Environment)));
|
||||
}
|
||||
catch
|
||||
{
|
||||
parameters.Add(_Database.CreateParameter("environment", ""));
|
||||
}
|
||||
}
|
||||
|
||||
return parameters.ToArray();
|
||||
}
|
||||
|
||||
|
@ -2097,6 +1714,7 @@ namespace OpenSim.Data.PGSQL
|
|||
parameters.Add(_Database.CreateParameter("OwnerID", prim.OwnerID));
|
||||
parameters.Add(_Database.CreateParameter("GroupID", prim.GroupID));
|
||||
parameters.Add(_Database.CreateParameter("LastOwnerID", prim.LastOwnerID));
|
||||
parameters.Add(_Database.CreateParameter("RezzerID", prim.RezzerID));
|
||||
parameters.Add(_Database.CreateParameter("OwnerMask", prim.OwnerMask));
|
||||
parameters.Add(_Database.CreateParameter("NextOwnerMask", prim.NextOwnerMask));
|
||||
parameters.Add(_Database.CreateParameter("GroupMask", prim.GroupMask));
|
||||
|
@ -2136,6 +1754,13 @@ namespace OpenSim.Data.PGSQL
|
|||
parameters.Add(_Database.CreateParameter("SitTargetOrientY", sitTargetOrient.Y));
|
||||
parameters.Add(_Database.CreateParameter("SitTargetOrientZ", sitTargetOrient.Z));
|
||||
|
||||
Vector3 standTargetPos = prim.StandOffset;
|
||||
parameters.Add(_Database.CreateParameter("standtargetx", standTargetPos.X));
|
||||
parameters.Add(_Database.CreateParameter("standtargety", standTargetPos.Y));
|
||||
parameters.Add(_Database.CreateParameter("standtargetz", standTargetPos.Z));
|
||||
|
||||
parameters.Add(_Database.CreateParameter("sitactrange", prim.SitActiveRange));
|
||||
|
||||
parameters.Add(_Database.CreateParameter("PayPrice", prim.PayPrice[0]));
|
||||
parameters.Add(_Database.CreateParameter("PayButton1", prim.PayPrice[1]));
|
||||
parameters.Add(_Database.CreateParameter("PayButton2", prim.PayPrice[2]));
|
||||
|
@ -2196,12 +1821,33 @@ namespace OpenSim.Data.PGSQL
|
|||
parameters.Add(_Database.CreateParameter("CollisionSound", prim.CollisionSound));
|
||||
parameters.Add(_Database.CreateParameter("CollisionSoundVolume", prim.CollisionSoundVolume));
|
||||
|
||||
parameters.Add(_Database.CreateParameter("PassTouches", prim.PassTouches));
|
||||
parameters.Add(_Database.CreateParameter("PassTouches", (bool)prim.PassTouches));
|
||||
parameters.Add(_Database.CreateParameter("PassCollisions", (bool)prim.PassCollisions));
|
||||
|
||||
if (prim.PassTouches)
|
||||
parameters.Add(_Database.CreateParameter("PassTouches", true));
|
||||
else
|
||||
parameters.Add(_Database.CreateParameter("PassTouches", false));
|
||||
|
||||
if (prim.PassCollisions)
|
||||
parameters.Add(_Database.CreateParameter("PassCollisions", true));
|
||||
else
|
||||
parameters.Add(_Database.CreateParameter("PassCollisions", false));
|
||||
|
||||
parameters.Add(_Database.CreateParameter("LinkNumber", prim.LinkNum));
|
||||
parameters.Add(_Database.CreateParameter("MediaURL", prim.MediaUrl));
|
||||
|
||||
if (prim.DynAttrs.CountNamespaces > 0)
|
||||
if (prim.VehicleParams != null)
|
||||
parameters.Add(_Database.CreateParameter("Vehicle", prim.VehicleParams.ToXml2()));
|
||||
else
|
||||
parameters.Add(_Database.CreateParameter("Vehicle", String.Empty));
|
||||
|
||||
if (prim.PhysicsInertia != null)
|
||||
parameters.Add(_Database.CreateParameter("PhysInertia", prim.PhysicsInertia.ToXml2()));
|
||||
else
|
||||
parameters.Add(_Database.CreateParameter("PhysInertia", String.Empty));
|
||||
|
||||
if (prim.DynAttrs != null && prim.DynAttrs.CountNamespaces > 0)
|
||||
parameters.Add(_Database.CreateParameter("DynAttrs", prim.DynAttrs.ToXml()));
|
||||
else
|
||||
parameters.Add(_Database.CreateParameter("DynAttrs", null));
|
||||
|
@ -2211,12 +1857,15 @@ namespace OpenSim.Data.PGSQL
|
|||
parameters.Add(_Database.CreateParameter("GravityModifier", (double)prim.GravityModifier));
|
||||
parameters.Add(_Database.CreateParameter("Friction", (double)prim.Friction));
|
||||
parameters.Add(_Database.CreateParameter("Restitution", (double)prim.Restitution));
|
||||
parameters.Add(_Database.CreateParameter("RotationAxisLocks", prim.RotationAxisLocks));
|
||||
|
||||
parameters.Add(_Database.CreateParameter("pseudocrc", prim.PseudoCRC));
|
||||
|
||||
return parameters.ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates the primshape parameters for stroing in DB.
|
||||
/// Creates the primshape parameters for storing in DB.
|
||||
/// </summary>
|
||||
/// <param name="prim">Basic data of SceneObjectpart prim.</param>
|
||||
/// <param name="sceneGroupID">The scene group ID.</param>
|
||||
|
|
|
@ -845,7 +845,7 @@ namespace OpenSim.Data.PGSQL
|
|||
|
||||
query = "SELECT \"profileImage\", \"profileFirstImage\" FROM \"userprofile\" WHERE \"useruuid\" = :Id";
|
||||
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(string.Format(query, "\"userpicks\""), dbcon))
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
|
||||
{
|
||||
cmd.Parameters.Add(m_database.CreateParameter("Id", avatarId));
|
||||
|
||||
|
|
|
@ -173,16 +173,18 @@ namespace OpenSim.Data.PGSQL
|
|||
|
||||
if (m_enableCompression)
|
||||
{
|
||||
using (GZipStream decompressionStream = new GZipStream(new MemoryStream(asset.Data), CompressionMode.Decompress))
|
||||
using(MemoryStream ms = new MemoryStream(asset.Data))
|
||||
using(GZipStream decompressionStream = new GZipStream(ms, CompressionMode.Decompress))
|
||||
{
|
||||
MemoryStream outputStream = new MemoryStream();
|
||||
WebUtil.CopyStream(decompressionStream, outputStream, int.MaxValue);
|
||||
// int compressedLength = asset.Data.Length;
|
||||
asset.Data = outputStream.ToArray();
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[XASSET DB]: Decompressed {0} {1} to {2} bytes from {3}",
|
||||
// asset.ID, asset.Name, asset.Data.Length, compressedLength);
|
||||
using(MemoryStream outputStream = new MemoryStream())
|
||||
{
|
||||
decompressionStream.CopyTo(outputStream,int.MaxValue);
|
||||
// int compressedLength = asset.Data.Length;
|
||||
asset.Data = outputStream.ToArray();
|
||||
}
|
||||
// m_log.DebugFormat(
|
||||
// "[XASSET DB]: Decompressed {0} {1} to {2} bytes from {3}",
|
||||
// asset.ID, asset.Name, asset.Data.Length, compressedLength);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -206,7 +206,7 @@ namespace OpenSim.Data.PGSQL
|
|||
cmd.CommandText = String.Format(@"select bit_or(""inventoryCurrentPermissions"") as ""inventoryCurrentPermissions""
|
||||
from inventoryitems
|
||||
where ""avatarID""::uuid = :PrincipalID
|
||||
and ""assetID"" = :AssetID
|
||||
and ""assetID""::uuid = :AssetID
|
||||
group by ""assetID"" ");
|
||||
|
||||
cmd.Parameters.Add(m_database.CreateParameter("PrincipalID", principalID));
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
:VERSION 1
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "public"."agentprefs" (
|
||||
"PrincipalID" uuid NOT NULL,
|
||||
"AccessPrefs" char(2) NOT NULL DEFAULT 'M'::bpchar COLLATE "default",
|
||||
"HoverHeight" float8 NOT NULL DEFAULT 0,
|
||||
"Language" char(5) NOT NULL DEFAULT 'en-us'::bpchar COLLATE "default",
|
||||
"LanguageIsPublic" bool NOT NULL DEFAULT true,
|
||||
"PermEveryone" int4 NOT NULL DEFAULT 0,
|
||||
"PermGroup" int4 NOT NULL DEFAULT 0,
|
||||
"PermNextOwner" int4 NOT NULL DEFAULT 532480
|
||||
)
|
||||
WITH (OIDS=FALSE);
|
||||
|
||||
ALTER TABLE "public"."agentprefs" ADD PRIMARY KEY ("PrincipalID") NOT DEFERRABLE INITIALLY IMMEDIATE;
|
||||
|
||||
COMMIT;
|
|
@ -1,307 +1,141 @@
|
|||
:VERSION 1
|
||||
:VERSION 12
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE estate_managers(
|
||||
"EstateID" int NOT NULL Primary Key,
|
||||
uuid varchar(36) NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE estate_groups(
|
||||
"EstateID" int NOT NULL,
|
||||
uuid varchar(36) NOT NULL
|
||||
);
|
||||
-- ----------------------------
|
||||
-- Table structure for estate_groups
|
||||
-- ----------------------------
|
||||
CREATE TABLE IF NOT EXISTS "public"."estate_groups" (
|
||||
"EstateID" int4 NOT NULL,
|
||||
"uuid" uuid NOT NULL
|
||||
)
|
||||
WITH (OIDS=FALSE);
|
||||
|
||||
-- Indexes structure for table estate_groups
|
||||
-- ----------------------------
|
||||
CREATE INDEX IF NOT EXISTS "ix_estate_groups" ON "public"."estate_groups" USING btree("EstateID" "pg_catalog"."int4_ops" ASC NULLS LAST);
|
||||
|
||||
CREATE TABLE estate_users(
|
||||
"EstateID" int NOT NULL,
|
||||
uuid varchar(36) NOT NULL
|
||||
);
|
||||
-- ----------------------------
|
||||
-- Table structure for estate_managers
|
||||
-- ----------------------------
|
||||
CREATE TABLE IF NOT EXISTS "public"."estate_managers" (
|
||||
"EstateID" int4 NOT NULL,
|
||||
"uuid" uuid NOT NULL
|
||||
)
|
||||
WITH (OIDS=FALSE);
|
||||
|
||||
-- Indexes structure for table estate_managers
|
||||
-- ----------------------------
|
||||
CREATE INDEX IF NOT EXISTS "ix_estate_managers" ON "public"."estate_managers" USING btree("EstateID" "pg_catalog"."int4_ops" ASC NULLS LAST);
|
||||
|
||||
CREATE TABLE estateban(
|
||||
"EstateID" int NOT NULL,
|
||||
"bannedUUID" varchar(36) NOT NULL,
|
||||
"bannedIp" varchar(16) NOT NULL,
|
||||
"bannedIpHostMask" varchar(16) NOT NULL,
|
||||
"bannedNameMask" varchar(64) NULL DEFAULT NULL
|
||||
);
|
||||
-- ----------------------------
|
||||
-- Table structure for estate_map
|
||||
-- ----------------------------
|
||||
CREATE TABLE IF NOT EXISTS "public"."estate_map" (
|
||||
"RegionID" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'::uuid,
|
||||
"EstateID" int4 NOT NULL
|
||||
)
|
||||
WITH (OIDS=FALSE);
|
||||
|
||||
Create Sequence estate_settings_id increment by 100 start with 100;
|
||||
-- Primary key structure for table estate_map
|
||||
-- ----------------------------
|
||||
ALTER TABLE "public"."estate_map" ADD PRIMARY KEY ("RegionID") NOT DEFERRABLE INITIALLY IMMEDIATE;
|
||||
|
||||
CREATE TABLE estate_settings(
|
||||
"EstateID" integer DEFAULT nextval('estate_settings_id') NOT NULL,
|
||||
"EstateName" varchar(64) NULL DEFAULT (NULL),
|
||||
"AbuseEmailToEstateOwner" boolean NOT NULL,
|
||||
"DenyAnonymous" boolean NOT NULL,
|
||||
"ResetHomeOnTeleport" boolean NOT NULL,
|
||||
"FixedSun" boolean NOT NULL,
|
||||
"DenyTransacted" boolean NOT NULL,
|
||||
"BlockDwell" boolean NOT NULL,
|
||||
"DenyIdentified" boolean NOT NULL,
|
||||
"AllowVoice" boolean NOT NULL,
|
||||
"UseGlobalTime" boolean NOT NULL,
|
||||
"PricePerMeter" int NOT NULL,
|
||||
"TaxFree" boolean NOT NULL,
|
||||
"AllowDirectTeleport" boolean NOT NULL,
|
||||
"RedirectGridX" int NOT NULL,
|
||||
"RedirectGridY" int NOT NULL,
|
||||
"ParentEstateID" int NOT NULL,
|
||||
"SunPosition" double precision NOT NULL,
|
||||
"EstateSkipScripts" boolean NOT NULL,
|
||||
"BillableFactor" double precision NOT NULL,
|
||||
"PublicAccess" boolean NOT NULL,
|
||||
"AbuseEmail" varchar(255) NOT NULL,
|
||||
"EstateOwner" varchar(36) NOT NULL,
|
||||
"DenyMinors" boolean NOT NULL
|
||||
);
|
||||
|
||||
|
||||
CREATE TABLE estate_map(
|
||||
"RegionID" varchar(36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
|
||||
"EstateID" int NOT NULL
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 2
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE INDEX IX_estate_managers ON estate_managers
|
||||
(
|
||||
"EstateID"
|
||||
);
|
||||
|
||||
|
||||
CREATE INDEX IX_estate_groups ON estate_groups
|
||||
(
|
||||
"EstateID"
|
||||
);
|
||||
|
||||
|
||||
CREATE INDEX IX_estate_users ON estate_users
|
||||
(
|
||||
"EstateID"
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 3
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_estateban
|
||||
(
|
||||
"EstateID" int NOT NULL,
|
||||
"bannedUUID" varchar(36) NOT NULL,
|
||||
"bannedIp" varchar(16) NULL,
|
||||
"bannedIpHostMask" varchar(16) NULL,
|
||||
"bannedNameMask" varchar(64) NULL
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_estateban ("EstateID", "bannedUUID", "bannedIp", "bannedIpHostMask", "bannedNameMask")
|
||||
SELECT "EstateID", "bannedUUID", "bannedIp", "bannedIpHostMask", "bannedNameMask" FROM estateban;
|
||||
|
||||
DROP TABLE estateban;
|
||||
|
||||
Alter table Tmp_estateban
|
||||
rename to estateban;
|
||||
|
||||
CREATE INDEX IX_estateban ON estateban
|
||||
(
|
||||
"EstateID"
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 4
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_estate_managers
|
||||
(
|
||||
"EstateID" int NOT NULL,
|
||||
uuid uuid NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_estate_managers ("EstateID", uuid)
|
||||
SELECT "EstateID", cast(uuid as uuid) FROM estate_managers;
|
||||
|
||||
DROP TABLE estate_managers;
|
||||
|
||||
Alter table Tmp_estate_managers
|
||||
rename to estate_managers;
|
||||
|
||||
CREATE INDEX IX_estate_managers ON estate_managers
|
||||
(
|
||||
"EstateID"
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 5
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_estate_groups
|
||||
(
|
||||
"EstateID" int NOT NULL,
|
||||
uuid uuid NOT NULL
|
||||
) ;
|
||||
|
||||
INSERT INTO Tmp_estate_groups ("EstateID", uuid)
|
||||
SELECT "EstateID", cast(uuid as uuid) FROM estate_groups;
|
||||
|
||||
DROP TABLE estate_groups;
|
||||
|
||||
Alter table Tmp_estate_groups
|
||||
rename to estate_groups;
|
||||
|
||||
CREATE INDEX IX_estate_groups ON estate_groups
|
||||
(
|
||||
"EstateID"
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 6
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_estate_users
|
||||
(
|
||||
"EstateID" int NOT NULL,
|
||||
uuid uuid NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_estate_users ("EstateID", uuid)
|
||||
SELECT "EstateID", cast(uuid as uuid) FROM estate_users ;
|
||||
|
||||
DROP TABLE estate_users;
|
||||
|
||||
Alter table Tmp_estate_users
|
||||
rename to estate_users;
|
||||
|
||||
CREATE INDEX IX_estate_users ON estate_users
|
||||
(
|
||||
"EstateID"
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 7
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_estateban
|
||||
(
|
||||
"EstateID" int NOT NULL,
|
||||
"bannedUUID" uuid NOT NULL,
|
||||
"bannedIp" varchar(16) NULL,
|
||||
"bannedIpHostMask" varchar(16) NULL,
|
||||
"bannedNameMask" varchar(64) NULL
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_estateban ("EstateID", "bannedUUID", "bannedIp", "bannedIpHostMask", "bannedNameMask")
|
||||
SELECT "EstateID", cast("bannedUUID" as uuid), "bannedIp", "bannedIpHostMask", "bannedNameMask" FROM estateban ;
|
||||
|
||||
DROP TABLE estateban;
|
||||
|
||||
Alter table Tmp_estateban
|
||||
rename to estateban;
|
||||
|
||||
CREATE INDEX IX_estateban ON estateban
|
||||
(
|
||||
"EstateID"
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 8
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_estate_settings
|
||||
(
|
||||
"EstateID" integer default nextval('estate_settings_id') NOT NULL,
|
||||
"EstateName" varchar(64) NULL DEFAULT (NULL),
|
||||
"AbuseEmailToEstateOwner" boolean NOT NULL,
|
||||
"DenyAnonymous" boolean NOT NULL,
|
||||
"ResetHomeOnTeleport" boolean NOT NULL,
|
||||
"FixedSun" boolean NOT NULL,
|
||||
"DenyTransacted" boolean NOT NULL,
|
||||
"BlockDwell" boolean NOT NULL,
|
||||
"DenyIdentified" boolean NOT NULL,
|
||||
"AllowVoice" boolean NOT NULL,
|
||||
"UseGlobalTime" boolean NOT NULL,
|
||||
"PricePerMeter" int NOT NULL,
|
||||
"TaxFree" boolean NOT NULL,
|
||||
"AllowDirectTeleport" boolean NOT NULL,
|
||||
"RedirectGridX" int NOT NULL,
|
||||
"RedirectGridY" int NOT NULL,
|
||||
"ParentEstateID" int NOT NULL,
|
||||
"SunPosition" double precision NOT NULL,
|
||||
"EstateSkipScripts" boolean NOT NULL,
|
||||
"BillableFactor" double precision NOT NULL,
|
||||
"PublicAccess" boolean NOT NULL,
|
||||
"AbuseEmail" varchar(255) NOT NULL,
|
||||
-- ----------------------------
|
||||
-- Table structure for estate_settings
|
||||
-- ----------------------------
|
||||
CREATE TABLE IF NOT EXISTS "public"."estate_settings" (
|
||||
"EstateID" int4 NOT NULL DEFAULT nextval('estate_settings_id'::regclass),
|
||||
"EstateName" varchar(64) DEFAULT NULL::character varying COLLATE "default",
|
||||
"AbuseEmailToEstateOwner" bool NOT NULL,
|
||||
"DenyAnonymous" bool NOT NULL,
|
||||
"ResetHomeOnTeleport" bool NOT NULL,
|
||||
"FixedSun" bool NOT NULL,
|
||||
"DenyTransacted" bool NOT NULL,
|
||||
"BlockDwell" bool NOT NULL,
|
||||
"DenyIdentified" bool NOT NULL,
|
||||
"AllowVoice" bool NOT NULL,
|
||||
"UseGlobalTime" bool NOT NULL,
|
||||
"PricePerMeter" int4 NOT NULL,
|
||||
"TaxFree" bool NOT NULL,
|
||||
"AllowDirectTeleport" bool NOT NULL,
|
||||
"RedirectGridX" int4 NOT NULL,
|
||||
"RedirectGridY" int4 NOT NULL,
|
||||
"ParentEstateID" int4 NOT NULL,
|
||||
"SunPosition" float8 NOT NULL,
|
||||
"EstateSkipScripts" bool NOT NULL,
|
||||
"BillableFactor" float8 NOT NULL,
|
||||
"PublicAccess" bool NOT NULL,
|
||||
"AbuseEmail" varchar(255) NOT NULL COLLATE "default",
|
||||
"EstateOwner" uuid NOT NULL,
|
||||
"DenyMinors" boolean NOT NULL
|
||||
);
|
||||
"DenyMinors" bool NOT NULL,
|
||||
"AllowLandmark" bool NOT NULL DEFAULT true,
|
||||
"AllowParcelChanges" bool NOT NULL DEFAULT true,
|
||||
"AllowSetHome" bool NOT NULL DEFAULT true
|
||||
)
|
||||
WITH (OIDS=FALSE);
|
||||
|
||||
INSERT INTO Tmp_estate_settings ("EstateID", "EstateName", "AbuseEmailToEstateOwner", "DenyAnonymous", "ResetHomeOnTeleport", "FixedSun", "DenyTransacted", "BlockDwell", "DenyIdentified", "AllowVoice", "UseGlobalTime", "PricePerMeter", "TaxFree", "AllowDirectTeleport", "RedirectGridX", "RedirectGridY", "ParentEstateID", "SunPosition", "EstateSkipScripts", "BillableFactor", "PublicAccess", "AbuseEmail", "EstateOwner", "DenyMinors")
|
||||
SELECT "EstateID", "EstateName", "AbuseEmailToEstateOwner", "DenyAnonymous", "ResetHomeOnTeleport", "FixedSun", "DenyTransacted", "BlockDwell", "DenyIdentified", "AllowVoice", "UseGlobalTime", "PricePerMeter", "TaxFree", "AllowDirectTeleport", "RedirectGridX", "RedirectGridY", "ParentEstateID", "SunPosition", "EstateSkipScripts", "BillableFactor", "PublicAccess", "AbuseEmail", cast("EstateOwner" as uuid), "DenyMinors" FROM estate_settings ;
|
||||
-- Primary key structure for table estate_settings
|
||||
-- ----------------------------
|
||||
ALTER TABLE "public"."estate_settings" ADD PRIMARY KEY ("EstateID") NOT DEFERRABLE INITIALLY IMMEDIATE;
|
||||
|
||||
DROP TABLE estate_settings;
|
||||
-- ----------------------------
|
||||
-- Table structure for estate_users
|
||||
-- ----------------------------
|
||||
CREATE TABLE IF NOT EXISTS "public"."estate_users" (
|
||||
"EstateID" int4 NOT NULL,
|
||||
"uuid" uuid NOT NULL
|
||||
)
|
||||
WITH (OIDS=FALSE);
|
||||
|
||||
-- Indexes structure for table estate_users
|
||||
-- ----------------------------
|
||||
CREATE INDEX IF NOT EXISTS "ix_estate_users" ON "public"."estate_users" USING btree("EstateID" "pg_catalog"."int4_ops" ASC NULLS LAST);
|
||||
|
||||
Alter table Tmp_estate_settings
|
||||
rename to estate_settings;
|
||||
-- ----------------------------
|
||||
-- Table structure for estateban
|
||||
-- ----------------------------
|
||||
CREATE TABLE IF NOT EXISTS "public"."estateban" (
|
||||
"EstateID" int4 NOT NULL,
|
||||
"bannedUUID" uuid NOT NULL,
|
||||
"bannedIp" varchar(16) COLLATE "default",
|
||||
"bannedIpHostMask" varchar(16) COLLATE "default",
|
||||
"bannedNameMask" varchar(64) COLLATE "default"
|
||||
)
|
||||
WITH (OIDS=FALSE);
|
||||
|
||||
|
||||
Create index on estate_settings (lower("EstateName"));
|
||||
-- Indexes structure for table estateban
|
||||
-- ----------------------------
|
||||
CREATE INDEX IF NOT EXISTS "ix_estateban" ON "public"."estateban" USING btree("EstateID" "pg_catalog"."int4_ops" ASC NULLS LAST);
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 13
|
||||
|
||||
:VERSION 9
|
||||
BEGIN TRASACTION;
|
||||
|
||||
-- ----------------------------
|
||||
-- SEQUENCE estate_settings_id
|
||||
-- ----------------------------
|
||||
CREATE SEQUENCE IF NOT EXISTS "public"."estate_settings_id"
|
||||
INCREMENT 100
|
||||
MINVALUE 1
|
||||
MAXVALUE 9223372036854775807
|
||||
START 100
|
||||
CACHE 1;
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 14
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Tmp_estate_map
|
||||
(
|
||||
"RegionID" uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
|
||||
"EstateID" int NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO Tmp_estate_map ("RegionID", "EstateID")
|
||||
SELECT cast("RegionID" as uuid), "EstateID" FROM estate_map ;
|
||||
|
||||
DROP TABLE estate_map;
|
||||
|
||||
Alter table Tmp_estate_map
|
||||
rename to estate_map;
|
||||
|
||||
ALTER TABLE "public"."estateban"
|
||||
ADD COLUMN "banningUUID" uuid NOT NULL,
|
||||
ADD COLUMN "banTime" int4 NOT NULL DEFAULT 0;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 10
|
||||
|
||||
:VERSION 15
|
||||
BEGIN TRANSACTION;
|
||||
ALTER TABLE estate_settings ADD COLUMN "AllowLandmark" boolean NOT NULL default true;
|
||||
ALTER TABLE estate_settings ADD COLUMN "AllowParcelChanges" boolean NOT NULL default true;
|
||||
ALTER TABLE estate_settings ADD COLUMN "AllowSetHome" boolean NOT NULL default true;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 11
|
||||
|
||||
Begin transaction;
|
||||
|
||||
|
||||
Commit;
|
||||
|
||||
ALTER TABLE "public"."estate_settings"
|
||||
ADD COLUMN "AllowEnviromentOverride" bool NOT NULL;
|
||||
COMMIT;
|
|
@ -0,0 +1,14 @@
|
|||
:VERSION 1
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE fsassets (
|
||||
"id" uuid NOT NULL PRIMARY KEY,
|
||||
"type" integer NOT NULL,
|
||||
"hash" char(64) NOT NULL,
|
||||
"create_time" integer NOT NULL DEFAULT '0',
|
||||
"access_time" integer NOT NULL DEFAULT '0',
|
||||
"asset_flags" integer NOT NULL DEFAULT '0'
|
||||
);
|
||||
|
||||
COMMIT;
|
|
@ -1195,3 +1195,63 @@ CREATE TABLE bakedterrain
|
|||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 45 #---- Add RezzerID filed in table prims
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE prims ADD "RezzerID" uuid NULL;
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 46 #---- Add physics inertia data to table prims
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE prims ADD "PhysInertia" TEXT;
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 47 #---- Convert field PassCollisions in table prims to BOOLEAN
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE "public"."prims" ALTER COLUMN "PassCollisions" DROP DEFAULT;
|
||||
ALTER TABLE "public"."prims"
|
||||
ALTER COLUMN "PassCollisions" TYPE BOOLEAN
|
||||
USING CASE WHEN "PassCollisions" = 0 THEN FALSE
|
||||
WHEN "PassCollisions" = 1 THEN TRUE
|
||||
ELSE NULL
|
||||
END;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 48 #---- field Vehicle to table prims
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE prims ADD "Vehicle" TEXT;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 49 #----- Add standtarget and sit range
|
||||
|
||||
BEGIN;
|
||||
ALTER TABLE `prims`
|
||||
ADD COLUMN `standtargetx` real DEFAULT '0.0',
|
||||
ADD COLUMN `standtargety` real DEFAULT '0.0',
|
||||
ADD COLUMN `standtargetz` real DEFAULT '0.0',
|
||||
ADD COLUMN `sitactrange` real DEFAULT '0.0';
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 50 #----- Add pseudo CRC and region cache id
|
||||
|
||||
BEGIN;
|
||||
ALTER TABLE `prims` ADD COLUMN `pseudocrc` integer DEFAULT '0';
|
||||
ALTER TABLE `regionsettings` ADD COLUMN `cacheID` uuid DEFAULT NULL;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 51 #----- parcel environment store
|
||||
BEGIN;
|
||||
ALTER TABLE `land` ADD COLUMN `environment` varchar default NULL;
|
||||
COMMIT;
|
|
@ -63,7 +63,21 @@ CREATE TABLE IF NOT EXISTS estateban (
|
|||
bannedIpHostMask varchar(16) NOT NULL,
|
||||
bannedNameMask varchar(64) default NULL
|
||||
);
|
||||
|
||||
CREATE INDEX estate_ban_estate_id on estateban(EstateID);
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 11
|
||||
BEGIN;
|
||||
ALTER TABLE `estateban` ADD COLUMN `banningUUID` varchar(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
|
||||
ALTER TABLE `estateban` ADD COLUMN `banTime` integer NOT NULL DEFAULT 0;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 12
|
||||
BEGIN;
|
||||
ALTER TABLE `estate_settings`
|
||||
ADD COLUMN `AllowEnviromentOverride` tinyint not null default 0;
|
||||
COMMIT;
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
:VERSION 1
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE MuteList (
|
||||
AgentID char(36) NOT NULL,
|
||||
MuteID char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
||||
MuteName varchar(64) NOT NULL DEFAULT '',
|
||||
MuteType int(11) NOT NULL DEFAULT '1',
|
||||
MuteFlags int(11) NOT NULL DEFAULT '0',
|
||||
Stamp int(11) NOT NULL,
|
||||
UNIQUE (AgentID, MuteID, MuteName),
|
||||
PRIMARY KEY(AgentID)
|
||||
);
|
||||
|
||||
COMMIT;
|
|
@ -183,14 +183,14 @@ CREATE TABLE IF NOT EXISTS land(
|
|||
UserLookAtY float,
|
||||
UserLookAtZ float,
|
||||
AuthbuyerID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000',
|
||||
OtherCleanTime INTEGER NOT NULL default 0,
|
||||
Dwell INTEGER NOT NULL default 0,
|
||||
`MediaType` VARCHAR(32) NOT NULL DEFAULT 'none/none',
|
||||
`MediaDescription` VARCHAR(255) NOT NULL DEFAULT '',
|
||||
`MediaSize` VARCHAR(16) NOT NULL DEFAULT '0,0',
|
||||
`MediaLoop` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
`ObscureMusic` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
`ObscureMedia` BOOLEAN NOT NULL DEFAULT FALSE);
|
||||
OtherCleanTime INTEGER NOT NULL default 0,
|
||||
Dwell INTEGER NOT NULL default 0,
|
||||
`MediaType` VARCHAR(32) NOT NULL DEFAULT 'none/none',
|
||||
`MediaDescription` VARCHAR(255) NOT NULL DEFAULT '',
|
||||
`MediaSize` VARCHAR(16) NOT NULL DEFAULT '0,0',
|
||||
`MediaLoop` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
`ObscureMusic` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
`ObscureMedia` BOOLEAN NOT NULL DEFAULT FALSE);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS landaccesslist(
|
||||
LandUUID varchar(255),
|
||||
|
@ -371,3 +371,31 @@ BEGIN;
|
|||
ALTER TABLE `prims` ADD COLUMN `RezzerID` char(36) DEFAULT NULL;
|
||||
|
||||
COMMIT;
|
||||
|
||||
:VERSION 36 #----- Add physics inertia data
|
||||
|
||||
BEGIN;
|
||||
ALTER TABLE `prims` ADD COLUMN `PhysInertia` TEXT default NULL;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 37 #----- Add standtarget and sit range
|
||||
|
||||
BEGIN;
|
||||
ALTER TABLE `prims` ADD COLUMN `standtargetx` float NOT NULL DEFAULT '0.0';
|
||||
ALTER TABLE `prims` ADD COLUMN `standtargety` float NOT NULL DEFAULT '0.0';
|
||||
ALTER TABLE `prims` ADD COLUMN `standtargetz` float NOT NULL DEFAULT '0.0';
|
||||
ALTER TABLE `prims` ADD COLUMN `sitactrange` float NOT NULL DEFAULT '0.0';
|
||||
COMMIT;
|
||||
|
||||
|
||||
:VERSION 38 #----- Add pseudo CRC and region cache id
|
||||
|
||||
BEGIN;
|
||||
ALTER TABLE `prims` ADD COLUMN `pseudocrc` integer DEFAULT '0';
|
||||
ALTER TABLE `regionsettings` ADD COLUMN `cacheID` char(36) DEFAULT NULL;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 39 #----- parcel environment store
|
||||
BEGIN;
|
||||
ALTER TABLE `land` ADD COLUMN `environment` TEXT default NULL;
|
||||
COMMIT;
|
||||
|
|
|
@ -186,13 +186,10 @@ namespace OpenSim.Data.SQLite
|
|||
private void DoCreate(EstateSettings es)
|
||||
{
|
||||
List<string> names = new List<string>(FieldList);
|
||||
|
||||
IDataReader r = null;
|
||||
names.Remove("EstateID");
|
||||
|
||||
using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
|
||||
{
|
||||
names.Remove("EstateID");
|
||||
|
||||
string sql = "insert into estate_settings ("+String.Join(",", names.ToArray())+") values ( :"+String.Join(", :", names.ToArray())+")";
|
||||
|
||||
cmd.CommandText = sql;
|
||||
|
@ -217,17 +214,12 @@ namespace OpenSim.Data.SQLite
|
|||
|
||||
cmd.CommandText = "select LAST_INSERT_ROWID() as id";
|
||||
cmd.Parameters.Clear();
|
||||
|
||||
r = cmd.ExecuteReader();
|
||||
using(IDataReader r = cmd.ExecuteReader())
|
||||
{
|
||||
r.Read();
|
||||
es.EstateID = Convert.ToUInt32(r["id"]);
|
||||
}
|
||||
}
|
||||
|
||||
r.Read();
|
||||
|
||||
es.EstateID = Convert.ToUInt32(r["id"]);
|
||||
|
||||
r.Close();
|
||||
|
||||
es.Save();
|
||||
}
|
||||
|
||||
public void StoreEstateSettings(EstateSettings es)
|
||||
|
@ -240,11 +232,10 @@ namespace OpenSim.Data.SQLite
|
|||
foreach (string f in fields)
|
||||
terms.Add(f+" = :"+f);
|
||||
|
||||
string sql = "update estate_settings set "+String.Join(", ", terms.ToArray())+" where EstateID = :EstateID";
|
||||
|
||||
using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
|
||||
{
|
||||
cmd.CommandText = sql;
|
||||
cmd.CommandText = "update estate_settings set " + String.Join(", ", terms.ToArray()) + " where EstateID = :EstateID"; ;
|
||||
cmd.Parameters.AddWithValue(":EstateID", es.EstateID);
|
||||
|
||||
foreach (string name in FieldList)
|
||||
{
|
||||
|
@ -278,7 +269,7 @@ namespace OpenSim.Data.SQLite
|
|||
|
||||
using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
|
||||
{
|
||||
cmd.CommandText = "select bannedUUID from estateban where EstateID = :EstateID";
|
||||
cmd.CommandText = "select * from estateban where EstateID = :EstateID";
|
||||
cmd.Parameters.AddWithValue(":EstateID", es.EstateID);
|
||||
|
||||
r = cmd.ExecuteReader();
|
||||
|
@ -288,12 +279,11 @@ namespace OpenSim.Data.SQLite
|
|||
{
|
||||
EstateBan eb = new EstateBan();
|
||||
|
||||
UUID uuid = new UUID();
|
||||
UUID.TryParse(r["bannedUUID"].ToString(), out uuid);
|
||||
|
||||
eb.BannedUserID = uuid;
|
||||
eb.BannedUserID = DBGuid.FromDB(r["bannedUUID"]); ;
|
||||
eb.BannedHostAddress = "0.0.0.0";
|
||||
eb.BannedHostIPMask = "0.0.0.0";
|
||||
eb.BanningUserID = DBGuid.FromDB(r["banningUUID"]);
|
||||
eb.BanTime = Convert.ToInt32(r["banTime"]);
|
||||
es.AddBan(eb);
|
||||
}
|
||||
r.Close();
|
||||
|
@ -310,12 +300,14 @@ namespace OpenSim.Data.SQLite
|
|||
|
||||
cmd.Parameters.Clear();
|
||||
|
||||
cmd.CommandText = "insert into estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) values ( :EstateID, :bannedUUID, '', '', '' )";
|
||||
cmd.CommandText = "insert into estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask, banningUUID, banTime) values ( :EstateID, :bannedUUID, '', '', '', :banningUUID, :banTime )";
|
||||
|
||||
foreach (EstateBan b in es.EstateBans)
|
||||
{
|
||||
cmd.Parameters.AddWithValue(":EstateID", es.EstateID.ToString());
|
||||
cmd.Parameters.AddWithValue(":bannedUUID", b.BannedUserID.ToString());
|
||||
cmd.Parameters.AddWithValue(":banningUUID", b.BanningUserID.ToString());
|
||||
cmd.Parameters.AddWithValue(":banTime", b.BanTime);
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
cmd.Parameters.Clear();
|
||||
|
@ -471,34 +463,35 @@ namespace OpenSim.Data.SQLite
|
|||
|
||||
public bool LinkRegion(UUID regionID, int estateID)
|
||||
{
|
||||
SqliteTransaction transaction = m_connection.BeginTransaction();
|
||||
|
||||
// Delete any existing estate mapping for this region.
|
||||
using(SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
|
||||
using(SqliteTransaction transaction = m_connection.BeginTransaction())
|
||||
{
|
||||
cmd.CommandText = "delete from estate_map where RegionID = :RegionID";
|
||||
cmd.Transaction = transaction;
|
||||
cmd.Parameters.AddWithValue(":RegionID", regionID.ToString());
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
using(SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
|
||||
{
|
||||
cmd.CommandText = "insert into estate_map values (:RegionID, :EstateID)";
|
||||
cmd.Transaction = transaction;
|
||||
cmd.Parameters.AddWithValue(":RegionID", regionID.ToString());
|
||||
cmd.Parameters.AddWithValue(":EstateID", estateID.ToString());
|
||||
|
||||
if (cmd.ExecuteNonQuery() == 0)
|
||||
// Delete any existing estate mapping for this region.
|
||||
using(SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
|
||||
{
|
||||
transaction.Rollback();
|
||||
return false;
|
||||
cmd.CommandText = "delete from estate_map where RegionID = :RegionID";
|
||||
cmd.Transaction = transaction;
|
||||
cmd.Parameters.AddWithValue(":RegionID", regionID.ToString());
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
else
|
||||
|
||||
using(SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
|
||||
{
|
||||
transaction.Commit();
|
||||
return true;
|
||||
cmd.CommandText = "insert into estate_map values (:RegionID, :EstateID)";
|
||||
cmd.Transaction = transaction;
|
||||
cmd.Parameters.AddWithValue(":RegionID", regionID.ToString());
|
||||
cmd.Parameters.AddWithValue(":EstateID", estateID.ToString());
|
||||
|
||||
if (cmd.ExecuteNonQuery() == 0)
|
||||
{
|
||||
transaction.Rollback();
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
transaction.Commit();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,42 +28,44 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using log4net;
|
||||
using OpenSim.Region.OptionalModules.Scripting.Minimodule.Interfaces;
|
||||
using System.Data;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
#if CSharpSqlite
|
||||
using Community.CsharpSqlite.Sqlite;
|
||||
#else
|
||||
using Mono.Data.Sqlite;
|
||||
#endif
|
||||
|
||||
namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
||||
namespace OpenSim.Data.SQLite
|
||||
{
|
||||
public class MicroScheduler : System.MarshalByRefObject, IMicrothreader
|
||||
public class SQLiteMuteListData : SQLiteGenericTableHandler<MuteData>, IMuteListData
|
||||
{
|
||||
private readonly List<IEnumerator> m_threads = new List<IEnumerator>();
|
||||
|
||||
public void Run(IEnumerable microthread)
|
||||
public SQLiteMuteListData(string connectionString)
|
||||
: base(connectionString, "MuteList", "MuteListStore")
|
||||
{
|
||||
lock (m_threads)
|
||||
m_threads.Add(microthread.GetEnumerator());
|
||||
}
|
||||
|
||||
public void Tick(int count)
|
||||
public MuteData[] Get(UUID agentID)
|
||||
{
|
||||
lock (m_threads)
|
||||
MuteData[] data = base.Get("AgentID", agentID.ToString());
|
||||
return data;
|
||||
}
|
||||
|
||||
public bool Delete(UUID agentID, UUID muteID, string muteName)
|
||||
{
|
||||
using (SqliteCommand cmd = new SqliteCommand())
|
||||
{
|
||||
if (m_threads.Count == 0)
|
||||
return;
|
||||
cmd.CommandText = "delete from MuteList where `AgentID` = :AgentID and `MuteID` = :MuteID and `MuteName` = :MuteName";
|
||||
|
||||
int i = 0;
|
||||
while (m_threads.Count > 0 && i < count)
|
||||
{
|
||||
i++;
|
||||
cmd.Parameters.AddWithValue(":AgentID", agentID.ToString());
|
||||
cmd.Parameters.AddWithValue(":MuteID", muteID.ToString());
|
||||
cmd.Parameters.AddWithValue(":MuteName", muteName);
|
||||
|
||||
bool running = m_threads[i%m_threads.Count].MoveNext();
|
||||
|
||||
|
||||
if (!running)
|
||||
m_threads.Remove(m_threads[i%m_threads.Count]);
|
||||
}
|
||||
if (ExecuteNonQuery(cmd, m_Connection) > 0)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -429,75 +429,6 @@ namespace OpenSim.Data.SQLite
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Load windlight settings from region storage
|
||||
/// </summary>
|
||||
/// <param name="regionUUID">RegionID</param>
|
||||
public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID)
|
||||
{
|
||||
RegionLightShareData wl = null;
|
||||
|
||||
lock (ds)
|
||||
{
|
||||
DataTable windlightTable = ds.Tables["regionwindlight"];
|
||||
DataRow windlightRow = windlightTable.Rows.Find(regionUUID.ToString());
|
||||
if (windlightRow == null)
|
||||
{
|
||||
wl = new RegionLightShareData();
|
||||
wl.regionID = regionUUID;
|
||||
StoreRegionWindlightSettings(wl);
|
||||
return wl;
|
||||
}
|
||||
wl = buildRegionWindlight(windlightRow);
|
||||
return wl;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Remove windlight settings from region storage
|
||||
/// </summary>
|
||||
/// <param name="regionID">RegionID</param>
|
||||
public void RemoveRegionWindlightSettings(UUID regionID)
|
||||
{
|
||||
lock (ds)
|
||||
{
|
||||
DataTable windlightTable = ds.Tables["regionwindlight"];
|
||||
DataRow windlightRow = windlightTable.Rows.Find(regionID.ToString());
|
||||
|
||||
if (windlightRow != null)
|
||||
{
|
||||
windlightRow.Delete();
|
||||
}
|
||||
}
|
||||
Commit();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds an windlight into region storage
|
||||
/// </summary>
|
||||
/// <param name="wl">RegionLightShareData</param>
|
||||
public void StoreRegionWindlightSettings(RegionLightShareData wl)
|
||||
{
|
||||
lock (ds)
|
||||
{
|
||||
DataTable windlightTable = ds.Tables["regionwindlight"];
|
||||
DataRow windlightRow = windlightTable.Rows.Find(wl.regionID.ToString());
|
||||
|
||||
if (windlightRow == null)
|
||||
{
|
||||
windlightRow = windlightTable.NewRow();
|
||||
fillRegionWindlightRow(windlightRow, wl);
|
||||
windlightTable.Rows.Add(windlightRow);
|
||||
}
|
||||
else
|
||||
{
|
||||
fillRegionWindlightRow(windlightRow, wl);
|
||||
}
|
||||
|
||||
Commit();
|
||||
}
|
||||
}
|
||||
|
||||
#region Region Environment Settings
|
||||
public string LoadRegionEnvironmentSettings(UUID regionUUID)
|
||||
{
|
||||
|
@ -626,10 +557,13 @@ namespace OpenSim.Data.SQLite
|
|||
// m_log.Info("[REGION DB]: Adding obj: " + obj.UUID + " to region: " + regionUUID);
|
||||
addPrim(prim, obj.UUID, regionUUID);
|
||||
}
|
||||
primDa.Update(ds, "prims");
|
||||
shapeDa.Update(ds, "primshapes");
|
||||
itemsDa.Update(ds, "primitems");
|
||||
ds.AcceptChanges();
|
||||
}
|
||||
|
||||
Commit();
|
||||
// m_log.Info("[Dump of prims]: " + ds.GetXml());
|
||||
// m_log.Info("[Dump of prims]: " + ds.GetXml());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -823,7 +757,7 @@ namespace OpenSim.Data.SQLite
|
|||
// Legacy entry point for when terrain was always a 256x256 hieghtmap
|
||||
public void StoreTerrain(double[,] ter, UUID regionID)
|
||||
{
|
||||
StoreTerrain(new HeightmapTerrainData(ter), regionID);
|
||||
StoreTerrain(new TerrainData(ter), regionID);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -835,8 +769,7 @@ namespace OpenSim.Data.SQLite
|
|||
{
|
||||
lock (ds)
|
||||
{
|
||||
using (
|
||||
SqliteCommand cmd = new SqliteCommand("delete from terrain where RegionUUID=:RegionUUID", m_conn))
|
||||
using (SqliteCommand cmd = new SqliteCommand("delete from terrain where RegionUUID=:RegionUUID", m_conn))
|
||||
{
|
||||
cmd.Parameters.Add(new SqliteParameter(":RegionUUID", regionID.ToString()));
|
||||
cmd.ExecuteNonQuery();
|
||||
|
@ -1058,12 +991,9 @@ namespace OpenSim.Data.SQLite
|
|||
if (rowToCheck["LandUUID"].ToString() == parcel.LandData.GlobalID.ToString())
|
||||
rowsToDelete.Add(rowToCheck);
|
||||
}
|
||||
for (int iter = 0; iter < rowsToDelete.Count; iter++)
|
||||
{
|
||||
for (int iter = 0; iter < rowsToDelete.Count; ++iter)
|
||||
rowsToDelete[iter].Delete();
|
||||
landaccesslist.Rows.Remove(rowsToDelete[iter]);
|
||||
}
|
||||
rowsToDelete.Clear();
|
||||
|
||||
foreach (LandAccessEntry entry in parcel.LandData.ParcelAccessList)
|
||||
{
|
||||
DataRow newAccessRow = landaccesslist.NewRow();
|
||||
|
@ -1313,6 +1243,21 @@ namespace OpenSim.Data.SQLite
|
|||
|
||||
createCol(prims, "KeyframeMotion", typeof(Byte[]));
|
||||
|
||||
createCol(prims, "PassTouches", typeof(bool));
|
||||
createCol(prims, "PassCollisions", typeof(bool));
|
||||
createCol(prims, "Vehicle", typeof(string));
|
||||
|
||||
createCol(prims, "RotationAxisLocks", typeof(byte));
|
||||
|
||||
createCol(prims, "PhysInertia", typeof(string));
|
||||
|
||||
createCol(prims, "standtargetx", typeof(float));
|
||||
createCol(prims, "standtargety", typeof(float));
|
||||
createCol(prims, "standtargetz", typeof(float));
|
||||
createCol(prims, "sitactrange", typeof(float));
|
||||
|
||||
createCol(prims, "pseudocrc", typeof(int));
|
||||
|
||||
// Add in contraints
|
||||
prims.PrimaryKey = new DataColumn[] { prims.Columns["UUID"] };
|
||||
|
||||
|
@ -1355,6 +1300,7 @@ namespace OpenSim.Data.SQLite
|
|||
createCol(shapes, "ProfileCurve", typeof(Int32));
|
||||
createCol(shapes, "ProfileHollow", typeof(Int32));
|
||||
createCol(shapes, "State", typeof(Int32));
|
||||
createCol(shapes, "LastAttachPoint", typeof(Int32));
|
||||
// text TODO: this isn't right, but I'm not sure the right
|
||||
// way to specify this as a blob atm
|
||||
createCol(shapes, "Texture", typeof(Byte[]));
|
||||
|
@ -1456,6 +1402,7 @@ namespace OpenSim.Data.SQLite
|
|||
createCol(land, "SeeAVs", typeof(Boolean));
|
||||
createCol(land, "AnyAVSounds", typeof(Boolean));
|
||||
createCol(land, "GroupAVSounds", typeof(Boolean));
|
||||
createCol(land, "environment", typeof(string));
|
||||
|
||||
land.PrimaryKey = new DataColumn[] { land.Columns["UUID"] };
|
||||
|
||||
|
@ -1520,6 +1467,9 @@ namespace OpenSim.Data.SQLite
|
|||
createCol(regionsettings, "map_tile_ID", typeof(String));
|
||||
createCol(regionsettings, "TelehubObject", typeof(String));
|
||||
createCol(regionsettings, "parcel_tile_ID", typeof(String));
|
||||
createCol(regionsettings, "block_search", typeof(Boolean));
|
||||
createCol(regionsettings, "casino", typeof(Boolean));
|
||||
createCol(regionsettings, "cacheID", typeof(string));
|
||||
regionsettings.PrimaryKey = new DataColumn[] { regionsettings.Columns["regionUUID"] };
|
||||
return regionsettings;
|
||||
}
|
||||
|
@ -1725,14 +1675,18 @@ namespace OpenSim.Data.SQLite
|
|||
Convert.ToSingle(row["SitTargetOffsetY"]),
|
||||
Convert.ToSingle(row["SitTargetOffsetZ"]));
|
||||
prim.SitTargetOrientationLL = new Quaternion(
|
||||
Convert.ToSingle(
|
||||
row["SitTargetOrientX"]),
|
||||
Convert.ToSingle(
|
||||
row["SitTargetOrientY"]),
|
||||
Convert.ToSingle(
|
||||
row["SitTargetOrientZ"]),
|
||||
Convert.ToSingle(
|
||||
row["SitTargetOrientW"]));
|
||||
Convert.ToSingle(row["SitTargetOrientX"]),
|
||||
Convert.ToSingle(row["SitTargetOrientY"]),
|
||||
Convert.ToSingle(row["SitTargetOrientZ"]),
|
||||
Convert.ToSingle(row["SitTargetOrientW"]));
|
||||
|
||||
prim.StandOffset = new Vector3(
|
||||
Convert.ToSingle(row["standtargetx"]),
|
||||
Convert.ToSingle(row["standtargety"]),
|
||||
Convert.ToSingle(row["standtargetz"])
|
||||
);
|
||||
|
||||
prim.SitActiveRange = Convert.ToSingle(row["sitactrange"]);
|
||||
|
||||
prim.ClickAction = Convert.ToByte(row["ClickAction"]);
|
||||
prim.PayPrice[0] = Convert.ToInt32(row["PayPrice"]);
|
||||
|
@ -1743,7 +1697,10 @@ namespace OpenSim.Data.SQLite
|
|||
|
||||
prim.Sound = new UUID(row["LoopedSound"].ToString());
|
||||
prim.SoundGain = Convert.ToSingle(row["LoopedSoundGain"]);
|
||||
prim.SoundFlags = 1; // If it's persisted at all, it's looped
|
||||
if (prim.Sound != UUID.Zero)
|
||||
prim.SoundFlags = 1; // If it's persisted at all, it's looped
|
||||
else
|
||||
prim.SoundFlags = 0;
|
||||
|
||||
if (!row.IsNull("TextureAnimation"))
|
||||
prim.TextureAnimation = Convert.FromBase64String(row["TextureAnimation"].ToString());
|
||||
|
@ -1809,7 +1766,7 @@ namespace OpenSim.Data.SQLite
|
|||
}
|
||||
else
|
||||
{
|
||||
prim.DynAttrs = new DAMap();
|
||||
prim.DynAttrs = null;
|
||||
}
|
||||
|
||||
prim.PhysicsShapeType = Convert.ToByte(row["PhysicsShapeType"]);
|
||||
|
@ -1843,6 +1800,16 @@ namespace OpenSim.Data.SQLite
|
|||
if (vehicle != null)
|
||||
prim.VehicleParams = vehicle;
|
||||
}
|
||||
|
||||
PhysicsInertiaData pdata = null;
|
||||
if (!(row["PhysInertia"] is DBNull) && row["PhysInertia"].ToString() != String.Empty)
|
||||
pdata = PhysicsInertiaData.FromXml2(row["PhysInertia"].ToString());
|
||||
prim.PhysicsInertia = pdata;
|
||||
|
||||
int pseudocrc = Convert.ToInt32(row["pseudocrc"]);
|
||||
if(pseudocrc != 0)
|
||||
prim.PseudoCRC = pseudocrc;
|
||||
|
||||
return prim;
|
||||
}
|
||||
|
||||
|
@ -1954,6 +1921,36 @@ namespace OpenSim.Data.SQLite
|
|||
|
||||
newData.OtherCleanTime = Convert.ToInt32(row["OtherCleanTime"]);
|
||||
|
||||
if (row["environment"] is DBNull)
|
||||
{
|
||||
newData.Environment = null;
|
||||
newData.EnvironmentVersion = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
string env = (string)row["environment"];
|
||||
if (string.IsNullOrEmpty(env))
|
||||
{
|
||||
newData.Environment = null;
|
||||
newData.EnvironmentVersion = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
ViewerEnvironment VEnv = ViewerEnvironment.FromOSDString(env);
|
||||
newData.Environment = VEnv;
|
||||
newData.EnvironmentVersion = VEnv.version;
|
||||
}
|
||||
catch
|
||||
{
|
||||
newData.Environment = null;
|
||||
newData.EnvironmentVersion = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return newData;
|
||||
}
|
||||
|
||||
|
@ -2006,86 +2003,12 @@ namespace OpenSim.Data.SQLite
|
|||
newSettings.ParcelImageID = new UUID((String)row["parcel_tile_ID"]);
|
||||
newSettings.GodBlockSearch = Convert.ToBoolean(row["block_search"]);
|
||||
newSettings.Casino = Convert.ToBoolean(row["casino"]);
|
||||
if (!(row["cacheID"] is System.DBNull))
|
||||
newSettings.CacheID = new UUID((String)row["cacheID"]);
|
||||
|
||||
return newSettings;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Build a windlight entry from the persisted data.
|
||||
/// </summary>
|
||||
/// <param name="row"></param>
|
||||
/// <returns>RegionLightShareData</returns>
|
||||
private RegionLightShareData buildRegionWindlight(DataRow row)
|
||||
{
|
||||
RegionLightShareData windlight = new RegionLightShareData();
|
||||
|
||||
windlight.regionID = new UUID((string)row["region_id"]);
|
||||
windlight.waterColor.X = Convert.ToSingle(row["water_color_r"]);
|
||||
windlight.waterColor.Y = Convert.ToSingle(row["water_color_g"]);
|
||||
windlight.waterColor.Z = Convert.ToSingle(row["water_color_b"]);
|
||||
//windlight.waterColor.W = Convert.ToSingle(row["water_color_i"]); //not implemented
|
||||
windlight.waterFogDensityExponent = Convert.ToSingle(row["water_fog_density_exponent"]);
|
||||
windlight.underwaterFogModifier = Convert.ToSingle(row["underwater_fog_modifier"]);
|
||||
windlight.reflectionWaveletScale.X = Convert.ToSingle(row["reflection_wavelet_scale_1"]);
|
||||
windlight.reflectionWaveletScale.Y = Convert.ToSingle(row["reflection_wavelet_scale_2"]);
|
||||
windlight.reflectionWaveletScale.Z = Convert.ToSingle(row["reflection_wavelet_scale_3"]);
|
||||
windlight.fresnelScale = Convert.ToSingle(row["fresnel_scale"]);
|
||||
windlight.fresnelOffset = Convert.ToSingle(row["fresnel_offset"]);
|
||||
windlight.refractScaleAbove = Convert.ToSingle(row["refract_scale_above"]);
|
||||
windlight.refractScaleBelow = Convert.ToSingle(row["refract_scale_below"]);
|
||||
windlight.blurMultiplier = Convert.ToSingle(row["blur_multiplier"]);
|
||||
windlight.bigWaveDirection.X = Convert.ToSingle(row["big_wave_direction_x"]);
|
||||
windlight.bigWaveDirection.Y = Convert.ToSingle(row["big_wave_direction_y"]);
|
||||
windlight.littleWaveDirection.X = Convert.ToSingle(row["little_wave_direction_x"]);
|
||||
windlight.littleWaveDirection.Y = Convert.ToSingle(row["little_wave_direction_y"]);
|
||||
windlight.normalMapTexture = new UUID((string)row["normal_map_texture"]);
|
||||
windlight.horizon.X = Convert.ToSingle(row["horizon_r"]);
|
||||
windlight.horizon.Y = Convert.ToSingle(row["horizon_g"]);
|
||||
windlight.horizon.Z = Convert.ToSingle(row["horizon_b"]);
|
||||
windlight.horizon.W = Convert.ToSingle(row["horizon_i"]);
|
||||
windlight.hazeHorizon = Convert.ToSingle(row["haze_horizon"]);
|
||||
windlight.blueDensity.X = Convert.ToSingle(row["blue_density_r"]);
|
||||
windlight.blueDensity.Y = Convert.ToSingle(row["blue_density_g"]);
|
||||
windlight.blueDensity.Z = Convert.ToSingle(row["blue_density_b"]);
|
||||
windlight.blueDensity.W = Convert.ToSingle(row["blue_density_i"]);
|
||||
windlight.hazeDensity = Convert.ToSingle(row["haze_density"]);
|
||||
windlight.densityMultiplier = Convert.ToSingle(row["density_multiplier"]);
|
||||
windlight.distanceMultiplier = Convert.ToSingle(row["distance_multiplier"]);
|
||||
windlight.maxAltitude = Convert.ToUInt16(row["max_altitude"]);
|
||||
windlight.sunMoonColor.X = Convert.ToSingle(row["sun_moon_color_r"]);
|
||||
windlight.sunMoonColor.Y = Convert.ToSingle(row["sun_moon_color_g"]);
|
||||
windlight.sunMoonColor.Z = Convert.ToSingle(row["sun_moon_color_b"]);
|
||||
windlight.sunMoonColor.W = Convert.ToSingle(row["sun_moon_color_i"]);
|
||||
windlight.sunMoonPosition = Convert.ToSingle(row["sun_moon_position"]);
|
||||
windlight.ambient.X = Convert.ToSingle(row["ambient_r"]);
|
||||
windlight.ambient.Y = Convert.ToSingle(row["ambient_g"]);
|
||||
windlight.ambient.Z = Convert.ToSingle(row["ambient_b"]);
|
||||
windlight.ambient.W = Convert.ToSingle(row["ambient_i"]);
|
||||
windlight.eastAngle = Convert.ToSingle(row["east_angle"]);
|
||||
windlight.sunGlowFocus = Convert.ToSingle(row["sun_glow_focus"]);
|
||||
windlight.sunGlowSize = Convert.ToSingle(row["sun_glow_size"]);
|
||||
windlight.sceneGamma = Convert.ToSingle(row["scene_gamma"]);
|
||||
windlight.starBrightness = Convert.ToSingle(row["star_brightness"]);
|
||||
windlight.cloudColor.X = Convert.ToSingle(row["cloud_color_r"]);
|
||||
windlight.cloudColor.Y = Convert.ToSingle(row["cloud_color_g"]);
|
||||
windlight.cloudColor.Z = Convert.ToSingle(row["cloud_color_b"]);
|
||||
windlight.cloudColor.W = Convert.ToSingle(row["cloud_color_i"]);
|
||||
windlight.cloudXYDensity.X = Convert.ToSingle(row["cloud_x"]);
|
||||
windlight.cloudXYDensity.Y = Convert.ToSingle(row["cloud_y"]);
|
||||
windlight.cloudXYDensity.Z = Convert.ToSingle(row["cloud_density"]);
|
||||
windlight.cloudCoverage = Convert.ToSingle(row["cloud_coverage"]);
|
||||
windlight.cloudScale = Convert.ToSingle(row["cloud_scale"]);
|
||||
windlight.cloudDetailXYDensity.X = Convert.ToSingle(row["cloud_detail_x"]);
|
||||
windlight.cloudDetailXYDensity.Y = Convert.ToSingle(row["cloud_detail_y"]);
|
||||
windlight.cloudDetailXYDensity.Z = Convert.ToSingle(row["cloud_detail_density"]);
|
||||
windlight.cloudScrollX = Convert.ToSingle(row["cloud_scroll_x"]);
|
||||
windlight.cloudScrollXLock = Convert.ToBoolean(row["cloud_scroll_x_lock"]);
|
||||
windlight.cloudScrollY = Convert.ToSingle(row["cloud_scroll_y"]);
|
||||
windlight.cloudScrollYLock = Convert.ToBoolean(row["cloud_scroll_y_lock"]);
|
||||
windlight.drawClassicClouds = Convert.ToBoolean(row["draw_classic_clouds"]);
|
||||
|
||||
return windlight;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Build a land access entry from the persisted data.
|
||||
/// </summary>
|
||||
|
@ -2166,6 +2089,14 @@ namespace OpenSim.Data.SQLite
|
|||
row["SitTargetOrientX"] = sitTargetOrient.X;
|
||||
row["SitTargetOrientY"] = sitTargetOrient.Y;
|
||||
row["SitTargetOrientZ"] = sitTargetOrient.Z;
|
||||
|
||||
Vector3 standTarget = prim.StandOffset;
|
||||
row["standtargetx"] = standTarget.X;
|
||||
row["standtargety"] = standTarget.Y;
|
||||
row["standtargetz"] = standTarget.Z;
|
||||
|
||||
row["sitactrange"] = prim.SitActiveRange;
|
||||
|
||||
row["ColorR"] = Convert.ToInt32(prim.Color.R);
|
||||
row["ColorG"] = Convert.ToInt32(prim.Color.G);
|
||||
row["ColorB"] = Convert.ToInt32(prim.Color.B);
|
||||
|
@ -2191,7 +2122,6 @@ namespace OpenSim.Data.SQLite
|
|||
row["CameraAtOffsetY"] = prim.GetCameraAtOffset().Y;
|
||||
row["CameraAtOffsetZ"] = prim.GetCameraAtOffset().Z;
|
||||
|
||||
|
||||
if ((prim.SoundFlags & 1) != 0) // Looped
|
||||
{
|
||||
row["LoopedSound"] = prim.Sound.ToString();
|
||||
|
@ -2241,7 +2171,7 @@ namespace OpenSim.Data.SQLite
|
|||
row["AttachedPosY"] = prim.AttachedPos.Y;
|
||||
row["AttachedPosZ"] = prim.AttachedPos.Z;
|
||||
|
||||
if (prim.DynAttrs.CountNamespaces > 0)
|
||||
if (prim.DynAttrs!= null && prim.DynAttrs.CountNamespaces > 0)
|
||||
row["DynAttrs"] = prim.DynAttrs.ToXml();
|
||||
else
|
||||
row["DynAttrs"] = null;
|
||||
|
@ -2266,6 +2196,12 @@ namespace OpenSim.Data.SQLite
|
|||
else
|
||||
row["Vehicle"] = String.Empty;
|
||||
|
||||
if (prim.PhysicsInertia != null)
|
||||
row["PhysInertia"] = prim.PhysicsInertia.ToXml2();
|
||||
else
|
||||
row["PhysInertia"] = String.Empty;
|
||||
|
||||
row["pseudocrc"] = prim.PseudoCRC;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -2353,6 +2289,20 @@ namespace OpenSim.Data.SQLite
|
|||
row["AnyAVSounds"] = land.AnyAVSounds;
|
||||
row["GroupAVSounds"] = land.GroupAVSounds;
|
||||
|
||||
if (land.Environment == null)
|
||||
row["environment"] = "";
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
row["environment"] = ViewerEnvironment.ToOSDString(land.Environment);
|
||||
}
|
||||
catch
|
||||
{
|
||||
row["environment"] = "";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -2413,79 +2363,7 @@ namespace OpenSim.Data.SQLite
|
|||
row["parcel_tile_ID"] = settings.ParcelImageID.ToString();
|
||||
row["block_search"] = settings.GodBlockSearch;
|
||||
row["casino"] = settings.Casino;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="row"></param>
|
||||
/// <param name="windlight"></param>
|
||||
private static void fillRegionWindlightRow(DataRow row, RegionLightShareData windlight)
|
||||
{
|
||||
row["region_id"] = windlight.regionID.ToString();
|
||||
row["water_color_r"] = windlight.waterColor.X;
|
||||
row["water_color_g"] = windlight.waterColor.Y;
|
||||
row["water_color_b"] = windlight.waterColor.Z;
|
||||
row["water_color_i"] = 1; //windlight.waterColor.W; //not implemented
|
||||
row["water_fog_density_exponent"] = windlight.waterFogDensityExponent;
|
||||
row["underwater_fog_modifier"] = windlight.underwaterFogModifier;
|
||||
row["reflection_wavelet_scale_1"] = windlight.reflectionWaveletScale.X;
|
||||
row["reflection_wavelet_scale_2"] = windlight.reflectionWaveletScale.Y;
|
||||
row["reflection_wavelet_scale_3"] = windlight.reflectionWaveletScale.Z;
|
||||
row["fresnel_scale"] = windlight.fresnelScale;
|
||||
row["fresnel_offset"] = windlight.fresnelOffset;
|
||||
row["refract_scale_above"] = windlight.refractScaleAbove;
|
||||
row["refract_scale_below"] = windlight.refractScaleBelow;
|
||||
row["blur_multiplier"] = windlight.blurMultiplier;
|
||||
row["big_wave_direction_x"] = windlight.bigWaveDirection.X;
|
||||
row["big_wave_direction_y"] = windlight.bigWaveDirection.Y;
|
||||
row["little_wave_direction_x"] = windlight.littleWaveDirection.X;
|
||||
row["little_wave_direction_y"] = windlight.littleWaveDirection.Y;
|
||||
row["normal_map_texture"] = windlight.normalMapTexture.ToString();
|
||||
row["horizon_r"] = windlight.horizon.X;
|
||||
row["horizon_g"] = windlight.horizon.Y;
|
||||
row["horizon_b"] = windlight.horizon.Z;
|
||||
row["horizon_i"] = windlight.horizon.W;
|
||||
row["haze_horizon"] = windlight.hazeHorizon;
|
||||
row["blue_density_r"] = windlight.blueDensity.X;
|
||||
row["blue_density_g"] = windlight.blueDensity.Y;
|
||||
row["blue_density_b"] = windlight.blueDensity.Z;
|
||||
row["blue_density_i"] = windlight.blueDensity.W;
|
||||
row["haze_density"] = windlight.hazeDensity;
|
||||
row["density_multiplier"] = windlight.densityMultiplier;
|
||||
row["distance_multiplier"] = windlight.distanceMultiplier;
|
||||
row["max_altitude"] = windlight.maxAltitude;
|
||||
row["sun_moon_color_r"] = windlight.sunMoonColor.X;
|
||||
row["sun_moon_color_g"] = windlight.sunMoonColor.Y;
|
||||
row["sun_moon_color_b"] = windlight.sunMoonColor.Z;
|
||||
row["sun_moon_color_i"] = windlight.sunMoonColor.W;
|
||||
row["sun_moon_position"] = windlight.sunMoonPosition;
|
||||
row["ambient_r"] = windlight.ambient.X;
|
||||
row["ambient_g"] = windlight.ambient.Y;
|
||||
row["ambient_b"] = windlight.ambient.Z;
|
||||
row["ambient_i"] = windlight.ambient.W;
|
||||
row["east_angle"] = windlight.eastAngle;
|
||||
row["sun_glow_focus"] = windlight.sunGlowFocus;
|
||||
row["sun_glow_size"] = windlight.sunGlowSize;
|
||||
row["scene_gamma"] = windlight.sceneGamma;
|
||||
row["star_brightness"] = windlight.starBrightness;
|
||||
row["cloud_color_r"] = windlight.cloudColor.X;
|
||||
row["cloud_color_g"] = windlight.cloudColor.Y;
|
||||
row["cloud_color_b"] = windlight.cloudColor.Z;
|
||||
row["cloud_color_i"] = windlight.cloudColor.W;
|
||||
row["cloud_x"] = windlight.cloudXYDensity.X;
|
||||
row["cloud_y"] = windlight.cloudXYDensity.Y;
|
||||
row["cloud_density"] = windlight.cloudXYDensity.Z;
|
||||
row["cloud_coverage"] = windlight.cloudCoverage;
|
||||
row["cloud_scale"] = windlight.cloudScale;
|
||||
row["cloud_detail_x"] = windlight.cloudDetailXYDensity.X;
|
||||
row["cloud_detail_y"] = windlight.cloudDetailXYDensity.Y;
|
||||
row["cloud_detail_density"] = windlight.cloudDetailXYDensity.Z;
|
||||
row["cloud_scroll_x"] = windlight.cloudScrollX;
|
||||
row["cloud_scroll_x_lock"] = windlight.cloudScrollXLock;
|
||||
row["cloud_scroll_y"] = windlight.cloudScrollY;
|
||||
row["cloud_scroll_y_lock"] = windlight.cloudScrollYLock;
|
||||
row["draw_classic_clouds"] = windlight.drawClassicClouds;
|
||||
row["cacheID"] = settings.CacheID;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -926,7 +926,7 @@ namespace OpenSim.Data.SQLite
|
|||
{
|
||||
using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
|
||||
{
|
||||
cmd.CommandText = query;
|
||||
cmd.CommandText = string.Format(query, "\"classifieds\"");
|
||||
cmd.Parameters.AddWithValue(":Id", avatarId.ToString());
|
||||
|
||||
using (reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
|
||||
|
@ -940,7 +940,7 @@ namespace OpenSim.Data.SQLite
|
|||
|
||||
using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
|
||||
{
|
||||
cmd.CommandText = query;
|
||||
cmd.CommandText = string.Format(query, "\"userpicks\"");
|
||||
cmd.Parameters.AddWithValue(":Id", avatarId.ToString());
|
||||
|
||||
using (reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
|
||||
|
|
|
@ -305,17 +305,11 @@ namespace OpenSim.Data.SQLite
|
|||
|
||||
using (SqliteCommand cmd = new SqliteCommand())
|
||||
{
|
||||
cmd.CommandText = "update inventoryfolders set version=version+1 where folderID = ?folderID";
|
||||
cmd.CommandText = "update inventoryfolders set version=version+1 where folderID = :folderID";
|
||||
cmd.Parameters.Add(new SqliteParameter(":folderID", folderID));
|
||||
|
||||
try
|
||||
{
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
if(ExecuteNonQuery(cmd, m_Connection) == 0)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
@ -495,10 +495,6 @@ namespace OpenSim.Data.Tests
|
|||
Assert.AreEqual(pricePerMeter, estateSettings.PricePerMeter);
|
||||
Assert.AreEqual(redirectGridX, estateSettings.RedirectGridX);
|
||||
Assert.AreEqual(redirectGridY, estateSettings.RedirectGridY);
|
||||
Assert.AreEqual(useGlobalTime, estateSettings.UseGlobalTime);
|
||||
Assert.AreEqual(fixedSun, estateSettings.FixedSun);
|
||||
|
||||
DataTestUtil.AssertDoubleEqualsWithTolerance(sunPosition, estateSettings.SunPosition);
|
||||
|
||||
Assert.AreEqual(allowVoice, estateSettings.AllowVoice);
|
||||
Assert.AreEqual(allowDirectTeleport, estateSettings.AllowDirectTeleport);
|
||||
|
|
|
@ -269,12 +269,12 @@ namespace OpenSim.Data.Tests
|
|||
random.NextBytes(partsys);
|
||||
DateTime expires = new DateTime(2008, 12, 20);
|
||||
DateTime rezzed = new DateTime(2009, 07, 15);
|
||||
Vector3 groupos = new Vector3(random.Next(),random.Next(),random.Next());
|
||||
Vector3 offset = new Vector3(random.Next(),random.Next(),random.Next());
|
||||
Quaternion rotoff = new Quaternion(random.Next(),random.Next(),random.Next(),random.Next());
|
||||
Vector3 velocity = new Vector3(random.Next(),random.Next(),random.Next());
|
||||
Vector3 angvelo = new Vector3(random.Next(),random.Next(),random.Next());
|
||||
Vector3 accel = new Vector3(random.Next(),random.Next(),random.Next());
|
||||
Vector3 groupos = new Vector3(random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
Vector3 offset = new Vector3(random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
Quaternion rotoff = new Quaternion(random.Next(1),random.Next(1),random.Next(1),random.Next(1));
|
||||
Vector3 velocity = new Vector3(random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
Vector3 angvelo = new Vector3(random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
Vector3 accel = new Vector3(random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
string description = name;
|
||||
Color color = Color.FromArgb(255, 165, 50, 100);
|
||||
string text = "All Your Base Are Belong to Us";
|
||||
|
@ -289,7 +289,7 @@ namespace OpenSim.Data.Tests
|
|||
pbshap.ProfileBegin = ushort.MaxValue;
|
||||
pbshap.ProfileEnd = ushort.MaxValue;
|
||||
pbshap.ProfileHollow = ushort.MaxValue;
|
||||
Vector3 scale = new Vector3(random.Next(),random.Next(),random.Next());
|
||||
Vector3 scale = new Vector3(random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
|
||||
RegionInfo regionInfo = new RegionInfo();
|
||||
regionInfo.RegionID = region3;
|
||||
|
@ -378,9 +378,9 @@ namespace OpenSim.Data.Tests
|
|||
SceneObjectPart p = sogs[0].RootPart;
|
||||
Assert.That(regionh,Is.EqualTo(p.RegionHandle), "Assert.That(regionh,Is.EqualTo(p.RegionHandle))");
|
||||
//Assert.That(localid,Is.EqualTo(p.LocalId), "Assert.That(localid,Is.EqualTo(p.LocalId))");
|
||||
Assert.That(groupos,Is.EqualTo(p.GroupPosition), "Assert.That(groupos,Is.EqualTo(p.GroupPosition))");
|
||||
Assert.That(groupos, Is.EqualTo(p.GroupPosition), "Assert.That(groupos,Is.EqualTo(p.GroupPosition))");
|
||||
Assert.That(name,Is.EqualTo(p.Name), "Assert.That(name,Is.EqualTo(p.Name))");
|
||||
Assert.That(rotoff,Is.EqualTo(p.RotationOffset), "Assert.That(rotoff,Is.EqualTo(p.RotationOffset))");
|
||||
Assert.That(rotoff, Is.EqualTo(p.RotationOffset), "Assert.That(rotoff,Is.EqualTo(p.RotationOffset))");
|
||||
Assert.That(uuid,Is.EqualTo(p.UUID), "Assert.That(uuid,Is.EqualTo(p.UUID))");
|
||||
Assert.That(creator,Is.EqualTo(p.CreatorID), "Assert.That(creator,Is.EqualTo(p.CreatorID))");
|
||||
//Assert.That(iserial,Is.EqualTo(p.InventorySerial), "Assert.That(iserial,Is.EqualTo(p.InventorySerial))");
|
||||
|
@ -443,12 +443,12 @@ namespace OpenSim.Data.Tests
|
|||
random.NextBytes(partsys);
|
||||
DateTime expires = new DateTime(2010, 12, 20);
|
||||
DateTime rezzed = new DateTime(2005, 07, 15);
|
||||
Vector3 groupos = new Vector3(random.Next(),random.Next(),random.Next());
|
||||
Vector3 offset = new Vector3(random.Next(),random.Next(),random.Next());
|
||||
Quaternion rotoff = new Quaternion(random.Next(),random.Next(),random.Next(),random.Next());
|
||||
Vector3 velocity = new Vector3(random.Next(),random.Next(),random.Next());
|
||||
Vector3 angvelo = new Vector3(random.Next(),random.Next(),random.Next());
|
||||
Vector3 accel = new Vector3(random.Next(),random.Next(),random.Next());
|
||||
Vector3 groupos = new Vector3(random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
Vector3 offset = new Vector3(random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
Quaternion rotoff = new Quaternion(random.Next(100000),random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
Vector3 velocity = new Vector3(random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
Vector3 angvelo = new Vector3(random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
Vector3 accel = new Vector3(random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
string description = name;
|
||||
Color color = Color.FromArgb(255, 255, 255, 0);
|
||||
string text = "What You Say?{]\vz~";
|
||||
|
@ -536,12 +536,12 @@ namespace OpenSim.Data.Tests
|
|||
{
|
||||
UUID tmp = UUID.Random();
|
||||
SceneObjectPart sop = NewSOP(("Test SOP " + i.ToString()),tmp);
|
||||
Vector3 groupos = new Vector3(random.Next(),random.Next(),random.Next());
|
||||
Vector3 offset = new Vector3(random.Next(),random.Next(),random.Next());
|
||||
Quaternion rotoff = new Quaternion(random.Next(),random.Next(),random.Next(),random.Next());
|
||||
Vector3 velocity = new Vector3(random.Next(),random.Next(),random.Next());
|
||||
Vector3 angvelo = new Vector3(random.Next(),random.Next(),random.Next());
|
||||
Vector3 accel = new Vector3(random.Next(),random.Next(),random.Next());
|
||||
Vector3 groupos = new Vector3(random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
Vector3 offset = new Vector3(random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
Quaternion rotoff = new Quaternion(random.Next(100000),random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
Vector3 velocity = new Vector3(random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
Vector3 angvelo = new Vector3(random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
Vector3 accel = new Vector3(random.Next(100000),random.Next(100000),random.Next(100000));
|
||||
|
||||
sop.GroupPosition = groupos;
|
||||
sop.RotationOffset = rotoff;
|
||||
|
@ -648,11 +648,13 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T020_PrimInventoryEmpty()
|
||||
{
|
||||
/*
|
||||
TestHelpers.InMethod();
|
||||
|
||||
SceneObjectGroup sog = GetMySOG("object1");
|
||||
TaskInventoryItem t = sog.GetInventoryItem(sog.RootPart.LocalId, item1);
|
||||
Assert.That(t, Is.Null);
|
||||
*/
|
||||
}
|
||||
|
||||
// TODO: Is there any point to call StorePrimInventory on a list, rather than on the prim itself?
|
||||
|
@ -672,6 +674,7 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T021_PrimInventoryBasic()
|
||||
{
|
||||
/*
|
||||
TestHelpers.InMethod();
|
||||
|
||||
SceneObjectGroup sog = GetMySOG("object1");
|
||||
|
@ -707,11 +710,13 @@ namespace OpenSim.Data.Tests
|
|||
sog = FindSOG("object1", region1);
|
||||
t = sog.GetInventoryItem(sog.RootPart.LocalId, item1);
|
||||
Assert.That(t, Is.Null);
|
||||
*/
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void T025_PrimInventoryPersistency()
|
||||
{
|
||||
/*
|
||||
TestHelpers.InMethod();
|
||||
|
||||
InventoryItemBase i = new InventoryItemBase();
|
||||
|
@ -779,12 +784,14 @@ namespace OpenSim.Data.Tests
|
|||
// Assert.That(t.CurrentPermissions, Is.EqualTo(curperm | 16), "Assert.That(t.CurrentPermissions, Is.EqualTo(curperm | 8))");
|
||||
Assert.That(t.ParentID,Is.EqualTo(sog.RootPart.FolderID), "Assert.That(t.ParentID,Is.EqualTo(sog.RootPart.FolderID))");
|
||||
Assert.That(t.ParentPartID,Is.EqualTo(sog.RootPart.UUID), "Assert.That(t.ParentPartID,Is.EqualTo(sog.RootPart.UUID))");
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
[Test]
|
||||
[ExpectedException(typeof(ArgumentException))]
|
||||
public void T026_PrimInventoryMany()
|
||||
{
|
||||
|
||||
TestHelpers.InMethod();
|
||||
|
||||
UUID i1,i2,i3,i4;
|
||||
|
@ -812,8 +819,9 @@ namespace OpenSim.Data.Tests
|
|||
Assert.That(t3.Name, Is.EqualTo(ib3.Name), "Assert.That(t3.Name, Is.EqualTo(ib3.Name))");
|
||||
TaskInventoryItem t4 = sog.GetInventoryItem(sog.RootPart.LocalId, i4);
|
||||
Assert.That(t4, Is.Null);
|
||||
}
|
||||
|
||||
}
|
||||
*/
|
||||
[Test]
|
||||
public void T052_RemoveObject()
|
||||
{
|
||||
|
@ -861,7 +869,6 @@ namespace OpenSim.Data.Tests
|
|||
double terrainlower = random.Next();
|
||||
Vector3 sunvector = new Vector3((float)Math.Round(random.NextDouble(),5),(float)Math.Round(random.NextDouble(),5),(float)Math.Round(random.NextDouble(),5));
|
||||
UUID terimgid = UUID.Random();
|
||||
double sunpos = random.Next();
|
||||
UUID cov = UUID.Random();
|
||||
|
||||
RegionSettings r1 = db.LoadRegionSettings(region1);
|
||||
|
@ -895,10 +902,8 @@ namespace OpenSim.Data.Tests
|
|||
r1.TerrainLowerLimit = terrainlower;
|
||||
r1.UseEstateSun = false;
|
||||
r1.Sandbox = true;
|
||||
r1.SunVector = sunvector;
|
||||
r1.TerrainImageID = terimgid;
|
||||
r1.FixedSun = true;
|
||||
r1.SunPosition = sunpos;
|
||||
r1.Covenant = cov;
|
||||
|
||||
db.StoreRegionSettings(r1);
|
||||
|
@ -933,12 +938,8 @@ namespace OpenSim.Data.Tests
|
|||
Assert.That(r1a.WaterHeight,Is.EqualTo(waterh), "Assert.That(r1a.WaterHeight,Is.EqualTo(waterh))");
|
||||
Assert.That(r1a.TerrainRaiseLimit,Is.EqualTo(terrainraise), "Assert.That(r1a.TerrainRaiseLimit,Is.EqualTo(terrainraise))");
|
||||
Assert.That(r1a.TerrainLowerLimit,Is.EqualTo(terrainlower), "Assert.That(r1a.TerrainLowerLimit,Is.EqualTo(terrainlower))");
|
||||
Assert.That(r1a.UseEstateSun,Is.False);
|
||||
Assert.That(r1a.Sandbox,Is.True);
|
||||
Assert.That(r1a.SunVector,Is.EqualTo(sunvector), "Assert.That(r1a.SunVector,Is.EqualTo(sunvector))");
|
||||
//Assert.That(r1a.TerrainImageID,Is.EqualTo(terimgid), "Assert.That(r1a.TerrainImageID,Is.EqualTo(terimgid))");
|
||||
Assert.That(r1a.FixedSun,Is.True);
|
||||
Assert.That(r1a.SunPosition, Is.EqualTo(sunpos), "Assert.That(r1a.SunPosition, Is.EqualTo(sunpos))");
|
||||
Assert.That(r1a.Covenant, Is.EqualTo(cov), "Assert.That(r1a.Covenant, Is.EqualTo(cov))");
|
||||
}
|
||||
|
||||
|
@ -962,7 +963,7 @@ namespace OpenSim.Data.Tests
|
|||
db.StoreTerrain(t1, region1);
|
||||
|
||||
// store terrain is async
|
||||
Thread.Sleep(1000);
|
||||
Thread.Sleep(500);
|
||||
|
||||
Assert.That(db.LoadTerrain(zero), Is.Null);
|
||||
Assert.That(db.LoadTerrain(region1), Is.Not.Null);
|
||||
|
@ -992,7 +993,7 @@ namespace OpenSim.Data.Tests
|
|||
db.StoreTerrain(baseterrain2, region1);
|
||||
|
||||
// store terrain is async
|
||||
Thread.Sleep(1000);
|
||||
Thread.Sleep(500);
|
||||
|
||||
double[,] t1 = db.LoadTerrain(region1);
|
||||
Assert.That(CompareTerrain(t1, baseterrain1), Is.False);
|
||||
|
@ -1078,7 +1079,6 @@ namespace OpenSim.Data.Tests
|
|||
sop.Shape = PrimitiveBaseShape.Default;
|
||||
|
||||
SceneObjectGroup sog = new SceneObjectGroup(sop);
|
||||
// sog.SetScene(scene);
|
||||
|
||||
return sog;
|
||||
}
|
||||
|
|
|
@ -173,6 +173,7 @@ namespace OpenSim.Framework
|
|||
/// Position the Agent's Avatar starts in the region
|
||||
/// </summary>
|
||||
public Vector3 startpos;
|
||||
public float startfar = -1.0f;
|
||||
|
||||
public Dictionary<string, object> ServiceURLs;
|
||||
|
||||
|
@ -219,6 +220,8 @@ namespace OpenSim.Framework
|
|||
args["channel"] = OSD.FromString(Channel);
|
||||
args["mac"] = OSD.FromString(Mac);
|
||||
args["id0"] = OSD.FromString(Id0);
|
||||
if(startfar > 0)
|
||||
args["far"] = OSD.FromReal(startfar);
|
||||
|
||||
if (Appearance != null)
|
||||
{
|
||||
|
@ -264,16 +267,17 @@ namespace OpenSim.Framework
|
|||
/// <param name="args"></param>
|
||||
public void UnpackAgentCircuitData(OSDMap args)
|
||||
{
|
||||
if (args["agent_id"] != null)
|
||||
AgentID = args["agent_id"].AsUUID();
|
||||
if (args["base_folder"] != null)
|
||||
BaseFolder = args["base_folder"].AsUUID();
|
||||
if (args["caps_path"] != null)
|
||||
CapsPath = args["caps_path"].AsString();
|
||||
OSD tmpOSD;
|
||||
if (args.TryGetValue("agent_id", out tmpOSD))
|
||||
AgentID = tmpOSD.AsUUID();
|
||||
if (args.TryGetValue("base_folder", out tmpOSD))
|
||||
BaseFolder =tmpOSD.AsUUID();
|
||||
if (args.TryGetValue("caps_path", out tmpOSD))
|
||||
CapsPath = tmpOSD.AsString();
|
||||
|
||||
if ((args["children_seeds"] != null) && (args["children_seeds"].Type == OSDType.Array))
|
||||
if ((args.TryGetValue("children_seeds", out tmpOSD) && tmpOSD is OSDArray))
|
||||
{
|
||||
OSDArray childrenSeeds = (OSDArray)(args["children_seeds"]);
|
||||
OSDArray childrenSeeds = (OSDArray)tmpOSD;
|
||||
ChildrenCapSeeds = new Dictionary<ulong, string>();
|
||||
foreach (OSD o in childrenSeeds)
|
||||
{
|
||||
|
@ -282,50 +286,59 @@ namespace OpenSim.Framework
|
|||
ulong handle = 0;
|
||||
string seed = "";
|
||||
OSDMap pair = (OSDMap)o;
|
||||
if (pair["handle"] != null)
|
||||
if (!UInt64.TryParse(pair["handle"].AsString(), out handle))
|
||||
if (pair.TryGetValue("handle", out tmpOSD))
|
||||
{
|
||||
if (!UInt64.TryParse(tmpOSD.AsString(), out handle))
|
||||
continue;
|
||||
if (pair["seed"] != null)
|
||||
seed = pair["seed"].AsString();
|
||||
}
|
||||
if (!ChildrenCapSeeds.ContainsKey(handle))
|
||||
ChildrenCapSeeds.Add(handle, seed);
|
||||
{
|
||||
if (pair.TryGetValue("seed", out tmpOSD))
|
||||
{
|
||||
seed = tmpOSD.AsString();
|
||||
ChildrenCapSeeds.Add(handle, seed);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
ChildrenCapSeeds = new Dictionary<ulong, string>();
|
||||
|
||||
if (args["child"] != null)
|
||||
child = args["child"].AsBoolean();
|
||||
if (args["circuit_code"] != null)
|
||||
UInt32.TryParse(args["circuit_code"].AsString(), out circuitcode);
|
||||
if (args["first_name"] != null)
|
||||
firstname = args["first_name"].AsString();
|
||||
if (args["last_name"] != null)
|
||||
lastname = args["last_name"].AsString();
|
||||
if (args["inventory_folder"] != null)
|
||||
InventoryFolder = args["inventory_folder"].AsUUID();
|
||||
if (args["secure_session_id"] != null)
|
||||
SecureSessionID = args["secure_session_id"].AsUUID();
|
||||
if (args["session_id"] != null)
|
||||
SessionID = args["session_id"].AsUUID();
|
||||
if (args["service_session_id"] != null)
|
||||
ServiceSessionID = args["service_session_id"].AsString();
|
||||
if (args["client_ip"] != null)
|
||||
IPAddress = args["client_ip"].AsString();
|
||||
if (args["viewer"] != null)
|
||||
Viewer = args["viewer"].AsString();
|
||||
if (args["channel"] != null)
|
||||
Channel = args["channel"].AsString();
|
||||
if (args["mac"] != null)
|
||||
Mac = args["mac"].AsString();
|
||||
if (args["id0"] != null)
|
||||
Id0 = args["id0"].AsString();
|
||||
if (args["teleport_flags"] != null)
|
||||
teleportFlags = args["teleport_flags"].AsUInteger();
|
||||
if (args.TryGetValue("child", out tmpOSD))
|
||||
child = tmpOSD.AsBoolean();
|
||||
if (args.TryGetValue("circuit_code", out tmpOSD))
|
||||
UInt32.TryParse(tmpOSD.AsString(), out circuitcode);
|
||||
if (args.TryGetValue("first_name", out tmpOSD))
|
||||
firstname = tmpOSD.AsString();
|
||||
if (args.TryGetValue("last_name", out tmpOSD))
|
||||
lastname = tmpOSD.AsString();
|
||||
if (args.TryGetValue("inventory_folder", out tmpOSD))
|
||||
InventoryFolder = tmpOSD.AsUUID();
|
||||
if (args.TryGetValue("secure_session_id", out tmpOSD))
|
||||
SecureSessionID = tmpOSD.AsUUID();
|
||||
if (args.TryGetValue("session_id", out tmpOSD))
|
||||
SessionID = tmpOSD.AsUUID();
|
||||
if (args.TryGetValue("service_session_id", out tmpOSD))
|
||||
ServiceSessionID = tmpOSD.AsString();
|
||||
if (args.TryGetValue("client_ip", out tmpOSD))
|
||||
IPAddress = tmpOSD.AsString();
|
||||
if (args.TryGetValue("viewer", out tmpOSD))
|
||||
Viewer = tmpOSD.AsString();
|
||||
if (args.TryGetValue("channel", out tmpOSD))
|
||||
Channel = tmpOSD.AsString();
|
||||
if (args.TryGetValue("mac", out tmpOSD))
|
||||
Mac = tmpOSD.AsString();
|
||||
if (args.TryGetValue("id0", out tmpOSD))
|
||||
Id0 = tmpOSD.AsString();
|
||||
if (args.TryGetValue("teleport_flags", out tmpOSD))
|
||||
teleportFlags = tmpOSD.AsUInteger();
|
||||
|
||||
if (args["start_pos"] != null)
|
||||
Vector3.TryParse(args["start_pos"].AsString(), out startpos);
|
||||
if (args.TryGetValue("start_pos", out tmpOSD))
|
||||
Vector3.TryParse(tmpOSD.AsString(), out startpos);
|
||||
|
||||
if(args.TryGetValue("far", out tmpOSD))
|
||||
startfar = (float)tmpOSD.AsReal();
|
||||
|
||||
//m_log.InfoFormat("[AGENTCIRCUITDATA]: agentid={0}, child={1}, startpos={2}", AgentID, child, startpos);
|
||||
|
||||
|
@ -336,12 +349,12 @@ namespace OpenSim.Framework
|
|||
|
||||
// Eventually this code should be deprecated, use full appearance
|
||||
// packing in packed_appearance
|
||||
if (args["appearance_serial"] != null)
|
||||
Appearance.Serial = args["appearance_serial"].AsInteger();
|
||||
if (args.TryGetValue("appearance_serial", out tmpOSD))
|
||||
Appearance.Serial = tmpOSD.AsInteger();
|
||||
|
||||
if (args.ContainsKey("packed_appearance") && (args["packed_appearance"].Type == OSDType.Map))
|
||||
if (args.TryGetValue("packed_appearance", out tmpOSD) && (tmpOSD is OSDMap))
|
||||
{
|
||||
Appearance.Unpack((OSDMap)args["packed_appearance"]);
|
||||
Appearance.Unpack((OSDMap)tmpOSD);
|
||||
// m_log.InfoFormat("[AGENTCIRCUITDATA] unpacked appearance");
|
||||
}
|
||||
else
|
||||
|
@ -356,31 +369,29 @@ namespace OpenSim.Framework
|
|||
|
||||
ServiceURLs = new Dictionary<string, object>();
|
||||
// Try parse the new way, OSDMap
|
||||
if (args.ContainsKey("serviceurls") && args["serviceurls"] != null && (args["serviceurls"]).Type == OSDType.Map)
|
||||
if (args.TryGetValue("serviceurls", out tmpOSD) && (tmpOSD is OSDMap))
|
||||
{
|
||||
OSDMap urls = (OSDMap)(args["serviceurls"]);
|
||||
OSDMap urls = (OSDMap)tmpOSD;
|
||||
foreach (KeyValuePair<String, OSD> kvp in urls)
|
||||
{
|
||||
ServiceURLs[kvp.Key] = kvp.Value.AsString();
|
||||
ServiceURLs[kvp.Key] = kvp.Value;
|
||||
//System.Console.WriteLine("XXX " + kvp.Key + "=" + ServiceURLs[kvp.Key]);
|
||||
|
||||
}
|
||||
}
|
||||
// else try the old way, OSDArray
|
||||
// OBSOLETE -- soon to be deleted
|
||||
else if (args.ContainsKey("service_urls") && args["service_urls"] != null && (args["service_urls"]).Type == OSDType.Array)
|
||||
else if (args.TryGetValue("service_urls", out tmpOSD) && (tmpOSD is OSDArray))
|
||||
{
|
||||
OSDArray urls = (OSDArray)(args["service_urls"]);
|
||||
for (int i = 0; i < urls.Count / 2; i++)
|
||||
OSDArray urls = (OSDArray)tmpOSD;
|
||||
OSD tmpOSDb;
|
||||
for (int i = 0; i < urls.Count - 1; i += 2)
|
||||
{
|
||||
ServiceURLs[urls[i * 2].AsString()] = urls[(i * 2) + 1].AsString();
|
||||
tmpOSD = urls[i];
|
||||
tmpOSDb = urls[i + 1];
|
||||
ServiceURLs[tmpOSD.AsString()] = tmpOSDb.AsString();
|
||||
//System.Console.WriteLine("XXX " + urls[i * 2].AsString() + "=" + urls[(i * 2) + 1].AsString());
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
*/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Concurrent;
|
||||
using OpenMetaverse;
|
||||
|
||||
namespace OpenSim.Framework
|
||||
|
@ -41,26 +42,18 @@ namespace OpenSim.Framework
|
|||
/// <remarks>
|
||||
/// We lock this for operations both on this dictionary and on m_agentCircuitsByUUID
|
||||
/// </remarks>
|
||||
private Dictionary<uint, AgentCircuitData> m_agentCircuits = new Dictionary<uint, AgentCircuitData>();
|
||||
private ConcurrentDictionary<uint, AgentCircuitData> m_agentCircuits = new ConcurrentDictionary<uint, AgentCircuitData>();
|
||||
|
||||
/// <summary>
|
||||
/// Agent circuits indexed by agent UUID.
|
||||
/// </summary>
|
||||
private Dictionary<UUID, AgentCircuitData> m_agentCircuitsByUUID = new Dictionary<UUID, AgentCircuitData>();
|
||||
private ConcurrentDictionary<UUID, AgentCircuitData> m_agentCircuitsByUUID = new ConcurrentDictionary<UUID, AgentCircuitData>();
|
||||
|
||||
public virtual AuthenticateResponse AuthenticateSession(UUID sessionID, UUID agentID, uint circuitcode)
|
||||
{
|
||||
AgentCircuitData validcircuit = null;
|
||||
|
||||
lock (m_agentCircuits)
|
||||
{
|
||||
if (m_agentCircuits.ContainsKey(circuitcode))
|
||||
validcircuit = m_agentCircuits[circuitcode];
|
||||
}
|
||||
|
||||
AuthenticateResponse user = new AuthenticateResponse();
|
||||
|
||||
if (validcircuit == null)
|
||||
if (!m_agentCircuits.TryGetValue(circuitcode, out AgentCircuitData validcircuit) || validcircuit == null)
|
||||
{
|
||||
//don't have this circuit code in our list
|
||||
user.Authorised = false;
|
||||
|
@ -79,13 +72,13 @@ namespace OpenSim.Framework
|
|||
user.LoginInfo.InventoryFolder = validcircuit.InventoryFolder;
|
||||
user.LoginInfo.BaseFolder = validcircuit.BaseFolder;
|
||||
user.LoginInfo.StartPos = validcircuit.startpos;
|
||||
user.LoginInfo.StartFar = (float)validcircuit.startfar;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Invalid
|
||||
user.Authorised = false;
|
||||
}
|
||||
|
||||
return user;
|
||||
}
|
||||
|
||||
|
@ -96,65 +89,39 @@ namespace OpenSim.Framework
|
|||
/// <param name="agentData"></param>
|
||||
public virtual void AddNewCircuit(uint circuitCode, AgentCircuitData agentData)
|
||||
{
|
||||
lock (m_agentCircuits)
|
||||
{
|
||||
if (m_agentCircuits.ContainsKey(circuitCode))
|
||||
{
|
||||
m_agentCircuits[circuitCode] = agentData;
|
||||
m_agentCircuitsByUUID[agentData.AgentID] = agentData;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_agentCircuits.Add(circuitCode, agentData);
|
||||
m_agentCircuitsByUUID[agentData.AgentID] = agentData;
|
||||
}
|
||||
}
|
||||
RemoveCircuit(agentData.AgentID); // no duplications
|
||||
m_agentCircuits[circuitCode] = agentData;
|
||||
m_agentCircuitsByUUID[agentData.AgentID] = agentData;
|
||||
}
|
||||
|
||||
public virtual void RemoveCircuit(uint circuitCode)
|
||||
{
|
||||
lock (m_agentCircuits)
|
||||
if (m_agentCircuits.TryRemove(circuitCode, out AgentCircuitData ac))
|
||||
{
|
||||
if (m_agentCircuits.ContainsKey(circuitCode))
|
||||
{
|
||||
UUID agentID = m_agentCircuits[circuitCode].AgentID;
|
||||
m_agentCircuits.Remove(circuitCode);
|
||||
m_agentCircuitsByUUID.Remove(agentID);
|
||||
}
|
||||
m_agentCircuitsByUUID.TryRemove(ac.AgentID, out AgentCircuitData dummy);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void RemoveCircuit(UUID agentID)
|
||||
{
|
||||
lock (m_agentCircuits)
|
||||
if (m_agentCircuitsByUUID.TryRemove(agentID, out AgentCircuitData ac))
|
||||
{
|
||||
if (m_agentCircuitsByUUID.ContainsKey(agentID))
|
||||
{
|
||||
uint circuitCode = m_agentCircuitsByUUID[agentID].circuitcode;
|
||||
m_agentCircuits.Remove(circuitCode);
|
||||
m_agentCircuitsByUUID.Remove(agentID);
|
||||
}
|
||||
m_agentCircuits.TryRemove(ac.circuitcode, out AgentCircuitData dummy);
|
||||
}
|
||||
}
|
||||
|
||||
public AgentCircuitData GetAgentCircuitData(uint circuitCode)
|
||||
{
|
||||
AgentCircuitData agentCircuit = null;
|
||||
|
||||
lock (m_agentCircuits)
|
||||
m_agentCircuits.TryGetValue(circuitCode, out agentCircuit);
|
||||
|
||||
return agentCircuit;
|
||||
if(m_agentCircuits.TryGetValue(circuitCode, out AgentCircuitData agentCircuit))
|
||||
return agentCircuit;
|
||||
return null;
|
||||
}
|
||||
|
||||
public AgentCircuitData GetAgentCircuitData(UUID agentID)
|
||||
{
|
||||
AgentCircuitData agentCircuit = null;
|
||||
|
||||
lock (m_agentCircuits)
|
||||
m_agentCircuitsByUUID.TryGetValue(agentID, out agentCircuit);
|
||||
|
||||
return agentCircuit;
|
||||
if(m_agentCircuitsByUUID.TryGetValue(agentID, out AgentCircuitData agentCircuit))
|
||||
return agentCircuit;
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -169,20 +136,16 @@ namespace OpenSim.Framework
|
|||
|
||||
public void UpdateAgentData(AgentCircuitData agentData)
|
||||
{
|
||||
lock (m_agentCircuits)
|
||||
if (m_agentCircuits.TryGetValue(agentData.circuitcode, out AgentCircuitData ac))
|
||||
{
|
||||
if (m_agentCircuits.ContainsKey((uint) agentData.circuitcode))
|
||||
{
|
||||
m_agentCircuits[(uint) agentData.circuitcode].firstname = agentData.firstname;
|
||||
m_agentCircuits[(uint) agentData.circuitcode].lastname = agentData.lastname;
|
||||
m_agentCircuits[(uint) agentData.circuitcode].startpos = agentData.startpos;
|
||||
ac.firstname = agentData.firstname;
|
||||
ac.lastname = agentData.lastname;
|
||||
ac.startpos = agentData.startpos;
|
||||
ac.startfar = agentData.startfar;
|
||||
|
||||
// Updated for when we don't know them before calling Scene.NewUserConnection
|
||||
m_agentCircuits[(uint) agentData.circuitcode].SecureSessionID = agentData.SecureSessionID;
|
||||
m_agentCircuits[(uint) agentData.circuitcode].SessionID = agentData.SessionID;
|
||||
|
||||
// m_log.Debug("update user start pos is " + agentData.startpos.X + " , " + agentData.startpos.Y + " , " + agentData.startpos.Z);
|
||||
}
|
||||
// Updated for when we don't know them before calling Scene.NewUserConnection
|
||||
ac.SecureSessionID = agentData.SecureSessionID;
|
||||
ac.SessionID = agentData.SessionID;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -191,38 +154,30 @@ namespace OpenSim.Framework
|
|||
/// </summary>
|
||||
/// <param name="circuitcode"></param>
|
||||
/// <param name="newcircuitcode"></param>
|
||||
public bool TryChangeCiruitCode(uint circuitcode, uint newcircuitcode)
|
||||
public bool TryChangeCircuitCode(uint circuitcode, uint newcircuitcode)
|
||||
{
|
||||
lock (m_agentCircuits)
|
||||
if(m_agentCircuits.ContainsKey(newcircuitcode))
|
||||
return false;
|
||||
if (m_agentCircuits.TryRemove(circuitcode, out AgentCircuitData agentData))
|
||||
{
|
||||
if (m_agentCircuits.ContainsKey((uint)circuitcode) && !m_agentCircuits.ContainsKey((uint)newcircuitcode))
|
||||
{
|
||||
AgentCircuitData agentData = m_agentCircuits[(uint)circuitcode];
|
||||
|
||||
agentData.circuitcode = newcircuitcode;
|
||||
|
||||
m_agentCircuits.Remove((uint)circuitcode);
|
||||
m_agentCircuits.Add(newcircuitcode, agentData);
|
||||
return true;
|
||||
}
|
||||
agentData.circuitcode = newcircuitcode;
|
||||
m_agentCircuits.TryAdd(newcircuitcode, agentData);
|
||||
m_agentCircuitsByUUID[agentData.AgentID] = agentData;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public void UpdateAgentChildStatus(uint circuitcode, bool childstatus)
|
||||
{
|
||||
lock (m_agentCircuits)
|
||||
if (m_agentCircuits.ContainsKey(circuitcode))
|
||||
m_agentCircuits[circuitcode].child = childstatus;
|
||||
if (m_agentCircuits.TryGetValue(circuitcode, out AgentCircuitData ac))
|
||||
ac.child = childstatus;
|
||||
}
|
||||
|
||||
public bool GetAgentChildStatus(uint circuitcode)
|
||||
{
|
||||
lock (m_agentCircuits)
|
||||
if (m_agentCircuits.ContainsKey(circuitcode))
|
||||
return m_agentCircuits[circuitcode].child;
|
||||
|
||||
if (m_agentCircuits.TryGetValue(circuitcode, out AgentCircuitData ac))
|
||||
return ac.child;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -83,6 +83,7 @@ namespace OpenSim.Framework
|
|||
public bool UseClientAgentPosition;
|
||||
public bool NeedsCameraCollision;
|
||||
public uint lastpacketSequence;
|
||||
public double lastUpdateTS;
|
||||
|
||||
public AgentUpdateArgs()
|
||||
{
|
||||
|
|
|
@ -112,12 +112,13 @@ namespace OpenSim.Framework
|
|||
/// <param name="args"></param>
|
||||
public void UnpackUpdateMessage(OSDMap args)
|
||||
{
|
||||
if (args["animation"] != null)
|
||||
animID = args["animation"].AsUUID();
|
||||
if (args["object_id"] != null)
|
||||
objectID = args["object_id"].AsUUID();
|
||||
if (args["seq_num"] != null)
|
||||
sequenceNum = args["seq_num"].AsInteger();
|
||||
OSD tmp;
|
||||
if (args.TryGetValue("animation", out tmp))
|
||||
animID = tmp.AsUUID();
|
||||
if (args.TryGetValue("object_id", out tmp))
|
||||
objectID = tmp.AsUUID();
|
||||
if (args.TryGetValue("seq_num", out tmp))
|
||||
sequenceNum = tmp.AsInteger();
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
|
|
|
@ -31,7 +31,8 @@ using OpenMetaverse;
|
|||
|
||||
namespace OpenSim.Framework
|
||||
{
|
||||
public delegate bool AnimationSetValidator(UUID animID);
|
||||
// public delegate bool AnimationSetValidator(UUID animID);
|
||||
public delegate uint AnimationSetValidator(UUID animID);
|
||||
|
||||
public class AnimationSet
|
||||
{
|
||||
|
@ -141,7 +142,7 @@ namespace OpenSim.Framework
|
|||
assetData += String.Format("{0} {1} {2}\n", kvp.Key, kvp.Value.Value.ToString(), kvp.Value.Key);
|
||||
return System.Text.Encoding.ASCII.GetBytes(assetData);
|
||||
}
|
||||
|
||||
/*
|
||||
public bool Validate(AnimationSetValidator val)
|
||||
{
|
||||
if (m_parseError)
|
||||
|
@ -164,5 +165,22 @@ namespace OpenSim.Framework
|
|||
|
||||
return allOk;
|
||||
}
|
||||
*/
|
||||
public uint Validate(AnimationSetValidator val)
|
||||
{
|
||||
if (m_parseError)
|
||||
return 0;
|
||||
|
||||
uint ret = 0x7fffffff;
|
||||
uint t;
|
||||
foreach (KeyValuePair<string, KeyValuePair<string, UUID>> kvp in m_animations)
|
||||
{
|
||||
t = val(kvp.Value.Value);
|
||||
if (t == 0)
|
||||
return 0;
|
||||
ret &= t;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,12 +34,13 @@ using OpenMetaverse;
|
|||
namespace OpenSim.Framework
|
||||
{
|
||||
[Flags]
|
||||
// this enum is stuck, can not be changed or will break compatibilty with any version older than that change
|
||||
public enum AssetFlags : int
|
||||
{
|
||||
Normal = 0, // Immutable asset
|
||||
Maptile = 1, // What it says
|
||||
Rewritable = 2, // Content can be rewritten
|
||||
Collectable = 4 // Can be GC'ed after some time
|
||||
Collectable = 4, // Can be GC'ed after some time
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -42,11 +42,13 @@ namespace OpenSim.Framework.AssetLoader.Filesystem
|
|||
public class AssetLoaderFileSystem : IAssetLoader
|
||||
{
|
||||
private static readonly UUID LIBRARY_OWNER_ID = new UUID("11111111-1111-0000-0000-000100bba000");
|
||||
private static readonly string LIBRARY_OWNER_IDstr = "11111111-1111-0000-0000-000100bba000";
|
||||
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
protected static AssetBase CreateAsset(string assetIdStr, string name, string path, sbyte type)
|
||||
{
|
||||
AssetBase asset = new AssetBase(new UUID(assetIdStr), name, type, LIBRARY_OWNER_ID.ToString());
|
||||
AssetBase asset = new AssetBase(new UUID(assetIdStr), name, type, LIBRARY_OWNER_IDstr);
|
||||
|
||||
if (!String.IsNullOrEmpty(path))
|
||||
{
|
||||
|
|
|
@ -51,27 +51,28 @@ namespace OpenSim.Framework
|
|||
|
||||
// this is viewer capabilities and weared things dependent
|
||||
// should be only used as initial default value ( V1 viewers )
|
||||
public readonly static int VISUALPARAM_COUNT = 218;
|
||||
public const int VISUALPARAM_COUNT = 218;
|
||||
|
||||
// public readonly static int TEXTURE_COUNT = 21
|
||||
// 21 bad, make it be updated as libovm gets update
|
||||
// also keeping in sync with it
|
||||
public readonly static int TEXTURE_COUNT = Primitive.TextureEntry.MAX_FACES;
|
||||
// regions and viewer compatibility
|
||||
public readonly static int TEXTURE_COUNT = 45;
|
||||
public const int TEXTURE_COUNT_PV7 = 29;
|
||||
public const int BAKES_COUNT_PV7 = 6;
|
||||
public const int MAXWEARABLE_PV7 = 16;
|
||||
public const int MAXWEARABLE_LEGACY = 15;
|
||||
|
||||
public readonly static byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
|
||||
public readonly static byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20, 40, 41, 42, 43, 44 };
|
||||
|
||||
protected int m_serial = 0;
|
||||
protected byte[] m_visualparams;
|
||||
protected Primitive.TextureEntry m_texture;
|
||||
protected AvatarWearable[] m_wearables;
|
||||
protected Dictionary<int, List<AvatarAttachment>> m_attachments;
|
||||
protected float m_avatarHeight = 0;
|
||||
protected WearableCacheItem[] m_cacheitems;
|
||||
protected Vector3 m_avatarSize = new Vector3(0.45f, 0.6f, 1.9f); // sl Z cloud value
|
||||
protected Vector3 m_avatarBoxSize = new Vector3(0.45f, 0.6f, 1.9f);
|
||||
protected float m_avatarHeight = 0;
|
||||
protected float m_avatarFeetOffset = 0;
|
||||
protected float m_avatarAnimOffset = 0;
|
||||
protected WearableCacheItem[] m_cacheitems;
|
||||
protected bool m_cacheItemsDirty = true;
|
||||
|
||||
public virtual int Serial
|
||||
{
|
||||
|
@ -128,11 +129,7 @@ namespace OpenSim.Framework
|
|||
set { m_cacheitems = value; }
|
||||
}
|
||||
|
||||
public virtual bool WearableCacheItemsDirty
|
||||
{
|
||||
get { return m_cacheItemsDirty; }
|
||||
set { m_cacheItemsDirty = value; }
|
||||
}
|
||||
public virtual float AvatarPreferencesHoverZ { get; set; }
|
||||
|
||||
public AvatarAppearance()
|
||||
{
|
||||
|
@ -204,12 +201,14 @@ namespace OpenSim.Framework
|
|||
SetDefaultParams();
|
||||
// SetHeight();
|
||||
SetSize(new Vector3(0.45f, 0.6f, 1.9f));
|
||||
AvatarPreferencesHoverZ = 0;
|
||||
m_attachments = new Dictionary<int, List<AvatarAttachment>>();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
m_serial = appearance.Serial;
|
||||
AvatarPreferencesHoverZ = appearance.AvatarPreferencesHoverZ;
|
||||
|
||||
if (copyWearables && (appearance.Wearables != null))
|
||||
{
|
||||
|
@ -228,7 +227,7 @@ namespace OpenSim.Framework
|
|||
m_texture = null;
|
||||
if (appearance.Texture != null)
|
||||
{
|
||||
byte[] tbytes = appearance.Texture.GetBytes();
|
||||
byte[] tbytes = appearance.Texture.GetBakesBytes();
|
||||
m_texture = new Primitive.TextureEntry(tbytes,0,tbytes.Length);
|
||||
if (copyBaked && appearance.m_cacheitems != null)
|
||||
m_cacheitems = (WearableCacheItem[])appearance.m_cacheitems.Clone();
|
||||
|
@ -295,6 +294,7 @@ namespace OpenSim.Framework
|
|||
m_serial = 0;
|
||||
|
||||
SetDefaultTexture();
|
||||
AvatarPreferencesHoverZ = 0;
|
||||
|
||||
//for (int i = 0; i < BAKE_INDICES.Length; i++)
|
||||
// {
|
||||
|
@ -330,9 +330,6 @@ namespace OpenSim.Framework
|
|||
protected virtual void SetDefaultTexture()
|
||||
{
|
||||
m_texture = new Primitive.TextureEntry(new UUID(AppearanceManager.DEFAULT_AVATAR_TEXTURE));
|
||||
|
||||
// for (uint i = 0; i < TEXTURE_COUNT; i++)
|
||||
// m_texture.CreateFace(i).TextureID = new UUID(AppearanceManager.DEFAULT_AVATAR_TEXTURE);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -347,31 +344,31 @@ namespace OpenSim.Framework
|
|||
if (textureEntry == null)
|
||||
return false;
|
||||
|
||||
// There are much simpler versions of this copy that could be
|
||||
// made. We determine if any of the textures actually
|
||||
// changed to know if the appearance should be saved later
|
||||
bool changed = false;
|
||||
for (uint i = 0; i < AvatarAppearance.TEXTURE_COUNT; i++)
|
||||
{
|
||||
Primitive.TextureEntryFace newface = textureEntry.FaceTextures[i];
|
||||
Primitive.TextureEntryFace oldface = m_texture.FaceTextures[i];
|
||||
Primitive.TextureEntryFace newface;
|
||||
Primitive.TextureEntryFace tmpFace;
|
||||
|
||||
if (newface == null)
|
||||
//make sure textureEntry.DefaultTexture is the unused one(DEFAULT_AVATAR_TEXTURE).
|
||||
Primitive.TextureEntry converted = new Primitive.TextureEntry(AppearanceManager.DEFAULT_AVATAR_TEXTURE);
|
||||
for (uint i = 0; i < TEXTURE_COUNT; ++i)
|
||||
{
|
||||
newface = textureEntry.GetFace(i);
|
||||
if (newface.TextureID != AppearanceManager.DEFAULT_AVATAR_TEXTURE)
|
||||
{
|
||||
if (oldface == null)
|
||||
continue;
|
||||
tmpFace = converted.GetFace(i);
|
||||
tmpFace.TextureID = newface.TextureID; // we need a full high level copy, assuming all other parameters are the same.
|
||||
if (m_texture.FaceTextures[i] == null || newface.TextureID != m_texture.FaceTextures[i].TextureID)
|
||||
changed = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (oldface != null && oldface.TextureID == newface.TextureID)
|
||||
{ if (m_texture.FaceTextures[i] == null)
|
||||
continue;
|
||||
if(m_texture.FaceTextures[i].TextureID != AppearanceManager.DEFAULT_AVATAR_TEXTURE)
|
||||
changed = true;
|
||||
}
|
||||
|
||||
changed = true;
|
||||
}
|
||||
|
||||
m_texture = textureEntry;
|
||||
|
||||
if(changed)
|
||||
m_texture = converted;
|
||||
return changed;
|
||||
}
|
||||
|
||||
|
@ -736,42 +733,72 @@ namespace OpenSim.Framework
|
|||
|
||||
data["serial"] = OSD.FromInteger(m_serial);
|
||||
data["height"] = OSD.FromReal(m_avatarHeight);
|
||||
data["aphz"] = OSD.FromReal(AvatarPreferencesHoverZ);
|
||||
|
||||
if (m_texture == null)
|
||||
return data;
|
||||
|
||||
bool sendPV8 = false;
|
||||
|
||||
// Wearables
|
||||
//
|
||||
// This will send as many or as few wearables as we have, unless a count
|
||||
// is given. Used for legacy (pre 0.4) versions.
|
||||
int count = ctx.WearablesCount;
|
||||
if (ctx.WearablesCount == -1)
|
||||
count = m_wearables.Length;
|
||||
OSDArray wears = new OSDArray(count);
|
||||
for (int i = 0; i < count; i++)
|
||||
OSDArray wears;
|
||||
int count;
|
||||
if (ctx == null)
|
||||
count = MAXWEARABLE_LEGACY;
|
||||
else
|
||||
{
|
||||
AvatarWearable dummyWearable = new AvatarWearable();
|
||||
|
||||
if (i < m_wearables.Length)
|
||||
wears.Add(m_wearables[i].Pack());
|
||||
if(ctx.OutboundVersion >= 0.8)
|
||||
{
|
||||
sendPV8 = true;
|
||||
count = m_wearables.Length;
|
||||
}
|
||||
else if (ctx.OutboundVersion >= 0.6)
|
||||
count = MAXWEARABLE_PV7;
|
||||
else
|
||||
wears.Add(dummyWearable.Pack());
|
||||
count = MAXWEARABLE_LEGACY;
|
||||
|
||||
if (sendPV8 && count > MAXWEARABLE_PV7)
|
||||
{
|
||||
wears = new OSDArray(count - MAXWEARABLE_PV7);
|
||||
for (int i = MAXWEARABLE_PV7; i < count; ++i)
|
||||
wears.Add(m_wearables[i].Pack());
|
||||
|
||||
data["wrbls8"] = wears;
|
||||
count = MAXWEARABLE_PV7;
|
||||
}
|
||||
}
|
||||
|
||||
if(count > m_wearables.Length)
|
||||
count = m_wearables.Length;
|
||||
|
||||
wears = new OSDArray(count);
|
||||
for (int i = 0; i < count; ++i)
|
||||
wears.Add(m_wearables[i].Pack());
|
||||
data["wearables"] = wears;
|
||||
|
||||
// Avatar Textures
|
||||
OSDArray textures = new OSDArray(AvatarAppearance.TEXTURE_COUNT);
|
||||
for (uint i = 0; i < AvatarAppearance.TEXTURE_COUNT; i++)
|
||||
OSDArray textures;
|
||||
if (sendPV8)
|
||||
{
|
||||
if (m_texture.FaceTextures[i] != null)
|
||||
textures.Add(OSD.FromUUID(m_texture.FaceTextures[i].TextureID));
|
||||
else
|
||||
textures.Add(OSD.FromUUID(AppearanceManager.DEFAULT_AVATAR_TEXTURE));
|
||||
byte[] te = m_texture.GetBakesBytes();
|
||||
data["te8"] = OSD.FromBinary(te);
|
||||
}
|
||||
else
|
||||
{
|
||||
textures = new OSDArray(TEXTURE_COUNT_PV7);
|
||||
for (uint i = 0; i < TEXTURE_COUNT_PV7; ++i)
|
||||
textures.Add(OSD.FromUUID(m_texture.GetFace(i).TextureID));
|
||||
data["textures"] = textures;
|
||||
}
|
||||
data["textures"] = textures;
|
||||
|
||||
if (m_cacheitems != null)
|
||||
{
|
||||
OSDArray baked = WearableCacheItem.BakedToOSD(m_cacheitems);
|
||||
if (baked != null)
|
||||
OSDArray baked = WearableCacheItem.BakedToOSD(m_cacheitems, 0, BAKES_COUNT_PV7);
|
||||
if (baked != null && baked.Count > 0)
|
||||
data["bakedcache"] = baked;
|
||||
baked = WearableCacheItem.BakedToOSD(m_cacheitems, BAKES_COUNT_PV7, -1);
|
||||
if (baked != null && baked.Count > 0)
|
||||
data["bc8"] = baked;
|
||||
}
|
||||
|
||||
// Visual Parameters
|
||||
|
@ -790,68 +817,178 @@ namespace OpenSim.Framework
|
|||
return data;
|
||||
}
|
||||
|
||||
public OSDMap PackForNotecard(bool NoHuds = true)
|
||||
{
|
||||
OSDMap data = new OSDMap();
|
||||
|
||||
data["serial"] = OSD.FromInteger(m_serial);
|
||||
data["height"] = OSD.FromReal(m_avatarHeight);
|
||||
data["aphz"] = OSD.FromReal(AvatarPreferencesHoverZ);
|
||||
|
||||
// old regions may not like missing/empty wears
|
||||
OSDArray wears = new OSDArray(MAXWEARABLE_LEGACY);
|
||||
for (int i = 0; i< MAXWEARABLE_LEGACY; ++i)
|
||||
wears.Add(new OSDArray());
|
||||
data["wearables"] = wears;
|
||||
|
||||
// Avatar Textures
|
||||
OSDArray textures;
|
||||
|
||||
// allow old regions to still see something
|
||||
textures = new OSDArray(TEXTURE_COUNT_PV7);
|
||||
textures.Add(OSD.FromUUID(AppearanceManager.DEFAULT_AVATAR_TEXTURE));
|
||||
for (uint i = 1; i < TEXTURE_COUNT_PV7; ++i)
|
||||
textures.Add(OSD.FromUUID(m_texture.GetFace(i).TextureID));
|
||||
data["textures"] = textures;
|
||||
|
||||
bool needExtra = false;
|
||||
for (int i = BAKES_COUNT_PV7; i < BAKE_INDICES.Length; ++i)
|
||||
{
|
||||
int idx = BAKE_INDICES[i];
|
||||
if (m_texture.FaceTextures[idx] == null)
|
||||
continue;
|
||||
if (m_texture.FaceTextures[idx].TextureID == AppearanceManager.DEFAULT_AVATAR_TEXTURE ||
|
||||
m_texture.FaceTextures[idx].TextureID == UUID.Zero)
|
||||
continue;
|
||||
needExtra = true;
|
||||
}
|
||||
|
||||
if (needExtra)
|
||||
{
|
||||
byte[] te = m_texture.GetBakesBytes();
|
||||
data["te8"] = OSD.FromBinary(te);
|
||||
}
|
||||
|
||||
// Visual Parameters
|
||||
OSDBinary visualparams = new OSDBinary(m_visualparams);
|
||||
data["visualparams"] = visualparams;
|
||||
|
||||
lock (m_attachments)
|
||||
{
|
||||
// Attachments
|
||||
OSDArray attachs = new OSDArray(m_attachments.Count);
|
||||
foreach (AvatarAttachment attach in GetAttachments())
|
||||
{
|
||||
if (NoHuds &&
|
||||
attach.AttachPoint >= (uint)AttachmentPoint.HUDCenter2 &&
|
||||
attach.AttachPoint <= (uint)AttachmentPoint.HUDBottomRight)
|
||||
continue;
|
||||
attachs.Add(attach.Pack());
|
||||
}
|
||||
data["attachments"] = attachs;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Unpack and OSDMap and initialize the appearance
|
||||
/// from it
|
||||
/// </summary>
|
||||
public void Unpack(OSDMap data)
|
||||
{
|
||||
if ((data != null) && (data["serial"] != null))
|
||||
m_serial = data["serial"].AsInteger();
|
||||
if ((data != null) && (data["height"] != null))
|
||||
// m_avatarHeight = (float)data["height"].AsReal();
|
||||
SetSize(new Vector3(0.45f,0.6f, (float)data["height"].AsReal()));
|
||||
SetDefaultWearables();
|
||||
SetDefaultTexture();
|
||||
SetDefaultParams();
|
||||
m_attachments = new Dictionary<int, List<AvatarAttachment>>();
|
||||
|
||||
if(data == null)
|
||||
{
|
||||
m_log.Warn("[AVATAR APPEARANCE]: data to unpack is null");
|
||||
return;
|
||||
}
|
||||
|
||||
OSD tmpOSD;
|
||||
if (data.TryGetValue("serial", out tmpOSD))
|
||||
m_serial = tmpOSD.AsInteger();
|
||||
if(data.TryGetValue("aphz", out tmpOSD))
|
||||
AvatarPreferencesHoverZ = (float)tmpOSD.AsReal();
|
||||
if (data.TryGetValue("height", out tmpOSD))
|
||||
SetSize(new Vector3(0.45f, 0.6f, (float)tmpOSD.AsReal()));
|
||||
|
||||
try
|
||||
{
|
||||
// Wearables
|
||||
SetDefaultWearables();
|
||||
if ((data != null) && (data["wearables"] != null) && (data["wearables"]).Type == OSDType.Array)
|
||||
OSD tmpOSD8;
|
||||
OSDArray wears8 = null;
|
||||
int wears8Count = 0;
|
||||
|
||||
if (data.TryGetValue("wrbls8", out tmpOSD8) && (tmpOSD8 is OSDArray))
|
||||
{
|
||||
OSDArray wears = (OSDArray)(data["wearables"]);
|
||||
|
||||
int count = wears.Count;
|
||||
|
||||
m_wearables = new AvatarWearable[count];
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
m_wearables[i] = new AvatarWearable((OSDArray)wears[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.Warn("[AVATAR APPEARANCE]: failed to unpack wearables");
|
||||
wears8 = (OSDArray)tmpOSD8;
|
||||
wears8Count = wears8.Count;
|
||||
}
|
||||
|
||||
// Avatar Textures
|
||||
SetDefaultTexture();
|
||||
if ((data != null) && (data["textures"] != null) && (data["textures"]).Type == OSDType.Array)
|
||||
if (data.TryGetValue("wearables", out tmpOSD) && (tmpOSD is OSDArray))
|
||||
{
|
||||
OSDArray textures = (OSDArray)(data["textures"]);
|
||||
for (int i = 0; i < AvatarAppearance.TEXTURE_COUNT && i < textures.Count; i++)
|
||||
OSDArray wears = (OSDArray)tmpOSD;
|
||||
if(wears.Count + wears8Count > 0)
|
||||
{
|
||||
UUID textureID = AppearanceManager.DEFAULT_AVATAR_TEXTURE;
|
||||
if (textures[i] != null)
|
||||
textureID = textures[i].AsUUID();
|
||||
m_texture.CreateFace((uint)i).TextureID = new UUID(textureID);
|
||||
m_wearables = new AvatarWearable[wears.Count + wears8Count];
|
||||
|
||||
for (int i = 0; i < wears.Count; ++i)
|
||||
m_wearables[i] = new AvatarWearable((OSDArray)wears[i]);
|
||||
if (wears8Count > 0)
|
||||
{
|
||||
for (int i = 0; i < wears8Count; ++i)
|
||||
m_wearables[i + wears.Count] = new AvatarWearable((OSDArray)wears8[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
if (data.TryGetValue("te8", out tmpOSD))
|
||||
{
|
||||
m_log.Warn("[AVATAR APPEARANCE]: failed to unpack textures");
|
||||
byte[] teb = tmpOSD.AsBinary();
|
||||
Primitive.TextureEntry te = new Primitive.TextureEntry(teb, 0, teb.Length);
|
||||
m_texture = te;
|
||||
}
|
||||
else if (data.TryGetValue("textures", out tmpOSD) && (tmpOSD is OSDArray))
|
||||
{
|
||||
OSDArray textures = (OSDArray)tmpOSD;
|
||||
for (int i = 0; i < textures.Count && i < TEXTURE_COUNT_PV7; ++i)
|
||||
{
|
||||
tmpOSD = textures[i];
|
||||
if (tmpOSD != null)
|
||||
m_texture.CreateFace((uint)i).TextureID = tmpOSD.AsUUID();
|
||||
}
|
||||
}
|
||||
|
||||
if ((data != null) && (data["bakedcache"] != null) && (data["bakedcache"]).Type == OSDType.Array)
|
||||
if (data.TryGetValue("bakedcache", out tmpOSD) && (tmpOSD is OSDArray))
|
||||
{
|
||||
OSDArray bakedOSDArray = (OSDArray)(data["bakedcache"]);
|
||||
m_cacheitems = WearableCacheItem.BakedFromOSD(bakedOSDArray);
|
||||
OSDArray bakedOSDArray = (OSDArray)tmpOSD;
|
||||
m_cacheitems = WearableCacheItem.GetDefaultCacheItem();
|
||||
|
||||
bakedOSDArray = (OSDArray)tmpOSD;
|
||||
foreach (OSDMap item in bakedOSDArray)
|
||||
{
|
||||
int idx = item["textureindex"].AsInteger();
|
||||
if (idx < 0 || idx >= m_cacheitems.Length)
|
||||
continue;
|
||||
m_cacheitems[idx].CacheId = item["cacheid"].AsUUID();
|
||||
m_cacheitems[idx].TextureID = item["textureid"].AsUUID();
|
||||
m_cacheitems[idx].TextureAsset = null;
|
||||
}
|
||||
|
||||
if (data.TryGetValue("bc8", out tmpOSD) && (tmpOSD is OSDArray))
|
||||
{
|
||||
bakedOSDArray = (OSDArray)tmpOSD;
|
||||
foreach (OSDMap item in bakedOSDArray)
|
||||
{
|
||||
int idx = item["textureindex"].AsInteger();
|
||||
if (idx < 0 || idx >= m_cacheitems.Length)
|
||||
continue;
|
||||
m_cacheitems[idx].CacheId = item["cacheid"].AsUUID();
|
||||
m_cacheitems[idx].TextureID = item["textureid"].AsUUID();
|
||||
m_cacheitems[idx].TextureAsset = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Visual Parameters
|
||||
SetDefaultParams();
|
||||
if ((data != null) && (data["visualparams"] != null))
|
||||
if (data.TryGetValue("visualparams", out tmpOSD))
|
||||
{
|
||||
if ((data["visualparams"].Type == OSDType.Binary) || (data["visualparams"].Type == OSDType.Array))
|
||||
m_visualparams = data["visualparams"].AsBinary();
|
||||
if (tmpOSD is OSDBinary || tmpOSD is OSDArray)
|
||||
m_visualparams = tmpOSD.AsBinary();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -859,10 +996,9 @@ namespace OpenSim.Framework
|
|||
}
|
||||
|
||||
// Attachments
|
||||
m_attachments = new Dictionary<int, List<AvatarAttachment>>();
|
||||
if ((data != null) && (data["attachments"] != null) && (data["attachments"]).Type == OSDType.Array)
|
||||
if (data.TryGetValue("attachments", out tmpOSD) && tmpOSD is OSDArray)
|
||||
{
|
||||
OSDArray attachs = (OSDArray)(data["attachments"]);
|
||||
OSDArray attachs = (OSDArray)tmpOSD;
|
||||
for (int i = 0; i < attachs.Count; i++)
|
||||
{
|
||||
AvatarAttachment att = new AvatarAttachment((OSDMap)attachs[i]);
|
||||
|
@ -882,6 +1018,32 @@ namespace OpenSim.Framework
|
|||
|
||||
#endregion
|
||||
|
||||
public bool CanTeleport(float version)
|
||||
{
|
||||
if (version >= 0.8)
|
||||
return true;
|
||||
if (m_wearables.Length <= MAXWEARABLE_PV7)
|
||||
return true;
|
||||
for(int i = MAXWEARABLE_PV7; i < m_wearables.Length; ++i)
|
||||
{
|
||||
if(m_wearables[i].Count > 0)
|
||||
return false;
|
||||
}
|
||||
|
||||
// also check baked
|
||||
for (int i = BAKES_COUNT_PV7; i < BAKE_INDICES.Length; i++)
|
||||
{
|
||||
int idx = BAKE_INDICES[i];
|
||||
if (m_texture.FaceTextures[idx] == null)
|
||||
continue;
|
||||
if (m_texture.FaceTextures[idx].TextureID == AppearanceManager.DEFAULT_AVATAR_TEXTURE ||
|
||||
m_texture.FaceTextures[idx].TextureID == UUID.Zero)
|
||||
continue;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
#region VPElement
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -68,11 +68,18 @@ namespace OpenSim.Framework
|
|||
|
||||
public void Unpack(OSDMap args)
|
||||
{
|
||||
if (args["point"] != null)
|
||||
AttachPoint = args["point"].AsInteger();
|
||||
OSD tmpOSD;
|
||||
if (args.TryGetValue("point", out tmpOSD))
|
||||
AttachPoint = tmpOSD.AsInteger();
|
||||
if (args.TryGetValue("item", out tmpOSD))
|
||||
ItemID = tmpOSD.AsUUID();
|
||||
else
|
||||
ItemID = UUID.Zero;
|
||||
|
||||
ItemID = (args["item"] != null) ? args["item"].AsUUID() : UUID.Zero;
|
||||
AssetID = (args["asset"] != null) ? args["asset"].AsUUID() : UUID.Zero;
|
||||
if (args.TryGetValue("asset", out tmpOSD))
|
||||
AssetID = tmpOSD.AsUUID();
|
||||
else
|
||||
AssetID = UUID.Zero;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue