diff options
author | Diva Canto | 2009-09-18 19:17:02 -0700 |
---|---|---|
committer | Diva Canto | 2009-09-18 19:17:02 -0700 |
commit | 4a55ff88c088ac0019a1106d97a8b8dd173c8cff (patch) | |
tree | aa91fe204048d6f050cffca83168aec61f76a9a2 /OpenSim | |
parent | First pass at the grid service. (diff) | |
parent | correct off-by-one error in save iar command handling (diff) | |
download | opensim-SC_OLD-4a55ff88c088ac0019a1106d97a8b8dd173c8cff.zip opensim-SC_OLD-4a55ff88c088ac0019a1106d97a8b8dd173c8cff.tar.gz opensim-SC_OLD-4a55ff88c088ac0019a1106d97a8b8dd173c8cff.tar.bz2 opensim-SC_OLD-4a55ff88c088ac0019a1106d97a8b8dd173c8cff.tar.xz |
Merge branch 'master' of ssh://diva@opensimulator.org/var/git/opensim
Diffstat (limited to 'OpenSim')
33 files changed, 518 insertions, 2270 deletions
diff --git a/OpenSim/Data/NHibernate/NHibernateRegionData.cs b/OpenSim/Data/NHibernate/NHibernateRegionData.cs index 26ec500..673ca6f 100644 --- a/OpenSim/Data/NHibernate/NHibernateRegionData.cs +++ b/OpenSim/Data/NHibernate/NHibernateRegionData.cs | |||
@@ -178,25 +178,38 @@ namespace OpenSim.Data.NHibernate | |||
178 | 178 | ||
179 | private SceneObjectGroup LoadObject(UUID uuid, UUID region) | 179 | private SceneObjectGroup LoadObject(UUID uuid, UUID region) |
180 | { | 180 | { |
181 | SceneObjectGroup group = new SceneObjectGroup(); | ||
182 | |||
183 | ICriteria criteria = manager.GetSession().CreateCriteria(typeof(SceneObjectPart)); | 181 | ICriteria criteria = manager.GetSession().CreateCriteria(typeof(SceneObjectPart)); |
184 | criteria.Add(Expression.Eq("RegionID", region)); | 182 | criteria.Add(Expression.Eq("RegionID", region)); |
185 | criteria.Add(Expression.Eq("ParentUUID", uuid)); | 183 | criteria.Add(Expression.Eq("ParentUUID", uuid)); |
186 | criteria.AddOrder(Order.Asc("ParentID")); | 184 | criteria.AddOrder(Order.Asc("ParentID")); |
187 | 185 | ||
188 | foreach (SceneObjectPart p in criteria.List()) | 186 | IList<SceneObjectPart> parts = criteria.List<SceneObjectPart>(); |
187 | |||
188 | SceneObjectGroup group = null; | ||
189 | |||
190 | // Find the root part | ||
191 | for (int i = 0; i < parts.Count; i++) | ||
189 | { | 192 | { |
190 | // root part | 193 | if (parts[i].UUID == uuid) |
191 | if (p.UUID == uuid) | ||
192 | { | 194 | { |
193 | group.SetRootPart(p); | 195 | group = new SceneObjectGroup(parts[i]); |
196 | break; | ||
194 | } | 197 | } |
195 | else | 198 | } |
199 | |||
200 | // Add the children parts | ||
201 | if (group != null) | ||
202 | { | ||
203 | for (int i = 0; i < parts.Count; i++) | ||
196 | { | 204 | { |
197 | group.AddPart(p); | 205 | if (parts[i].UUID != uuid) |
206 | group.AddPart(parts[i]); | ||
198 | } | 207 | } |
199 | } | 208 | } |
209 | else | ||
210 | { | ||
211 | m_log.Error("[NHIBERNATE]: LoadObject() Attempted to load a SceneObjectGroup with no root SceneObjectPart "); | ||
212 | } | ||
200 | 213 | ||
201 | return group; | 214 | return group; |
202 | } | 215 | } |
@@ -237,8 +250,7 @@ namespace OpenSim.Data.NHibernate | |||
237 | // root part | 250 | // root part |
238 | if (p.UUID == p.ParentUUID) | 251 | if (p.UUID == p.ParentUUID) |
239 | { | 252 | { |
240 | SceneObjectGroup group = new SceneObjectGroup(); | 253 | SceneObjectGroup group = new SceneObjectGroup(p); |
241 | group.SetRootPart(p); | ||
242 | SOG.Add(p.ParentUUID, group); | 254 | SOG.Add(p.ParentUUID, group); |
243 | } | 255 | } |
244 | else | 256 | else |
diff --git a/OpenSim/Data/SQLite/SQLiteRegionData.cs b/OpenSim/Data/SQLite/SQLiteRegionData.cs index 0259ac5..ea076fe 100644 --- a/OpenSim/Data/SQLite/SQLiteRegionData.cs +++ b/OpenSim/Data/SQLite/SQLiteRegionData.cs | |||
@@ -416,7 +416,6 @@ namespace OpenSim.Data.SQLite | |||
416 | 416 | ||
417 | if (uuid == objID) //is new SceneObjectGroup ? | 417 | if (uuid == objID) //is new SceneObjectGroup ? |
418 | { | 418 | { |
419 | SceneObjectGroup group = new SceneObjectGroup(); | ||
420 | prim = buildPrim(primRow); | 419 | prim = buildPrim(primRow); |
421 | DataRow shapeRow = shapes.Rows.Find(prim.UUID.ToString()); | 420 | DataRow shapeRow = shapes.Rows.Find(prim.UUID.ToString()); |
422 | if (shapeRow != null) | 421 | if (shapeRow != null) |
@@ -430,7 +429,7 @@ namespace OpenSim.Data.SQLite | |||
430 | prim.Shape = PrimitiveBaseShape.Default; | 429 | prim.Shape = PrimitiveBaseShape.Default; |
431 | } | 430 | } |
432 | 431 | ||
433 | group.SetRootPart(prim); | 432 | SceneObjectGroup group = new SceneObjectGroup(prim); |
434 | createdObjects.Add(group.UUID, group); | 433 | createdObjects.Add(group.UUID, group); |
435 | retvals.Add(group); | 434 | retvals.Add(group); |
436 | LoadItems(prim); | 435 | LoadItems(prim); |
diff --git a/OpenSim/Data/Tests/BasicRegionTest.cs b/OpenSim/Data/Tests/BasicRegionTest.cs index 8474921..c66ab7c 100644 --- a/OpenSim/Data/Tests/BasicRegionTest.cs +++ b/OpenSim/Data/Tests/BasicRegionTest.cs | |||
@@ -322,9 +322,8 @@ namespace OpenSim.Data.Tests | |||
322 | // This is necessary or object will not be inserted in DB | 322 | // This is necessary or object will not be inserted in DB |
323 | sop.ObjectFlags = 0; | 323 | sop.ObjectFlags = 0; |
324 | 324 | ||
325 | SceneObjectGroup sog = new SceneObjectGroup(); | 325 | SceneObjectGroup sog = new SceneObjectGroup(sop); |
326 | sog.SetScene(scene); // Reguired by nhibernate database module. | 326 | sog.SetScene(scene); // Reguired by nhibernate database module. |
327 | sog.SetRootPart(sop); | ||
328 | 327 | ||
329 | // Inserts group in DB | 328 | // Inserts group in DB |
330 | db.StoreObject(sog,region3); | 329 | db.StoreObject(sog,region3); |
@@ -1003,9 +1002,8 @@ namespace OpenSim.Data.Tests | |||
1003 | sop.UUID = uuid; | 1002 | sop.UUID = uuid; |
1004 | sop.Shape = PrimitiveBaseShape.Default; | 1003 | sop.Shape = PrimitiveBaseShape.Default; |
1005 | 1004 | ||
1006 | SceneObjectGroup sog = new SceneObjectGroup(); | 1005 | SceneObjectGroup sog = new SceneObjectGroup(sop); |
1007 | sog.SetScene(scene); | 1006 | sog.SetScene(scene); |
1008 | sog.SetRootPart(sop); | ||
1009 | 1007 | ||
1010 | return sog; | 1008 | return sog; |
1011 | } | 1009 | } |
diff --git a/OpenSim/Framework/Servers/BaseGetAssetStreamHandler.cs b/OpenSim/Framework/Servers/BaseGetAssetStreamHandler.cs deleted file mode 100644 index 8372ae7..0000000 --- a/OpenSim/Framework/Servers/BaseGetAssetStreamHandler.cs +++ /dev/null | |||
@@ -1,205 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.IO; | ||
31 | using System.Net; | ||
32 | using System.Reflection; | ||
33 | using System.Text; | ||
34 | using System.Text.RegularExpressions; | ||
35 | using System.Xml; | ||
36 | using System.Xml.Serialization; | ||
37 | using log4net; | ||
38 | using OpenMetaverse; | ||
39 | using OpenSim.Framework.Servers.HttpServer; | ||
40 | using OpenSim.Framework.Statistics; | ||
41 | |||
42 | namespace OpenSim.Framework.Servers | ||
43 | { | ||
44 | public abstract class BaseGetAssetStreamHandler : BaseStreamHandler | ||
45 | { | ||
46 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
47 | |||
48 | protected BaseGetAssetStreamHandler(string httpMethod, string path) : base(httpMethod, path) | ||
49 | { | ||
50 | } | ||
51 | |||
52 | protected abstract AssetBase GetAsset(UUID assetID); | ||
53 | |||
54 | public override byte[] Handle(string path, Stream request, | ||
55 | OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
56 | { | ||
57 | byte[] result = new byte[] { }; | ||
58 | |||
59 | string[] p = SplitParams(path); | ||
60 | |||
61 | if (p.Length > 0) | ||
62 | { | ||
63 | UUID assetID; | ||
64 | |||
65 | if (!UUID.TryParse(p[0], out assetID)) | ||
66 | { | ||
67 | m_log.DebugFormat( | ||
68 | "[REST]: GET:/asset ignoring request with malformed UUID {0}", p[0]); | ||
69 | return result; | ||
70 | } | ||
71 | |||
72 | if (StatsManager.AssetStats != null) | ||
73 | { | ||
74 | StatsManager.AssetStats.AddRequest(); | ||
75 | } | ||
76 | |||
77 | AssetBase asset = GetAsset(assetID); | ||
78 | |||
79 | if (asset != null) | ||
80 | { | ||
81 | if (p.Length > 1 && p[1] == "data") | ||
82 | { | ||
83 | httpResponse.StatusCode = (int)HttpStatusCode.OK; | ||
84 | httpResponse.ContentType = SLAssetTypeToContentType(asset.Type); | ||
85 | result = asset.Data; | ||
86 | } | ||
87 | else | ||
88 | { | ||
89 | result = GetXml(asset); | ||
90 | } | ||
91 | } | ||
92 | else | ||
93 | { | ||
94 | m_log.DebugFormat("[REST]: GET:/asset failed to find {0}", assetID); | ||
95 | |||
96 | httpResponse.StatusCode = (int)HttpStatusCode.NotFound; | ||
97 | |||
98 | if (StatsManager.AssetStats != null) | ||
99 | { | ||
100 | StatsManager.AssetStats.AddNotFoundRequest(); | ||
101 | } | ||
102 | } | ||
103 | } | ||
104 | |||
105 | return result; | ||
106 | } | ||
107 | |||
108 | public static byte[] GetXml(AssetBase asset) | ||
109 | { | ||
110 | byte[] result; | ||
111 | XmlSerializer xs = new XmlSerializer(typeof(AssetBase)); | ||
112 | MemoryStream ms = new MemoryStream(); | ||
113 | XmlTextWriter xw = new XmlTextWriter(ms, Encoding.UTF8); | ||
114 | xw.Formatting = Formatting.Indented; | ||
115 | xs.Serialize(xw, asset); | ||
116 | xw.Flush(); | ||
117 | |||
118 | ms.Seek(0, SeekOrigin.Begin); | ||
119 | //StreamReader sr = new StreamReader(ms); | ||
120 | |||
121 | result = ms.GetBuffer(); | ||
122 | |||
123 | Array.Resize<byte>(ref result, (int)ms.Length); | ||
124 | return result; | ||
125 | } | ||
126 | |||
127 | public string ProcessAssetDataString(string data) | ||
128 | { | ||
129 | Regex regex = new Regex("(creator_id|owner_id)\\s+(\\S+)"); | ||
130 | |||
131 | // IUserService userService = null; | ||
132 | |||
133 | data = regex.Replace(data, delegate(Match m) | ||
134 | { | ||
135 | string result = String.Empty; | ||
136 | |||
137 | // string key = m.Groups[1].Captures[0].Value; | ||
138 | // | ||
139 | // string value = m.Groups[2].Captures[0].Value; | ||
140 | // | ||
141 | // Guid userUri; | ||
142 | // | ||
143 | // switch (key) | ||
144 | // { | ||
145 | // case "creator_id": | ||
146 | // userUri = new Guid(value); | ||
147 | // // result = "creator_url " + userService(userService, userUri); | ||
148 | // break; | ||
149 | // | ||
150 | // case "owner_id": | ||
151 | // userUri = new Guid(value); | ||
152 | // // result = "owner_url " + ResolveUserUri(userService, userUri); | ||
153 | // break; | ||
154 | // } | ||
155 | |||
156 | return result; | ||
157 | }); | ||
158 | |||
159 | return data; | ||
160 | } | ||
161 | |||
162 | private string SLAssetTypeToContentType(int assetType) | ||
163 | { | ||
164 | switch (assetType) | ||
165 | { | ||
166 | case 0: | ||
167 | return "image/jp2"; | ||
168 | case 1: | ||
169 | return "application/ogg"; | ||
170 | case 2: | ||
171 | return "application/x-metaverse-callingcard"; | ||
172 | case 3: | ||
173 | return "application/x-metaverse-landmark"; | ||
174 | case 5: | ||
175 | return "application/x-metaverse-clothing"; | ||
176 | case 6: | ||
177 | return "application/x-metaverse-primitive"; | ||
178 | case 7: | ||
179 | return "application/x-metaverse-notecard"; | ||
180 | case 8: | ||
181 | return "application/x-metaverse-folder"; | ||
182 | case 10: | ||
183 | return "application/x-metaverse-lsl"; | ||
184 | case 11: | ||
185 | return "application/x-metaverse-lso"; | ||
186 | case 12: | ||
187 | return "image/tga"; | ||
188 | case 13: | ||
189 | return "application/x-metaverse-bodypart"; | ||
190 | case 17: | ||
191 | return "audio/x-wav"; | ||
192 | case 19: | ||
193 | return "image/jpeg"; | ||
194 | case 20: | ||
195 | return "application/x-metaverse-animation"; | ||
196 | case 21: | ||
197 | return "application/x-metaverse-gesture"; | ||
198 | case 22: | ||
199 | return "application/x-metaverse-simstate"; | ||
200 | default: | ||
201 | return "application/octet-stream"; | ||
202 | } | ||
203 | } | ||
204 | } | ||
205 | } | ||
diff --git a/OpenSim/Framework/Servers/PostAssetStreamHandler.cs b/OpenSim/Framework/Servers/PostAssetStreamHandler.cs deleted file mode 100644 index 8bf406c..0000000 --- a/OpenSim/Framework/Servers/PostAssetStreamHandler.cs +++ /dev/null | |||
@@ -1,72 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System.IO; | ||
29 | using System.Reflection; | ||
30 | using System.Xml.Serialization; | ||
31 | using log4net; | ||
32 | using OpenMetaverse; | ||
33 | using OpenSim.Data; | ||
34 | using OpenSim.Framework; | ||
35 | using OpenSim.Framework.Servers.HttpServer; | ||
36 | |||
37 | namespace OpenSim.Framework.Servers | ||
38 | { | ||
39 | public class PostAssetStreamHandler : BaseStreamHandler | ||
40 | { | ||
41 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
42 | |||
43 | // private OpenAsset_Main m_assetManager; | ||
44 | private IAssetDataPlugin m_assetProvider; | ||
45 | |||
46 | public override byte[] Handle(string path, Stream request, | ||
47 | OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
48 | { | ||
49 | string param = GetParam(path); | ||
50 | |||
51 | UUID assetId; | ||
52 | if (param.Length > 0) | ||
53 | UUID.TryParse(param, out assetId); | ||
54 | // byte[] txBuffer = new byte[4096]; | ||
55 | |||
56 | XmlSerializer xs = new XmlSerializer(typeof (AssetBase)); | ||
57 | AssetBase asset = (AssetBase) xs.Deserialize(request); | ||
58 | |||
59 | m_log.InfoFormat("[REST]: Creating asset {0}", asset.FullID); | ||
60 | m_assetProvider.StoreAsset(asset); | ||
61 | |||
62 | return new byte[] {}; | ||
63 | } | ||
64 | |||
65 | public PostAssetStreamHandler(IAssetDataPlugin assetProvider) | ||
66 | : base("POST", "/assets") | ||
67 | { | ||
68 | // m_assetManager = assetManager; | ||
69 | m_assetProvider = assetProvider; | ||
70 | } | ||
71 | } | ||
72 | } | ||
diff --git a/OpenSim/Framework/Servers/Tests/GetAssetStreamHandlerTests.cs b/OpenSim/Framework/Servers/Tests/GetAssetStreamHandlerTests.cs deleted file mode 100644 index be3f518..0000000 --- a/OpenSim/Framework/Servers/Tests/GetAssetStreamHandlerTests.cs +++ /dev/null | |||
@@ -1,135 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Net; | ||
31 | using System.Text; | ||
32 | using HttpServer; | ||
33 | using NUnit.Framework; | ||
34 | using OpenSim.Data; | ||
35 | using OpenSim.Framework.Servers.HttpServer; | ||
36 | using OpenSim.Tests.Common; | ||
37 | using OpenSim.Tests.Common.Mock; | ||
38 | using OpenSim.Tests.Common.Setup; | ||
39 | |||
40 | namespace OpenSim.Framework.Servers.Tests | ||
41 | { | ||
42 | [TestFixture] | ||
43 | public class GetAssetStreamHandlerTests | ||
44 | { | ||
45 | private const string ASSETS_PATH = "/assets"; | ||
46 | |||
47 | [Test] | ||
48 | public void TestConstructor() | ||
49 | { | ||
50 | TestHelper.InMethod(); | ||
51 | |||
52 | // GetAssetStreamHandler handler = | ||
53 | new GetAssetStreamHandler(null); | ||
54 | } | ||
55 | |||
56 | [Test] | ||
57 | public void TestGetParams() | ||
58 | { | ||
59 | TestHelper.InMethod(); | ||
60 | |||
61 | GetAssetStreamHandler handler = new GetAssetStreamHandler(null); | ||
62 | BaseRequestHandlerTestHelper.BaseTestGetParams(handler, ASSETS_PATH); | ||
63 | } | ||
64 | |||
65 | [Test] | ||
66 | public void TestSplitParams() | ||
67 | { | ||
68 | TestHelper.InMethod(); | ||
69 | |||
70 | GetAssetStreamHandler handler = new GetAssetStreamHandler(null); | ||
71 | BaseRequestHandlerTestHelper.BaseTestSplitParams(handler, ASSETS_PATH); | ||
72 | } | ||
73 | |||
74 | [Test] | ||
75 | public void TestHandleNoParams() | ||
76 | { | ||
77 | TestHelper.InMethod(); | ||
78 | |||
79 | GetAssetStreamHandler handler = new GetAssetStreamHandler(null); | ||
80 | |||
81 | BaseRequestHandlerTestHelper.BaseTestHandleNoParams(handler, ASSETS_PATH); | ||
82 | } | ||
83 | |||
84 | [Test] | ||
85 | public void TestHandleMalformedGuid() | ||
86 | { | ||
87 | TestHelper.InMethod(); | ||
88 | |||
89 | GetAssetStreamHandler handler = new GetAssetStreamHandler(null); | ||
90 | |||
91 | BaseRequestHandlerTestHelper.BaseTestHandleMalformedGuid(handler, ASSETS_PATH); | ||
92 | } | ||
93 | |||
94 | [Test] | ||
95 | public void TestHandleFetchMissingAsset() | ||
96 | { | ||
97 | GetAssetStreamHandler handler; | ||
98 | OSHttpResponse response; | ||
99 | CreateTestEnvironment(out handler, out response); | ||
100 | |||
101 | GetAssetStreamHandlerTestHelpers.BaseFetchMissingAsset(handler, response); | ||
102 | } | ||
103 | |||
104 | [Test] | ||
105 | public void TestHandleFetchExistingAssetData() | ||
106 | { | ||
107 | GetAssetStreamHandler handler; | ||
108 | OSHttpResponse response; | ||
109 | AssetBase asset = CreateTestEnvironment(out handler, out response); | ||
110 | |||
111 | GetAssetStreamHandlerTestHelpers.BaseFetchExistingAssetDataTest(asset, handler, response); | ||
112 | } | ||
113 | |||
114 | [Test] | ||
115 | public void TestHandleFetchExistingAssetXml() | ||
116 | { | ||
117 | GetAssetStreamHandler handler; | ||
118 | OSHttpResponse response; | ||
119 | AssetBase asset = CreateTestEnvironment(out handler, out response); | ||
120 | |||
121 | GetAssetStreamHandlerTestHelpers.BaseFetchExistingAssetXmlTest(asset, handler, response); | ||
122 | } | ||
123 | |||
124 | private static AssetBase CreateTestEnvironment(out GetAssetStreamHandler handler, out OSHttpResponse response) | ||
125 | { | ||
126 | AssetBase asset = GetAssetStreamHandlerTestHelpers.CreateCommonTestResources(out response); | ||
127 | |||
128 | IAssetDataPlugin assetDataPlugin = new TestAssetDataPlugin(); | ||
129 | handler = new GetAssetStreamHandler(assetDataPlugin); | ||
130 | |||
131 | assetDataPlugin.StoreAsset(asset); | ||
132 | return asset; | ||
133 | } | ||
134 | } | ||
135 | } | ||
diff --git a/OpenSim/Framework/Servers/VersionInfo.cs b/OpenSim/Framework/Servers/VersionInfo.cs index 743ca69..6f9b00c 100644 --- a/OpenSim/Framework/Servers/VersionInfo.cs +++ b/OpenSim/Framework/Servers/VersionInfo.cs | |||
@@ -69,6 +69,6 @@ namespace OpenSim | |||
69 | /// of the code that is too old. | 69 | /// of the code that is too old. |
70 | /// | 70 | /// |
71 | /// </value> | 71 | /// </value> |
72 | public readonly static int MajorInterfaceVersion = 5; | 72 | public readonly static int MajorInterfaceVersion = 6; |
73 | } | 73 | } |
74 | } | 74 | } |
diff --git a/OpenSim/Grid/AssetServer/Main.cs b/OpenSim/Grid/AssetServer/Main.cs deleted file mode 100644 index ac8f888..0000000 --- a/OpenSim/Grid/AssetServer/Main.cs +++ /dev/null | |||
@@ -1,146 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.IO; | ||
30 | using System.Reflection; | ||
31 | using log4net; | ||
32 | using log4net.Config; | ||
33 | using OpenMetaverse; | ||
34 | using OpenSim.Data; | ||
35 | using OpenSim.Framework; | ||
36 | using OpenSim.Framework.AssetLoader.Filesystem; | ||
37 | using OpenSim.Framework.Console; | ||
38 | using OpenSim.Framework.Servers; | ||
39 | using OpenSim.Framework.Servers.HttpServer; | ||
40 | using OpenSim.Framework.Statistics; | ||
41 | |||
42 | namespace OpenSim.Grid.AssetServer | ||
43 | { | ||
44 | /// <summary> | ||
45 | /// An asset server | ||
46 | /// </summary> | ||
47 | public class OpenAsset_Main : BaseOpenSimServer | ||
48 | { | ||
49 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
50 | |||
51 | public static OpenAsset_Main assetserver; | ||
52 | |||
53 | // Temporarily hardcoded - should be a plugin | ||
54 | protected IAssetLoader assetLoader = new AssetLoaderFileSystem(); | ||
55 | |||
56 | private IAssetDataPlugin m_assetProvider; | ||
57 | |||
58 | public static void Main(string[] args) | ||
59 | { | ||
60 | XmlConfigurator.Configure(); | ||
61 | |||
62 | assetserver = new OpenAsset_Main(); | ||
63 | assetserver.Startup(); | ||
64 | |||
65 | assetserver.Work(); | ||
66 | } | ||
67 | |||
68 | private void Work() | ||
69 | { | ||
70 | m_console.Output("Enter help for a list of commands"); | ||
71 | |||
72 | while (true) | ||
73 | { | ||
74 | m_console.Prompt(); | ||
75 | } | ||
76 | } | ||
77 | |||
78 | public OpenAsset_Main() | ||
79 | { | ||
80 | m_console = new LocalConsole("Asset"); | ||
81 | |||
82 | MainConsole.Instance = m_console; | ||
83 | } | ||
84 | |||
85 | protected override void StartupSpecific() | ||
86 | { | ||
87 | AssetConfig config = new AssetConfig("ASSET SERVER", (Path.Combine(Util.configDir(), "AssetServer_Config.xml"))); | ||
88 | |||
89 | m_log.Info("[ASSET]: Setting up asset DB"); | ||
90 | setupDB(config); | ||
91 | |||
92 | m_log.Info("[ASSET]: Loading default asset set from '" + config.AssetSetsLocation + "'"); | ||
93 | LoadDefaultAssets(config.AssetSetsLocation); | ||
94 | |||
95 | m_log.Info("[ASSET]: Starting HTTP process"); | ||
96 | m_httpServer = new BaseHttpServer(config.HttpPort); | ||
97 | |||
98 | m_stats = StatsManager.StartCollectingAssetStats(); | ||
99 | |||
100 | AddHttpHandlers(); | ||
101 | |||
102 | m_httpServer.Start(); | ||
103 | |||
104 | base.StartupSpecific(); | ||
105 | } | ||
106 | |||
107 | protected void AddHttpHandlers() | ||
108 | { | ||
109 | m_httpServer.AddStreamHandler(new GetAssetStreamHandler(m_assetProvider)); | ||
110 | m_httpServer.AddStreamHandler(new PostAssetStreamHandler(m_assetProvider)); | ||
111 | } | ||
112 | |||
113 | public byte[] GetAssetData(UUID assetID, bool isTexture) | ||
114 | { | ||
115 | return null; | ||
116 | } | ||
117 | |||
118 | public void setupDB(AssetConfig config) | ||
119 | { | ||
120 | try | ||
121 | { | ||
122 | m_assetProvider = DataPluginFactory.LoadDataPlugin<IAssetDataPlugin>(config.DatabaseProvider, config.DatabaseConnect); | ||
123 | if (m_assetProvider == null) | ||
124 | { | ||
125 | m_log.Error("[ASSET]: Failed to load a database plugin, server halting"); | ||
126 | Environment.Exit(-1); | ||
127 | } | ||
128 | } | ||
129 | catch (Exception e) | ||
130 | { | ||
131 | m_log.Warn("[ASSET]: setupDB() - Exception occured"); | ||
132 | m_log.Warn("[ASSET]: " + e.ToString()); | ||
133 | } | ||
134 | } | ||
135 | |||
136 | public void LoadDefaultAssets(string pAssetSetsLocation) | ||
137 | { | ||
138 | assetLoader.ForEachDefaultXmlAsset(pAssetSetsLocation, StoreAsset); | ||
139 | } | ||
140 | |||
141 | protected void StoreAsset(AssetBase asset) | ||
142 | { | ||
143 | m_assetProvider.StoreAsset(asset); | ||
144 | } | ||
145 | } | ||
146 | } | ||
diff --git a/OpenSim/Grid/AssetServer/Properties/AssemblyInfo.cs b/OpenSim/Grid/AssetServer/Properties/AssemblyInfo.cs deleted file mode 100644 index 5d67e3f..0000000 --- a/OpenSim/Grid/AssetServer/Properties/AssemblyInfo.cs +++ /dev/null | |||
@@ -1,63 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System.Reflection; | ||
29 | using System.Runtime.InteropServices; | ||
30 | |||
31 | // General information about an assembly is controlled through the following | ||
32 | // set of attributes. Change these attribute values to modify the information | ||
33 | // associated with an assembly. | ||
34 | |||
35 | [assembly : AssemblyTitle("OGS-AssetServer")] | ||
36 | [assembly : AssemblyDescription("")] | ||
37 | [assembly : AssemblyConfiguration("")] | ||
38 | [assembly : AssemblyCompany("http://opensimulator.org")] | ||
39 | [assembly : AssemblyProduct("OGS-AssetServer")] | ||
40 | [assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")] | ||
41 | [assembly : AssemblyTrademark("")] | ||
42 | [assembly : AssemblyCulture("")] | ||
43 | |||
44 | // Setting ComVisible to false makes the types in this assembly not visible | ||
45 | // to COM components. If you need to access a type in this assembly from | ||
46 | // COM, set the ComVisible attribute to true on that type. | ||
47 | |||
48 | [assembly : ComVisible(false)] | ||
49 | |||
50 | // The following GUID is for the ID of the typelib if this project is exposed to COM | ||
51 | |||
52 | [assembly : Guid("b541b244-3d1d-4625-9003-bc2a3a6a39a4")] | ||
53 | |||
54 | // Version information for an assembly consists of the following four values: | ||
55 | // | ||
56 | // Major Version | ||
57 | // Minor Version | ||
58 | // Build Number | ||
59 | // Revision | ||
60 | // | ||
61 | |||
62 | [assembly : AssemblyVersion("0.6.5.*")] | ||
63 | [assembly : AssemblyFileVersion("0.6.5.0")] | ||
diff --git a/OpenSim/Grid/InventoryServer/AuthedSessionCache.cs b/OpenSim/Grid/InventoryServer/AuthedSessionCache.cs deleted file mode 100644 index dadf34a..0000000 --- a/OpenSim/Grid/InventoryServer/AuthedSessionCache.cs +++ /dev/null | |||
@@ -1,133 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | |||
31 | namespace OpenSim.Grid.InventoryServer | ||
32 | { | ||
33 | public class AuthedSessionCache | ||
34 | { | ||
35 | public class CacheData | ||
36 | { | ||
37 | private static readonly DateTime UNIX_EPOCH = new DateTime(1970, 1, 1); | ||
38 | private string m_session_id; | ||
39 | private string m_agent_id; | ||
40 | private int m_expire; | ||
41 | |||
42 | private int get_current_unix_time() | ||
43 | { | ||
44 | return (int)(DateTime.UtcNow - UNIX_EPOCH).TotalSeconds; | ||
45 | } | ||
46 | |||
47 | public CacheData(string sid, string aid) | ||
48 | { | ||
49 | m_session_id = sid; | ||
50 | m_agent_id = aid; | ||
51 | m_expire = get_current_unix_time() + DEFAULT_LIFETIME; | ||
52 | } | ||
53 | |||
54 | public CacheData(string sid, string aid, int time_now) | ||
55 | { | ||
56 | m_session_id = sid; | ||
57 | m_agent_id = aid; | ||
58 | m_expire = time_now + DEFAULT_LIFETIME; | ||
59 | } | ||
60 | |||
61 | public string SessionID | ||
62 | { | ||
63 | get { return m_session_id; } | ||
64 | set { m_session_id = value; } | ||
65 | } | ||
66 | |||
67 | public string AgentID | ||
68 | { | ||
69 | get { return m_agent_id; } | ||
70 | set { m_agent_id = value; } | ||
71 | } | ||
72 | |||
73 | public bool isExpired | ||
74 | { | ||
75 | get { return m_expire < get_current_unix_time(); } | ||
76 | } | ||
77 | |||
78 | public void Renew() | ||
79 | { | ||
80 | m_expire = get_current_unix_time() + DEFAULT_LIFETIME; | ||
81 | } | ||
82 | } | ||
83 | |||
84 | private static readonly int DEFAULT_LIFETIME = 30; | ||
85 | private Dictionary<string, CacheData> m_authed_sessions = new Dictionary<string,CacheData>(); | ||
86 | // private int m_session_lifetime = DEFAULT_LIFETIME; | ||
87 | |||
88 | public AuthedSessionCache() | ||
89 | { | ||
90 | // m_session_lifetime = DEFAULT_LIFETIME; | ||
91 | } | ||
92 | |||
93 | public AuthedSessionCache(int timeout) | ||
94 | { | ||
95 | // m_session_lifetime = timeout; | ||
96 | } | ||
97 | |||
98 | public CacheData getCachedSession(string session_id, string agent_id) | ||
99 | { | ||
100 | CacheData ret = null; | ||
101 | lock (m_authed_sessions) | ||
102 | { | ||
103 | if (m_authed_sessions.ContainsKey(session_id)) | ||
104 | { | ||
105 | CacheData cached_session = m_authed_sessions[session_id]; | ||
106 | if (!cached_session.isExpired && cached_session.AgentID == agent_id) | ||
107 | { | ||
108 | ret = m_authed_sessions[session_id]; | ||
109 | // auto renew | ||
110 | m_authed_sessions[session_id].Renew(); | ||
111 | } | ||
112 | } | ||
113 | } | ||
114 | return ret; | ||
115 | } | ||
116 | |||
117 | public void Add(string session_id, string agent_id) | ||
118 | { | ||
119 | CacheData data = new CacheData(session_id, agent_id); | ||
120 | lock (m_authed_sessions) | ||
121 | { | ||
122 | if (m_authed_sessions.ContainsKey(session_id)) | ||
123 | { | ||
124 | m_authed_sessions[session_id] = data; | ||
125 | } | ||
126 | else | ||
127 | { | ||
128 | m_authed_sessions.Add(session_id, data); | ||
129 | } | ||
130 | } | ||
131 | } | ||
132 | } | ||
133 | } | ||
diff --git a/OpenSim/Grid/InventoryServer/GridInventoryService.cs b/OpenSim/Grid/InventoryServer/GridInventoryService.cs deleted file mode 100644 index 0704faa..0000000 --- a/OpenSim/Grid/InventoryServer/GridInventoryService.cs +++ /dev/null | |||
@@ -1,256 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Net; | ||
32 | using System.Reflection; | ||
33 | using log4net; | ||
34 | using Nwc.XmlRpc; | ||
35 | using OpenMetaverse; | ||
36 | using OpenSim.Framework; | ||
37 | using OpenSim.Framework.Communications; | ||
38 | using OpenSim.Framework.Communications.Cache; | ||
39 | |||
40 | namespace OpenSim.Grid.InventoryServer | ||
41 | { | ||
42 | /// <summary> | ||
43 | /// Used on a grid server to satisfy external inventory requests | ||
44 | /// </summary> | ||
45 | public class GridInventoryService : InventoryServiceBase | ||
46 | { | ||
47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
48 | |||
49 | private bool m_doLookup = false; | ||
50 | |||
51 | public bool DoLookup | ||
52 | { | ||
53 | get { return m_doLookup; } | ||
54 | set { m_doLookup = value; } | ||
55 | } | ||
56 | |||
57 | private static readonly int INVENTORY_DEFAULT_SESSION_TIME = 30; // secs | ||
58 | |||
59 | private string m_userserver_url; | ||
60 | private AuthedSessionCache m_session_cache = new AuthedSessionCache(INVENTORY_DEFAULT_SESSION_TIME); | ||
61 | |||
62 | public GridInventoryService(string userserver_url) | ||
63 | { | ||
64 | m_userserver_url = userserver_url; | ||
65 | } | ||
66 | |||
67 | /// <summary> | ||
68 | /// Check that the source of an inventory request is one that we trust. | ||
69 | /// </summary> | ||
70 | /// <param name="peer"></param> | ||
71 | /// <returns></returns> | ||
72 | public bool CheckTrustSource(IPEndPoint peer) | ||
73 | { | ||
74 | if (m_doLookup) | ||
75 | { | ||
76 | m_log.InfoFormat("[GRID AGENT INVENTORY]: Checking trusted source {0}", peer); | ||
77 | UriBuilder ub = new UriBuilder(m_userserver_url); | ||
78 | IPAddress[] uaddrs = Dns.GetHostAddresses(ub.Host); | ||
79 | foreach (IPAddress uaddr in uaddrs) | ||
80 | { | ||
81 | if (uaddr.Equals(peer.Address)) | ||
82 | { | ||
83 | return true; | ||
84 | } | ||
85 | } | ||
86 | |||
87 | m_log.WarnFormat( | ||
88 | "[GRID AGENT INVENTORY]: Rejecting request since source {0} was not in the list of trusted sources", | ||
89 | peer); | ||
90 | |||
91 | return false; | ||
92 | } | ||
93 | else | ||
94 | { | ||
95 | return true; | ||
96 | } | ||
97 | } | ||
98 | |||
99 | /// <summary> | ||
100 | /// Check that the source of an inventory request for a particular agent is a current session belonging to | ||
101 | /// that agent. | ||
102 | /// </summary> | ||
103 | /// <param name="session_id"></param> | ||
104 | /// <param name="avatar_id"></param> | ||
105 | /// <returns></returns> | ||
106 | public bool CheckAuthSession(string session_id, string avatar_id) | ||
107 | { | ||
108 | if (m_doLookup) | ||
109 | { | ||
110 | m_log.InfoFormat("[GRID AGENT INVENTORY]: checking authed session {0} {1}", session_id, avatar_id); | ||
111 | |||
112 | if (m_session_cache.getCachedSession(session_id, avatar_id) == null) | ||
113 | { | ||
114 | // cache miss, ask userserver | ||
115 | Hashtable requestData = new Hashtable(); | ||
116 | requestData["avatar_uuid"] = avatar_id; | ||
117 | requestData["session_id"] = session_id; | ||
118 | ArrayList SendParams = new ArrayList(); | ||
119 | SendParams.Add(requestData); | ||
120 | XmlRpcRequest UserReq = new XmlRpcRequest("check_auth_session", SendParams); | ||
121 | XmlRpcResponse UserResp = UserReq.Send(m_userserver_url, 3000); | ||
122 | |||
123 | Hashtable responseData = (Hashtable)UserResp.Value; | ||
124 | if (responseData.ContainsKey("auth_session") && responseData["auth_session"].ToString() == "TRUE") | ||
125 | { | ||
126 | m_log.Info("[GRID AGENT INVENTORY]: got authed session from userserver"); | ||
127 | // add to cache; the session time will be automatically renewed | ||
128 | m_session_cache.Add(session_id, avatar_id); | ||
129 | return true; | ||
130 | } | ||
131 | } | ||
132 | else | ||
133 | { | ||
134 | // cache hits | ||
135 | m_log.Info("[GRID AGENT INVENTORY]: got authed session from cache"); | ||
136 | return true; | ||
137 | } | ||
138 | |||
139 | m_log.Warn("[GRID AGENT INVENTORY]: unknown session_id, request rejected"); | ||
140 | return false; | ||
141 | } | ||
142 | else | ||
143 | { | ||
144 | return true; | ||
145 | } | ||
146 | } | ||
147 | |||
148 | /// <summary> | ||
149 | /// Return a user's entire inventory | ||
150 | /// </summary> | ||
151 | /// <param name="rawUserID"></param> | ||
152 | /// <returns>The user's inventory. If an inventory cannot be found then an empty collection is returned.</returns> | ||
153 | public InventoryCollection GetUserInventory(Guid rawUserID) | ||
154 | { | ||
155 | UUID userID = new UUID(rawUserID); | ||
156 | |||
157 | m_log.InfoFormat("[GRID AGENT INVENTORY]: Processing request for inventory of {0}", userID); | ||
158 | |||
159 | // Uncomment me to simulate a slow responding inventory server | ||
160 | //Thread.Sleep(16000); | ||
161 | |||
162 | InventoryCollection invCollection = new InventoryCollection(); | ||
163 | |||
164 | List<InventoryFolderBase> allFolders = GetInventorySkeleton(userID); | ||
165 | |||
166 | if (null == allFolders) | ||
167 | { | ||
168 | m_log.WarnFormat("[GRID AGENT INVENTORY]: No inventory found for user {0}", rawUserID); | ||
169 | |||
170 | return invCollection; | ||
171 | } | ||
172 | |||
173 | List<InventoryItemBase> allItems = new List<InventoryItemBase>(); | ||
174 | |||
175 | foreach (InventoryFolderBase folder in allFolders) | ||
176 | { | ||
177 | List<InventoryItemBase> items = RequestFolderItems(folder.ID); | ||
178 | |||
179 | if (items != null) | ||
180 | { | ||
181 | allItems.InsertRange(0, items); | ||
182 | } | ||
183 | } | ||
184 | |||
185 | invCollection.UserID = userID; | ||
186 | invCollection.Folders = allFolders; | ||
187 | invCollection.Items = allItems; | ||
188 | |||
189 | // foreach (InventoryFolderBase folder in invCollection.Folders) | ||
190 | // { | ||
191 | // m_log.DebugFormat("[GRID AGENT INVENTORY]: Sending back folder {0} {1}", folder.Name, folder.ID); | ||
192 | // } | ||
193 | // | ||
194 | // foreach (InventoryItemBase item in invCollection.Items) | ||
195 | // { | ||
196 | // m_log.DebugFormat("[GRID AGENT INVENTORY]: Sending back item {0} {1}, folder {2}", item.Name, item.ID, item.Folder); | ||
197 | // } | ||
198 | |||
199 | m_log.InfoFormat( | ||
200 | "[GRID AGENT INVENTORY]: Sending back inventory response to user {0} containing {1} folders and {2} items", | ||
201 | invCollection.UserID, invCollection.Folders.Count, invCollection.Items.Count); | ||
202 | |||
203 | return invCollection; | ||
204 | } | ||
205 | |||
206 | public List<InventoryItemBase> GetFolderItems(Guid folderID) | ||
207 | { | ||
208 | List<InventoryItemBase> allItems = new List<InventoryItemBase>(); | ||
209 | |||
210 | |||
211 | List<InventoryItemBase> items = RequestFolderItems(new UUID(folderID)); | ||
212 | |||
213 | if (items != null) | ||
214 | { | ||
215 | allItems.InsertRange(0, items); | ||
216 | } | ||
217 | m_log.InfoFormat( | ||
218 | "[GRID AGENT INVENTORY]: Sending back inventory response containing {0} items", allItems.Count.ToString()); | ||
219 | return allItems; | ||
220 | } | ||
221 | |||
222 | /// <summary> | ||
223 | /// Guid to UUID wrapper for same name IInventoryServices method | ||
224 | /// </summary> | ||
225 | /// <param name="rawUserID"></param> | ||
226 | /// <returns></returns> | ||
227 | public List<InventoryFolderBase> GetInventorySkeleton(Guid rawUserID) | ||
228 | { | ||
229 | UUID userID = new UUID(rawUserID); | ||
230 | return GetInventorySkeleton(userID); | ||
231 | } | ||
232 | |||
233 | /// <summary> | ||
234 | /// Create an inventory for the given user. | ||
235 | /// </summary> | ||
236 | /// <param name="rawUserID"></param> | ||
237 | /// <returns></returns> | ||
238 | public bool CreateUsersInventory(Guid rawUserID) | ||
239 | { | ||
240 | UUID userID = new UUID(rawUserID); | ||
241 | |||
242 | m_log.InfoFormat("[GRID AGENT INVENTORY]: Creating new set of inventory folders for user {0}", userID); | ||
243 | |||
244 | return CreateNewUserInventory(userID); | ||
245 | } | ||
246 | |||
247 | public List<InventoryItemBase> GetActiveGestures(Guid rawUserID) | ||
248 | { | ||
249 | UUID userID = new UUID(rawUserID); | ||
250 | |||
251 | m_log.InfoFormat("[GRID AGENT INVENTORY]: fetching active gestures for user {0}", userID); | ||
252 | |||
253 | return GetActiveGestures(userID); | ||
254 | } | ||
255 | } | ||
256 | } | ||
diff --git a/OpenSim/Grid/InventoryServer/InventoryServiceBase.cs b/OpenSim/Grid/InventoryServer/InventoryServiceBase.cs deleted file mode 100644 index f8b4949..0000000 --- a/OpenSim/Grid/InventoryServer/InventoryServiceBase.cs +++ /dev/null | |||
@@ -1,519 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System.Collections.Generic; | ||
29 | using System.Reflection; | ||
30 | using log4net; | ||
31 | using OpenMetaverse; | ||
32 | using OpenSim.Data; | ||
33 | using OpenSim.Framework; | ||
34 | using OpenSim.Framework.Communications; | ||
35 | |||
36 | namespace OpenSim.Grid.InventoryServer | ||
37 | { | ||
38 | /// <summary> | ||
39 | /// Abstract base class used by local and grid implementations of an inventory service. | ||
40 | /// </summary> | ||
41 | public abstract class InventoryServiceBase : IInterServiceInventoryServices | ||
42 | { | ||
43 | |||
44 | private static readonly ILog m_log | ||
45 | = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
46 | |||
47 | protected List<IInventoryDataPlugin> m_plugins = new List<IInventoryDataPlugin>(); | ||
48 | |||
49 | #region Plugin methods | ||
50 | |||
51 | /// <summary> | ||
52 | /// Add a new inventory data plugin - plugins will be requested in the order they were added. | ||
53 | /// </summary> | ||
54 | /// <param name="plugin">The plugin that will provide data</param> | ||
55 | public void AddPlugin(IInventoryDataPlugin plugin) | ||
56 | { | ||
57 | m_plugins.Add(plugin); | ||
58 | } | ||
59 | |||
60 | /// <summary> | ||
61 | /// Adds a list of inventory data plugins, as described by `provider' | ||
62 | /// and `connect', to `m_plugins'. | ||
63 | /// </summary> | ||
64 | /// <param name="provider"> | ||
65 | /// The filename of the inventory server plugin DLL. | ||
66 | /// </param> | ||
67 | /// <param name="connect"> | ||
68 | /// The connection string for the storage backend. | ||
69 | /// </param> | ||
70 | public void AddPlugin(string provider, string connect) | ||
71 | { | ||
72 | m_plugins.AddRange(DataPluginFactory.LoadDataPlugins<IInventoryDataPlugin>(provider, connect)); | ||
73 | } | ||
74 | |||
75 | #endregion | ||
76 | |||
77 | #region IInventoryServices methods | ||
78 | |||
79 | public string Host | ||
80 | { | ||
81 | get { return "default"; } | ||
82 | } | ||
83 | |||
84 | public List<InventoryFolderBase> GetInventorySkeleton(UUID userId) | ||
85 | { | ||
86 | // m_log.DebugFormat("[AGENT INVENTORY]: Getting inventory skeleton for {0}", userId); | ||
87 | |||
88 | InventoryFolderBase rootFolder = RequestRootFolder(userId); | ||
89 | |||
90 | // Agent has no inventory structure yet. | ||
91 | if (null == rootFolder) | ||
92 | { | ||
93 | return null; | ||
94 | } | ||
95 | |||
96 | List<InventoryFolderBase> userFolders = new List<InventoryFolderBase>(); | ||
97 | |||
98 | userFolders.Add(rootFolder); | ||
99 | |||
100 | foreach (IInventoryDataPlugin plugin in m_plugins) | ||
101 | { | ||
102 | IList<InventoryFolderBase> folders = plugin.getFolderHierarchy(rootFolder.ID); | ||
103 | userFolders.AddRange(folders); | ||
104 | } | ||
105 | |||
106 | // foreach (InventoryFolderBase folder in userFolders) | ||
107 | // { | ||
108 | // m_log.DebugFormat("[AGENT INVENTORY]: Got folder {0} {1}", folder.name, folder.folderID); | ||
109 | // } | ||
110 | |||
111 | return userFolders; | ||
112 | } | ||
113 | |||
114 | // See IInventoryServices | ||
115 | public virtual bool HasInventoryForUser(UUID userID) | ||
116 | { | ||
117 | return false; | ||
118 | } | ||
119 | |||
120 | // See IInventoryServices | ||
121 | public virtual InventoryFolderBase RequestRootFolder(UUID userID) | ||
122 | { | ||
123 | // Retrieve the first root folder we get from the list of plugins. | ||
124 | foreach (IInventoryDataPlugin plugin in m_plugins) | ||
125 | { | ||
126 | InventoryFolderBase rootFolder = plugin.getUserRootFolder(userID); | ||
127 | if (rootFolder != null) | ||
128 | return rootFolder; | ||
129 | } | ||
130 | |||
131 | // Return nothing if no plugin was able to supply a root folder | ||
132 | return null; | ||
133 | } | ||
134 | |||
135 | // See IInventoryServices | ||
136 | public bool CreateNewUserInventory(UUID user) | ||
137 | { | ||
138 | InventoryFolderBase existingRootFolder = RequestRootFolder(user); | ||
139 | |||
140 | if (null != existingRootFolder) | ||
141 | { | ||
142 | m_log.WarnFormat( | ||
143 | "[AGENT INVENTORY]: Did not create a new inventory for user {0} since they already have " | ||
144 | + "a root inventory folder with id {1}", | ||
145 | user, existingRootFolder.ID); | ||
146 | } | ||
147 | else | ||
148 | { | ||
149 | UsersInventory inven = new UsersInventory(); | ||
150 | inven.CreateNewInventorySet(user); | ||
151 | AddNewInventorySet(inven); | ||
152 | |||
153 | return true; | ||
154 | } | ||
155 | |||
156 | return false; | ||
157 | } | ||
158 | |||
159 | public List<InventoryItemBase> GetActiveGestures(UUID userId) | ||
160 | { | ||
161 | List<InventoryItemBase> activeGestures = new List<InventoryItemBase>(); | ||
162 | foreach (IInventoryDataPlugin plugin in m_plugins) | ||
163 | { | ||
164 | activeGestures.AddRange(plugin.fetchActiveGestures(userId)); | ||
165 | } | ||
166 | |||
167 | return activeGestures; | ||
168 | } | ||
169 | |||
170 | #endregion | ||
171 | |||
172 | #region Methods used by GridInventoryService | ||
173 | |||
174 | public List<InventoryFolderBase> RequestSubFolders(UUID parentFolderID) | ||
175 | { | ||
176 | List<InventoryFolderBase> inventoryList = new List<InventoryFolderBase>(); | ||
177 | |||
178 | foreach (IInventoryDataPlugin plugin in m_plugins) | ||
179 | { | ||
180 | inventoryList.AddRange(plugin.getInventoryFolders(parentFolderID)); | ||
181 | } | ||
182 | |||
183 | return inventoryList; | ||
184 | } | ||
185 | |||
186 | public List<InventoryItemBase> RequestFolderItems(UUID folderID) | ||
187 | { | ||
188 | List<InventoryItemBase> itemsList = new List<InventoryItemBase>(); | ||
189 | |||
190 | foreach (IInventoryDataPlugin plugin in m_plugins) | ||
191 | { | ||
192 | itemsList.AddRange(plugin.getInventoryInFolder(folderID)); | ||
193 | } | ||
194 | |||
195 | return itemsList; | ||
196 | } | ||
197 | |||
198 | #endregion | ||
199 | |||
200 | // See IInventoryServices | ||
201 | public virtual bool AddFolder(InventoryFolderBase folder) | ||
202 | { | ||
203 | m_log.DebugFormat( | ||
204 | "[AGENT INVENTORY]: Adding folder {0} {1} to folder {2}", folder.Name, folder.ID, folder.ParentID); | ||
205 | |||
206 | foreach (IInventoryDataPlugin plugin in m_plugins) | ||
207 | { | ||
208 | plugin.addInventoryFolder(folder); | ||
209 | } | ||
210 | |||
211 | // FIXME: Should return false on failure | ||
212 | return true; | ||
213 | } | ||
214 | |||
215 | // See IInventoryServices | ||
216 | public virtual bool UpdateFolder(InventoryFolderBase folder) | ||
217 | { | ||
218 | m_log.DebugFormat( | ||
219 | "[AGENT INVENTORY]: Updating folder {0} {1} to folder {2}", folder.Name, folder.ID, folder.ParentID); | ||
220 | |||
221 | foreach (IInventoryDataPlugin plugin in m_plugins) | ||
222 | { | ||
223 | plugin.updateInventoryFolder(folder); | ||
224 | } | ||
225 | |||
226 | // FIXME: Should return false on failure | ||
227 | return true; | ||
228 | } | ||
229 | |||
230 | // See IInventoryServices | ||
231 | public virtual bool MoveFolder(InventoryFolderBase folder) | ||
232 | { | ||
233 | m_log.DebugFormat( | ||
234 | "[AGENT INVENTORY]: Moving folder {0} {1} to folder {2}", folder.Name, folder.ID, folder.ParentID); | ||
235 | |||
236 | foreach (IInventoryDataPlugin plugin in m_plugins) | ||
237 | { | ||
238 | plugin.moveInventoryFolder(folder); | ||
239 | } | ||
240 | |||
241 | // FIXME: Should return false on failure | ||
242 | return true; | ||
243 | } | ||
244 | |||
245 | // See IInventoryServices | ||
246 | public virtual bool AddItem(InventoryItemBase item) | ||
247 | { | ||
248 | m_log.DebugFormat( | ||
249 | "[AGENT INVENTORY]: Adding item {0} {1} to folder {2}", item.Name, item.ID, item.Folder); | ||
250 | |||
251 | foreach (IInventoryDataPlugin plugin in m_plugins) | ||
252 | { | ||
253 | plugin.addInventoryItem(item); | ||
254 | } | ||
255 | |||
256 | // FIXME: Should return false on failure | ||
257 | return true; | ||
258 | } | ||
259 | |||
260 | // See IInventoryServices | ||
261 | public virtual bool UpdateItem(InventoryItemBase item) | ||
262 | { | ||
263 | m_log.InfoFormat( | ||
264 | "[AGENT INVENTORY]: Updating item {0} {1} in folder {2}", item.Name, item.ID, item.Folder); | ||
265 | |||
266 | foreach (IInventoryDataPlugin plugin in m_plugins) | ||
267 | { | ||
268 | plugin.updateInventoryItem(item); | ||
269 | } | ||
270 | |||
271 | // FIXME: Should return false on failure | ||
272 | return true; | ||
273 | } | ||
274 | |||
275 | // See IInventoryServices | ||
276 | public virtual bool DeleteItem(InventoryItemBase item) | ||
277 | { | ||
278 | m_log.InfoFormat( | ||
279 | "[AGENT INVENTORY]: Deleting item {0} {1} from folder {2}", item.Name, item.ID, item.Folder); | ||
280 | |||
281 | foreach (IInventoryDataPlugin plugin in m_plugins) | ||
282 | { | ||
283 | plugin.deleteInventoryItem(item.ID); | ||
284 | } | ||
285 | |||
286 | // FIXME: Should return false on failure | ||
287 | return true; | ||
288 | } | ||
289 | |||
290 | public virtual InventoryItemBase QueryItem(InventoryItemBase item) | ||
291 | { | ||
292 | foreach (IInventoryDataPlugin plugin in m_plugins) | ||
293 | { | ||
294 | InventoryItemBase result = plugin.queryInventoryItem(item.ID); | ||
295 | if (result != null) | ||
296 | return result; | ||
297 | } | ||
298 | |||
299 | return null; | ||
300 | } | ||
301 | |||
302 | public virtual InventoryFolderBase QueryFolder(InventoryFolderBase item) | ||
303 | { | ||
304 | foreach (IInventoryDataPlugin plugin in m_plugins) | ||
305 | { | ||
306 | InventoryFolderBase result = plugin.queryInventoryFolder(item.ID); | ||
307 | if (result != null) | ||
308 | return result; | ||
309 | } | ||
310 | |||
311 | return null; | ||
312 | } | ||
313 | |||
314 | /// <summary> | ||
315 | /// Purge a folder of all items items and subfolders. | ||
316 | /// | ||
317 | /// FIXME: Really nasty in a sense, because we have to query the database to get information we may | ||
318 | /// already know... Needs heavy refactoring. | ||
319 | /// </summary> | ||
320 | /// <param name="folder"></param> | ||
321 | public virtual bool PurgeFolder(InventoryFolderBase folder) | ||
322 | { | ||
323 | m_log.DebugFormat( | ||
324 | "[AGENT INVENTORY]: Purging folder {0} {1} of its contents", folder.Name, folder.ID); | ||
325 | |||
326 | List<InventoryFolderBase> subFolders = RequestSubFolders(folder.ID); | ||
327 | |||
328 | foreach (InventoryFolderBase subFolder in subFolders) | ||
329 | { | ||
330 | // m_log.DebugFormat("[AGENT INVENTORY]: Deleting folder {0} {1}", subFolder.Name, subFolder.ID); | ||
331 | |||
332 | foreach (IInventoryDataPlugin plugin in m_plugins) | ||
333 | { | ||
334 | plugin.deleteInventoryFolder(subFolder.ID); | ||
335 | } | ||
336 | } | ||
337 | |||
338 | List<InventoryItemBase> items = RequestFolderItems(folder.ID); | ||
339 | |||
340 | foreach (InventoryItemBase item in items) | ||
341 | { | ||
342 | DeleteItem(item); | ||
343 | } | ||
344 | |||
345 | // FIXME: Should return false on failure | ||
346 | return true; | ||
347 | } | ||
348 | |||
349 | private void AddNewInventorySet(UsersInventory inventory) | ||
350 | { | ||
351 | foreach (InventoryFolderBase folder in inventory.Folders.Values) | ||
352 | { | ||
353 | AddFolder(folder); | ||
354 | } | ||
355 | } | ||
356 | |||
357 | public InventoryItemBase GetInventoryItem(UUID itemID) | ||
358 | { | ||
359 | foreach (IInventoryDataPlugin plugin in m_plugins) | ||
360 | { | ||
361 | InventoryItemBase item = plugin.getInventoryItem(itemID); | ||
362 | if (item != null) | ||
363 | return item; | ||
364 | } | ||
365 | |||
366 | return null; | ||
367 | } | ||
368 | |||
369 | /// <summary> | ||
370 | /// Used to create a new user inventory. | ||
371 | /// </summary> | ||
372 | private class UsersInventory | ||
373 | { | ||
374 | public Dictionary<UUID, InventoryFolderBase> Folders = new Dictionary<UUID, InventoryFolderBase>(); | ||
375 | public Dictionary<UUID, InventoryItemBase> Items = new Dictionary<UUID, InventoryItemBase>(); | ||
376 | |||
377 | public virtual void CreateNewInventorySet(UUID user) | ||
378 | { | ||
379 | InventoryFolderBase folder = new InventoryFolderBase(); | ||
380 | |||
381 | folder.ParentID = UUID.Zero; | ||
382 | folder.Owner = user; | ||
383 | folder.ID = UUID.Random(); | ||
384 | folder.Name = "My Inventory"; | ||
385 | folder.Type = (short)AssetType.Folder; | ||
386 | folder.Version = 1; | ||
387 | Folders.Add(folder.ID, folder); | ||
388 | |||
389 | UUID rootFolder = folder.ID; | ||
390 | |||
391 | folder = new InventoryFolderBase(); | ||
392 | folder.ParentID = rootFolder; | ||
393 | folder.Owner = user; | ||
394 | folder.ID = UUID.Random(); | ||
395 | folder.Name = "Animations"; | ||
396 | folder.Type = (short)AssetType.Animation; | ||
397 | folder.Version = 1; | ||
398 | Folders.Add(folder.ID, folder); | ||
399 | |||
400 | folder = new InventoryFolderBase(); | ||
401 | folder.ParentID = rootFolder; | ||
402 | folder.Owner = user; | ||
403 | folder.ID = UUID.Random(); | ||
404 | folder.Name = "Body Parts"; | ||
405 | folder.Type = (short)AssetType.Bodypart; | ||
406 | folder.Version = 1; | ||
407 | Folders.Add(folder.ID, folder); | ||
408 | |||
409 | folder = new InventoryFolderBase(); | ||
410 | folder.ParentID = rootFolder; | ||
411 | folder.Owner = user; | ||
412 | folder.ID = UUID.Random(); | ||
413 | folder.Name = "Calling Cards"; | ||
414 | folder.Type = (short)AssetType.CallingCard; | ||
415 | folder.Version = 1; | ||
416 | Folders.Add(folder.ID, folder); | ||
417 | |||
418 | folder = new InventoryFolderBase(); | ||
419 | folder.ParentID = rootFolder; | ||
420 | folder.Owner = user; | ||
421 | folder.ID = UUID.Random(); | ||
422 | folder.Name = "Clothing"; | ||
423 | folder.Type = (short)AssetType.Clothing; | ||
424 | folder.Version = 1; | ||
425 | Folders.Add(folder.ID, folder); | ||
426 | |||
427 | folder = new InventoryFolderBase(); | ||
428 | folder.ParentID = rootFolder; | ||
429 | folder.Owner = user; | ||
430 | folder.ID = UUID.Random(); | ||
431 | folder.Name = "Gestures"; | ||
432 | folder.Type = (short)AssetType.Gesture; | ||
433 | folder.Version = 1; | ||
434 | Folders.Add(folder.ID, folder); | ||
435 | |||
436 | folder = new InventoryFolderBase(); | ||
437 | folder.ParentID = rootFolder; | ||
438 | folder.Owner = user; | ||
439 | folder.ID = UUID.Random(); | ||
440 | folder.Name = "Landmarks"; | ||
441 | folder.Type = (short)AssetType.Landmark; | ||
442 | folder.Version = 1; | ||
443 | Folders.Add(folder.ID, folder); | ||
444 | |||
445 | folder = new InventoryFolderBase(); | ||
446 | folder.ParentID = rootFolder; | ||
447 | folder.Owner = user; | ||
448 | folder.ID = UUID.Random(); | ||
449 | folder.Name = "Lost And Found"; | ||
450 | folder.Type = (short)AssetType.LostAndFoundFolder; | ||
451 | folder.Version = 1; | ||
452 | Folders.Add(folder.ID, folder); | ||
453 | |||
454 | folder = new InventoryFolderBase(); | ||
455 | folder.ParentID = rootFolder; | ||
456 | folder.Owner = user; | ||
457 | folder.ID = UUID.Random(); | ||
458 | folder.Name = "Notecards"; | ||
459 | folder.Type = (short)AssetType.Notecard; | ||
460 | folder.Version = 1; | ||
461 | Folders.Add(folder.ID, folder); | ||
462 | |||
463 | folder = new InventoryFolderBase(); | ||
464 | folder.ParentID = rootFolder; | ||
465 | folder.Owner = user; | ||
466 | folder.ID = UUID.Random(); | ||
467 | folder.Name = "Objects"; | ||
468 | folder.Type = (short)AssetType.Object; | ||
469 | folder.Version = 1; | ||
470 | Folders.Add(folder.ID, folder); | ||
471 | |||
472 | folder = new InventoryFolderBase(); | ||
473 | folder.ParentID = rootFolder; | ||
474 | folder.Owner = user; | ||
475 | folder.ID = UUID.Random(); | ||
476 | folder.Name = "Photo Album"; | ||
477 | folder.Type = (short)AssetType.SnapshotFolder; | ||
478 | folder.Version = 1; | ||
479 | Folders.Add(folder.ID, folder); | ||
480 | |||
481 | folder = new InventoryFolderBase(); | ||
482 | folder.ParentID = rootFolder; | ||
483 | folder.Owner = user; | ||
484 | folder.ID = UUID.Random(); | ||
485 | folder.Name = "Scripts"; | ||
486 | folder.Type = (short)AssetType.LSLText; | ||
487 | folder.Version = 1; | ||
488 | Folders.Add(folder.ID, folder); | ||
489 | |||
490 | folder = new InventoryFolderBase(); | ||
491 | folder.ParentID = rootFolder; | ||
492 | folder.Owner = user; | ||
493 | folder.ID = UUID.Random(); | ||
494 | folder.Name = "Sounds"; | ||
495 | folder.Type = (short)AssetType.Sound; | ||
496 | folder.Version = 1; | ||
497 | Folders.Add(folder.ID, folder); | ||
498 | |||
499 | folder = new InventoryFolderBase(); | ||
500 | folder.ParentID = rootFolder; | ||
501 | folder.Owner = user; | ||
502 | folder.ID = UUID.Random(); | ||
503 | folder.Name = "Textures"; | ||
504 | folder.Type = (short)AssetType.Texture; | ||
505 | folder.Version = 1; | ||
506 | Folders.Add(folder.ID, folder); | ||
507 | |||
508 | folder = new InventoryFolderBase(); | ||
509 | folder.ParentID = rootFolder; | ||
510 | folder.Owner = user; | ||
511 | folder.ID = UUID.Random(); | ||
512 | folder.Name = "Trash"; | ||
513 | folder.Type = (short)AssetType.TrashFolder; | ||
514 | folder.Version = 1; | ||
515 | Folders.Add(folder.ID, folder); | ||
516 | } | ||
517 | } | ||
518 | } | ||
519 | } | ||
diff --git a/OpenSim/Grid/InventoryServer/Main.cs b/OpenSim/Grid/InventoryServer/Main.cs deleted file mode 100644 index 6106d93..0000000 --- a/OpenSim/Grid/InventoryServer/Main.cs +++ /dev/null | |||
@@ -1,182 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.IO; | ||
31 | using System.Reflection; | ||
32 | using log4net; | ||
33 | using log4net.Config; | ||
34 | using OpenMetaverse; | ||
35 | using OpenSim.Framework; | ||
36 | using OpenSim.Framework.Communications.Services; | ||
37 | using OpenSim.Framework.Console; | ||
38 | using OpenSim.Framework.Servers; | ||
39 | using OpenSim.Framework.Servers.HttpServer; | ||
40 | |||
41 | namespace OpenSim.Grid.InventoryServer | ||
42 | { | ||
43 | public class OpenInventory_Main : BaseOpenSimServer | ||
44 | { | ||
45 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
46 | |||
47 | private GridInventoryService m_inventoryService; | ||
48 | //private HGInventoryService m_directInventoryService; | ||
49 | |||
50 | public const string LogName = "INVENTORY"; | ||
51 | |||
52 | public static void Main(string[] args) | ||
53 | { | ||
54 | XmlConfigurator.Configure(); | ||
55 | |||
56 | OpenInventory_Main theServer = new OpenInventory_Main(); | ||
57 | theServer.Startup(); | ||
58 | |||
59 | theServer.Work(); | ||
60 | } | ||
61 | |||
62 | public OpenInventory_Main() | ||
63 | { | ||
64 | m_console = new LocalConsole("Inventory"); | ||
65 | MainConsole.Instance = m_console; | ||
66 | } | ||
67 | |||
68 | protected override void StartupSpecific() | ||
69 | { | ||
70 | InventoryConfig config = new InventoryConfig(LogName, (Path.Combine(Util.configDir(), "InventoryServer_Config.xml"))); | ||
71 | |||
72 | m_inventoryService = new GridInventoryService(config.UserServerURL); | ||
73 | m_inventoryService.DoLookup = config.SessionLookUp; | ||
74 | m_inventoryService.AddPlugin(config.DatabaseProvider, config.DatabaseConnect); | ||
75 | |||
76 | |||
77 | m_log.Info("[" + LogName + "]: Starting HTTP server ..."); | ||
78 | |||
79 | m_httpServer = new BaseHttpServer(config.HttpPort); | ||
80 | |||
81 | AddHttpHandlers(config.RegionAccessToAgentsInventory); | ||
82 | |||
83 | m_httpServer.Start(); | ||
84 | |||
85 | m_log.Info("[" + LogName + "]: Started HTTP server"); | ||
86 | |||
87 | base.StartupSpecific(); | ||
88 | |||
89 | m_console.Commands.AddCommand("inventoryserver", false, "add user", | ||
90 | "add user", | ||
91 | "Add a random user inventory", HandleAddUser); | ||
92 | } | ||
93 | |||
94 | protected void AddHttpHandlers(bool regionAccess) | ||
95 | { | ||
96 | if (regionAccess) | ||
97 | { | ||
98 | m_httpServer.AddStreamHandler( | ||
99 | new RestDeserialiseSecureHandler<Guid, InventoryCollection>( | ||
100 | "POST", "/GetInventory/", m_inventoryService.GetUserInventory, m_inventoryService.CheckAuthSession)); | ||
101 | |||
102 | m_httpServer.AddStreamHandler( | ||
103 | new RestDeserialiseSecureHandler<InventoryFolderBase, bool>( | ||
104 | "POST", "/UpdateFolder/", m_inventoryService.UpdateFolder, m_inventoryService.CheckAuthSession)); | ||
105 | |||
106 | m_httpServer.AddStreamHandler( | ||
107 | new RestDeserialiseSecureHandler<InventoryFolderBase, bool>( | ||
108 | "POST", "/MoveFolder/", m_inventoryService.MoveFolder, m_inventoryService.CheckAuthSession)); | ||
109 | |||
110 | m_httpServer.AddStreamHandler( | ||
111 | new RestDeserialiseSecureHandler<InventoryFolderBase, bool>( | ||
112 | "POST", "/PurgeFolder/", m_inventoryService.PurgeFolder, m_inventoryService.CheckAuthSession)); | ||
113 | |||
114 | m_httpServer.AddStreamHandler( | ||
115 | new RestDeserialiseSecureHandler<InventoryItemBase, bool>( | ||
116 | "POST", "/DeleteItem/", m_inventoryService.DeleteItem, m_inventoryService.CheckAuthSession)); | ||
117 | |||
118 | m_httpServer.AddStreamHandler( | ||
119 | new RestDeserialiseSecureHandler<InventoryItemBase, InventoryItemBase>( | ||
120 | "POST", "/QueryItem/", m_inventoryService.QueryItem, m_inventoryService.CheckAuthSession)); | ||
121 | |||
122 | m_httpServer.AddStreamHandler( | ||
123 | new RestDeserialiseSecureHandler<InventoryFolderBase, InventoryFolderBase>( | ||
124 | "POST", "/QueryFolder/", m_inventoryService.QueryFolder, m_inventoryService.CheckAuthSession)); | ||
125 | |||
126 | } | ||
127 | |||
128 | m_httpServer.AddStreamHandler( | ||
129 | new RestDeserialiseTrustedHandler<Guid, bool>( | ||
130 | "POST", "/CreateInventory/", m_inventoryService.CreateUsersInventory, m_inventoryService.CheckTrustSource)); | ||
131 | |||
132 | m_httpServer.AddStreamHandler( | ||
133 | new RestDeserialiseSecureHandler<InventoryFolderBase, bool>( | ||
134 | "POST", "/NewFolder/", m_inventoryService.AddFolder, m_inventoryService.CheckAuthSession)); | ||
135 | |||
136 | m_httpServer.AddStreamHandler( | ||
137 | new RestDeserialiseTrustedHandler<InventoryFolderBase, bool>( | ||
138 | "POST", "/CreateFolder/", m_inventoryService.AddFolder, m_inventoryService.CheckTrustSource)); | ||
139 | |||
140 | m_httpServer.AddStreamHandler( | ||
141 | new RestDeserialiseSecureHandler<InventoryItemBase, bool>( | ||
142 | "POST", "/NewItem/", m_inventoryService.AddItem, m_inventoryService.CheckAuthSession)); | ||
143 | |||
144 | m_httpServer.AddStreamHandler( | ||
145 | new RestDeserialiseTrustedHandler<InventoryItemBase, bool>( | ||
146 | "POST", "/AddNewItem/", m_inventoryService.AddItem, m_inventoryService.CheckTrustSource)); | ||
147 | |||
148 | m_httpServer.AddStreamHandler( | ||
149 | new RestDeserialiseTrustedHandler<Guid, List<InventoryItemBase>>( | ||
150 | "POST", "/GetItems/", m_inventoryService.GetFolderItems, m_inventoryService.CheckTrustSource)); | ||
151 | |||
152 | // for persistent active gestures | ||
153 | m_httpServer.AddStreamHandler( | ||
154 | new RestDeserialiseTrustedHandler<Guid, List<InventoryItemBase>> | ||
155 | ("POST", "/ActiveGestures/", m_inventoryService.GetActiveGestures, m_inventoryService.CheckTrustSource)); | ||
156 | |||
157 | // WARNING: Root folders no longer just delivers the root and immediate child folders (e.g | ||
158 | // system folders such as Objects, Textures), but it now returns the entire inventory skeleton. | ||
159 | // It would have been better to rename this request, but complexities in the BaseHttpServer | ||
160 | // (e.g. any http request not found is automatically treated as an xmlrpc request) make it easier | ||
161 | // to do this for now. | ||
162 | m_httpServer.AddStreamHandler( | ||
163 | new RestDeserialiseTrustedHandler<Guid, List<InventoryFolderBase>> | ||
164 | ("POST", "/RootFolders/", m_inventoryService.GetInventorySkeleton, m_inventoryService.CheckTrustSource)); | ||
165 | } | ||
166 | |||
167 | private void Work() | ||
168 | { | ||
169 | m_console.Output("Enter help for a list of commands\n"); | ||
170 | |||
171 | while (true) | ||
172 | { | ||
173 | m_console.Prompt(); | ||
174 | } | ||
175 | } | ||
176 | |||
177 | private void HandleAddUser(string module, string[] args) | ||
178 | { | ||
179 | m_inventoryService.CreateUsersInventory(UUID.Random().Guid); | ||
180 | } | ||
181 | } | ||
182 | } | ||
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs index 9f49da9..196205c 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs | |||
@@ -264,7 +264,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
264 | /// <param name="cmdparams"></param> | 264 | /// <param name="cmdparams"></param> |
265 | protected void HandleSaveInvConsoleCommand(string module, string[] cmdparams) | 265 | protected void HandleSaveInvConsoleCommand(string module, string[] cmdparams) |
266 | { | 266 | { |
267 | if (cmdparams.Length < 5) | 267 | if (cmdparams.Length < 6) |
268 | { | 268 | { |
269 | m_log.Error( | 269 | m_log.Error( |
270 | "[INVENTORY ARCHIVER]: usage is save iar <first name> <last name> <inventory path> <user password> [<save file path>]"); | 270 | "[INVENTORY ARCHIVER]: usage is save iar <first name> <last name> <inventory path> <user password> [<save file path>]"); |
@@ -324,6 +324,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
324 | protected CachedUserInfo GetUserInfo(string firstName, string lastName, string pass) | 324 | protected CachedUserInfo GetUserInfo(string firstName, string lastName, string pass) |
325 | { | 325 | { |
326 | CachedUserInfo userInfo = m_aScene.CommsManager.UserProfileCacheService.GetUserDetails(firstName, lastName); | 326 | CachedUserInfo userInfo = m_aScene.CommsManager.UserProfileCacheService.GetUserDetails(firstName, lastName); |
327 | //m_aScene.CommsManager.UserService.GetUserProfile(firstName, lastName); | ||
327 | if (null == userInfo) | 328 | if (null == userInfo) |
328 | { | 329 | { |
329 | m_log.ErrorFormat( | 330 | m_log.ErrorFormat( |
@@ -333,6 +334,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
333 | } | 334 | } |
334 | 335 | ||
335 | string md5PasswdHash = Util.Md5Hash(Util.Md5Hash(pass) + ":" + userInfo.UserProfile.PasswordSalt); | 336 | string md5PasswdHash = Util.Md5Hash(Util.Md5Hash(pass) + ":" + userInfo.UserProfile.PasswordSalt); |
337 | |||
338 | if (userInfo.UserProfile.PasswordHash == null || userInfo.UserProfile.PasswordHash == String.Empty) | ||
339 | { | ||
340 | m_log.ErrorFormat( | ||
341 | "[INVENTORY ARCHIVER]: Sorry, the grid mode service is not providing password hash details for the check. This will be fixed in an OpenSim git revision soon"); | ||
342 | |||
343 | return null; | ||
344 | } | ||
345 | |||
346 | // m_log.DebugFormat( | ||
347 | // "[INVENTORY ARCHIVER]: received salt {0}, hash {1}, supplied hash {2}", | ||
348 | // userInfo.UserProfile.PasswordSalt, userInfo.UserProfile.PasswordHash, md5PasswdHash); | ||
349 | |||
336 | if (userInfo.UserProfile.PasswordHash != md5PasswdHash) | 350 | if (userInfo.UserProfile.PasswordHash != md5PasswdHash) |
337 | { | 351 | { |
338 | m_log.ErrorFormat( | 352 | m_log.ErrorFormat( |
diff --git a/OpenSim/Region/Examples/SimpleModule/ComplexObject.cs b/OpenSim/Region/Examples/SimpleModule/ComplexObject.cs index f9c3fa6..3809749 100644 --- a/OpenSim/Region/Examples/SimpleModule/ComplexObject.cs +++ b/OpenSim/Region/Examples/SimpleModule/ComplexObject.cs | |||
@@ -73,10 +73,6 @@ namespace OpenSim.Region.Examples.SimpleModule | |||
73 | base.UpdateMovement(); | 73 | base.UpdateMovement(); |
74 | } | 74 | } |
75 | 75 | ||
76 | public ComplexObject() | ||
77 | { | ||
78 | } | ||
79 | |||
80 | public ComplexObject(Scene scene, ulong regionHandle, UUID ownerID, uint localID, Vector3 pos) | 76 | public ComplexObject(Scene scene, ulong regionHandle, UUID ownerID, uint localID, Vector3 pos) |
81 | : base(ownerID, pos, PrimitiveBaseShape.Default) | 77 | : base(ownerID, pos, PrimitiveBaseShape.Default) |
82 | { | 78 | { |
diff --git a/OpenSim/Framework/Servers/GetAssetStreamHandler.cs b/OpenSim/Region/Framework/Interfaces/IVoiceModule.cs index c6958de..2e555fa 100644 --- a/OpenSim/Framework/Servers/GetAssetStreamHandler.cs +++ b/OpenSim/Region/Framework/Interfaces/IVoiceModule.cs | |||
@@ -25,39 +25,21 @@ | |||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | |
29 | using System.IO; | 29 | using System.IO; |
30 | using System.Reflection; | ||
31 | using System.Text; | ||
32 | using System.Text.RegularExpressions; | ||
33 | using System.Xml; | ||
34 | using System.Xml.Serialization; | ||
35 | using log4net; | ||
36 | using OpenMetaverse; | 30 | using OpenMetaverse; |
37 | using OpenSim.Data; | ||
38 | using OpenSim.Framework; | ||
39 | using OpenSim.Framework.Servers; | ||
40 | using OpenSim.Framework.Servers.HttpServer; | ||
41 | using OpenSim.Framework.Statistics; | ||
42 | using System.Net; | ||
43 | 31 | ||
44 | namespace OpenSim.Framework.Servers | 32 | namespace OpenSim.Region.Framework.Interfaces |
45 | { | 33 | { |
46 | public class GetAssetStreamHandler : BaseGetAssetStreamHandler | 34 | public interface IVoiceModule |
47 | { | 35 | { |
48 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
49 | |||
50 | private readonly IAssetDataPlugin m_assetProvider; | ||
51 | |||
52 | public GetAssetStreamHandler(IAssetDataPlugin assetProvider) | ||
53 | : base("GET", "/assets") | ||
54 | { | ||
55 | m_assetProvider = assetProvider; | ||
56 | } | ||
57 | 36 | ||
58 | protected override AssetBase GetAsset(UUID assetID) | 37 | /// <summary> |
59 | { | 38 | /// Set the SIP url to be used by a parcel, this will allow manual setting of a SIP address |
60 | return m_assetProvider.GetAsset(assetID); | 39 | /// for a particular piece of land, allowing region owners to use preconfigured SIP conference channels. |
61 | } | 40 | /// This is used by osSetParcelSIPAddress |
41 | /// </summary> | ||
42 | void setLandSIPAddress(string SIPAddress,UUID GlobalID); | ||
43 | |||
62 | } | 44 | } |
63 | } | 45 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 6ba7e41..3c17bbe 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -250,16 +250,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
250 | /// </summary> | 250 | /// </summary> |
251 | public override Vector3 AbsolutePosition | 251 | public override Vector3 AbsolutePosition |
252 | { | 252 | { |
253 | get | 253 | get { return m_rootPart.GroupPosition; } |
254 | { | ||
255 | if (m_rootPart == null) | ||
256 | { | ||
257 | throw new NullReferenceException( | ||
258 | string.Format("[SCENE OBJECT GROUP]: Object {0} has no root part.", m_uuid)); | ||
259 | } | ||
260 | |||
261 | return m_rootPart.GroupPosition; | ||
262 | } | ||
263 | set | 254 | set |
264 | { | 255 | { |
265 | Vector3 val = value; | 256 | Vector3 val = value; |
@@ -291,41 +282,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
291 | 282 | ||
292 | public override uint LocalId | 283 | public override uint LocalId |
293 | { | 284 | { |
294 | get | 285 | get { return m_rootPart.LocalId; } |
295 | { | ||
296 | if (m_rootPart == null) | ||
297 | { | ||
298 | m_log.Error("[SCENE OBJECT GROUP]: Unable to find the rootpart for a LocalId Request!"); | ||
299 | return 0; | ||
300 | } | ||
301 | |||
302 | return m_rootPart.LocalId; | ||
303 | } | ||
304 | set { m_rootPart.LocalId = value; } | 286 | set { m_rootPart.LocalId = value; } |
305 | } | 287 | } |
306 | 288 | ||
307 | public override UUID UUID | 289 | public override UUID UUID |
308 | { | 290 | { |
309 | get { | 291 | get { return m_rootPart.UUID; } |
310 | if (m_rootPart == null) | ||
311 | { | ||
312 | m_log.Error("Got a null rootpart while requesting UUID. Called from: ", new Exception()); | ||
313 | return UUID.Zero; | ||
314 | } | ||
315 | else return m_rootPart.UUID; | ||
316 | } | ||
317 | set { m_rootPart.UUID = value; } | 292 | set { m_rootPart.UUID = value; } |
318 | } | 293 | } |
319 | 294 | ||
320 | public UUID OwnerID | 295 | public UUID OwnerID |
321 | { | 296 | { |
322 | get | 297 | get { return m_rootPart.OwnerID; } |
323 | { | ||
324 | if (m_rootPart == null) | ||
325 | return UUID.Zero; | ||
326 | |||
327 | return m_rootPart.OwnerID; | ||
328 | } | ||
329 | set { m_rootPart.OwnerID = value; } | 298 | set { m_rootPart.OwnerID = value; } |
330 | } | 299 | } |
331 | 300 | ||
@@ -366,7 +335,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
366 | { | 335 | { |
367 | m_isSelected = value; | 336 | m_isSelected = value; |
368 | // Tell physics engine that group is selected | 337 | // Tell physics engine that group is selected |
369 | if (m_rootPart != null && m_rootPart.PhysActor != null) | 338 | if (m_rootPart.PhysActor != null) |
370 | { | 339 | { |
371 | m_rootPart.PhysActor.Selected = value; | 340 | m_rootPart.PhysActor.Selected = value; |
372 | // Pass it on to the children. | 341 | // Pass it on to the children. |
@@ -399,13 +368,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
399 | #region Constructors | 368 | #region Constructors |
400 | 369 | ||
401 | /// <summary> | 370 | /// <summary> |
402 | /// Constructor | ||
403 | /// </summary> | ||
404 | public SceneObjectGroup() | ||
405 | { | ||
406 | } | ||
407 | |||
408 | /// <summary> | ||
409 | /// This constructor creates a SceneObjectGroup using a pre-existing SceneObjectPart. | 371 | /// This constructor creates a SceneObjectGroup using a pre-existing SceneObjectPart. |
410 | /// The original SceneObjectPart will be used rather than a copy, preserving | 372 | /// The original SceneObjectPart will be used rather than a copy, preserving |
411 | /// its existing localID and UUID. | 373 | /// its existing localID and UUID. |
@@ -419,9 +381,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
419 | /// Constructor. This object is added to the scene later via AttachToScene() | 381 | /// Constructor. This object is added to the scene later via AttachToScene() |
420 | /// </summary> | 382 | /// </summary> |
421 | public SceneObjectGroup(UUID ownerID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape) | 383 | public SceneObjectGroup(UUID ownerID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape) |
422 | { | 384 | { |
423 | Vector3 rootOffset = new Vector3(0, 0, 0); | 385 | SetRootPart(new SceneObjectPart(ownerID, shape, pos, rot, Vector3.Zero)); |
424 | SetRootPart(new SceneObjectPart(ownerID, shape, pos, rot, rootOffset)); | ||
425 | } | 386 | } |
426 | 387 | ||
427 | /// <summary> | 388 | /// <summary> |
@@ -462,11 +423,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
462 | 423 | ||
463 | public UUID GetFromItemID() | 424 | public UUID GetFromItemID() |
464 | { | 425 | { |
465 | if (m_rootPart != null) | 426 | return m_rootPart.FromItemID; |
466 | { | ||
467 | return m_rootPart.FromItemID; | ||
468 | } | ||
469 | return UUID.Zero; | ||
470 | } | 427 | } |
471 | 428 | ||
472 | /// <summary> | 429 | /// <summary> |
@@ -958,11 +915,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
958 | 915 | ||
959 | public byte GetAttachmentPoint() | 916 | public byte GetAttachmentPoint() |
960 | { | 917 | { |
961 | if (m_rootPart != null) | 918 | return m_rootPart.Shape.State; |
962 | { | ||
963 | return m_rootPart.Shape.State; | ||
964 | } | ||
965 | return (byte)0; | ||
966 | } | 919 | } |
967 | 920 | ||
968 | public void ClearPartAttachmentData() | 921 | public void ClearPartAttachmentData() |
@@ -1071,7 +1024,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1071 | /// </summary> | 1024 | /// </summary> |
1072 | /// <param name="part"></param> | 1025 | /// <param name="part"></param> |
1073 | public void SetRootPart(SceneObjectPart part) | 1026 | public void SetRootPart(SceneObjectPart part) |
1074 | { | 1027 | { |
1028 | if (part == null) | ||
1029 | throw new ArgumentNullException("Cannot give SceneObjectGroup a null root SceneObjectPart"); | ||
1030 | |||
1075 | part.SetParent(this); | 1031 | part.SetParent(this); |
1076 | m_rootPart = part; | 1032 | m_rootPart = part; |
1077 | if (!IsAttachment) | 1033 | if (!IsAttachment) |
@@ -1224,7 +1180,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1224 | 1180 | ||
1225 | if (!silent) | 1181 | if (!silent) |
1226 | { | 1182 | { |
1227 | if (m_rootPart != null && part == m_rootPart) | 1183 | if (part == m_rootPart) |
1228 | avatars[i].ControllingClient.SendKillObject(m_regionHandle, part.LocalId); | 1184 | avatars[i].ControllingClient.SendKillObject(m_regionHandle, part.LocalId); |
1229 | } | 1185 | } |
1230 | } | 1186 | } |
@@ -1447,7 +1403,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1447 | /// <param name="part"></param> | 1403 | /// <param name="part"></param> |
1448 | internal void SendPartFullUpdate(IClientAPI remoteClient, SceneObjectPart part, uint clientFlags) | 1404 | internal void SendPartFullUpdate(IClientAPI remoteClient, SceneObjectPart part, uint clientFlags) |
1449 | { | 1405 | { |
1450 | if (m_rootPart != null && m_rootPart.UUID == part.UUID) | 1406 | if (m_rootPart.UUID == part.UUID) |
1451 | { | 1407 | { |
1452 | if (IsAttachment) | 1408 | if (IsAttachment) |
1453 | { | 1409 | { |
@@ -1881,12 +1837,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1881 | if (m_isDeleted) | 1837 | if (m_isDeleted) |
1882 | return; | 1838 | return; |
1883 | 1839 | ||
1884 | // This is what happens when an orphanced link set child prim's | ||
1885 | // group was queued when it was linked | ||
1886 | // | ||
1887 | if (m_rootPart == null) | ||
1888 | return; | ||
1889 | |||
1890 | // Even temporary objects take part in physics (e.g. temp-on-rez bullets) | 1840 | // Even temporary objects take part in physics (e.g. temp-on-rez bullets) |
1891 | //if ((RootPart.Flags & PrimFlags.TemporaryOnRez) != 0) | 1841 | //if ((RootPart.Flags & PrimFlags.TemporaryOnRez) != 0) |
1892 | // return; | 1842 | // return; |
@@ -3129,26 +3079,22 @@ namespace OpenSim.Region.Framework.Scenes | |||
3129 | int yaxis = 4; | 3079 | int yaxis = 4; |
3130 | int zaxis = 8; | 3080 | int zaxis = 8; |
3131 | 3081 | ||
3132 | if (m_rootPart != null) | 3082 | setX = ((axis & xaxis) != 0) ? true : false; |
3133 | { | 3083 | setY = ((axis & yaxis) != 0) ? true : false; |
3134 | setX = ((axis & xaxis) != 0) ? true : false; | 3084 | setZ = ((axis & zaxis) != 0) ? true : false; |
3135 | setY = ((axis & yaxis) != 0) ? true : false; | ||
3136 | setZ = ((axis & zaxis) != 0) ? true : false; | ||
3137 | 3085 | ||
3138 | float setval = (rotate10 > 0) ? 1f : 0f; | 3086 | float setval = (rotate10 > 0) ? 1f : 0f; |
3139 | 3087 | ||
3140 | if (setX) | 3088 | if (setX) |
3141 | m_rootPart.RotationAxis.X = setval; | 3089 | m_rootPart.RotationAxis.X = setval; |
3142 | if (setY) | 3090 | if (setY) |
3143 | m_rootPart.RotationAxis.Y = setval; | 3091 | m_rootPart.RotationAxis.Y = setval; |
3144 | if (setZ) | 3092 | if (setZ) |
3145 | m_rootPart.RotationAxis.Z = setval; | 3093 | m_rootPart.RotationAxis.Z = setval; |
3146 | |||
3147 | if (setX || setY || setZ) | ||
3148 | { | ||
3149 | m_rootPart.SetPhysicsAxisRotation(); | ||
3150 | } | ||
3151 | 3094 | ||
3095 | if (setX || setY || setZ) | ||
3096 | { | ||
3097 | m_rootPart.SetPhysicsAxisRotation(); | ||
3152 | } | 3098 | } |
3153 | } | 3099 | } |
3154 | 3100 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index b0d279c..51bb114 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -415,9 +415,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
415 | set | 415 | set |
416 | { | 416 | { |
417 | m_name = value; | 417 | m_name = value; |
418 | if (PhysActor != null) | 418 | PhysicsActor pa = PhysActor; |
419 | if (pa != null) | ||
419 | { | 420 | { |
420 | PhysActor.SOPName = value; | 421 | pa.SOPName = value; |
421 | } | 422 | } |
422 | } | 423 | } |
423 | } | 424 | } |
@@ -427,10 +428,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
427 | get { return (byte) m_material; } | 428 | get { return (byte) m_material; } |
428 | set | 429 | set |
429 | { | 430 | { |
431 | PhysicsActor pa = PhysActor; | ||
430 | m_material = (Material)value; | 432 | m_material = (Material)value; |
431 | if (PhysActor != null) | 433 | if (pa != null) |
432 | { | 434 | { |
433 | PhysActor.SetMaterial((int)value); | 435 | pa.SetMaterial((int)value); |
434 | } | 436 | } |
435 | } | 437 | } |
436 | } | 438 | } |
@@ -501,11 +503,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
501 | get | 503 | get |
502 | { | 504 | { |
503 | // If this is a linkset, we don't want the physics engine mucking up our group position here. | 505 | // If this is a linkset, we don't want the physics engine mucking up our group position here. |
504 | if (PhysActor != null && _parentID == 0) | 506 | PhysicsActor pa = PhysActor; |
507 | if (pa != null && _parentID == 0) | ||
505 | { | 508 | { |
506 | m_groupPosition.X = PhysActor.Position.X; | 509 | m_groupPosition.X = pa.Position.X; |
507 | m_groupPosition.Y = PhysActor.Position.Y; | 510 | m_groupPosition.Y = pa.Position.Y; |
508 | m_groupPosition.Z = PhysActor.Position.Z; | 511 | m_groupPosition.Z = pa.Position.Z; |
509 | } | 512 | } |
510 | 513 | ||
511 | if (IsAttachment) | 514 | if (IsAttachment) |
@@ -525,26 +528,27 @@ namespace OpenSim.Region.Framework.Scenes | |||
525 | 528 | ||
526 | m_groupPosition = value; | 529 | m_groupPosition = value; |
527 | 530 | ||
528 | if (PhysActor != null) | 531 | PhysicsActor pa = PhysActor; |
532 | if (pa != null) | ||
529 | { | 533 | { |
530 | try | 534 | try |
531 | { | 535 | { |
532 | // Root prim actually goes at Position | 536 | // Root prim actually goes at Position |
533 | if (_parentID == 0) | 537 | if (_parentID == 0) |
534 | { | 538 | { |
535 | PhysActor.Position = new PhysicsVector(value.X, value.Y, value.Z); | 539 | pa.Position = new PhysicsVector(value.X, value.Y, value.Z); |
536 | } | 540 | } |
537 | else | 541 | else |
538 | { | 542 | { |
539 | // To move the child prim in respect to the group position and rotation we have to calculate | 543 | // To move the child prim in respect to the group position and rotation we have to calculate |
540 | Vector3 resultingposition = GetWorldPosition(); | 544 | Vector3 resultingposition = GetWorldPosition(); |
541 | PhysActor.Position = new PhysicsVector(resultingposition.X, resultingposition.Y, resultingposition.Z); | 545 | pa.Position = new PhysicsVector(resultingposition.X, resultingposition.Y, resultingposition.Z); |
542 | Quaternion resultingrot = GetWorldRotation(); | 546 | Quaternion resultingrot = GetWorldRotation(); |
543 | PhysActor.Orientation = resultingrot; | 547 | pa.Orientation = resultingrot; |
544 | } | 548 | } |
545 | 549 | ||
546 | // Tell the physics engines that this prim changed. | 550 | // Tell the physics engines that this prim changed. |
547 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 551 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
548 | } | 552 | } |
549 | catch (Exception e) | 553 | catch (Exception e) |
550 | { | 554 | { |
@@ -577,15 +581,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
577 | 581 | ||
578 | if (ParentGroup != null && !ParentGroup.IsDeleted) | 582 | if (ParentGroup != null && !ParentGroup.IsDeleted) |
579 | { | 583 | { |
580 | if (_parentID != 0 && PhysActor != null) | 584 | PhysicsActor pa = PhysActor; |
585 | if (_parentID != 0 && pa != null) | ||
581 | { | 586 | { |
582 | Vector3 resultingposition = GetWorldPosition(); | 587 | Vector3 resultingposition = GetWorldPosition(); |
583 | PhysActor.Position = new PhysicsVector(resultingposition.X, resultingposition.Y, resultingposition.Z); | 588 | pa.Position = new PhysicsVector(resultingposition.X, resultingposition.Y, resultingposition.Z); |
584 | Quaternion resultingrot = GetWorldRotation(); | 589 | Quaternion resultingrot = GetWorldRotation(); |
585 | PhysActor.Orientation = resultingrot; | 590 | pa.Orientation = resultingrot; |
586 | 591 | ||
587 | // Tell the physics engines that this prim changed. | 592 | // Tell the physics engines that this prim changed. |
588 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 593 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
589 | } | 594 | } |
590 | } | 595 | } |
591 | } | 596 | } |
@@ -595,13 +600,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
595 | { | 600 | { |
596 | get | 601 | get |
597 | { | 602 | { |
603 | PhysicsActor pa = PhysActor; | ||
598 | // We don't want the physics engine mucking up the rotations in a linkset | 604 | // We don't want the physics engine mucking up the rotations in a linkset |
599 | if ((_parentID == 0) && (Shape.PCode != 9 || Shape.State == 0) && (PhysActor != null)) | 605 | if ((_parentID == 0) && (Shape.PCode != 9 || Shape.State == 0) && (pa != null)) |
600 | { | 606 | { |
601 | if (PhysActor.Orientation.X != 0 || PhysActor.Orientation.Y != 0 | 607 | if (pa.Orientation.X != 0 || pa.Orientation.Y != 0 |
602 | || PhysActor.Orientation.Z != 0 || PhysActor.Orientation.W != 0) | 608 | || pa.Orientation.Z != 0 || pa.Orientation.W != 0) |
603 | { | 609 | { |
604 | m_rotationOffset = PhysActor.Orientation; | 610 | m_rotationOffset = pa.Orientation; |
605 | } | 611 | } |
606 | } | 612 | } |
607 | 613 | ||
@@ -610,27 +616,28 @@ namespace OpenSim.Region.Framework.Scenes | |||
610 | 616 | ||
611 | set | 617 | set |
612 | { | 618 | { |
619 | PhysicsActor pa = PhysActor; | ||
613 | StoreUndoState(); | 620 | StoreUndoState(); |
614 | m_rotationOffset = value; | 621 | m_rotationOffset = value; |
615 | 622 | ||
616 | if (PhysActor != null) | 623 | if (pa != null) |
617 | { | 624 | { |
618 | try | 625 | try |
619 | { | 626 | { |
620 | // Root prim gets value directly | 627 | // Root prim gets value directly |
621 | if (_parentID == 0) | 628 | if (_parentID == 0) |
622 | { | 629 | { |
623 | PhysActor.Orientation = value; | 630 | pa.Orientation = value; |
624 | //m_log.Info("[PART]: RO1:" + PhysActor.Orientation.ToString()); | 631 | //m_log.Info("[PART]: RO1:" + PhysActor.Orientation.ToString()); |
625 | } | 632 | } |
626 | else | 633 | else |
627 | { | 634 | { |
628 | // Child prim we have to calculate it's world rotationwel | 635 | // Child prim we have to calculate it's world rotationwel |
629 | Quaternion resultingrotation = GetWorldRotation(); | 636 | Quaternion resultingrotation = GetWorldRotation(); |
630 | PhysActor.Orientation = resultingrotation; | 637 | pa.Orientation = resultingrotation; |
631 | //m_log.Info("[PART]: RO2:" + PhysActor.Orientation.ToString()); | 638 | //m_log.Info("[PART]: RO2:" + PhysActor.Orientation.ToString()); |
632 | } | 639 | } |
633 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 640 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
634 | //} | 641 | //} |
635 | } | 642 | } |
636 | catch (Exception ex) | 643 | catch (Exception ex) |
@@ -650,13 +657,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
650 | //if (PhysActor.Velocity.X != 0 || PhysActor.Velocity.Y != 0 | 657 | //if (PhysActor.Velocity.X != 0 || PhysActor.Velocity.Y != 0 |
651 | //|| PhysActor.Velocity.Z != 0) | 658 | //|| PhysActor.Velocity.Z != 0) |
652 | //{ | 659 | //{ |
653 | if (PhysActor != null) | 660 | PhysicsActor pa = PhysActor; |
661 | if (pa != null) | ||
654 | { | 662 | { |
655 | if (PhysActor.IsPhysical) | 663 | if (pa.IsPhysical) |
656 | { | 664 | { |
657 | m_velocity.X = PhysActor.Velocity.X; | 665 | m_velocity.X = pa.Velocity.X; |
658 | m_velocity.Y = PhysActor.Velocity.Y; | 666 | m_velocity.Y = pa.Velocity.Y; |
659 | m_velocity.Z = PhysActor.Velocity.Z; | 667 | m_velocity.Z = pa.Velocity.Z; |
660 | } | 668 | } |
661 | } | 669 | } |
662 | 670 | ||
@@ -666,12 +674,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
666 | set | 674 | set |
667 | { | 675 | { |
668 | m_velocity = value; | 676 | m_velocity = value; |
669 | if (PhysActor != null) | 677 | PhysicsActor pa = PhysActor; |
678 | if (pa != null) | ||
670 | { | 679 | { |
671 | if (PhysActor.IsPhysical) | 680 | if (pa.IsPhysical) |
672 | { | 681 | { |
673 | PhysActor.Velocity = new PhysicsVector(value.X, value.Y, value.Z); | 682 | pa.Velocity = new PhysicsVector(value.X, value.Y, value.Z); |
674 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 683 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
675 | } | 684 | } |
676 | } | 685 | } |
677 | } | 686 | } |
@@ -688,9 +697,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
688 | { | 697 | { |
689 | get | 698 | get |
690 | { | 699 | { |
691 | if ((PhysActor != null) && PhysActor.IsPhysical) | 700 | PhysicsActor pa = PhysActor; |
701 | if ((pa != null) && pa.IsPhysical) | ||
692 | { | 702 | { |
693 | m_angularVelocity.FromBytes(PhysActor.RotationalVelocity.GetBytes(), 0); | 703 | m_angularVelocity.FromBytes(pa.RotationalVelocity.GetBytes(), 0); |
694 | } | 704 | } |
695 | return m_angularVelocity; | 705 | return m_angularVelocity; |
696 | } | 706 | } |
@@ -709,10 +719,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
709 | get { return m_description; } | 719 | get { return m_description; } |
710 | set | 720 | set |
711 | { | 721 | { |
722 | PhysicsActor pa = PhysActor; | ||
712 | m_description = value; | 723 | m_description = value; |
713 | if (PhysActor != null) | 724 | if (pa != null) |
714 | { | 725 | { |
715 | PhysActor.SOPDescription = value; | 726 | pa.SOPDescription = value; |
716 | } | 727 | } |
717 | } | 728 | } |
718 | } | 729 | } |
@@ -806,14 +817,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
806 | if (m_shape != null) { | 817 | if (m_shape != null) { |
807 | m_shape.Scale = value; | 818 | m_shape.Scale = value; |
808 | 819 | ||
809 | if (PhysActor != null && m_parentGroup != null) | 820 | PhysicsActor pa = PhysActor; |
821 | if (pa != null && m_parentGroup != null) | ||
810 | { | 822 | { |
811 | if (m_parentGroup.Scene != null) | 823 | if (m_parentGroup.Scene != null) |
812 | { | 824 | { |
813 | if (m_parentGroup.Scene.PhysicsScene != null) | 825 | if (m_parentGroup.Scene.PhysicsScene != null) |
814 | { | 826 | { |
815 | PhysActor.Size = new PhysicsVector(m_shape.Scale.X, m_shape.Scale.Y, m_shape.Scale.Z); | 827 | pa.Size = new PhysicsVector(m_shape.Scale.X, m_shape.Scale.Y, m_shape.Scale.Z); |
816 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 828 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
817 | } | 829 | } |
818 | } | 830 | } |
819 | } | 831 | } |
@@ -1343,13 +1355,14 @@ if (m_shape != null) { | |||
1343 | RigidBody); | 1355 | RigidBody); |
1344 | 1356 | ||
1345 | // Basic Physics returns null.. joy joy joy. | 1357 | // Basic Physics returns null.. joy joy joy. |
1346 | if (PhysActor != null) | 1358 | PhysicsActor pa = PhysActor; |
1359 | if (pa != null) | ||
1347 | { | 1360 | { |
1348 | PhysActor.SOPName = this.Name; // save object name and desc into the PhysActor so ODE internals know the joint/body info | 1361 | pa.SOPName = this.Name; // save object name and desc into the PhysActor so ODE internals know the joint/body info |
1349 | PhysActor.SOPDescription = this.Description; | 1362 | pa.SOPDescription = this.Description; |
1350 | PhysActor.LocalID = LocalId; | 1363 | pa.LocalID = LocalId; |
1351 | DoPhysicsPropertyUpdate(RigidBody, true); | 1364 | DoPhysicsPropertyUpdate(RigidBody, true); |
1352 | PhysActor.SetVolumeDetect(VolumeDetectActive ? 1 : 0); | 1365 | pa.SetVolumeDetect(VolumeDetectActive ? 1 : 0); |
1353 | } | 1366 | } |
1354 | } | 1367 | } |
1355 | } | 1368 | } |
@@ -1563,23 +1576,24 @@ if (m_shape != null) { | |||
1563 | } | 1576 | } |
1564 | else | 1577 | else |
1565 | { | 1578 | { |
1566 | if (PhysActor != null) | 1579 | PhysicsActor pa = PhysActor; |
1580 | if (pa != null) | ||
1567 | { | 1581 | { |
1568 | if (UsePhysics != PhysActor.IsPhysical || isNew) | 1582 | if (UsePhysics != pa.IsPhysical || isNew) |
1569 | { | 1583 | { |
1570 | if (PhysActor.IsPhysical) // implies UsePhysics==false for this block | 1584 | if (pa.IsPhysical) // implies UsePhysics==false for this block |
1571 | { | 1585 | { |
1572 | if (!isNew) | 1586 | if (!isNew) |
1573 | ParentGroup.Scene.RemovePhysicalPrim(1); | 1587 | ParentGroup.Scene.RemovePhysicalPrim(1); |
1574 | 1588 | ||
1575 | PhysActor.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate; | 1589 | pa.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate; |
1576 | PhysActor.OnOutOfBounds -= PhysicsOutOfBounds; | 1590 | pa.OnOutOfBounds -= PhysicsOutOfBounds; |
1577 | PhysActor.delink(); | 1591 | pa.delink(); |
1578 | 1592 | ||
1579 | if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints && (!isNew)) | 1593 | if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints && (!isNew)) |
1580 | { | 1594 | { |
1581 | // destroy all joints connected to this now deactivated body | 1595 | // destroy all joints connected to this now deactivated body |
1582 | m_parentGroup.Scene.PhysicsScene.RemoveAllJointsConnectedToActorThreadLocked(PhysActor); | 1596 | m_parentGroup.Scene.PhysicsScene.RemoveAllJointsConnectedToActorThreadLocked(pa); |
1583 | } | 1597 | } |
1584 | 1598 | ||
1585 | // stop client-side interpolation of all joint proxy objects that have just been deleted | 1599 | // stop client-side interpolation of all joint proxy objects that have just been deleted |
@@ -1598,7 +1612,7 @@ if (m_shape != null) { | |||
1598 | //RotationalVelocity = new Vector3(0, 0, 0); | 1612 | //RotationalVelocity = new Vector3(0, 0, 0); |
1599 | } | 1613 | } |
1600 | 1614 | ||
1601 | PhysActor.IsPhysical = UsePhysics; | 1615 | pa.IsPhysical = UsePhysics; |
1602 | 1616 | ||
1603 | 1617 | ||
1604 | // If we're not what we're supposed to be in the physics scene, recreate ourselves. | 1618 | // If we're not what we're supposed to be in the physics scene, recreate ourselves. |
@@ -1612,19 +1626,19 @@ if (m_shape != null) { | |||
1612 | { | 1626 | { |
1613 | ParentGroup.Scene.AddPhysicalPrim(1); | 1627 | ParentGroup.Scene.AddPhysicalPrim(1); |
1614 | 1628 | ||
1615 | PhysActor.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate; | 1629 | pa.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate; |
1616 | PhysActor.OnOutOfBounds += PhysicsOutOfBounds; | 1630 | pa.OnOutOfBounds += PhysicsOutOfBounds; |
1617 | if (_parentID != 0 && _parentID != LocalId) | 1631 | if (_parentID != 0 && _parentID != LocalId) |
1618 | { | 1632 | { |
1619 | if (ParentGroup.RootPart.PhysActor != null) | 1633 | if (ParentGroup.RootPart.PhysActor != null) |
1620 | { | 1634 | { |
1621 | PhysActor.link(ParentGroup.RootPart.PhysActor); | 1635 | pa.link(ParentGroup.RootPart.PhysActor); |
1622 | } | 1636 | } |
1623 | } | 1637 | } |
1624 | } | 1638 | } |
1625 | } | 1639 | } |
1626 | } | 1640 | } |
1627 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 1641 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
1628 | } | 1642 | } |
1629 | } | 1643 | } |
1630 | } | 1644 | } |
@@ -1690,9 +1704,10 @@ if (m_shape != null) { | |||
1690 | 1704 | ||
1691 | public Vector3 GetGeometricCenter() | 1705 | public Vector3 GetGeometricCenter() |
1692 | { | 1706 | { |
1693 | if (PhysActor != null) | 1707 | PhysicsActor pa = PhysActor; |
1708 | if (pa != null) | ||
1694 | { | 1709 | { |
1695 | return new Vector3(PhysActor.CenterOfMass.X, PhysActor.CenterOfMass.Y, PhysActor.CenterOfMass.Z); | 1710 | return new Vector3(pa.CenterOfMass.X, pa.CenterOfMass.Y, pa.CenterOfMass.Z); |
1696 | } | 1711 | } |
1697 | else | 1712 | else |
1698 | { | 1713 | { |
@@ -1702,9 +1717,10 @@ if (m_shape != null) { | |||
1702 | 1717 | ||
1703 | public float GetMass() | 1718 | public float GetMass() |
1704 | { | 1719 | { |
1705 | if (PhysActor != null) | 1720 | PhysicsActor pa = PhysActor; |
1721 | if (pa != null) | ||
1706 | { | 1722 | { |
1707 | return PhysActor.Mass; | 1723 | return pa.Mass; |
1708 | } | 1724 | } |
1709 | else | 1725 | else |
1710 | { | 1726 | { |
@@ -1714,8 +1730,9 @@ if (m_shape != null) { | |||
1714 | 1730 | ||
1715 | public PhysicsVector GetForce() | 1731 | public PhysicsVector GetForce() |
1716 | { | 1732 | { |
1717 | if (PhysActor != null) | 1733 | PhysicsActor pa = PhysActor; |
1718 | return PhysActor.Force; | 1734 | if (pa != null) |
1735 | return pa.Force; | ||
1719 | else | 1736 | else |
1720 | return new PhysicsVector(); | 1737 | return new PhysicsVector(); |
1721 | } | 1738 | } |
@@ -2094,11 +2111,15 @@ if (m_shape != null) { | |||
2094 | 2111 | ||
2095 | public void PhysicsRequestingTerseUpdate() | 2112 | public void PhysicsRequestingTerseUpdate() |
2096 | { | 2113 | { |
2097 | if (PhysActor != null) | 2114 | PhysicsActor pa = PhysActor; |
2115 | if (pa != null) | ||
2098 | { | 2116 | { |
2099 | Vector3 newpos = new Vector3(PhysActor.Position.GetBytes(), 0); | 2117 | Vector3 newpos = new Vector3(pa.Position.GetBytes(), 0); |
2100 | 2118 | ||
2101 | if (m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.N) | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.S) | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.E) | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.W)) | 2119 | if (m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.N) | |
2120 | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.S) | | ||
2121 | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.E) | | ||
2122 | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.W)) | ||
2102 | { | 2123 | { |
2103 | m_parentGroup.AbsolutePosition = newpos; | 2124 | m_parentGroup.AbsolutePosition = newpos; |
2104 | return; | 2125 | return; |
@@ -2294,14 +2315,15 @@ if (m_shape != null) { | |||
2294 | if (texture != null) | 2315 | if (texture != null) |
2295 | m_shape.SculptData = texture.Data; | 2316 | m_shape.SculptData = texture.Data; |
2296 | 2317 | ||
2297 | if (PhysActor != null) | 2318 | PhysicsActor pa = PhysActor; |
2319 | if (pa != null) | ||
2298 | { | 2320 | { |
2299 | // Tricks physics engine into thinking we've changed the part shape. | 2321 | // Tricks physics engine into thinking we've changed the part shape. |
2300 | PrimitiveBaseShape m_newshape = m_shape.Copy(); | 2322 | PrimitiveBaseShape m_newshape = m_shape.Copy(); |
2301 | PhysActor.Shape = m_newshape; | 2323 | pa.Shape = m_newshape; |
2302 | m_shape = m_newshape; | 2324 | m_shape = m_newshape; |
2303 | 2325 | ||
2304 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 2326 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
2305 | } | 2327 | } |
2306 | } | 2328 | } |
2307 | } | 2329 | } |
@@ -2520,9 +2542,10 @@ if (m_shape != null) { | |||
2520 | 2542 | ||
2521 | public void SetBuoyancy(float fvalue) | 2543 | public void SetBuoyancy(float fvalue) |
2522 | { | 2544 | { |
2523 | if (PhysActor != null) | 2545 | PhysicsActor pa = PhysActor; |
2546 | if (pa != null) | ||
2524 | { | 2547 | { |
2525 | PhysActor.Buoyancy = fvalue; | 2548 | pa.Buoyancy = fvalue; |
2526 | } | 2549 | } |
2527 | } | 2550 | } |
2528 | 2551 | ||
@@ -2538,56 +2561,62 @@ if (m_shape != null) { | |||
2538 | 2561 | ||
2539 | public void SetFloatOnWater(int floatYN) | 2562 | public void SetFloatOnWater(int floatYN) |
2540 | { | 2563 | { |
2541 | if (PhysActor != null) | 2564 | PhysicsActor pa = PhysActor; |
2565 | if (pa != null) | ||
2542 | { | 2566 | { |
2543 | if (floatYN == 1) | 2567 | if (floatYN == 1) |
2544 | { | 2568 | { |
2545 | PhysActor.FloatOnWater = true; | 2569 | pa.FloatOnWater = true; |
2546 | } | 2570 | } |
2547 | else | 2571 | else |
2548 | { | 2572 | { |
2549 | PhysActor.FloatOnWater = false; | 2573 | pa.FloatOnWater = false; |
2550 | } | 2574 | } |
2551 | } | 2575 | } |
2552 | } | 2576 | } |
2553 | 2577 | ||
2554 | public void SetForce(PhysicsVector force) | 2578 | public void SetForce(PhysicsVector force) |
2555 | { | 2579 | { |
2556 | if (PhysActor != null) | 2580 | PhysicsActor pa = PhysActor; |
2581 | if (pa != null) | ||
2557 | { | 2582 | { |
2558 | PhysActor.Force = force; | 2583 | pa.Force = force; |
2559 | } | 2584 | } |
2560 | } | 2585 | } |
2561 | 2586 | ||
2562 | public void SetVehicleType(int type) | 2587 | public void SetVehicleType(int type) |
2563 | { | 2588 | { |
2564 | if (PhysActor != null) | 2589 | PhysicsActor pa = PhysActor; |
2590 | if (pa != null) | ||
2565 | { | 2591 | { |
2566 | PhysActor.VehicleType = type; | 2592 | pa.VehicleType = type; |
2567 | } | 2593 | } |
2568 | } | 2594 | } |
2569 | 2595 | ||
2570 | public void SetVehicleFloatParam(int param, float value) | 2596 | public void SetVehicleFloatParam(int param, float value) |
2571 | { | 2597 | { |
2572 | if (PhysActor != null) | 2598 | PhysicsActor pa = PhysActor; |
2599 | if (pa != null) | ||
2573 | { | 2600 | { |
2574 | PhysActor.VehicleFloatParam(param, value); | 2601 | pa.VehicleFloatParam(param, value); |
2575 | } | 2602 | } |
2576 | } | 2603 | } |
2577 | 2604 | ||
2578 | public void SetVehicleVectorParam(int param, PhysicsVector value) | 2605 | public void SetVehicleVectorParam(int param, PhysicsVector value) |
2579 | { | 2606 | { |
2580 | if (PhysActor != null) | 2607 | PhysicsActor pa = PhysActor; |
2608 | if (pa != null) | ||
2581 | { | 2609 | { |
2582 | PhysActor.VehicleVectorParam(param, value); | 2610 | pa.VehicleVectorParam(param, value); |
2583 | } | 2611 | } |
2584 | } | 2612 | } |
2585 | 2613 | ||
2586 | public void SetVehicleRotationParam(int param, Quaternion rotation) | 2614 | public void SetVehicleRotationParam(int param, Quaternion rotation) |
2587 | { | 2615 | { |
2588 | if (PhysActor != null) | 2616 | PhysicsActor pa = PhysActor; |
2617 | if (pa != null) | ||
2589 | { | 2618 | { |
2590 | PhysActor.VehicleRotationParam(param, rotation); | 2619 | pa.VehicleRotationParam(param, rotation); |
2591 | } | 2620 | } |
2592 | } | 2621 | } |
2593 | 2622 | ||
@@ -2615,10 +2644,11 @@ if (m_shape != null) { | |||
2615 | 2644 | ||
2616 | public void SetPhysicsAxisRotation() | 2645 | public void SetPhysicsAxisRotation() |
2617 | { | 2646 | { |
2618 | if (PhysActor != null) | 2647 | PhysicsActor pa = PhysActor; |
2648 | if (pa != null) | ||
2619 | { | 2649 | { |
2620 | PhysActor.LockAngularMotion(RotationAxis); | 2650 | pa.LockAngularMotion(RotationAxis); |
2621 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 2651 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
2622 | } | 2652 | } |
2623 | } | 2653 | } |
2624 | 2654 | ||
@@ -3350,8 +3380,9 @@ if (m_shape != null) { | |||
3350 | { | 3380 | { |
3351 | IsVD = false; // Switch it of for the course of this routine | 3381 | IsVD = false; // Switch it of for the course of this routine |
3352 | VolumeDetectActive = false; // and also permanently | 3382 | VolumeDetectActive = false; // and also permanently |
3353 | if (PhysActor != null) | 3383 | PhysicsActor pa = PhysActor; |
3354 | PhysActor.SetVolumeDetect(0); // Let physics know about it too | 3384 | if (pa != null) |
3385 | pa.SetVolumeDetect(0); // Let physics know about it too | ||
3355 | } | 3386 | } |
3356 | else | 3387 | else |
3357 | { | 3388 | { |
@@ -3399,18 +3430,21 @@ if (m_shape != null) { | |||
3399 | if (IsPhantom || IsAttachment) // note: this may have been changed above in the case of joints | 3430 | if (IsPhantom || IsAttachment) // note: this may have been changed above in the case of joints |
3400 | { | 3431 | { |
3401 | AddFlag(PrimFlags.Phantom); | 3432 | AddFlag(PrimFlags.Phantom); |
3402 | if (PhysActor != null) | 3433 | PhysicsActor pa = PhysActor; |
3434 | if (pa != null) | ||
3403 | { | 3435 | { |
3404 | m_parentGroup.Scene.PhysicsScene.RemovePrim(PhysActor); | 3436 | m_parentGroup.Scene.PhysicsScene.RemovePrim(pa); |
3405 | /// that's not wholesome. Had to make Scene public | 3437 | /// that's not wholesome. Had to make Scene public |
3406 | PhysActor = null; | 3438 | pa = null; |
3407 | } | 3439 | } |
3408 | } | 3440 | } |
3409 | else // Not phantom | 3441 | else // Not phantom |
3410 | { | 3442 | { |
3411 | RemFlag(PrimFlags.Phantom); | 3443 | RemFlag(PrimFlags.Phantom); |
3412 | 3444 | ||
3413 | if (PhysActor == null) | 3445 | // This is NOT safe!! |
3446 | PhysicsActor pa = PhysActor; | ||
3447 | if (pa == null) | ||
3414 | { | 3448 | { |
3415 | // It's not phantom anymore. So make sure the physics engine get's knowledge of it | 3449 | // It's not phantom anymore. So make sure the physics engine get's knowledge of it |
3416 | PhysActor = m_parentGroup.Scene.PhysicsScene.AddPrimShape( | 3450 | PhysActor = m_parentGroup.Scene.PhysicsScene.AddPrimShape( |
@@ -3421,9 +3455,9 @@ if (m_shape != null) { | |||
3421 | RotationOffset, | 3455 | RotationOffset, |
3422 | UsePhysics); | 3456 | UsePhysics); |
3423 | 3457 | ||
3424 | if (PhysActor != null) | 3458 | if (pa != null) |
3425 | { | 3459 | { |
3426 | PhysActor.LocalID = LocalId; | 3460 | pa.LocalID = LocalId; |
3427 | DoPhysicsPropertyUpdate(UsePhysics, true); | 3461 | DoPhysicsPropertyUpdate(UsePhysics, true); |
3428 | if (m_parentGroup != null) | 3462 | if (m_parentGroup != null) |
3429 | { | 3463 | { |
@@ -3442,14 +3476,14 @@ if (m_shape != null) { | |||
3442 | (CollisionSound != UUID.Zero) | 3476 | (CollisionSound != UUID.Zero) |
3443 | ) | 3477 | ) |
3444 | { | 3478 | { |
3445 | PhysActor.OnCollisionUpdate += PhysicsCollision; | 3479 | pa.OnCollisionUpdate += PhysicsCollision; |
3446 | PhysActor.SubscribeEvents(1000); | 3480 | pa.SubscribeEvents(1000); |
3447 | } | 3481 | } |
3448 | } | 3482 | } |
3449 | } | 3483 | } |
3450 | else // it already has a physical representation | 3484 | else // it already has a physical representation |
3451 | { | 3485 | { |
3452 | PhysActor.IsPhysical = UsePhysics; | 3486 | pa.IsPhysical = UsePhysics; |
3453 | 3487 | ||
3454 | DoPhysicsPropertyUpdate(UsePhysics, false); // Update physical status. If it's phantom this will remove the prim | 3488 | DoPhysicsPropertyUpdate(UsePhysics, false); // Update physical status. If it's phantom this will remove the prim |
3455 | if (m_parentGroup != null) | 3489 | if (m_parentGroup != null) |
@@ -3472,9 +3506,10 @@ if (m_shape != null) { | |||
3472 | // Defensive programming calls for a check here. | 3506 | // Defensive programming calls for a check here. |
3473 | // Better would be throwing an exception that could be catched by a unit test as the internal | 3507 | // Better would be throwing an exception that could be catched by a unit test as the internal |
3474 | // logic should make sure, this Physactor is always here. | 3508 | // logic should make sure, this Physactor is always here. |
3475 | if (this.PhysActor != null) | 3509 | PhysicsActor pa = this.PhysActor; |
3510 | if (pa != null) | ||
3476 | { | 3511 | { |
3477 | PhysActor.SetVolumeDetect(1); | 3512 | pa.SetVolumeDetect(1); |
3478 | AddFlag(PrimFlags.Phantom); // We set this flag also if VD is active | 3513 | AddFlag(PrimFlags.Phantom); // We set this flag also if VD is active |
3479 | this.VolumeDetectActive = true; | 3514 | this.VolumeDetectActive = true; |
3480 | } | 3515 | } |
@@ -3482,10 +3517,11 @@ if (m_shape != null) { | |||
3482 | } | 3517 | } |
3483 | else | 3518 | else |
3484 | { // Remove VolumeDetect in any case. Note, it's safe to call SetVolumeDetect as often as you like | 3519 | { // Remove VolumeDetect in any case. Note, it's safe to call SetVolumeDetect as often as you like |
3485 | // (mumbles, well, at least if you have infinte CPU powers :-)) | 3520 | // (mumbles, well, at least if you have infinte CPU powers :-) ) |
3486 | if (this.PhysActor != null) | 3521 | PhysicsActor pa = this.PhysActor; |
3522 | if (pa != null) | ||
3487 | { | 3523 | { |
3488 | PhysActor.SetVolumeDetect(0); | 3524 | pa.SetVolumeDetect(0); |
3489 | } | 3525 | } |
3490 | this.VolumeDetectActive = false; | 3526 | this.VolumeDetectActive = false; |
3491 | } | 3527 | } |
@@ -3543,10 +3579,11 @@ if (m_shape != null) { | |||
3543 | m_shape.PathTaperY = shapeBlock.PathTaperY; | 3579 | m_shape.PathTaperY = shapeBlock.PathTaperY; |
3544 | m_shape.PathTwist = shapeBlock.PathTwist; | 3580 | m_shape.PathTwist = shapeBlock.PathTwist; |
3545 | m_shape.PathTwistBegin = shapeBlock.PathTwistBegin; | 3581 | m_shape.PathTwistBegin = shapeBlock.PathTwistBegin; |
3546 | if (PhysActor != null) | 3582 | PhysicsActor pa = PhysActor; |
3583 | if (pa != null) | ||
3547 | { | 3584 | { |
3548 | PhysActor.Shape = m_shape; | 3585 | pa.Shape = m_shape; |
3549 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 3586 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
3550 | } | 3587 | } |
3551 | 3588 | ||
3552 | // This is what makes vehicle trailers work | 3589 | // This is what makes vehicle trailers work |
@@ -3647,19 +3684,21 @@ if (m_shape != null) { | |||
3647 | ) | 3684 | ) |
3648 | { | 3685 | { |
3649 | // subscribe to physics updates. | 3686 | // subscribe to physics updates. |
3650 | if (PhysActor != null) | 3687 | PhysicsActor pa = PhysActor; |
3688 | if (pa != null) | ||
3651 | { | 3689 | { |
3652 | PhysActor.OnCollisionUpdate += PhysicsCollision; | 3690 | pa.OnCollisionUpdate += PhysicsCollision; |
3653 | PhysActor.SubscribeEvents(1000); | 3691 | pa.SubscribeEvents(1000); |
3654 | 3692 | ||
3655 | } | 3693 | } |
3656 | } | 3694 | } |
3657 | else | 3695 | else |
3658 | { | 3696 | { |
3659 | if (PhysActor != null) | 3697 | PhysicsActor pa = PhysActor; |
3698 | if (pa != null) | ||
3660 | { | 3699 | { |
3661 | PhysActor.UnSubscribeEvents(); | 3700 | pa.UnSubscribeEvents(); |
3662 | PhysActor.OnCollisionUpdate -= PhysicsCollision; | 3701 | pa.OnCollisionUpdate -= PhysicsCollision; |
3663 | } | 3702 | } |
3664 | } | 3703 | } |
3665 | 3704 | ||
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 23fe2d3..6772f75 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -2269,7 +2269,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2269 | { | 2269 | { |
2270 | //Record the time we enter this state so we know whether to "land" or not | 2270 | //Record the time we enter this state so we know whether to "land" or not |
2271 | m_animPersistUntil = DateTime.Now.Ticks; | 2271 | m_animPersistUntil = DateTime.Now.Ticks; |
2272 | return "FALLDOWN"; | 2272 | return "FALLDOWN"; // this falling animation is invoked too frequently when capsule tilt correction is used - why? |
2273 | } | 2273 | } |
2274 | } | 2274 | } |
2275 | } | 2275 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index 5ae81cd..fe74158 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs | |||
@@ -65,8 +65,6 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
65 | //m_log.DebugFormat("[SOG]: Starting deserialization of SOG"); | 65 | //m_log.DebugFormat("[SOG]: Starting deserialization of SOG"); |
66 | //int time = System.Environment.TickCount; | 66 | //int time = System.Environment.TickCount; |
67 | 67 | ||
68 | SceneObjectGroup sceneObject = new SceneObjectGroup(); | ||
69 | |||
70 | // libomv.types changes UUID to Guid | 68 | // libomv.types changes UUID to Guid |
71 | xmlData = xmlData.Replace("<UUID>", "<Guid>"); | 69 | xmlData = xmlData.Replace("<UUID>", "<Guid>"); |
72 | xmlData = xmlData.Replace("</UUID>", "</Guid>"); | 70 | xmlData = xmlData.Replace("</UUID>", "</Guid>"); |
@@ -88,17 +86,13 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
88 | parts = doc.GetElementsByTagName("RootPart"); | 86 | parts = doc.GetElementsByTagName("RootPart"); |
89 | 87 | ||
90 | if (parts.Count == 0) | 88 | if (parts.Count == 0) |
91 | { | ||
92 | throw new Exception("Invalid Xml format - no root part"); | 89 | throw new Exception("Invalid Xml format - no root part"); |
93 | } | 90 | |
94 | else | 91 | sr = new StringReader(parts[0].InnerXml); |
95 | { | 92 | reader = new XmlTextReader(sr); |
96 | sr = new StringReader(parts[0].InnerXml); | 93 | SceneObjectGroup sceneObject = new SceneObjectGroup(SceneObjectPart.FromXml(fromUserInventoryItemID, reader)); |
97 | reader = new XmlTextReader(sr); | 94 | reader.Close(); |
98 | sceneObject.SetRootPart(SceneObjectPart.FromXml(fromUserInventoryItemID, reader)); | 95 | sr.Close(); |
99 | reader.Close(); | ||
100 | sr.Close(); | ||
101 | } | ||
102 | 96 | ||
103 | parts = doc.GetElementsByTagName("Part"); | 97 | parts = doc.GetElementsByTagName("Part"); |
104 | 98 | ||
@@ -119,16 +113,15 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
119 | // Script state may, or may not, exist. Not having any, is NOT | 113 | // Script state may, or may not, exist. Not having any, is NOT |
120 | // ever a problem. | 114 | // ever a problem. |
121 | sceneObject.LoadScriptState(doc); | 115 | sceneObject.LoadScriptState(doc); |
116 | |||
117 | return sceneObject; | ||
122 | } | 118 | } |
123 | catch (Exception e) | 119 | catch (Exception e) |
124 | { | 120 | { |
125 | m_log.ErrorFormat( | 121 | m_log.ErrorFormat( |
126 | "[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData); | 122 | "[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData); |
123 | return null; | ||
127 | } | 124 | } |
128 | |||
129 | //m_log.DebugFormat("[SERIALIZER]: Finished deserialization of SOG {0}, {1}ms", Name, System.Environment.TickCount - time); | ||
130 | |||
131 | return sceneObject; | ||
132 | } | 125 | } |
133 | 126 | ||
134 | /// <summary> | 127 | /// <summary> |
@@ -194,8 +187,6 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
194 | { | 187 | { |
195 | //m_log.DebugFormat("[SOG]: Starting deserialization of SOG"); | 188 | //m_log.DebugFormat("[SOG]: Starting deserialization of SOG"); |
196 | //int time = System.Environment.TickCount; | 189 | //int time = System.Environment.TickCount; |
197 | |||
198 | SceneObjectGroup sceneObject = new SceneObjectGroup(); | ||
199 | 190 | ||
200 | // libomv.types changes UUID to Guid | 191 | // libomv.types changes UUID to Guid |
201 | xmlData = xmlData.Replace("<UUID>", "<Guid>"); | 192 | xmlData = xmlData.Replace("<UUID>", "<Guid>"); |
@@ -212,21 +203,23 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
212 | 203 | ||
213 | XmlNodeList parts = doc.GetElementsByTagName("SceneObjectPart"); | 204 | XmlNodeList parts = doc.GetElementsByTagName("SceneObjectPart"); |
214 | 205 | ||
215 | // Process the root part first | 206 | if (parts.Count == 0) |
216 | if (parts.Count > 0) | ||
217 | { | 207 | { |
218 | StringReader sr = new StringReader(parts[0].OuterXml); | 208 | m_log.ErrorFormat("[SERIALIZER]: Deserialization of xml failed: No SceneObjectPart nodes. xml was " + xmlData); |
219 | XmlTextReader reader = new XmlTextReader(sr); | 209 | return null; |
220 | sceneObject.SetRootPart(SceneObjectPart.FromXml(reader)); | ||
221 | reader.Close(); | ||
222 | sr.Close(); | ||
223 | } | 210 | } |
224 | 211 | ||
212 | StringReader sr = new StringReader(parts[0].OuterXml); | ||
213 | XmlTextReader reader = new XmlTextReader(sr); | ||
214 | SceneObjectGroup sceneObject = new SceneObjectGroup(SceneObjectPart.FromXml(reader)); | ||
215 | reader.Close(); | ||
216 | sr.Close(); | ||
217 | |||
225 | // Then deal with the rest | 218 | // Then deal with the rest |
226 | for (int i = 1; i < parts.Count; i++) | 219 | for (int i = 1; i < parts.Count; i++) |
227 | { | 220 | { |
228 | StringReader sr = new StringReader(parts[i].OuterXml); | 221 | sr = new StringReader(parts[i].OuterXml); |
229 | XmlTextReader reader = new XmlTextReader(sr); | 222 | reader = new XmlTextReader(sr); |
230 | SceneObjectPart part = SceneObjectPart.FromXml(reader); | 223 | SceneObjectPart part = SceneObjectPart.FromXml(reader); |
231 | sceneObject.AddPart(part); | 224 | sceneObject.AddPart(part); |
232 | part.StoreUndoState(); | 225 | part.StoreUndoState(); |
@@ -238,15 +231,13 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
238 | // ever a problem. | 231 | // ever a problem. |
239 | 232 | ||
240 | sceneObject.LoadScriptState(doc); | 233 | sceneObject.LoadScriptState(doc); |
234 | return sceneObject; | ||
241 | } | 235 | } |
242 | catch (Exception e) | 236 | catch (Exception e) |
243 | { | 237 | { |
244 | m_log.ErrorFormat("[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData); | 238 | m_log.ErrorFormat("[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData); |
239 | return null; | ||
245 | } | 240 | } |
246 | |||
247 | //m_log.DebugFormat("[SERIALIZER]: Finished deserialization of SOG {0}, {1}ms", Name, System.Environment.TickCount - time); | ||
248 | |||
249 | return sceneObject; | ||
250 | } | 241 | } |
251 | 242 | ||
252 | /// <summary> | 243 | /// <summary> |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs b/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs index bb8f27d..3b0e77f 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs | |||
@@ -128,7 +128,6 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
128 | 128 | ||
129 | private SceneObjectGroup NewSOG() | 129 | private SceneObjectGroup NewSOG() |
130 | { | 130 | { |
131 | SceneObjectGroup sog = new SceneObjectGroup(); | ||
132 | SceneObjectPart sop = new SceneObjectPart(UUID.Random(), PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero); | 131 | SceneObjectPart sop = new SceneObjectPart(UUID.Random(), PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero); |
133 | sop.Name = RandomName(); | 132 | sop.Name = RandomName(); |
134 | sop.Description = sop.Name; | 133 | sop.Description = sop.Name; |
@@ -136,9 +135,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
136 | sop.SitName = RandomName(); | 135 | sop.SitName = RandomName(); |
137 | sop.TouchName = RandomName(); | 136 | sop.TouchName = RandomName(); |
138 | sop.ObjectFlags |= (uint)PrimFlags.Phantom; | 137 | sop.ObjectFlags |= (uint)PrimFlags.Phantom; |
139 | |||
140 | sog.SetRootPart(sop); | ||
141 | 138 | ||
139 | SceneObjectGroup sog = new SceneObjectGroup(sop); | ||
142 | scene.AddNewSceneObject(sog, false); | 140 | scene.AddNewSceneObject(sog, false); |
143 | 141 | ||
144 | return sog; | 142 | return sog; |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs index 7fb2d25..19c0fea 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs | |||
@@ -407,9 +407,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
407 | sop.Shape.State = 1; | 407 | sop.Shape.State = 1; |
408 | sop.OwnerID = agent; | 408 | sop.OwnerID = agent; |
409 | 409 | ||
410 | SceneObjectGroup sog = new SceneObjectGroup(); | 410 | SceneObjectGroup sog = new SceneObjectGroup(sop); |
411 | sog.SetScene(scene); | 411 | sog.SetScene(scene); |
412 | sog.SetRootPart(sop); | ||
413 | 412 | ||
414 | return sog; | 413 | return sog; |
415 | } | 414 | } |
diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs index 65c5274..6b30959 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs | |||
@@ -53,7 +53,7 @@ using System.Text.RegularExpressions; | |||
53 | 53 | ||
54 | namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice | 54 | namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice |
55 | { | 55 | { |
56 | public class FreeSwitchVoiceModule : IRegionModule | 56 | public class FreeSwitchVoiceModule : IRegionModule, IVoiceModule |
57 | { | 57 | { |
58 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 58 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
59 | 59 | ||
@@ -101,13 +101,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice | |||
101 | private FreeSwitchDialplan m_FreeSwitchDialplan; | 101 | private FreeSwitchDialplan m_FreeSwitchDialplan; |
102 | 102 | ||
103 | private readonly Dictionary<string, string> m_UUIDName = new Dictionary<string, string>(); | 103 | private readonly Dictionary<string, string> m_UUIDName = new Dictionary<string, string>(); |
104 | private Dictionary<string, string> m_ParcelAddress = new Dictionary<string, string>(); | ||
105 | |||
106 | private Scene m_scene; | ||
104 | 107 | ||
105 | 108 | ||
106 | private IConfig m_config; | 109 | private IConfig m_config; |
107 | 110 | ||
108 | public void Initialise(Scene scene, IConfigSource config) | 111 | public void Initialise(Scene scene, IConfigSource config) |
109 | { | 112 | { |
110 | 113 | m_scene = scene; | |
111 | m_config = config.Configs["FreeSwitchVoice"]; | 114 | m_config = config.Configs["FreeSwitchVoice"]; |
112 | 115 | ||
113 | if (null == m_config) | 116 | if (null == m_config) |
@@ -230,6 +233,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice | |||
230 | { | 233 | { |
231 | OnRegisterCaps(scene, agentID, caps); | 234 | OnRegisterCaps(scene, agentID, caps); |
232 | }; | 235 | }; |
236 | |||
237 | |||
233 | 238 | ||
234 | try | 239 | try |
235 | { | 240 | { |
@@ -255,6 +260,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice | |||
255 | 260 | ||
256 | public void PostInitialise() | 261 | public void PostInitialise() |
257 | { | 262 | { |
263 | if(m_pluginEnabled) | ||
264 | { | ||
265 | m_log.Info("[FreeSwitchVoice] registering IVoiceModule with the scene"); | ||
266 | |||
267 | // register the voice interface for this module, so the script engine can call us | ||
268 | m_scene.RegisterModuleInterface<IVoiceModule>(this); | ||
269 | } | ||
258 | } | 270 | } |
259 | 271 | ||
260 | public void Close() | 272 | public void Close() |
@@ -270,7 +282,27 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice | |||
270 | { | 282 | { |
271 | get { return true; } | 283 | get { return true; } |
272 | } | 284 | } |
273 | 285 | ||
286 | // <summary> | ||
287 | // implementation of IVoiceModule, called by osSetParcelSIPAddress script function | ||
288 | // </summary> | ||
289 | public void setLandSIPAddress(string SIPAddress,UUID GlobalID) | ||
290 | { | ||
291 | m_log.DebugFormat("[FreeSwitchVoice]: setLandSIPAddress parcel id {0}: setting sip address {1}", | ||
292 | GlobalID, SIPAddress); | ||
293 | |||
294 | lock (m_ParcelAddress) | ||
295 | { | ||
296 | if (m_ParcelAddress.ContainsKey(GlobalID.ToString())) | ||
297 | { | ||
298 | m_ParcelAddress[GlobalID.ToString()] = SIPAddress; | ||
299 | } | ||
300 | else | ||
301 | { | ||
302 | m_ParcelAddress.Add(GlobalID.ToString(), SIPAddress); | ||
303 | } | ||
304 | } | ||
305 | } | ||
274 | 306 | ||
275 | // <summary> | 307 | // <summary> |
276 | // OnRegisterCaps is invoked via the scene.EventManager | 308 | // OnRegisterCaps is invoked via the scene.EventManager |
@@ -776,6 +808,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice | |||
776 | 808 | ||
777 | // Create parcel voice channel. If no parcel exists, then the voice channel ID is the same | 809 | // Create parcel voice channel. If no parcel exists, then the voice channel ID is the same |
778 | // as the directory ID. Otherwise, it reflects the parcel's ID. | 810 | // as the directory ID. Otherwise, it reflects the parcel's ID. |
811 | |||
812 | lock (m_ParcelAddress) | ||
813 | { | ||
814 | if (m_ParcelAddress.ContainsKey( land.GlobalID.ToString() )) | ||
815 | { | ||
816 | m_log.DebugFormat("[FreeSwitchVoice]: parcel id {0}: using sip address {1}", | ||
817 | land.GlobalID, m_ParcelAddress[land.GlobalID.ToString()]); | ||
818 | return m_ParcelAddress[land.GlobalID.ToString()]; | ||
819 | } | ||
820 | } | ||
779 | 821 | ||
780 | if (land.LocalID != 1 && (land.Flags & (uint)ParcelFlags.UseEstateVoiceChan) == 0) | 822 | if (land.LocalID != 1 && (land.Flags & (uint)ParcelFlags.UseEstateVoiceChan) == 0) |
781 | { | 823 | { |
@@ -797,6 +839,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice | |||
797 | // the personal speech indicators as well unless some siren14-3d codec magic happens. we dont have siren143d so we'll settle for the personal speech indicator. | 839 | // the personal speech indicators as well unless some siren14-3d codec magic happens. we dont have siren143d so we'll settle for the personal speech indicator. |
798 | channelUri = String.Format("sip:conf-{0}@{1}", "x" + Convert.ToBase64String(encoding.GetBytes(landUUID)), m_freeSwitchRealm); | 840 | channelUri = String.Format("sip:conf-{0}@{1}", "x" + Convert.ToBase64String(encoding.GetBytes(landUUID)), m_freeSwitchRealm); |
799 | 841 | ||
842 | lock (m_ParcelAddress) | ||
843 | { | ||
844 | if (!m_ParcelAddress.ContainsKey(land.GlobalID.ToString())) | ||
845 | { | ||
846 | m_ParcelAddress.Add(land.GlobalID.ToString(),channelUri); | ||
847 | } | ||
848 | } | ||
800 | 849 | ||
801 | return channelUri; | 850 | return channelUri; |
802 | } | 851 | } |
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs index 37e1ed4..d5cbfd4 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs | |||
@@ -281,7 +281,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
281 | 281 | ||
282 | private void OnRequestAvatarProperties(IClientAPI remoteClient, UUID avatarID) | 282 | private void OnRequestAvatarProperties(IClientAPI remoteClient, UUID avatarID) |
283 | { | 283 | { |
284 | GroupMembershipData[] avatarGroups = m_groupData.GetAgentGroupMemberships(GetClientGroupRequestID(remoteClient), avatarID).ToArray(); | 284 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
285 | |||
286 | //GroupMembershipData[] avatarGroups = m_groupData.GetAgentGroupMemberships(GetClientGroupRequestID(remoteClient), avatarID).ToArray(); | ||
287 | GroupMembershipData[] avatarGroups = GetProfileListedGroupMemberships(remoteClient, avatarID); | ||
285 | remoteClient.SendAvatarGroupsReply(avatarID, avatarGroups); | 288 | remoteClient.SendAvatarGroupsReply(avatarID, avatarGroups); |
286 | } | 289 | } |
287 | 290 | ||
@@ -485,6 +488,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
485 | bucket[18] = 0; //dunno | 488 | bucket[18] = 0; //dunno |
486 | } | 489 | } |
487 | 490 | ||
491 | |||
488 | m_groupData.AddGroupNotice(GetClientGroupRequestID(remoteClient), GroupID, NoticeID, im.fromAgentName, Subject, Message, bucket); | 492 | m_groupData.AddGroupNotice(GetClientGroupRequestID(remoteClient), GroupID, NoticeID, im.fromAgentName, Subject, Message, bucket); |
489 | if (OnNewGroupNotice != null) | 493 | if (OnNewGroupNotice != null) |
490 | { | 494 | { |
@@ -494,7 +498,20 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
494 | // Send notice out to everyone that wants notices | 498 | // Send notice out to everyone that wants notices |
495 | foreach (GroupMembersData member in m_groupData.GetGroupMembers(GetClientGroupRequestID(remoteClient), GroupID)) | 499 | foreach (GroupMembersData member in m_groupData.GetGroupMembers(GetClientGroupRequestID(remoteClient), GroupID)) |
496 | { | 500 | { |
497 | if (member.AcceptNotices) | 501 | if (m_debugEnabled) |
502 | { | ||
503 | UserProfileData targetUserProfile = m_sceneList[0].CommsManager.UserService.GetUserProfile(member.AgentID); | ||
504 | if (targetUserProfile != null) | ||
505 | { | ||
506 | m_log.DebugFormat("[GROUPS]: Prepping group notice {0} for agent: {1} who Accepts Notices ({2})", NoticeID, targetUserProfile.Name, member.AcceptNotices); | ||
507 | } | ||
508 | else | ||
509 | { | ||
510 | m_log.DebugFormat("[GROUPS]: Prepping group notice {0} for agent: {1} who Accepts Notices ({2})", NoticeID, member.AgentID, member.AcceptNotices); | ||
511 | } | ||
512 | } | ||
513 | |||
514 | if (member.AcceptNotices) | ||
498 | { | 515 | { |
499 | // Build notice IIM | 516 | // Build notice IIM |
500 | GridInstantMessage msg = CreateGroupNoticeIM(UUID.Zero, NoticeID, (byte)OpenMetaverse.InstantMessageDialog.GroupNotice); | 517 | GridInstantMessage msg = CreateGroupNoticeIM(UUID.Zero, NoticeID, (byte)OpenMetaverse.InstantMessageDialog.GroupNotice); |
@@ -614,13 +631,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
614 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 631 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
615 | 632 | ||
616 | List<GroupMembersData> data = m_groupData.GetGroupMembers(GetClientGroupRequestID(remoteClient), groupID); | 633 | List<GroupMembersData> data = m_groupData.GetGroupMembers(GetClientGroupRequestID(remoteClient), groupID); |
617 | if (m_debugEnabled) | ||
618 | { | ||
619 | foreach (GroupMembersData member in data) | ||
620 | { | ||
621 | m_log.DebugFormat("[GROUPS]: {0} {1}", member.AgentID, member.Title); | ||
622 | } | ||
623 | } | ||
624 | 634 | ||
625 | return data; | 635 | return data; |
626 | 636 | ||
@@ -632,14 +642,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
632 | 642 | ||
633 | List<GroupRolesData> data = m_groupData.GetGroupRoles(GetClientGroupRequestID(remoteClient), groupID); | 643 | List<GroupRolesData> data = m_groupData.GetGroupRoles(GetClientGroupRequestID(remoteClient), groupID); |
634 | 644 | ||
635 | if (m_debugEnabled) | ||
636 | { | ||
637 | foreach (GroupRolesData member in data) | ||
638 | { | ||
639 | m_log.DebugFormat("[GROUPS]: {0} {1}", member.Title, member.Members); | ||
640 | } | ||
641 | } | ||
642 | |||
643 | return data; | 645 | return data; |
644 | 646 | ||
645 | } | 647 | } |
@@ -650,14 +652,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
650 | 652 | ||
651 | List<GroupRoleMembersData> data = m_groupData.GetGroupRoleMembers(GetClientGroupRequestID(remoteClient), groupID); | 653 | List<GroupRoleMembersData> data = m_groupData.GetGroupRoleMembers(GetClientGroupRequestID(remoteClient), groupID); |
652 | 654 | ||
653 | if (m_debugEnabled) | ||
654 | { | ||
655 | foreach (GroupRoleMembersData member in data) | ||
656 | { | ||
657 | m_log.DebugFormat("[GROUPS]: Av: {0} Role: {1}", member.MemberID, member.RoleID); | ||
658 | } | ||
659 | } | ||
660 | |||
661 | return data; | 655 | return data; |
662 | 656 | ||
663 | 657 | ||
@@ -808,7 +802,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
808 | { | 802 | { |
809 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 803 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
810 | 804 | ||
811 | // TODO: Security Checks? | 805 | // Security Checks are handled in the Groups Service. |
812 | 806 | ||
813 | GroupRequestID grID = GetClientGroupRequestID(remoteClient); | 807 | GroupRequestID grID = GetClientGroupRequestID(remoteClient); |
814 | 808 | ||
@@ -825,6 +819,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
825 | case OpenMetaverse.GroupRoleUpdate.UpdateAll: | 819 | case OpenMetaverse.GroupRoleUpdate.UpdateAll: |
826 | case OpenMetaverse.GroupRoleUpdate.UpdateData: | 820 | case OpenMetaverse.GroupRoleUpdate.UpdateData: |
827 | case OpenMetaverse.GroupRoleUpdate.UpdatePowers: | 821 | case OpenMetaverse.GroupRoleUpdate.UpdatePowers: |
822 | if (m_debugEnabled) | ||
823 | { | ||
824 | GroupPowers gp = (GroupPowers)powers; | ||
825 | m_log.DebugFormat("[GROUPS]: Role ({0}) updated with Powers ({1}) ({2})", name, powers.ToString(), gp.ToString()); | ||
826 | } | ||
828 | m_groupData.UpdateGroupRole(grID, groupID, roleID, name, description, title, powers); | 827 | m_groupData.UpdateGroupRole(grID, groupID, roleID, name, description, title, powers); |
829 | break; | 828 | break; |
830 | 829 | ||
@@ -1195,6 +1194,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
1195 | 1194 | ||
1196 | foreach (GroupMembershipData membership in data) | 1195 | foreach (GroupMembershipData membership in data) |
1197 | { | 1196 | { |
1197 | if (remoteClient.AgentId != dataForAgentID) | ||
1198 | { | ||
1199 | if (!membership.ListInProfile) | ||
1200 | { | ||
1201 | // If we're sending group info to remoteclient about another agent, | ||
1202 | // filter out groups the other agent doesn't want to share. | ||
1203 | continue; | ||
1204 | } | ||
1205 | } | ||
1206 | |||
1198 | OSDMap GroupDataMap = new OSDMap(6); | 1207 | OSDMap GroupDataMap = new OSDMap(6); |
1199 | OSDMap NewGroupDataMap = new OSDMap(1); | 1208 | OSDMap NewGroupDataMap = new OSDMap(1); |
1200 | 1209 | ||
@@ -1281,11 +1290,46 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
1281 | // to the core Groups Stub | 1290 | // to the core Groups Stub |
1282 | remoteClient.SendGroupMembership(new GroupMembershipData[0]); | 1291 | remoteClient.SendGroupMembership(new GroupMembershipData[0]); |
1283 | 1292 | ||
1284 | GroupMembershipData[] membershipData = m_groupData.GetAgentGroupMemberships(GetClientGroupRequestID(remoteClient), dataForAgentID).ToArray(); | 1293 | GroupMembershipData[] membershipArray = GetProfileListedGroupMemberships(remoteClient, dataForAgentID); |
1294 | SendGroupMembershipInfoViaCaps(remoteClient, dataForAgentID, membershipArray); | ||
1295 | remoteClient.SendAvatarGroupsReply(dataForAgentID, membershipArray); | ||
1285 | 1296 | ||
1286 | SendGroupMembershipInfoViaCaps(remoteClient, dataForAgentID, membershipData); | 1297 | } |
1287 | remoteClient.SendAvatarGroupsReply(dataForAgentID, membershipData); | 1298 | |
1299 | /// <summary> | ||
1300 | /// Get a list of groups memberships for the agent that are marked "ListInProfile" | ||
1301 | /// </summary> | ||
1302 | /// <param name="dataForAgentID"></param> | ||
1303 | /// <returns></returns> | ||
1304 | private GroupMembershipData[] GetProfileListedGroupMemberships(IClientAPI requestingClient, UUID dataForAgentID) | ||
1305 | { | ||
1306 | List<GroupMembershipData> membershipData = m_groupData.GetAgentGroupMemberships(GetClientGroupRequestID(requestingClient), dataForAgentID); | ||
1307 | GroupMembershipData[] membershipArray; | ||
1308 | |||
1309 | if (requestingClient.AgentId != dataForAgentID) | ||
1310 | { | ||
1311 | Predicate<GroupMembershipData> showInProfile = delegate(GroupMembershipData membership) | ||
1312 | { | ||
1313 | return membership.ListInProfile; | ||
1314 | }; | ||
1315 | |||
1316 | membershipArray = membershipData.FindAll(showInProfile).ToArray(); | ||
1317 | } | ||
1318 | else | ||
1319 | { | ||
1320 | membershipArray = membershipData.ToArray(); | ||
1321 | } | ||
1322 | |||
1323 | if (m_debugEnabled) | ||
1324 | { | ||
1325 | m_log.InfoFormat("[GROUPS]: Get group membership information for {0} requested by {1}", dataForAgentID, requestingClient.AgentId); | ||
1326 | foreach (GroupMembershipData membership in membershipArray) | ||
1327 | { | ||
1328 | m_log.InfoFormat("[GROUPS]: {0} :: {1} - {2}", dataForAgentID, membership.GroupName, membership.GroupTitle); | ||
1329 | } | ||
1330 | } | ||
1288 | 1331 | ||
1332 | return membershipArray; | ||
1289 | } | 1333 | } |
1290 | 1334 | ||
1291 | private void SendAgentDataUpdate(IClientAPI remoteClient, UUID dataForAgentID, UUID activeGroupID, string activeGroupName, ulong activeGroupPowers, string activeGroupTitle) | 1335 | private void SendAgentDataUpdate(IClientAPI remoteClient, UUID dataForAgentID, UUID activeGroupID, string activeGroupName, ulong activeGroupPowers, string activeGroupTitle) |
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs index b3eaa37..805c3d4 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs | |||
@@ -855,16 +855,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
855 | IList parameters = new ArrayList(); | 855 | IList parameters = new ArrayList(); |
856 | parameters.Add(param); | 856 | parameters.Add(param); |
857 | 857 | ||
858 | XmlRpcRequest req; | 858 | ConfigurableKeepAliveXmlRpcRequest req; |
859 | if (!m_disableKeepAlive) | 859 | req = new ConfigurableKeepAliveXmlRpcRequest(function, parameters, m_disableKeepAlive); |
860 | { | ||
861 | req = new XmlRpcRequest(function, parameters); | ||
862 | } | ||
863 | else | ||
864 | { | ||
865 | // This seems to solve a major problem on some windows servers | ||
866 | req = new NoKeepAliveXmlRpcRequest(function, parameters); | ||
867 | } | ||
868 | 860 | ||
869 | XmlRpcResponse resp = null; | 861 | XmlRpcResponse resp = null; |
870 | 862 | ||
@@ -874,10 +866,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
874 | } | 866 | } |
875 | catch (Exception e) | 867 | catch (Exception e) |
876 | { | 868 | { |
869 | |||
870 | |||
877 | m_log.ErrorFormat("[XMLRPCGROUPDATA]: An error has occured while attempting to access the XmlRpcGroups server method: {0}", function); | 871 | m_log.ErrorFormat("[XMLRPCGROUPDATA]: An error has occured while attempting to access the XmlRpcGroups server method: {0}", function); |
878 | m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0} ", e.ToString()); | 872 | m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0} ", e.ToString()); |
879 | 873 | ||
880 | 874 | foreach( string ResponseLine in req.RequestResponse.Split(new string[] { Environment.NewLine },StringSplitOptions.None)) | |
875 | { | ||
876 | m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0} ", ResponseLine); | ||
877 | } | ||
878 | |||
881 | foreach (string key in param.Keys) | 879 | foreach (string key in param.Keys) |
882 | { | 880 | { |
883 | m_log.WarnFormat("[XMLRPCGROUPDATA]: {0} :: {1}", key, param[key].ToString()); | 881 | m_log.WarnFormat("[XMLRPCGROUPDATA]: {0} :: {1}", key, param[key].ToString()); |
@@ -961,20 +959,24 @@ namespace Nwc.XmlRpc | |||
961 | using System.Reflection; | 959 | using System.Reflection; |
962 | 960 | ||
963 | /// <summary>Class supporting the request side of an XML-RPC transaction.</summary> | 961 | /// <summary>Class supporting the request side of an XML-RPC transaction.</summary> |
964 | public class NoKeepAliveXmlRpcRequest : XmlRpcRequest | 962 | public class ConfigurableKeepAliveXmlRpcRequest : XmlRpcRequest |
965 | { | 963 | { |
966 | private Encoding _encoding = new ASCIIEncoding(); | 964 | private Encoding _encoding = new ASCIIEncoding(); |
967 | private XmlRpcRequestSerializer _serializer = new XmlRpcRequestSerializer(); | 965 | private XmlRpcRequestSerializer _serializer = new XmlRpcRequestSerializer(); |
968 | private XmlRpcResponseDeserializer _deserializer = new XmlRpcResponseDeserializer(); | 966 | private XmlRpcResponseDeserializer _deserializer = new XmlRpcResponseDeserializer(); |
967 | private bool _disableKeepAlive = true; | ||
968 | |||
969 | public string RequestResponse = String.Empty; | ||
969 | 970 | ||
970 | /// <summary>Instantiate an <c>XmlRpcRequest</c> for a specified method and parameters.</summary> | 971 | /// <summary>Instantiate an <c>XmlRpcRequest</c> for a specified method and parameters.</summary> |
971 | /// <param name="methodName"><c>String</c> designating the <i>object.method</i> on the server the request | 972 | /// <param name="methodName"><c>String</c> designating the <i>object.method</i> on the server the request |
972 | /// should be directed to.</param> | 973 | /// should be directed to.</param> |
973 | /// <param name="parameters"><c>ArrayList</c> of XML-RPC type parameters to invoke the request with.</param> | 974 | /// <param name="parameters"><c>ArrayList</c> of XML-RPC type parameters to invoke the request with.</param> |
974 | public NoKeepAliveXmlRpcRequest(String methodName, IList parameters) | 975 | public ConfigurableKeepAliveXmlRpcRequest(String methodName, IList parameters, bool disableKeepAlive) |
975 | { | 976 | { |
976 | MethodName = methodName; | 977 | MethodName = methodName; |
977 | _params = parameters; | 978 | _params = parameters; |
979 | _disableKeepAlive = disableKeepAlive; | ||
978 | } | 980 | } |
979 | 981 | ||
980 | /// <summary>Send the request to the server.</summary> | 982 | /// <summary>Send the request to the server.</summary> |
@@ -989,7 +991,7 @@ namespace Nwc.XmlRpc | |||
989 | request.Method = "POST"; | 991 | request.Method = "POST"; |
990 | request.ContentType = "text/xml"; | 992 | request.ContentType = "text/xml"; |
991 | request.AllowWriteStreamBuffering = true; | 993 | request.AllowWriteStreamBuffering = true; |
992 | request.KeepAlive = false; | 994 | request.KeepAlive = !_disableKeepAlive; |
993 | 995 | ||
994 | Stream stream = request.GetRequestStream(); | 996 | Stream stream = request.GetRequestStream(); |
995 | XmlTextWriter xml = new XmlTextWriter(stream, _encoding); | 997 | XmlTextWriter xml = new XmlTextWriter(stream, _encoding); |
@@ -1000,7 +1002,17 @@ namespace Nwc.XmlRpc | |||
1000 | HttpWebResponse response = (HttpWebResponse)request.GetResponse(); | 1002 | HttpWebResponse response = (HttpWebResponse)request.GetResponse(); |
1001 | StreamReader input = new StreamReader(response.GetResponseStream()); | 1003 | StreamReader input = new StreamReader(response.GetResponseStream()); |
1002 | 1004 | ||
1003 | XmlRpcResponse resp = (XmlRpcResponse)_deserializer.Deserialize(input); | 1005 | string inputXml = input.ReadToEnd(); |
1006 | XmlRpcResponse resp; | ||
1007 | try | ||
1008 | { | ||
1009 | resp = (XmlRpcResponse)_deserializer.Deserialize(inputXml); | ||
1010 | } | ||
1011 | catch (Exception e) | ||
1012 | { | ||
1013 | RequestResponse = inputXml; | ||
1014 | throw e; | ||
1015 | } | ||
1004 | input.Close(); | 1016 | input.Close(); |
1005 | response.Close(); | 1017 | response.Close(); |
1006 | return resp; | 1018 | return resp; |
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/PointMetaEntity.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/PointMetaEntity.cs index 59b7289..fbe43d6 100644 --- a/OpenSim/Region/OptionalModules/ContentManagementSystem/PointMetaEntity.cs +++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/PointMetaEntity.cs | |||
@@ -66,7 +66,6 @@ namespace OpenSim.Region.OptionalModules.ContentManagement | |||
66 | 66 | ||
67 | private void CreatePointEntity(Scene scene, UUID uuid, Vector3 groupPos) | 67 | private void CreatePointEntity(Scene scene, UUID uuid, Vector3 groupPos) |
68 | { | 68 | { |
69 | SceneObjectGroup x = new SceneObjectGroup(); | ||
70 | SceneObjectPart y = new SceneObjectPart(); | 69 | SceneObjectPart y = new SceneObjectPart(); |
71 | 70 | ||
72 | //Initialize part | 71 | //Initialize part |
@@ -93,8 +92,8 @@ namespace OpenSim.Region.OptionalModules.ContentManagement | |||
93 | y.TrimPermissions(); | 92 | y.TrimPermissions(); |
94 | 93 | ||
95 | //Initialize group and add part as root part | 94 | //Initialize group and add part as root part |
95 | SceneObjectGroup x = new SceneObjectGroup(y); | ||
96 | x.SetScene(scene); | 96 | x.SetScene(scene); |
97 | x.SetRootPart(y); | ||
98 | x.RegionHandle = scene.RegionInfo.RegionHandle; | 97 | x.RegionHandle = scene.RegionInfo.RegionHandle; |
99 | x.SetScene(scene); | 98 | x.SetScene(scene); |
100 | 99 | ||
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index dd58a4e..a00ba11 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | |||
@@ -107,6 +107,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
107 | public float MinimumGroundFlightOffset = 3f; | 107 | public float MinimumGroundFlightOffset = 3f; |
108 | 108 | ||
109 | private float m_tainted_CAPSULE_LENGTH; // set when the capsule length changes. | 109 | private float m_tainted_CAPSULE_LENGTH; // set when the capsule length changes. |
110 | private float m_tiltMagnitudeWhenProjectedOnXYPlane = 0.1131371f; // used to introduce a fixed tilt because a straight-up capsule falls through terrain, probably a bug in terrain collider | ||
110 | 111 | ||
111 | 112 | ||
112 | private float m_buoyancy = 0f; | 113 | private float m_buoyancy = 0f; |
@@ -477,7 +478,71 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
477 | } | 478 | } |
478 | } | 479 | } |
479 | } | 480 | } |
480 | 481 | ||
482 | private void AlignAvatarTiltWithCurrentDirectionOfMovement(PhysicsVector movementVector) | ||
483 | { | ||
484 | movementVector.Z = 0f; | ||
485 | float magnitude = (float)Math.Sqrt((double)(movementVector.X * movementVector.X + movementVector.Y * movementVector.Y)); | ||
486 | if (magnitude < 0.1f) return; | ||
487 | |||
488 | // normalize the velocity vector | ||
489 | float invMagnitude = 1.0f / magnitude; | ||
490 | movementVector.X *= invMagnitude; | ||
491 | movementVector.Y *= invMagnitude; | ||
492 | |||
493 | // if we change the capsule heading too often, the capsule can fall down | ||
494 | // therefore we snap movement vector to just 1 of 4 predefined directions (ne, nw, se, sw), | ||
495 | // meaning only 4 possible capsule tilt orientations | ||
496 | if (movementVector.X > 0) | ||
497 | { | ||
498 | // east | ||
499 | if (movementVector.Y > 0) | ||
500 | { | ||
501 | // northeast | ||
502 | movementVector.X = (float)Math.Sqrt(2.0); | ||
503 | movementVector.Y = (float)Math.Sqrt(2.0); | ||
504 | } | ||
505 | else | ||
506 | { | ||
507 | // southeast | ||
508 | movementVector.X = (float)Math.Sqrt(2.0); | ||
509 | movementVector.Y = -(float)Math.Sqrt(2.0); | ||
510 | } | ||
511 | } | ||
512 | else | ||
513 | { | ||
514 | // west | ||
515 | if (movementVector.Y > 0) | ||
516 | { | ||
517 | // northwest | ||
518 | movementVector.X = -(float)Math.Sqrt(2.0); | ||
519 | movementVector.Y = (float)Math.Sqrt(2.0); | ||
520 | } | ||
521 | else | ||
522 | { | ||
523 | // southwest | ||
524 | movementVector.X = -(float)Math.Sqrt(2.0); | ||
525 | movementVector.Y = -(float)Math.Sqrt(2.0); | ||
526 | } | ||
527 | } | ||
528 | |||
529 | |||
530 | // movementVector.Z is zero | ||
531 | |||
532 | // calculate tilt components based on desired amount of tilt and current (snapped) heading. | ||
533 | // the "-" sign is to force the tilt to be OPPOSITE the direction of movement. | ||
534 | float xTiltComponent = -movementVector.X * m_tiltMagnitudeWhenProjectedOnXYPlane; | ||
535 | float yTiltComponent = -movementVector.Y * m_tiltMagnitudeWhenProjectedOnXYPlane; | ||
536 | |||
537 | //m_log.Debug("[PHYSICS] changing avatar tilt"); | ||
538 | d.JointSetAMotorParam(Amotor, (int)dParam.LowStop, xTiltComponent); | ||
539 | d.JointSetAMotorParam(Amotor, (int)dParam.HiStop, xTiltComponent); // must be same as lowstop, else a different, spurious tilt is introduced | ||
540 | d.JointSetAMotorParam(Amotor, (int)dParam.LoStop2, yTiltComponent); | ||
541 | d.JointSetAMotorParam(Amotor, (int)dParam.HiStop2, yTiltComponent); // same as lowstop | ||
542 | d.JointSetAMotorParam(Amotor, (int)dParam.LoStop3, 0f); | ||
543 | d.JointSetAMotorParam(Amotor, (int)dParam.HiStop3, 0f); // same as lowstop | ||
544 | } | ||
545 | |||
481 | /// <summary> | 546 | /// <summary> |
482 | /// This creates the Avatar's physical Surrogate at the position supplied | 547 | /// This creates the Avatar's physical Surrogate at the position supplied |
483 | /// </summary> | 548 | /// </summary> |
@@ -576,71 +641,13 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
576 | // (with -0..0 motor stops) falls into the terrain for reasons yet | 641 | // (with -0..0 motor stops) falls into the terrain for reasons yet |
577 | // to be comprehended in their entirety. | 642 | // to be comprehended in their entirety. |
578 | #endregion | 643 | #endregion |
644 | AlignAvatarTiltWithCurrentDirectionOfMovement(new PhysicsVector(0,0,0)); | ||
579 | d.JointSetAMotorParam(Amotor, (int)dParam.LowStop, 0.08f); | 645 | d.JointSetAMotorParam(Amotor, (int)dParam.LowStop, 0.08f); |
580 | d.JointSetAMotorParam(Amotor, (int)dParam.LoStop3, -0f); | 646 | d.JointSetAMotorParam(Amotor, (int)dParam.LoStop3, -0f); |
581 | d.JointSetAMotorParam(Amotor, (int)dParam.LoStop2, 0.08f); | 647 | d.JointSetAMotorParam(Amotor, (int)dParam.LoStop2, 0.08f); |
582 | d.JointSetAMotorParam(Amotor, (int)dParam.HiStop, 0.08f); // must be same as lowstop, else a different, spurious tilt is introduced | 648 | d.JointSetAMotorParam(Amotor, (int)dParam.HiStop, 0.08f); // must be same as lowstop, else a different, spurious tilt is introduced |
583 | d.JointSetAMotorParam(Amotor, (int)dParam.HiStop3, 0f); // same as lowstop | 649 | d.JointSetAMotorParam(Amotor, (int)dParam.HiStop3, 0f); // same as lowstop |
584 | d.JointSetAMotorParam(Amotor, (int)dParam.HiStop2, 0.08f); // same as lowstop | 650 | d.JointSetAMotorParam(Amotor, (int)dParam.HiStop2, 0.08f); // same as lowstop |
585 | #region Documentation of capsule motor StopERP and StopCFM parameters | ||
586 | // In addition to the above tilt, we allow a dynamic tilt, or | ||
587 | // wobble, to emerge as the capsule is pushed around the environment. | ||
588 | // We do this with an experimentally determined combination of | ||
589 | // StopERP and StopCFM which make the above motor stops soft. | ||
590 | // The softness of the stops should be tweaked according to two | ||
591 | // requirements: | ||
592 | // | ||
593 | // 1. Motor stops should be weak enough to allow enough wobble such | ||
594 | // that the capsule can tilt slightly more when moving, to allow | ||
595 | // "gliding" over obstacles: | ||
596 | // | ||
597 | // | ||
598 | // .-. | ||
599 | // / / | ||
600 | // / / | ||
601 | // _ / / _ | ||
602 | // / \ .-. / / / \ | ||
603 | // | | ----> / / / / | | | ||
604 | // | | / / `-' | | | ||
605 | // | | / / +------+ | | | ||
606 | // | | / / | | | | | ||
607 | // | | / / | | | | | ||
608 | // \_/ `-' +------+ \_/ | ||
609 | // ---------------------------------------------------------- | ||
610 | // | ||
611 | // Note that requirement 1 is made complicated by the ever-present | ||
612 | // slight avatar tilt (assigned in the above code to prevent avatar | ||
613 | // from falling through terrain), which introduces a direction-dependent | ||
614 | // bias into the wobble (wobbling against the existing tilt is harder | ||
615 | // than wobbling with the tilt), which makes it easier to walk over | ||
616 | // prims from some directions. I have tried to minimize this effect by | ||
617 | // minimizing the avatar tilt to the minimum that prevents the avatar from | ||
618 | // falling through the terrain. | ||
619 | // | ||
620 | // 2. Motor stops should be strong enough to prevent the capsule | ||
621 | // from being forced all the way to the ground; otherwise the | ||
622 | // capsule could slip underneath obstacles like this: | ||
623 | // _ _ | ||
624 | // / \ +------+ / \ | ||
625 | // | | ----> | | | | | ||
626 | // | | | | | | | ||
627 | // | | .--.___ +------+ | | | ||
628 | // | | `--.__`--.__ | | | ||
629 | // | | `--.__`--. | | | ||
630 | // \_/ `--' \_/ | ||
631 | // ---------------------------------------------------------- | ||
632 | // | ||
633 | // | ||
634 | // It is strongly recommended you enable USE_DRAWSTUFF if you want to | ||
635 | // tweak these values, to see how the capsule is reacting in various | ||
636 | // situations. | ||
637 | #endregion | ||
638 | d.JointSetAMotorParam(Amotor, (int)dParam.StopCFM, 0.0035f); | ||
639 | d.JointSetAMotorParam(Amotor, (int)dParam.StopCFM2, 0.0035f); | ||
640 | d.JointSetAMotorParam(Amotor, (int)dParam.StopCFM3, 0.0035f); | ||
641 | d.JointSetAMotorParam(Amotor, (int)dParam.StopERP, 0.8f); | ||
642 | d.JointSetAMotorParam(Amotor, (int)dParam.StopERP2, 0.8f); | ||
643 | d.JointSetAMotorParam(Amotor, (int)dParam.StopERP3, 0.8f); | ||
644 | } | 651 | } |
645 | 652 | ||
646 | // Fudge factor is 1f by default, we're setting it to 0. We don't want it to Fudge or the | 653 | // Fudge factor is 1f by default, we're setting it to 0. We don't want it to Fudge or the |
@@ -939,6 +946,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
939 | 946 | ||
940 | PhysicsVector vec = new PhysicsVector(); | 947 | PhysicsVector vec = new PhysicsVector(); |
941 | d.Vector3 vel = d.BodyGetLinearVel(Body); | 948 | d.Vector3 vel = d.BodyGetLinearVel(Body); |
949 | |||
942 | float movementdivisor = 1f; | 950 | float movementdivisor = 1f; |
943 | 951 | ||
944 | if (!m_alwaysRun) | 952 | if (!m_alwaysRun) |
@@ -1052,6 +1060,10 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1052 | if (PhysicsVector.isFinite(vec)) | 1060 | if (PhysicsVector.isFinite(vec)) |
1053 | { | 1061 | { |
1054 | doForce(vec); | 1062 | doForce(vec); |
1063 | if (!_zeroFlag) | ||
1064 | { | ||
1065 | AlignAvatarTiltWithCurrentDirectionOfMovement(new PhysicsVector(vec.X, vec.Y, vec.Z)); | ||
1066 | } | ||
1055 | } | 1067 | } |
1056 | else | 1068 | else |
1057 | { | 1069 | { |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 726b37a..ccdd4c5 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | |||
@@ -1164,6 +1164,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1164 | 1164 | ||
1165 | land.SetMediaUrl(url); | 1165 | land.SetMediaUrl(url); |
1166 | } | 1166 | } |
1167 | |||
1168 | public void osSetParcelSIPAddress(string SIPAddress) | ||
1169 | { | ||
1170 | // What actually is the difference to the LL function? | ||
1171 | // | ||
1172 | CheckThreatLevel(ThreatLevel.VeryLow, "osSetParcelMediaURL"); | ||
1173 | |||
1174 | m_host.AddScriptLPS(1); | ||
1175 | |||
1176 | |||
1177 | ILandObject land | ||
1178 | = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); | ||
1179 | |||
1180 | if (land.landData.OwnerID != m_host.ObjectOwner) | ||
1181 | { | ||
1182 | OSSLError("osSetParcelSIPAddress: Sorry, you need to own the land to use this function"); | ||
1183 | return; | ||
1184 | } | ||
1185 | |||
1186 | // get the voice module | ||
1187 | IVoiceModule voiceModule = World.RequestModuleInterface<IVoiceModule>(); | ||
1188 | |||
1189 | if (voiceModule != null) | ||
1190 | voiceModule.setLandSIPAddress(SIPAddress,land.landData.GlobalID); | ||
1191 | else | ||
1192 | OSSLError("osSetParcelSIPAddress: No voice module enabled for this land"); | ||
1193 | |||
1194 | |||
1195 | } | ||
1167 | 1196 | ||
1168 | public string osGetScriptEngineName() | 1197 | public string osGetScriptEngineName() |
1169 | { | 1198 | { |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 49aa45a..d8d3c31 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs | |||
@@ -75,6 +75,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
75 | bool osConsoleCommand(string Command); | 75 | bool osConsoleCommand(string Command); |
76 | void osSetParcelMediaURL(string url); | 76 | void osSetParcelMediaURL(string url); |
77 | void osSetPrimFloatOnWater(int floatYN); | 77 | void osSetPrimFloatOnWater(int floatYN); |
78 | void osSetParcelSIPAddress(string SIPAddress); | ||
78 | 79 | ||
79 | // Avatar Info Commands | 80 | // Avatar Info Commands |
80 | string osGetAgentIP(string agent); | 81 | string osGetAgentIP(string agent); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 8f52d99..d0df390 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | |||
@@ -183,6 +183,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
183 | { | 183 | { |
184 | m_OSSL_Functions.osSetParcelMediaURL(url); | 184 | m_OSSL_Functions.osSetParcelMediaURL(url); |
185 | } | 185 | } |
186 | |||
187 | public void osSetParcelSIPAddress(string SIPAddress) | ||
188 | { | ||
189 | m_OSSL_Functions.osSetParcelSIPAddress(SIPAddress); | ||
190 | } | ||
186 | 191 | ||
187 | public void osSetPrimFloatOnWater(int floatYN) | 192 | public void osSetPrimFloatOnWater(int floatYN) |
188 | { | 193 | { |
diff --git a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs index cef678d..5443891 100644 --- a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs | |||
@@ -236,42 +236,8 @@ namespace OpenSim.Services.Connectors | |||
236 | } | 236 | } |
237 | catch (Exception e) | 237 | catch (Exception e) |
238 | { | 238 | { |
239 | // Maybe we're talking to an old inventory server. Try this other thing. | 239 | m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetFolderContent operation failed, {0} {1} (old server?).", |
240 | m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetFolderContent operation failed, {0} {1} (old server?). Trying GetInventory.", | ||
241 | e.Source, e.Message); | 240 | e.Source, e.Message); |
242 | |||
243 | InventoryCollection inventory; | ||
244 | List<InventoryFolderBase> folders = null; | ||
245 | try | ||
246 | { | ||
247 | inventory = SynchronousRestSessionObjectPoster<Guid, InventoryCollection>.BeginPostObject( | ||
248 | "POST", m_ServerURI + "/GetInventory/", new Guid(userID), sessionID.ToString(), userID.ToString()); | ||
249 | if (inventory != null) | ||
250 | folders = inventory.Folders; | ||
251 | } | ||
252 | catch (Exception ex) | ||
253 | { | ||
254 | m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetInventory operation also failed, {0} {1}. Giving up.", | ||
255 | e.Source, ex.Message); | ||
256 | return new InventoryCollection(); | ||
257 | } | ||
258 | |||
259 | if ((folders != null) && (folders.Count > 0)) | ||
260 | { | ||
261 | m_log.DebugFormat("[INVENTORY CONNECTOR]: Received entire inventory ({0} folders) for user {1}", | ||
262 | folders.Count, userID); | ||
263 | |||
264 | folders = folders.FindAll(delegate(InventoryFolderBase f) { return f.ParentID == folderID; }); | ||
265 | List<InventoryItemBase> items = inventory.Items; | ||
266 | if (items != null) | ||
267 | { | ||
268 | items = items.FindAll(delegate(InventoryItemBase i) { return i.Folder == folderID; }); | ||
269 | } | ||
270 | |||
271 | inventory.Items = items; | ||
272 | inventory.Folders = folders; | ||
273 | return inventory; | ||
274 | } | ||
275 | } | 241 | } |
276 | 242 | ||
277 | InventoryCollection nullCollection = new InventoryCollection(); | 243 | InventoryCollection nullCollection = new InventoryCollection(); |
diff --git a/OpenSim/Tests/Common/Setup/BaseRequestHandlerTestHelper.cs b/OpenSim/Tests/Common/Setup/BaseRequestHandlerTestHelper.cs index e858371..eaf8b39 100644 --- a/OpenSim/Tests/Common/Setup/BaseRequestHandlerTestHelper.cs +++ b/OpenSim/Tests/Common/Setup/BaseRequestHandlerTestHelper.cs | |||
@@ -72,15 +72,5 @@ namespace OpenSim.Tests.Common.Setup | |||
72 | 72 | ||
73 | public static byte[] EmptyByteArray = new byte[] {}; | 73 | public static byte[] EmptyByteArray = new byte[] {}; |
74 | 74 | ||
75 | public static void BaseTestHandleNoParams(BaseGetAssetStreamHandler handler, string assetsPath) | ||
76 | { | ||
77 | Assert.AreEqual(EmptyByteArray, handler.Handle(assetsPath, null, null, null), "Failed on empty params."); | ||
78 | Assert.AreEqual(EmptyByteArray, handler.Handle(assetsPath + "/", null, null, null), "Failed on single slash."); | ||
79 | } | ||
80 | |||
81 | public static void BaseTestHandleMalformedGuid(BaseGetAssetStreamHandler handler, string assetsPath) | ||
82 | { | ||
83 | Assert.AreEqual(EmptyByteArray, handler.Handle(assetsPath + "/badGuid", null, null, null), "Failed on bad guid."); | ||
84 | } | ||
85 | } | 75 | } |
86 | } \ No newline at end of file | 76 | } |
diff --git a/OpenSim/Tests/Common/Setup/GetAssetStreamHandlerTestHelpers.cs b/OpenSim/Tests/Common/Setup/GetAssetStreamHandlerTestHelpers.cs deleted file mode 100644 index ffa7283..0000000 --- a/OpenSim/Tests/Common/Setup/GetAssetStreamHandlerTestHelpers.cs +++ /dev/null | |||
@@ -1,122 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.IO; | ||
31 | using System.Net; | ||
32 | using System.Text; | ||
33 | using System.Xml; | ||
34 | using System.Xml.Serialization; | ||
35 | using NUnit.Framework; | ||
36 | using OpenMetaverse; | ||
37 | using OpenSim.Framework; | ||
38 | using OpenSim.Framework.Servers; | ||
39 | using OpenSim.Framework.Servers.HttpServer; | ||
40 | using OpenSim.Server.Base; | ||
41 | using OpenSim.Tests.Common.Mock; | ||
42 | |||
43 | namespace OpenSim.Tests.Common.Setup | ||
44 | { | ||
45 | public class GetAssetStreamHandlerTestHelpers | ||
46 | { | ||
47 | private const string EXPECTED_CONTENT_TYPE = "application/x-metaverse-callingcard"; | ||
48 | |||
49 | public static void BaseFetchExistingAssetXmlTest(AssetBase asset, BaseGetAssetStreamHandler handler, OSHttpResponse response) | ||
50 | { | ||
51 | byte[] expected = BaseGetAssetStreamHandler.GetXml(asset); | ||
52 | |||
53 | byte[] actual = handler.Handle("/assets/" + asset.ID , null, null, response); | ||
54 | |||
55 | Assert.Greater(actual.Length, 10, "Too short xml on fetching xml without trailing slash."); | ||
56 | Assert.AreEqual(expected, actual, "Failed on fetching xml without trailing slash."); | ||
57 | // Assert.AreEqual((int)HttpStatusCode.OK, response.StatusCode, "Wrong http response code on first fetch."); | ||
58 | |||
59 | actual = handler.Handle("/assets/" + asset.ID + "/", null, null, response); | ||
60 | Assert.Greater(actual.Length, 10, "Too short xml on fetching xml with trailing slash."); | ||
61 | Assert.AreEqual(expected, actual, "Failed on fetching xml with trailing slash."); | ||
62 | // Assert.AreEqual((int)HttpStatusCode.OK, response.StatusCode, "Wrong http response code on second fetch."); | ||
63 | |||
64 | actual = handler.Handle("/assets/" + asset.ID + "/badData", null, null, response); | ||
65 | Assert.Greater(actual.Length, 10, "Too short xml on fetching xml with bad trailing data."); | ||
66 | Assert.AreEqual(expected, actual, "Failed on fetching xml with bad trailing trailing slash."); | ||
67 | // Assert.AreEqual((int)HttpStatusCode.OK, response.StatusCode, "Wrong http response code on second fetch."); | ||
68 | } | ||
69 | |||
70 | public static void BaseFetchExistingAssetDataTest(AssetBase asset, BaseGetAssetStreamHandler handler, OSHttpResponse response) | ||
71 | { | ||
72 | Assert.AreEqual(asset.Data, handler.Handle("/assets/" + asset.ID + "/data", null, null, response), "Failed on fetching data without trailing slash."); | ||
73 | Assert.AreEqual((int)HttpStatusCode.OK, response.StatusCode, "Wrong http response code on first fetch."); | ||
74 | Assert.AreEqual(EXPECTED_CONTENT_TYPE, response.ContentType, "Wrong http content type on first fetch."); | ||
75 | |||
76 | Assert.AreEqual(asset.Data, handler.Handle("/assets/" + asset.ID + "/data/", null, null, response), "Failed on fetching data with trailing slash."); | ||
77 | Assert.AreEqual((int)HttpStatusCode.OK, response.StatusCode, "Wrong http response code on second fetch."); | ||
78 | Assert.AreEqual(EXPECTED_CONTENT_TYPE, response.ContentType, "Wrong http content type on second fetch."); | ||
79 | } | ||
80 | |||
81 | public static void BaseFetchExistingAssetMetaDataTest(AssetBase asset, BaseGetAssetStreamHandler handler, OSHttpResponse response) | ||
82 | { | ||
83 | XmlSerializer xs = new XmlSerializer(typeof(AssetMetadata)); | ||
84 | |||
85 | byte[] expected = ServerUtils.SerializeResult(xs, asset.Metadata); | ||
86 | |||
87 | Assert.AreEqual(expected, handler.Handle("/assets/" + asset.ID + "/metadata", null, null, response), "Failed on fetching data without trailing slash."); | ||
88 | Assert.AreEqual((int)HttpStatusCode.OK, response.StatusCode, "Wrong http response code on first fetch."); | ||
89 | Assert.AreEqual(EXPECTED_CONTENT_TYPE, response.ContentType, "Wrong http content type on first fetch."); | ||
90 | |||
91 | Assert.AreEqual(expected, handler.Handle("/assets/" + asset.ID + "/metadata/", null, null, response), "Failed on fetching data with trailing slash."); | ||
92 | Assert.AreEqual((int)HttpStatusCode.OK, response.StatusCode, "Wrong http response code on second fetch."); | ||
93 | Assert.AreEqual(EXPECTED_CONTENT_TYPE, response.ContentType, "Wrong http content type on second fetch."); | ||
94 | } | ||
95 | |||
96 | public static AssetBase CreateCommonTestResources(out OSHttpResponse response) | ||
97 | { | ||
98 | AssetBase asset = CreateTestAsset(); | ||
99 | response = new TestOSHttpResponse(); | ||
100 | return asset; | ||
101 | } | ||
102 | |||
103 | public static AssetBase CreateTestAsset() | ||
104 | { | ||
105 | byte[] expected = new byte[] { 1,2,3 }; | ||
106 | AssetBase asset = new AssetBase(); | ||
107 | asset.ID = Guid.NewGuid().ToString(); | ||
108 | asset.Data = expected; | ||
109 | asset.Type = 2; | ||
110 | |||
111 | return asset; | ||
112 | } | ||
113 | |||
114 | public static void BaseFetchMissingAsset(BaseGetAssetStreamHandler handler, OSHttpResponse response) | ||
115 | { | ||
116 | Assert.AreEqual( | ||
117 | BaseRequestHandlerTestHelper.EmptyByteArray, | ||
118 | handler.Handle("/assets/" + Guid.NewGuid(), null, null, response), "Failed on bad guid."); | ||
119 | Assert.AreEqual((int)HttpStatusCode.NotFound, response.StatusCode, "Response code wrong in BaseFetchMissingAsset"); | ||
120 | } | ||
121 | } | ||
122 | } | ||