diff options
Diffstat (limited to '')
288 files changed, 12730 insertions, 5701 deletions
diff --git a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs index 45b8d6f..0065702 100644 --- a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs +++ b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs | |||
@@ -122,9 +122,10 @@ namespace OpenSim.ApplicationPlugins.LoadRegions | |||
122 | Thread.CurrentThread.ManagedThreadId.ToString() + | 122 | Thread.CurrentThread.ManagedThreadId.ToString() + |
123 | ")"); | 123 | ")"); |
124 | 124 | ||
125 | m_openSim.PopulateRegionEstateInfo(regionsToLoad[i]); | 125 | bool changed = m_openSim.PopulateRegionEstateInfo(regionsToLoad[i]); |
126 | m_openSim.CreateRegion(regionsToLoad[i], true, out scene); | 126 | m_openSim.CreateRegion(regionsToLoad[i], true, out scene); |
127 | regionsToLoad[i].EstateSettings.Save(); | 127 | if (changed) |
128 | regionsToLoad[i].EstateSettings.Save(); | ||
128 | 129 | ||
129 | if (scene != null) | 130 | if (scene != null) |
130 | { | 131 | { |
diff --git a/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2Handler.cs b/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2Handler.cs index 717a097..c0ca1e1 100644 --- a/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2Handler.cs +++ b/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2Handler.cs | |||
@@ -101,18 +101,8 @@ namespace OpenSim.Capabilities.Handlers | |||
101 | llsdItem.item_id = invItem.ID; | 101 | llsdItem.item_id = invItem.ID; |
102 | llsdItem.name = invItem.Name; | 102 | llsdItem.name = invItem.Name; |
103 | llsdItem.parent_id = invItem.Folder; | 103 | llsdItem.parent_id = invItem.Folder; |
104 | 104 | llsdItem.type = invItem.AssetType; | |
105 | try | 105 | llsdItem.inv_type = invItem.InvType; |
106 | { | ||
107 | llsdItem.type = Utils.AssetTypeToString((AssetType)invItem.AssetType); | ||
108 | llsdItem.inv_type = Utils.InventoryTypeToString((InventoryType)invItem.InvType); | ||
109 | } | ||
110 | catch (Exception e) | ||
111 | { | ||
112 | m_log.ErrorFormat( | ||
113 | "[WEB FETCH INV DESC HANDLER]: Problem setting asset {0} inventory {1} types while converting inventory item {2}: {3}", | ||
114 | invItem.AssetType, invItem.InvType, invItem.Name, e.Message); | ||
115 | } | ||
116 | 106 | ||
117 | llsdItem.permissions = new LLSDPermissions(); | 107 | llsdItem.permissions = new LLSDPermissions(); |
118 | llsdItem.permissions.creator_id = invItem.CreatorIdAsUuid; | 108 | llsdItem.permissions.creator_id = invItem.CreatorIdAsUuid; |
@@ -126,21 +116,7 @@ namespace OpenSim.Capabilities.Handlers | |||
126 | llsdItem.permissions.owner_mask = (int)invItem.CurrentPermissions; | 116 | llsdItem.permissions.owner_mask = (int)invItem.CurrentPermissions; |
127 | llsdItem.sale_info = new LLSDSaleInfo(); | 117 | llsdItem.sale_info = new LLSDSaleInfo(); |
128 | llsdItem.sale_info.sale_price = invItem.SalePrice; | 118 | llsdItem.sale_info.sale_price = invItem.SalePrice; |
129 | switch (invItem.SaleType) | 119 | llsdItem.sale_info.sale_type = invItem.SaleType; |
130 | { | ||
131 | default: | ||
132 | llsdItem.sale_info.sale_type = "not"; | ||
133 | break; | ||
134 | case 1: | ||
135 | llsdItem.sale_info.sale_type = "original"; | ||
136 | break; | ||
137 | case 2: | ||
138 | llsdItem.sale_info.sale_type = "copy"; | ||
139 | break; | ||
140 | case 3: | ||
141 | llsdItem.sale_info.sale_type = "contents"; | ||
142 | break; | ||
143 | } | ||
144 | 120 | ||
145 | return llsdItem; | 121 | return llsdItem; |
146 | } | 122 | } |
diff --git a/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2ServerConnector.cs b/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2ServerConnector.cs index 0ba8931..5bab52f 100644 --- a/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2ServerConnector.cs +++ b/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2ServerConnector.cs | |||
@@ -63,7 +63,8 @@ namespace OpenSim.Capabilities.Handlers | |||
63 | 63 | ||
64 | FetchInventory2Handler fiHandler = new FetchInventory2Handler(m_InventoryService); | 64 | FetchInventory2Handler fiHandler = new FetchInventory2Handler(m_InventoryService); |
65 | IRequestHandler reqHandler | 65 | IRequestHandler reqHandler |
66 | = new RestStreamHandler("POST", "/CAPS/FetchInventory/", fiHandler.FetchInventoryRequest); | 66 | = new RestStreamHandler( |
67 | "POST", "/CAPS/FetchInventory/", fiHandler.FetchInventoryRequest, "FetchInventory", null); | ||
67 | server.AddStreamHandler(reqHandler); | 68 | server.AddStreamHandler(reqHandler); |
68 | } | 69 | } |
69 | } | 70 | } |
diff --git a/OpenSim/Capabilities/Handlers/GetMesh/GetMeshServerConnector.cs b/OpenSim/Capabilities/Handlers/GetMesh/GetMeshServerConnector.cs index 2ecfa3c..8a275f3 100644 --- a/OpenSim/Capabilities/Handlers/GetMesh/GetMeshServerConnector.cs +++ b/OpenSim/Capabilities/Handlers/GetMesh/GetMeshServerConnector.cs | |||
@@ -66,13 +66,14 @@ namespace OpenSim.Capabilities.Handlers | |||
66 | throw new Exception(String.Format("Failed to load AssetService from {0}; config is {1}", assetService, m_ConfigName)); | 66 | throw new Exception(String.Format("Failed to load AssetService from {0}; config is {1}", assetService, m_ConfigName)); |
67 | 67 | ||
68 | GetMeshHandler gmeshHandler = new GetMeshHandler(m_AssetService); | 68 | GetMeshHandler gmeshHandler = new GetMeshHandler(m_AssetService); |
69 | IRequestHandler reqHandler = new RestHTTPHandler("GET", "/CAPS/" + UUID.Random(), | 69 | IRequestHandler reqHandler |
70 | delegate(Hashtable m_dhttpMethod) | 70 | = new RestHTTPHandler( |
71 | { | 71 | "GET", |
72 | return gmeshHandler.ProcessGetMesh(m_dhttpMethod, UUID.Zero, null); | 72 | "/CAPS/" + UUID.Random(), |
73 | }); | 73 | httpMethod => gmeshHandler.ProcessGetMesh(httpMethod, UUID.Zero, null), |
74 | "GetMesh", | ||
75 | null); | ||
74 | server.AddStreamHandler(reqHandler); | 76 | server.AddStreamHandler(reqHandler); |
75 | } | 77 | } |
76 | |||
77 | } | 78 | } |
78 | } | 79 | } \ No newline at end of file |
diff --git a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs index 217217e..abdbc72 100644 --- a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs +++ b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs | |||
@@ -58,8 +58,8 @@ namespace OpenSim.Capabilities.Handlers | |||
58 | // TODO: Change this to a config option | 58 | // TODO: Change this to a config option |
59 | const string REDIRECT_URL = null; | 59 | const string REDIRECT_URL = null; |
60 | 60 | ||
61 | public GetTextureHandler(string path, IAssetService assService) : | 61 | public GetTextureHandler(string path, IAssetService assService, string name, string description) |
62 | base("GET", path) | 62 | : base("GET", path, name, description) |
63 | { | 63 | { |
64 | m_assetService = assService; | 64 | m_assetService = assService; |
65 | } | 65 | } |
diff --git a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureServerConnector.cs b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureServerConnector.cs index 0d072f7..71cf033 100644 --- a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureServerConnector.cs +++ b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureServerConnector.cs | |||
@@ -62,8 +62,8 @@ namespace OpenSim.Capabilities.Handlers | |||
62 | if (m_AssetService == null) | 62 | if (m_AssetService == null) |
63 | throw new Exception(String.Format("Failed to load AssetService from {0}; config is {1}", assetService, m_ConfigName)); | 63 | throw new Exception(String.Format("Failed to load AssetService from {0}; config is {1}", assetService, m_ConfigName)); |
64 | 64 | ||
65 | server.AddStreamHandler(new GetTextureHandler("/CAPS/GetTexture/" /*+ UUID.Random() */, m_AssetService)); | 65 | server.AddStreamHandler( |
66 | new GetTextureHandler("/CAPS/GetTexture/" /*+ UUID.Random() */, m_AssetService, "GetTexture", null)); | ||
66 | } | 67 | } |
67 | |||
68 | } | 68 | } |
69 | } | 69 | } \ No newline at end of file |
diff --git a/OpenSim/Capabilities/Handlers/GetTexture/Tests/GetTextureHandlerTests.cs b/OpenSim/Capabilities/Handlers/GetTexture/Tests/GetTextureHandlerTests.cs index fd152c3..761e4e7 100644 --- a/OpenSim/Capabilities/Handlers/GetTexture/Tests/GetTextureHandlerTests.cs +++ b/OpenSim/Capabilities/Handlers/GetTexture/Tests/GetTextureHandlerTests.cs | |||
@@ -50,9 +50,9 @@ namespace OpenSim.Capabilities.Handlers.GetTexture.Tests | |||
50 | TestHelpers.InMethod(); | 50 | TestHelpers.InMethod(); |
51 | 51 | ||
52 | // Overkill - we only really need the asset service, not a whole scene. | 52 | // Overkill - we only really need the asset service, not a whole scene. |
53 | Scene scene = SceneHelpers.SetupScene(); | 53 | Scene scene = new SceneHelpers().SetupScene(); |
54 | 54 | ||
55 | GetTextureHandler handler = new GetTextureHandler(null, scene.AssetService); | 55 | GetTextureHandler handler = new GetTextureHandler(null, scene.AssetService, "TestGetTexture", null); |
56 | TestOSHttpRequest req = new TestOSHttpRequest(); | 56 | TestOSHttpRequest req = new TestOSHttpRequest(); |
57 | TestOSHttpResponse resp = new TestOSHttpResponse(); | 57 | TestOSHttpResponse resp = new TestOSHttpResponse(); |
58 | req.Url = new Uri("http://localhost/?texture_id=00000000-0000-1111-9999-000000000012"); | 58 | req.Url = new Uri("http://localhost/?texture_id=00000000-0000-1111-9999-000000000012"); |
diff --git a/OpenSim/Capabilities/Handlers/UploadBakedTexture/UploadBakedTextureHandler.cs b/OpenSim/Capabilities/Handlers/UploadBakedTexture/UploadBakedTextureHandler.cs index 594ce9d..8849a59 100644 --- a/OpenSim/Capabilities/Handlers/UploadBakedTexture/UploadBakedTextureHandler.cs +++ b/OpenSim/Capabilities/Handlers/UploadBakedTexture/UploadBakedTextureHandler.cs | |||
@@ -85,8 +85,8 @@ namespace OpenSim.Capabilities.Handlers | |||
85 | uploader.OnUpLoad += BakedTextureUploaded; | 85 | uploader.OnUpLoad += BakedTextureUploaded; |
86 | 86 | ||
87 | m_HostCapsObj.HttpListener.AddStreamHandler( | 87 | m_HostCapsObj.HttpListener.AddStreamHandler( |
88 | new BinaryStreamHandler("POST", capsBase + uploaderPath, | 88 | new BinaryStreamHandler( |
89 | uploader.uploaderCaps)); | 89 | "POST", capsBase + uploaderPath, uploader.uploaderCaps, "UploadBakedTexture", null)); |
90 | 90 | ||
91 | string protocol = "http://"; | 91 | string protocol = "http://"; |
92 | 92 | ||
diff --git a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs index d5c062b..849cad2 100644 --- a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs +++ b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs | |||
@@ -156,11 +156,12 @@ namespace OpenSim.Capabilities.Handlers | |||
156 | inv.Folders = new List<InventoryFolderBase>(); | 156 | inv.Folders = new List<InventoryFolderBase>(); |
157 | inv.Items = new List<InventoryItemBase>(); | 157 | inv.Items = new List<InventoryItemBase>(); |
158 | int version = 0; | 158 | int version = 0; |
159 | int descendents = 0; | ||
159 | 160 | ||
160 | inv | 161 | inv |
161 | = Fetch( | 162 | = Fetch( |
162 | invFetch.owner_id, invFetch.folder_id, invFetch.owner_id, | 163 | invFetch.owner_id, invFetch.folder_id, invFetch.owner_id, |
163 | invFetch.fetch_folders, invFetch.fetch_items, invFetch.sort_order, out version); | 164 | invFetch.fetch_folders, invFetch.fetch_items, invFetch.sort_order, out version, out descendents); |
164 | 165 | ||
165 | if (inv != null && inv.Folders != null) | 166 | if (inv != null && inv.Folders != null) |
166 | { | 167 | { |
@@ -168,6 +169,8 @@ namespace OpenSim.Capabilities.Handlers | |||
168 | { | 169 | { |
169 | contents.categories.Array.Add(ConvertInventoryFolder(invFolder)); | 170 | contents.categories.Array.Add(ConvertInventoryFolder(invFolder)); |
170 | } | 171 | } |
172 | |||
173 | descendents += inv.Folders.Count; | ||
171 | } | 174 | } |
172 | 175 | ||
173 | if (inv != null && inv.Items != null) | 176 | if (inv != null && inv.Items != null) |
@@ -178,7 +181,7 @@ namespace OpenSim.Capabilities.Handlers | |||
178 | } | 181 | } |
179 | } | 182 | } |
180 | 183 | ||
181 | contents.descendents = contents.items.Array.Count + contents.categories.Array.Count; | 184 | contents.descendents = descendents; |
182 | contents.version = version; | 185 | contents.version = version; |
183 | 186 | ||
184 | // m_log.DebugFormat( | 187 | // m_log.DebugFormat( |
@@ -206,7 +209,7 @@ namespace OpenSim.Capabilities.Handlers | |||
206 | /// <returns>An empty InventoryCollection if the inventory look up failed</returns> | 209 | /// <returns>An empty InventoryCollection if the inventory look up failed</returns> |
207 | private InventoryCollection Fetch( | 210 | private InventoryCollection Fetch( |
208 | UUID agentID, UUID folderID, UUID ownerID, | 211 | UUID agentID, UUID folderID, UUID ownerID, |
209 | bool fetchFolders, bool fetchItems, int sortOrder, out int version) | 212 | bool fetchFolders, bool fetchItems, int sortOrder, out int version, out int descendents) |
210 | { | 213 | { |
211 | // m_log.DebugFormat( | 214 | // m_log.DebugFormat( |
212 | // "[WEB FETCH INV DESC HANDLER]: Fetching folders ({0}), items ({1}) from {2} for agent {3}", | 215 | // "[WEB FETCH INV DESC HANDLER]: Fetching folders ({0}), items ({1}) from {2} for agent {3}", |
@@ -215,6 +218,8 @@ namespace OpenSim.Capabilities.Handlers | |||
215 | // FIXME MAYBE: We're not handling sortOrder! | 218 | // FIXME MAYBE: We're not handling sortOrder! |
216 | 219 | ||
217 | version = 0; | 220 | version = 0; |
221 | descendents = 0; | ||
222 | |||
218 | InventoryFolderImpl fold; | 223 | InventoryFolderImpl fold; |
219 | if (m_LibraryService != null && m_LibraryService.LibraryRootFolder != null && agentID == m_LibraryService.LibraryRootFolder.Owner) | 224 | if (m_LibraryService != null && m_LibraryService.LibraryRootFolder != null && agentID == m_LibraryService.LibraryRootFolder.Owner) |
220 | { | 225 | { |
@@ -223,6 +228,7 @@ namespace OpenSim.Capabilities.Handlers | |||
223 | InventoryCollection ret = new InventoryCollection(); | 228 | InventoryCollection ret = new InventoryCollection(); |
224 | ret.Folders = new List<InventoryFolderBase>(); | 229 | ret.Folders = new List<InventoryFolderBase>(); |
225 | ret.Items = fold.RequestListOfItems(); | 230 | ret.Items = fold.RequestListOfItems(); |
231 | descendents = ret.Folders.Count + ret.Items.Count; | ||
226 | 232 | ||
227 | return ret; | 233 | return ret; |
228 | } | 234 | } |
@@ -246,24 +252,71 @@ namespace OpenSim.Capabilities.Handlers | |||
246 | 252 | ||
247 | version = containingFolder.Version; | 253 | version = containingFolder.Version; |
248 | 254 | ||
249 | // if (fetchItems) | 255 | if (fetchItems) |
256 | { | ||
257 | List<InventoryItemBase> itemsToReturn = contents.Items; | ||
258 | List<InventoryItemBase> originalItems = new List<InventoryItemBase>(itemsToReturn); | ||
259 | |||
260 | // descendents must only include the links, not the linked items we add | ||
261 | descendents = originalItems.Count; | ||
262 | |||
263 | // Add target items for links in this folder before the links themselves. | ||
264 | foreach (InventoryItemBase item in originalItems) | ||
265 | { | ||
266 | if (item.AssetType == (int)AssetType.Link) | ||
267 | { | ||
268 | InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID)); | ||
269 | |||
270 | // Take care of genuinely broken links where the target doesn't exist | ||
271 | // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, | ||
272 | // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles | ||
273 | // rather than having to keep track of every folder requested in the recursion. | ||
274 | if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link) | ||
275 | itemsToReturn.Insert(0, linkedItem); | ||
276 | } | ||
277 | } | ||
278 | |||
279 | // Now scan for folder links and insert the items they target and those links at the head of the return data | ||
280 | foreach (InventoryItemBase item in originalItems) | ||
281 | { | ||
282 | if (item.AssetType == (int)AssetType.LinkFolder) | ||
283 | { | ||
284 | InventoryCollection linkedFolderContents = m_InventoryService.GetFolderContent(ownerID, item.AssetID); | ||
285 | List<InventoryItemBase> links = linkedFolderContents.Items; | ||
286 | |||
287 | itemsToReturn.InsertRange(0, links); | ||
288 | |||
289 | foreach (InventoryItemBase link in linkedFolderContents.Items) | ||
290 | { | ||
291 | // Take care of genuinely broken links where the target doesn't exist | ||
292 | // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, | ||
293 | // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles | ||
294 | // rather than having to keep track of every folder requested in the recursion. | ||
295 | if (link != null) | ||
296 | { | ||
297 | // m_log.DebugFormat( | ||
298 | // "[WEB FETCH INV DESC HANDLER]: Adding item {0} {1} from folder {2} linked from {3}", | ||
299 | // link.Name, (AssetType)link.AssetType, item.AssetID, containingFolder.Name); | ||
300 | |||
301 | InventoryItemBase linkedItem | ||
302 | = m_InventoryService.GetItem(new InventoryItemBase(link.AssetID)); | ||
303 | |||
304 | itemsToReturn.Insert(0, linkedItem); | ||
305 | } | ||
306 | } | ||
307 | } | ||
308 | } | ||
309 | } | ||
310 | |||
311 | // foreach (InventoryItemBase item in contents.Items) | ||
250 | // { | 312 | // { |
251 | // List<InventoryItemBase> linkedItemsToAdd = new List<InventoryItemBase>(); | 313 | // m_log.DebugFormat( |
252 | // | 314 | // "[WEB FETCH INV DESC HANDLER]: Returning item {0}, type {1}, parent {2} in {3} {4}", |
253 | // foreach (InventoryItemBase item in contents.Items) | 315 | // item.Name, (AssetType)item.AssetType, item.Folder, containingFolder.Name, containingFolder.ID); |
254 | // { | 316 | // } |
255 | // if (item.AssetType == (int)AssetType.Link) | 317 | |
256 | // { | 318 | // ===== |
257 | // InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID)); | 319 | |
258 | // | ||
259 | // // Take care of genuinely broken links where the target doesn't exist | ||
260 | // // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, | ||
261 | // // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles | ||
262 | // // rather than having to keep track of every folder requested in the recursion. | ||
263 | // if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link) | ||
264 | // linkedItemsToAdd.Insert(0, linkedItem); | ||
265 | // } | ||
266 | // } | ||
267 | // | 320 | // |
268 | // foreach (InventoryItemBase linkedItem in linkedItemsToAdd) | 321 | // foreach (InventoryItemBase linkedItem in linkedItemsToAdd) |
269 | // { | 322 | // { |
@@ -365,18 +418,8 @@ namespace OpenSim.Capabilities.Handlers | |||
365 | llsdItem.item_id = invItem.ID; | 418 | llsdItem.item_id = invItem.ID; |
366 | llsdItem.name = invItem.Name; | 419 | llsdItem.name = invItem.Name; |
367 | llsdItem.parent_id = invItem.Folder; | 420 | llsdItem.parent_id = invItem.Folder; |
368 | 421 | llsdItem.type = invItem.AssetType; | |
369 | try | 422 | llsdItem.inv_type = invItem.InvType; |
370 | { | ||
371 | llsdItem.type = Utils.AssetTypeToString((AssetType)invItem.AssetType); | ||
372 | llsdItem.inv_type = Utils.InventoryTypeToString((InventoryType)invItem.InvType); | ||
373 | } | ||
374 | catch (Exception e) | ||
375 | { | ||
376 | m_log.ErrorFormat( | ||
377 | "[WEB FETCH INV DESC HANDLER]: Problem setting asset {0} inventory {1} types while converting inventory item {2}: {3}", | ||
378 | invItem.AssetType, invItem.InvType, invItem.Name, e.Message); | ||
379 | } | ||
380 | 423 | ||
381 | llsdItem.permissions = new LLSDPermissions(); | 424 | llsdItem.permissions = new LLSDPermissions(); |
382 | llsdItem.permissions.creator_id = invItem.CreatorIdAsUuid; | 425 | llsdItem.permissions.creator_id = invItem.CreatorIdAsUuid; |
@@ -390,21 +433,7 @@ namespace OpenSim.Capabilities.Handlers | |||
390 | llsdItem.permissions.owner_mask = (int)invItem.CurrentPermissions; | 433 | llsdItem.permissions.owner_mask = (int)invItem.CurrentPermissions; |
391 | llsdItem.sale_info = new LLSDSaleInfo(); | 434 | llsdItem.sale_info = new LLSDSaleInfo(); |
392 | llsdItem.sale_info.sale_price = invItem.SalePrice; | 435 | llsdItem.sale_info.sale_price = invItem.SalePrice; |
393 | switch (invItem.SaleType) | 436 | llsdItem.sale_info.sale_type = invItem.SaleType; |
394 | { | ||
395 | default: | ||
396 | llsdItem.sale_info.sale_type = "not"; | ||
397 | break; | ||
398 | case 1: | ||
399 | llsdItem.sale_info.sale_type = "original"; | ||
400 | break; | ||
401 | case 2: | ||
402 | llsdItem.sale_info.sale_type = "copy"; | ||
403 | break; | ||
404 | case 3: | ||
405 | llsdItem.sale_info.sale_type = "contents"; | ||
406 | break; | ||
407 | } | ||
408 | 437 | ||
409 | return llsdItem; | 438 | return llsdItem; |
410 | } | 439 | } |
diff --git a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescServerConnector.cs b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescServerConnector.cs index 92eeb14..5d86557 100644 --- a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescServerConnector.cs +++ b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescServerConnector.cs | |||
@@ -68,7 +68,13 @@ namespace OpenSim.Capabilities.Handlers | |||
68 | ServerUtils.LoadPlugin<ILibraryService>(libService, args); | 68 | ServerUtils.LoadPlugin<ILibraryService>(libService, args); |
69 | 69 | ||
70 | WebFetchInvDescHandler webFetchHandler = new WebFetchInvDescHandler(m_InventoryService, m_LibraryService); | 70 | WebFetchInvDescHandler webFetchHandler = new WebFetchInvDescHandler(m_InventoryService, m_LibraryService); |
71 | IRequestHandler reqHandler = new RestStreamHandler("POST", "/CAPS/WebFetchInvDesc/" /*+ UUID.Random()*/, webFetchHandler.FetchInventoryDescendentsRequest); | 71 | IRequestHandler reqHandler |
72 | = new RestStreamHandler( | ||
73 | "POST", | ||
74 | "/CAPS/WebFetchInvDesc/" /*+ UUID.Random()*/, | ||
75 | webFetchHandler.FetchInventoryDescendentsRequest, | ||
76 | "WebFetchInvDesc", | ||
77 | null); | ||
72 | server.AddStreamHandler(reqHandler); | 78 | server.AddStreamHandler(reqHandler); |
73 | } | 79 | } |
74 | 80 | ||
diff --git a/OpenSim/Capabilities/LLSDEnvironmentSettings.cs b/OpenSim/Capabilities/LLSDEnvironmentSettings.cs new file mode 100644 index 0000000..39019af --- /dev/null +++ b/OpenSim/Capabilities/LLSDEnvironmentSettings.cs | |||
@@ -0,0 +1,68 @@ | |||
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 OpenMetaverse; | ||
31 | |||
32 | namespace OpenSim.Framework.Capabilities | ||
33 | { | ||
34 | [OSDMap] | ||
35 | public class LLSDEnvironmentRequest | ||
36 | { | ||
37 | public UUID messageID; | ||
38 | public UUID regionID; | ||
39 | } | ||
40 | |||
41 | [OSDMap] | ||
42 | public class LLSDEnvironmentSetResponse | ||
43 | { | ||
44 | public UUID regionID; | ||
45 | public UUID messageID; | ||
46 | public Boolean success; | ||
47 | public String fail_reason; | ||
48 | } | ||
49 | |||
50 | public class EnvironmentSettings | ||
51 | { | ||
52 | /// <summary> | ||
53 | /// generates a empty llsd settings response for viewer | ||
54 | /// </summary> | ||
55 | /// <param name="messageID">the message UUID</param> | ||
56 | /// <param name="regionID">the region UUID</param> | ||
57 | public static string EmptySettings(UUID messageID, UUID regionID) | ||
58 | { | ||
59 | OSDArray arr = new OSDArray(); | ||
60 | LLSDEnvironmentRequest msg = new LLSDEnvironmentRequest(); | ||
61 | msg.messageID = messageID; | ||
62 | msg.regionID = regionID; | ||
63 | arr.Array.Add(msg); | ||
64 | return LLSDHelpers.SerialiseLLSDReply(arr); | ||
65 | } | ||
66 | } | ||
67 | |||
68 | } | ||
diff --git a/OpenSim/Capabilities/LLSDInventoryItem.cs b/OpenSim/Capabilities/LLSDInventoryItem.cs index 426a6cb..958e807 100644 --- a/OpenSim/Capabilities/LLSDInventoryItem.cs +++ b/OpenSim/Capabilities/LLSDInventoryItem.cs | |||
@@ -37,8 +37,8 @@ namespace OpenSim.Framework.Capabilities | |||
37 | public UUID asset_id; | 37 | public UUID asset_id; |
38 | public UUID item_id; | 38 | public UUID item_id; |
39 | public LLSDPermissions permissions; | 39 | public LLSDPermissions permissions; |
40 | public string type; | 40 | public int type; |
41 | public string inv_type; | 41 | public int inv_type; |
42 | public int flags; | 42 | public int flags; |
43 | 43 | ||
44 | public LLSDSaleInfo sale_info; | 44 | public LLSDSaleInfo sale_info; |
@@ -65,7 +65,7 @@ namespace OpenSim.Framework.Capabilities | |||
65 | public class LLSDSaleInfo | 65 | public class LLSDSaleInfo |
66 | { | 66 | { |
67 | public int sale_price; | 67 | public int sale_price; |
68 | public string sale_type; | 68 | public int sale_type; |
69 | } | 69 | } |
70 | 70 | ||
71 | [OSDMap] | 71 | [OSDMap] |
diff --git a/OpenSim/Capabilities/LLSDStreamHandler.cs b/OpenSim/Capabilities/LLSDStreamHandler.cs index c7c1fc9..f5c728c 100644 --- a/OpenSim/Capabilities/LLSDStreamHandler.cs +++ b/OpenSim/Capabilities/LLSDStreamHandler.cs | |||
@@ -39,7 +39,11 @@ namespace OpenSim.Framework.Capabilities | |||
39 | private LLSDMethod<TRequest, TResponse> m_method; | 39 | private LLSDMethod<TRequest, TResponse> m_method; |
40 | 40 | ||
41 | public LLSDStreamhandler(string httpMethod, string path, LLSDMethod<TRequest, TResponse> method) | 41 | public LLSDStreamhandler(string httpMethod, string path, LLSDMethod<TRequest, TResponse> method) |
42 | : base(httpMethod, path) | 42 | : this(httpMethod, path, method, null, null) {} |
43 | |||
44 | public LLSDStreamhandler( | ||
45 | string httpMethod, string path, LLSDMethod<TRequest, TResponse> method, string name, string description) | ||
46 | : base(httpMethod, path, name, description) | ||
43 | { | 47 | { |
44 | m_method = method; | 48 | m_method = method; |
45 | } | 49 | } |
diff --git a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs index df496a7..47fb6d7 100644 --- a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs +++ b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs | |||
@@ -1181,6 +1181,72 @@ VALUES | |||
1181 | // } | 1181 | // } |
1182 | #endregion | 1182 | #endregion |
1183 | } | 1183 | } |
1184 | |||
1185 | #region Environment Settings | ||
1186 | public string LoadRegionEnvironmentSettings(UUID regionUUID) | ||
1187 | { | ||
1188 | string sql = "select * from [regionenvironment] where region_id = @region_id"; | ||
1189 | using (SqlConnection conn = new SqlConnection(m_connectionString)) | ||
1190 | using (SqlCommand cmd = new SqlCommand(sql, conn)) | ||
1191 | { | ||
1192 | cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionUUID)); | ||
1193 | conn.Open(); | ||
1194 | using (SqlDataReader result = cmd.ExecuteReader()) | ||
1195 | { | ||
1196 | if (!result.Read()) | ||
1197 | { | ||
1198 | return String.Empty; | ||
1199 | } | ||
1200 | else | ||
1201 | { | ||
1202 | return Convert.ToString(result["llsd_settings"]); | ||
1203 | } | ||
1204 | } | ||
1205 | } | ||
1206 | } | ||
1207 | |||
1208 | public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings) | ||
1209 | { | ||
1210 | { | ||
1211 | string sql = "DELETE FROM [regionenvironment] WHERE region_id = @region_id"; | ||
1212 | using (SqlConnection conn = new SqlConnection(m_connectionString)) | ||
1213 | |||
1214 | using (SqlCommand cmd = new SqlCommand(sql, conn)) | ||
1215 | { | ||
1216 | cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionUUID)); | ||
1217 | conn.Open(); | ||
1218 | cmd.ExecuteNonQuery(); | ||
1219 | } | ||
1220 | |||
1221 | sql = "INSERT INTO [regionenvironment] (region_id, llsd_settings) VALUES (@region_id, @llsd_settings)"; | ||
1222 | |||
1223 | using (SqlConnection conn = new SqlConnection(m_connectionString)) | ||
1224 | |||
1225 | using (SqlCommand cmd = new SqlCommand(sql, conn)) | ||
1226 | { | ||
1227 | cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionUUID)); | ||
1228 | cmd.Parameters.Add(_Database.CreateParameter("@llsd_settings", settings)); | ||
1229 | |||
1230 | conn.Open(); | ||
1231 | cmd.ExecuteNonQuery(); | ||
1232 | } | ||
1233 | } | ||
1234 | } | ||
1235 | |||
1236 | public void RemoveRegionEnvironmentSettings(UUID regionUUID) | ||
1237 | { | ||
1238 | string sql = "delete from [regionenvironment] where region_id = @region_id"; | ||
1239 | using (SqlConnection conn = new SqlConnection(m_connectionString)) | ||
1240 | using (SqlCommand cmd = new SqlCommand(sql, conn)) | ||
1241 | { | ||
1242 | cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionUUID)); | ||
1243 | |||
1244 | conn.Open(); | ||
1245 | cmd.ExecuteNonQuery(); | ||
1246 | } | ||
1247 | } | ||
1248 | #endregion | ||
1249 | |||
1184 | /// <summary> | 1250 | /// <summary> |
1185 | /// Loads the settings of a region. | 1251 | /// Loads the settings of a region. |
1186 | /// </summary> | 1252 | /// </summary> |
diff --git a/OpenSim/Data/MSSQL/Resources/RegionStore.migrations b/OpenSim/Data/MSSQL/Resources/RegionStore.migrations index d6a3be9..350e548 100644 --- a/OpenSim/Data/MSSQL/Resources/RegionStore.migrations +++ b/OpenSim/Data/MSSQL/Resources/RegionStore.migrations | |||
@@ -1134,3 +1134,17 @@ ALTER TABLE landaccesslist ADD Expires integer NOT NULL DEFAULT 0; | |||
1134 | 1134 | ||
1135 | COMMIT | 1135 | COMMIT |
1136 | 1136 | ||
1137 | :VERSION 37 #---------------- Environment Settings | ||
1138 | |||
1139 | BEGIN TRANSACTION | ||
1140 | |||
1141 | CREATE TABLE [dbo].[regionenvironment]( | ||
1142 | [region_id] [uniqueidentifier] NOT NULL, | ||
1143 | [llsd_settings] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, | ||
1144 | PRIMARY KEY CLUSTERED | ||
1145 | ( | ||
1146 | [region_id] ASC | ||
1147 | )WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] | ||
1148 | ) ON [PRIMARY] | ||
1149 | |||
1150 | COMMIT | ||
diff --git a/OpenSim/Data/MySQL/MySQLAssetData.cs b/OpenSim/Data/MySQL/MySQLAssetData.cs index a22dc0a..20df234 100644 --- a/OpenSim/Data/MySQL/MySQLAssetData.cs +++ b/OpenSim/Data/MySQL/MySQLAssetData.cs | |||
@@ -163,54 +163,53 @@ namespace OpenSim.Data.MySQL | |||
163 | { | 163 | { |
164 | dbcon.Open(); | 164 | dbcon.Open(); |
165 | 165 | ||
166 | MySqlCommand cmd = | 166 | using (MySqlCommand cmd = |
167 | new MySqlCommand( | 167 | new MySqlCommand( |
168 | "replace INTO assets(id, name, description, assetType, local, temporary, create_time, access_time, asset_flags, CreatorID, data)" + | 168 | "replace INTO assets(id, name, description, assetType, local, temporary, create_time, access_time, asset_flags, CreatorID, data)" + |
169 | "VALUES(?id, ?name, ?description, ?assetType, ?local, ?temporary, ?create_time, ?access_time, ?asset_flags, ?CreatorID, ?data)", | 169 | "VALUES(?id, ?name, ?description, ?assetType, ?local, ?temporary, ?create_time, ?access_time, ?asset_flags, ?CreatorID, ?data)", |
170 | dbcon); | 170 | dbcon)) |
171 | |||
172 | string assetName = asset.Name; | ||
173 | if (asset.Name.Length > 64) | ||
174 | { | ||
175 | assetName = asset.Name.Substring(0, 64); | ||
176 | m_log.Warn("[ASSET DB]: Name field truncated from " + asset.Name.Length + " to " + assetName.Length + " characters on add"); | ||
177 | } | ||
178 | |||
179 | string assetDescription = asset.Description; | ||
180 | if (asset.Description.Length > 64) | ||
181 | { | ||
182 | assetDescription = asset.Description.Substring(0, 64); | ||
183 | m_log.Warn("[ASSET DB]: Description field truncated from " + asset.Description.Length + " to " + assetDescription.Length + " characters on add"); | ||
184 | } | ||
185 | |||
186 | // need to ensure we dispose | ||
187 | try | ||
188 | { | 171 | { |
189 | using (cmd) | 172 | string assetName = asset.Name; |
173 | if (asset.Name.Length > 64) | ||
190 | { | 174 | { |
191 | // create unix epoch time | 175 | assetName = asset.Name.Substring(0, 64); |
192 | int now = (int)Utils.DateTimeToUnixTime(DateTime.UtcNow); | 176 | m_log.Warn("[ASSET DB]: Name field truncated from " + asset.Name.Length + " to " + assetName.Length + " characters on add"); |
193 | cmd.Parameters.AddWithValue("?id", asset.ID); | 177 | } |
194 | cmd.Parameters.AddWithValue("?name", assetName); | 178 | |
195 | cmd.Parameters.AddWithValue("?description", assetDescription); | 179 | string assetDescription = asset.Description; |
196 | cmd.Parameters.AddWithValue("?assetType", asset.Type); | 180 | if (asset.Description.Length > 64) |
197 | cmd.Parameters.AddWithValue("?local", asset.Local); | 181 | { |
198 | cmd.Parameters.AddWithValue("?temporary", asset.Temporary); | 182 | assetDescription = asset.Description.Substring(0, 64); |
199 | cmd.Parameters.AddWithValue("?create_time", now); | 183 | m_log.Warn("[ASSET DB]: Description field truncated from " + asset.Description.Length + " to " + assetDescription.Length + " characters on add"); |
200 | cmd.Parameters.AddWithValue("?access_time", now); | 184 | } |
201 | cmd.Parameters.AddWithValue("?CreatorID", asset.Metadata.CreatorID); | 185 | |
202 | cmd.Parameters.AddWithValue("?asset_flags", (int)asset.Flags); | 186 | try |
203 | cmd.Parameters.AddWithValue("?data", asset.Data); | 187 | { |
204 | cmd.ExecuteNonQuery(); | 188 | using (cmd) |
205 | cmd.Dispose(); | 189 | { |
206 | return true; | 190 | // create unix epoch time |
191 | int now = (int)Utils.DateTimeToUnixTime(DateTime.UtcNow); | ||
192 | cmd.Parameters.AddWithValue("?id", asset.ID); | ||
193 | cmd.Parameters.AddWithValue("?name", assetName); | ||
194 | cmd.Parameters.AddWithValue("?description", assetDescription); | ||
195 | cmd.Parameters.AddWithValue("?assetType", asset.Type); | ||
196 | cmd.Parameters.AddWithValue("?local", asset.Local); | ||
197 | cmd.Parameters.AddWithValue("?temporary", asset.Temporary); | ||
198 | cmd.Parameters.AddWithValue("?create_time", now); | ||
199 | cmd.Parameters.AddWithValue("?access_time", now); | ||
200 | cmd.Parameters.AddWithValue("?CreatorID", asset.Metadata.CreatorID); | ||
201 | cmd.Parameters.AddWithValue("?asset_flags", (int)asset.Flags); | ||
202 | cmd.Parameters.AddWithValue("?data", asset.Data); | ||
203 | cmd.ExecuteNonQuery(); | ||
204 | return true; | ||
205 | } | ||
206 | } | ||
207 | catch (Exception e) | ||
208 | { | ||
209 | m_log.ErrorFormat("[ASSET DB]: MySQL failure creating asset {0} with name \"{1}\". Error: {2}", | ||
210 | asset.FullID, asset.Name, e.Message); | ||
211 | return false; | ||
207 | } | 212 | } |
208 | } | ||
209 | catch (Exception e) | ||
210 | { | ||
211 | m_log.ErrorFormat("[ASSET DB]: MySQL failure creating asset {0} with name \"{1}\". Error: {2}", | ||
212 | asset.FullID, asset.Name, e.Message); | ||
213 | return false; | ||
214 | } | 213 | } |
215 | } | 214 | } |
216 | } | 215 | } |
@@ -223,33 +222,31 @@ namespace OpenSim.Data.MySQL | |||
223 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) | 222 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) |
224 | { | 223 | { |
225 | dbcon.Open(); | 224 | dbcon.Open(); |
226 | MySqlCommand cmd = | ||
227 | new MySqlCommand("update assets set access_time=?access_time where id=?id", | ||
228 | dbcon); | ||
229 | 225 | ||
230 | // need to ensure we dispose | 226 | using (MySqlCommand cmd |
231 | try | 227 | = new MySqlCommand("update assets set access_time=?access_time where id=?id", dbcon)) |
232 | { | 228 | { |
233 | using (cmd) | 229 | try |
234 | { | 230 | { |
235 | // create unix epoch time | 231 | using (cmd) |
236 | int now = (int)Utils.DateTimeToUnixTime(DateTime.UtcNow); | 232 | { |
237 | cmd.Parameters.AddWithValue("?id", asset.ID); | 233 | // create unix epoch time |
238 | cmd.Parameters.AddWithValue("?access_time", now); | 234 | int now = (int)Utils.DateTimeToUnixTime(DateTime.UtcNow); |
239 | cmd.ExecuteNonQuery(); | 235 | cmd.Parameters.AddWithValue("?id", asset.ID); |
240 | cmd.Dispose(); | 236 | cmd.Parameters.AddWithValue("?access_time", now); |
237 | cmd.ExecuteNonQuery(); | ||
238 | } | ||
239 | } | ||
240 | catch (Exception e) | ||
241 | { | ||
242 | m_log.ErrorFormat( | ||
243 | "[ASSETS DB]: " + | ||
244 | "MySql failure updating access_time for asset {0} with name {1}" + Environment.NewLine + e.ToString() | ||
245 | + Environment.NewLine + "Attempting reconnection", asset.FullID, asset.Name); | ||
241 | } | 246 | } |
242 | } | ||
243 | catch (Exception e) | ||
244 | { | ||
245 | m_log.ErrorFormat( | ||
246 | "[ASSETS DB]: " + | ||
247 | "MySql failure updating access_time for asset {0} with name {1}" + Environment.NewLine + e.ToString() | ||
248 | + Environment.NewLine + "Attempting reconnection", asset.FullID, asset.Name); | ||
249 | } | 247 | } |
250 | } | 248 | } |
251 | } | 249 | } |
252 | |||
253 | } | 250 | } |
254 | 251 | ||
255 | /// <summary> | 252 | /// <summary> |
@@ -312,35 +309,41 @@ namespace OpenSim.Data.MySQL | |||
312 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) | 309 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) |
313 | { | 310 | { |
314 | dbcon.Open(); | 311 | dbcon.Open(); |
315 | MySqlCommand cmd = new MySqlCommand("SELECT name,description,assetType,temporary,id,asset_flags,CreatorID FROM assets LIMIT ?start, ?count", dbcon); | ||
316 | cmd.Parameters.AddWithValue("?start", start); | ||
317 | cmd.Parameters.AddWithValue("?count", count); | ||
318 | 312 | ||
319 | try | 313 | using (MySqlCommand cmd |
314 | = new MySqlCommand( | ||
315 | "SELECT name,description,assetType,temporary,id,asset_flags,CreatorID FROM assets LIMIT ?start, ?count", | ||
316 | dbcon)) | ||
320 | { | 317 | { |
321 | using (MySqlDataReader dbReader = cmd.ExecuteReader()) | 318 | cmd.Parameters.AddWithValue("?start", start); |
319 | cmd.Parameters.AddWithValue("?count", count); | ||
320 | |||
321 | try | ||
322 | { | 322 | { |
323 | while (dbReader.Read()) | 323 | using (MySqlDataReader dbReader = cmd.ExecuteReader()) |
324 | { | 324 | { |
325 | AssetMetadata metadata = new AssetMetadata(); | 325 | while (dbReader.Read()) |
326 | metadata.Name = (string)dbReader["name"]; | 326 | { |
327 | metadata.Description = (string)dbReader["description"]; | 327 | AssetMetadata metadata = new AssetMetadata(); |
328 | metadata.Type = (sbyte)dbReader["assetType"]; | 328 | metadata.Name = (string)dbReader["name"]; |
329 | metadata.Temporary = Convert.ToBoolean(dbReader["temporary"]); // Not sure if this is correct. | 329 | metadata.Description = (string)dbReader["description"]; |
330 | metadata.Flags = (AssetFlags)Convert.ToInt32(dbReader["asset_flags"]); | 330 | metadata.Type = (sbyte)dbReader["assetType"]; |
331 | metadata.FullID = DBGuid.FromDB(dbReader["id"]); | 331 | metadata.Temporary = Convert.ToBoolean(dbReader["temporary"]); // Not sure if this is correct. |
332 | metadata.CreatorID = dbReader["CreatorID"].ToString(); | 332 | metadata.Flags = (AssetFlags)Convert.ToInt32(dbReader["asset_flags"]); |
333 | 333 | metadata.FullID = DBGuid.FromDB(dbReader["id"]); | |
334 | // Current SHA1s are not stored/computed. | 334 | metadata.CreatorID = dbReader["CreatorID"].ToString(); |
335 | metadata.SHA1 = new byte[] { }; | 335 | |
336 | 336 | // Current SHA1s are not stored/computed. | |
337 | retList.Add(metadata); | 337 | metadata.SHA1 = new byte[] { }; |
338 | |||
339 | retList.Add(metadata); | ||
340 | } | ||
338 | } | 341 | } |
339 | } | 342 | } |
340 | } | 343 | catch (Exception e) |
341 | catch (Exception e) | 344 | { |
342 | { | 345 | m_log.Error("[ASSETS DB]: MySql failure fetching asset set" + Environment.NewLine + e.ToString()); |
343 | m_log.Error("[ASSETS DB]: MySql failure fetching asset set" + Environment.NewLine + e.ToString()); | 346 | } |
344 | } | 347 | } |
345 | } | 348 | } |
346 | } | 349 | } |
@@ -355,11 +358,12 @@ namespace OpenSim.Data.MySQL | |||
355 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) | 358 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) |
356 | { | 359 | { |
357 | dbcon.Open(); | 360 | dbcon.Open(); |
358 | MySqlCommand cmd = new MySqlCommand("delete from assets where id=?id", dbcon); | ||
359 | cmd.Parameters.AddWithValue("?id", id); | ||
360 | cmd.ExecuteNonQuery(); | ||
361 | 361 | ||
362 | cmd.Dispose(); | 362 | using (MySqlCommand cmd = new MySqlCommand("delete from assets where id=?id", dbcon)) |
363 | { | ||
364 | cmd.Parameters.AddWithValue("?id", id); | ||
365 | cmd.ExecuteNonQuery(); | ||
366 | } | ||
363 | } | 367 | } |
364 | } | 368 | } |
365 | 369 | ||
diff --git a/OpenSim/Data/MySQL/MySQLAuthenticationData.cs b/OpenSim/Data/MySQL/MySQLAuthenticationData.cs index 8d82f61..7627497 100644 --- a/OpenSim/Data/MySQL/MySQLAuthenticationData.cs +++ b/OpenSim/Data/MySQL/MySQLAuthenticationData.cs | |||
@@ -70,99 +70,106 @@ namespace OpenSim.Data.MySQL | |||
70 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) | 70 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) |
71 | { | 71 | { |
72 | dbcon.Open(); | 72 | dbcon.Open(); |
73 | MySqlCommand cmd = new MySqlCommand("select * from `" + m_Realm + "` where UUID = ?principalID", dbcon); | ||
74 | cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); | ||
75 | |||
76 | IDataReader result = cmd.ExecuteReader(); | ||
77 | 73 | ||
78 | if (result.Read()) | 74 | using (MySqlCommand cmd |
75 | = new MySqlCommand("select * from `" + m_Realm + "` where UUID = ?principalID", dbcon)) | ||
79 | { | 76 | { |
80 | ret.PrincipalID = principalID; | 77 | cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); |
81 | 78 | ||
82 | if (m_ColumnNames == null) | 79 | IDataReader result = cmd.ExecuteReader(); |
80 | |||
81 | if (result.Read()) | ||
83 | { | 82 | { |
84 | m_ColumnNames = new List<string>(); | 83 | ret.PrincipalID = principalID; |
85 | 84 | ||
86 | DataTable schemaTable = result.GetSchemaTable(); | 85 | CheckColumnNames(result); |
87 | foreach (DataRow row in schemaTable.Rows) | 86 | |
88 | m_ColumnNames.Add(row["ColumnName"].ToString()); | 87 | foreach (string s in m_ColumnNames) |
88 | { | ||
89 | if (s == "UUID") | ||
90 | continue; | ||
91 | |||
92 | ret.Data[s] = result[s].ToString(); | ||
93 | } | ||
94 | |||
95 | return ret; | ||
89 | } | 96 | } |
90 | 97 | else | |
91 | foreach (string s in m_ColumnNames) | ||
92 | { | 98 | { |
93 | if (s == "UUID") | 99 | return null; |
94 | continue; | ||
95 | |||
96 | ret.Data[s] = result[s].ToString(); | ||
97 | } | 100 | } |
98 | |||
99 | return ret; | ||
100 | } | ||
101 | else | ||
102 | { | ||
103 | return null; | ||
104 | } | 101 | } |
105 | } | 102 | } |
106 | } | 103 | } |
107 | 104 | ||
108 | public bool Store(AuthenticationData data) | 105 | private void CheckColumnNames(IDataReader result) |
109 | { | 106 | { |
110 | if (data.Data.ContainsKey("UUID")) | 107 | if (m_ColumnNames != null) |
111 | data.Data.Remove("UUID"); | 108 | return; |
112 | 109 | ||
113 | string[] fields = new List<string>(data.Data.Keys).ToArray(); | 110 | List<string> columnNames = new List<string>(); |
114 | |||
115 | MySqlCommand cmd = new MySqlCommand(); | ||
116 | 111 | ||
117 | string update = "update `"+m_Realm+"` set "; | 112 | DataTable schemaTable = result.GetSchemaTable(); |
118 | bool first = true; | 113 | foreach (DataRow row in schemaTable.Rows) |
119 | foreach (string field in fields) | 114 | columnNames.Add(row["ColumnName"].ToString()); |
120 | { | ||
121 | if (!first) | ||
122 | update += ", "; | ||
123 | update += "`" + field + "` = ?"+field; | ||
124 | 115 | ||
125 | first = false; | 116 | m_ColumnNames = columnNames; |
126 | 117 | } | |
127 | cmd.Parameters.AddWithValue("?"+field, data.Data[field]); | ||
128 | } | ||
129 | 118 | ||
130 | update += " where UUID = ?principalID"; | 119 | public bool Store(AuthenticationData data) |
120 | { | ||
121 | if (data.Data.ContainsKey("UUID")) | ||
122 | data.Data.Remove("UUID"); | ||
131 | 123 | ||
132 | cmd.CommandText = update; | 124 | string[] fields = new List<string>(data.Data.Keys).ToArray(); |
133 | cmd.Parameters.AddWithValue("?principalID", data.PrincipalID.ToString()); | ||
134 | 125 | ||
135 | if (ExecuteNonQuery(cmd) < 1) | 126 | using (MySqlCommand cmd = new MySqlCommand()) |
136 | { | 127 | { |
137 | string insert = "insert into `" + m_Realm + "` (`UUID`, `" + | 128 | string update = "update `"+m_Realm+"` set "; |
138 | String.Join("`, `", fields) + | 129 | bool first = true; |
139 | "`) values (?principalID, ?" + String.Join(", ?", fields) + ")"; | 130 | foreach (string field in fields) |
140 | 131 | { | |
141 | cmd.CommandText = insert; | 132 | if (!first) |
142 | 133 | update += ", "; | |
134 | update += "`" + field + "` = ?"+field; | ||
135 | |||
136 | first = false; | ||
137 | |||
138 | cmd.Parameters.AddWithValue("?"+field, data.Data[field]); | ||
139 | } | ||
140 | |||
141 | update += " where UUID = ?principalID"; | ||
142 | |||
143 | cmd.CommandText = update; | ||
144 | cmd.Parameters.AddWithValue("?principalID", data.PrincipalID.ToString()); | ||
145 | |||
143 | if (ExecuteNonQuery(cmd) < 1) | 146 | if (ExecuteNonQuery(cmd) < 1) |
144 | { | 147 | { |
145 | cmd.Dispose(); | 148 | string insert = "insert into `" + m_Realm + "` (`UUID`, `" + |
146 | return false; | 149 | String.Join("`, `", fields) + |
150 | "`) values (?principalID, ?" + String.Join(", ?", fields) + ")"; | ||
151 | |||
152 | cmd.CommandText = insert; | ||
153 | |||
154 | if (ExecuteNonQuery(cmd) < 1) | ||
155 | return false; | ||
147 | } | 156 | } |
148 | } | 157 | } |
149 | 158 | ||
150 | cmd.Dispose(); | ||
151 | |||
152 | return true; | 159 | return true; |
153 | } | 160 | } |
154 | 161 | ||
155 | public bool SetDataItem(UUID principalID, string item, string value) | 162 | public bool SetDataItem(UUID principalID, string item, string value) |
156 | { | 163 | { |
157 | MySqlCommand cmd = new MySqlCommand("update `" + m_Realm + | 164 | using (MySqlCommand cmd |
158 | "` set `" + item + "` = ?" + item + " where UUID = ?UUID"); | 165 | = new MySqlCommand("update `" + m_Realm + "` set `" + item + "` = ?" + item + " where UUID = ?UUID")) |
159 | 166 | { | |
160 | 167 | cmd.Parameters.AddWithValue("?"+item, value); | |
161 | cmd.Parameters.AddWithValue("?"+item, value); | 168 | cmd.Parameters.AddWithValue("?UUID", principalID.ToString()); |
162 | cmd.Parameters.AddWithValue("?UUID", principalID.ToString()); | 169 | |
163 | 170 | if (ExecuteNonQuery(cmd) > 0) | |
164 | if (ExecuteNonQuery(cmd) > 0) | 171 | return true; |
165 | return true; | 172 | } |
166 | 173 | ||
167 | return false; | 174 | return false; |
168 | } | 175 | } |
@@ -172,18 +179,18 @@ namespace OpenSim.Data.MySQL | |||
172 | if (System.Environment.TickCount - m_LastExpire > 30000) | 179 | if (System.Environment.TickCount - m_LastExpire > 30000) |
173 | DoExpire(); | 180 | DoExpire(); |
174 | 181 | ||
175 | MySqlCommand cmd = new MySqlCommand("insert into tokens (UUID, token, validity) values (?principalID, ?token, date_add(now(), interval ?lifetime minute))"); | 182 | using (MySqlCommand cmd |
176 | cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); | 183 | = new MySqlCommand( |
177 | cmd.Parameters.AddWithValue("?token", token); | 184 | "insert into tokens (UUID, token, validity) values (?principalID, ?token, date_add(now(), interval ?lifetime minute))")) |
178 | cmd.Parameters.AddWithValue("?lifetime", lifetime.ToString()); | ||
179 | |||
180 | if (ExecuteNonQuery(cmd) > 0) | ||
181 | { | 185 | { |
182 | cmd.Dispose(); | 186 | cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); |
183 | return true; | 187 | cmd.Parameters.AddWithValue("?token", token); |
188 | cmd.Parameters.AddWithValue("?lifetime", lifetime.ToString()); | ||
189 | |||
190 | if (ExecuteNonQuery(cmd) > 0) | ||
191 | return true; | ||
184 | } | 192 | } |
185 | 193 | ||
186 | cmd.Dispose(); | ||
187 | return false; | 194 | return false; |
188 | } | 195 | } |
189 | 196 | ||
@@ -192,30 +199,29 @@ namespace OpenSim.Data.MySQL | |||
192 | if (System.Environment.TickCount - m_LastExpire > 30000) | 199 | if (System.Environment.TickCount - m_LastExpire > 30000) |
193 | DoExpire(); | 200 | DoExpire(); |
194 | 201 | ||
195 | MySqlCommand cmd = new MySqlCommand("update tokens set validity = date_add(now(), interval ?lifetime minute) where UUID = ?principalID and token = ?token and validity > now()"); | 202 | using (MySqlCommand cmd |
196 | cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); | 203 | = new MySqlCommand( |
197 | cmd.Parameters.AddWithValue("?token", token); | 204 | "update tokens set validity = date_add(now(), interval ?lifetime minute) where UUID = ?principalID and token = ?token and validity > now()")) |
198 | cmd.Parameters.AddWithValue("?lifetime", lifetime.ToString()); | ||
199 | |||
200 | if (ExecuteNonQuery(cmd) > 0) | ||
201 | { | 205 | { |
202 | cmd.Dispose(); | 206 | cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); |
203 | return true; | 207 | cmd.Parameters.AddWithValue("?token", token); |
204 | } | 208 | cmd.Parameters.AddWithValue("?lifetime", lifetime.ToString()); |
205 | 209 | ||
206 | cmd.Dispose(); | 210 | if (ExecuteNonQuery(cmd) > 0) |
211 | return true; | ||
212 | } | ||
207 | 213 | ||
208 | return false; | 214 | return false; |
209 | } | 215 | } |
210 | 216 | ||
211 | private void DoExpire() | 217 | private void DoExpire() |
212 | { | 218 | { |
213 | MySqlCommand cmd = new MySqlCommand("delete from tokens where validity < now()"); | 219 | using (MySqlCommand cmd = new MySqlCommand("delete from tokens where validity < now()")) |
214 | ExecuteNonQuery(cmd); | 220 | { |
215 | 221 | ExecuteNonQuery(cmd); | |
216 | cmd.Dispose(); | 222 | } |
217 | 223 | ||
218 | m_LastExpire = System.Environment.TickCount; | 224 | m_LastExpire = System.Environment.TickCount; |
219 | } | 225 | } |
220 | } | 226 | } |
221 | } | 227 | } \ No newline at end of file |
diff --git a/OpenSim/Data/MySQL/MySQLAvatarData.cs b/OpenSim/Data/MySQL/MySQLAvatarData.cs index 8c841ab..6a2f5d8 100644 --- a/OpenSim/Data/MySQL/MySQLAvatarData.cs +++ b/OpenSim/Data/MySQL/MySQLAvatarData.cs | |||
@@ -52,14 +52,15 @@ namespace OpenSim.Data.MySQL | |||
52 | 52 | ||
53 | public bool Delete(UUID principalID, string name) | 53 | public bool Delete(UUID principalID, string name) |
54 | { | 54 | { |
55 | MySqlCommand cmd = new MySqlCommand(); | 55 | using (MySqlCommand cmd = new MySqlCommand()) |
56 | 56 | { | |
57 | cmd.CommandText = String.Format("delete from {0} where `PrincipalID` = ?PrincipalID and `Name` = ?Name", m_Realm); | 57 | cmd.CommandText = String.Format("delete from {0} where `PrincipalID` = ?PrincipalID and `Name` = ?Name", m_Realm); |
58 | cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString()); | 58 | cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString()); |
59 | cmd.Parameters.AddWithValue("?Name", name); | 59 | cmd.Parameters.AddWithValue("?Name", name); |
60 | 60 | ||
61 | if (ExecuteNonQuery(cmd) > 0) | 61 | if (ExecuteNonQuery(cmd) > 0) |
62 | return true; | 62 | return true; |
63 | } | ||
63 | 64 | ||
64 | return false; | 65 | return false; |
65 | } | 66 | } |
diff --git a/OpenSim/Data/MySQL/MySQLFriendsData.cs b/OpenSim/Data/MySQL/MySQLFriendsData.cs index 130ba5e..3cd6b8f 100644 --- a/OpenSim/Data/MySQL/MySQLFriendsData.cs +++ b/OpenSim/Data/MySQL/MySQLFriendsData.cs | |||
@@ -49,34 +49,38 @@ namespace OpenSim.Data.MySQL | |||
49 | 49 | ||
50 | public bool Delete(string principalID, string friend) | 50 | public bool Delete(string principalID, string friend) |
51 | { | 51 | { |
52 | MySqlCommand cmd = new MySqlCommand(); | 52 | using (MySqlCommand cmd = new MySqlCommand()) |
53 | { | ||
54 | cmd.CommandText = String.Format("delete from {0} where PrincipalID = ?PrincipalID and Friend = ?Friend", m_Realm); | ||
55 | cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString()); | ||
56 | cmd.Parameters.AddWithValue("?Friend", friend); | ||
53 | 57 | ||
54 | cmd.CommandText = String.Format("delete from {0} where PrincipalID = ?PrincipalID and Friend = ?Friend", m_Realm); | 58 | ExecuteNonQuery(cmd); |
55 | cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString()); | 59 | } |
56 | cmd.Parameters.AddWithValue("?Friend", friend); | ||
57 | |||
58 | ExecuteNonQuery(cmd); | ||
59 | 60 | ||
60 | return true; | 61 | return true; |
61 | } | 62 | } |
62 | 63 | ||
63 | public FriendsData[] GetFriends(UUID principalID) | 64 | public FriendsData[] GetFriends(UUID principalID) |
64 | { | 65 | { |
65 | MySqlCommand cmd = new MySqlCommand(); | 66 | using (MySqlCommand cmd = new MySqlCommand()) |
66 | 67 | { | |
67 | cmd.CommandText = String.Format("select a.*,case when b.Flags is null then -1 else b.Flags end as TheirFlags from {0} as a left join {0} as b on a.PrincipalID = b.Friend and a.Friend = b.PrincipalID where a.PrincipalID = ?PrincipalID", m_Realm); | 68 | cmd.CommandText = String.Format("select a.*,case when b.Flags is null then -1 else b.Flags end as TheirFlags from {0} as a left join {0} as b on a.PrincipalID = b.Friend and a.Friend = b.PrincipalID where a.PrincipalID = ?PrincipalID", m_Realm); |
68 | cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString()); | 69 | cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString()); |
69 | 70 | ||
70 | return DoQuery(cmd); | 71 | return DoQuery(cmd); |
72 | } | ||
71 | } | 73 | } |
72 | 74 | ||
73 | public FriendsData[] GetFriends(string principalID) | 75 | public FriendsData[] GetFriends(string principalID) |
74 | { | 76 | { |
75 | MySqlCommand cmd = new MySqlCommand(); | 77 | using (MySqlCommand cmd = new MySqlCommand()) |
78 | { | ||
79 | cmd.CommandText = String.Format("select a.*,case when b.Flags is null then -1 else b.Flags end as TheirFlags from {0} as a left join {0} as b on a.PrincipalID = b.Friend and a.Friend = b.PrincipalID where a.PrincipalID LIKE ?PrincipalID", m_Realm); | ||
80 | cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString() + '%'); | ||
76 | 81 | ||
77 | cmd.CommandText = String.Format("select a.*,case when b.Flags is null then -1 else b.Flags end as TheirFlags from {0} as a left join {0} as b on a.PrincipalID = b.Friend and a.Friend = b.PrincipalID where a.PrincipalID LIKE ?PrincipalID", m_Realm); | 82 | return DoQuery(cmd); |
78 | cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString() + '%'); | 83 | } |
79 | return DoQuery(cmd); | ||
80 | } | 84 | } |
81 | } | 85 | } |
82 | } | 86 | } \ No newline at end of file |
diff --git a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs index 786b955..86367a1 100644 --- a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs +++ b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs | |||
@@ -91,15 +91,17 @@ namespace OpenSim.Data.MySQL | |||
91 | if (m_ColumnNames != null) | 91 | if (m_ColumnNames != null) |
92 | return; | 92 | return; |
93 | 93 | ||
94 | m_ColumnNames = new List<string>(); | 94 | List<string> columnNames = new List<string>(); |
95 | 95 | ||
96 | DataTable schemaTable = reader.GetSchemaTable(); | 96 | DataTable schemaTable = reader.GetSchemaTable(); |
97 | foreach (DataRow row in schemaTable.Rows) | 97 | foreach (DataRow row in schemaTable.Rows) |
98 | { | 98 | { |
99 | if (row["ColumnName"] != null && | 99 | if (row["ColumnName"] != null && |
100 | (!m_Fields.ContainsKey(row["ColumnName"].ToString()))) | 100 | (!m_Fields.ContainsKey(row["ColumnName"].ToString()))) |
101 | m_ColumnNames.Add(row["ColumnName"].ToString()); | 101 | columnNames.Add(row["ColumnName"].ToString()); |
102 | } | 102 | } |
103 | |||
104 | m_ColumnNames = columnNames; | ||
103 | } | 105 | } |
104 | 106 | ||
105 | public virtual T[] Get(string field, string key) | 107 | public virtual T[] Get(string field, string key) |
diff --git a/OpenSim/Data/MySQL/MySQLInventoryData.cs b/OpenSim/Data/MySQL/MySQLInventoryData.cs index 1a634e5..e9b10f3 100644 --- a/OpenSim/Data/MySQL/MySQLInventoryData.cs +++ b/OpenSim/Data/MySQL/MySQLInventoryData.cs | |||
@@ -467,43 +467,43 @@ namespace OpenSim.Data.MySQL | |||
467 | { | 467 | { |
468 | dbcon.Open(); | 468 | dbcon.Open(); |
469 | 469 | ||
470 | MySqlCommand result = new MySqlCommand(sql, dbcon); | 470 | using (MySqlCommand result = new MySqlCommand(sql, dbcon)) |
471 | result.Parameters.AddWithValue("?inventoryID", item.ID.ToString()); | ||
472 | result.Parameters.AddWithValue("?assetID", item.AssetID.ToString()); | ||
473 | result.Parameters.AddWithValue("?assetType", item.AssetType.ToString()); | ||
474 | result.Parameters.AddWithValue("?parentFolderID", item.Folder.ToString()); | ||
475 | result.Parameters.AddWithValue("?avatarID", item.Owner.ToString()); | ||
476 | result.Parameters.AddWithValue("?inventoryName", itemName); | ||
477 | result.Parameters.AddWithValue("?inventoryDescription", itemDesc); | ||
478 | result.Parameters.AddWithValue("?inventoryNextPermissions", item.NextPermissions.ToString()); | ||
479 | result.Parameters.AddWithValue("?inventoryCurrentPermissions", | ||
480 | item.CurrentPermissions.ToString()); | ||
481 | result.Parameters.AddWithValue("?invType", item.InvType); | ||
482 | result.Parameters.AddWithValue("?creatorID", item.CreatorId); | ||
483 | result.Parameters.AddWithValue("?inventoryBasePermissions", item.BasePermissions); | ||
484 | result.Parameters.AddWithValue("?inventoryEveryOnePermissions", item.EveryOnePermissions); | ||
485 | result.Parameters.AddWithValue("?inventoryGroupPermissions", item.GroupPermissions); | ||
486 | result.Parameters.AddWithValue("?salePrice", item.SalePrice); | ||
487 | result.Parameters.AddWithValue("?saleType", unchecked((sbyte)item.SaleType)); | ||
488 | result.Parameters.AddWithValue("?creationDate", item.CreationDate); | ||
489 | result.Parameters.AddWithValue("?groupID", item.GroupID); | ||
490 | result.Parameters.AddWithValue("?groupOwned", item.GroupOwned); | ||
491 | result.Parameters.AddWithValue("?flags", item.Flags); | ||
492 | |||
493 | lock (m_dbLock) | ||
494 | { | 471 | { |
495 | result.ExecuteNonQuery(); | 472 | result.Parameters.AddWithValue("?inventoryID", item.ID.ToString()); |
473 | result.Parameters.AddWithValue("?assetID", item.AssetID.ToString()); | ||
474 | result.Parameters.AddWithValue("?assetType", item.AssetType.ToString()); | ||
475 | result.Parameters.AddWithValue("?parentFolderID", item.Folder.ToString()); | ||
476 | result.Parameters.AddWithValue("?avatarID", item.Owner.ToString()); | ||
477 | result.Parameters.AddWithValue("?inventoryName", itemName); | ||
478 | result.Parameters.AddWithValue("?inventoryDescription", itemDesc); | ||
479 | result.Parameters.AddWithValue("?inventoryNextPermissions", item.NextPermissions.ToString()); | ||
480 | result.Parameters.AddWithValue("?inventoryCurrentPermissions", | ||
481 | item.CurrentPermissions.ToString()); | ||
482 | result.Parameters.AddWithValue("?invType", item.InvType); | ||
483 | result.Parameters.AddWithValue("?creatorID", item.CreatorId); | ||
484 | result.Parameters.AddWithValue("?inventoryBasePermissions", item.BasePermissions); | ||
485 | result.Parameters.AddWithValue("?inventoryEveryOnePermissions", item.EveryOnePermissions); | ||
486 | result.Parameters.AddWithValue("?inventoryGroupPermissions", item.GroupPermissions); | ||
487 | result.Parameters.AddWithValue("?salePrice", item.SalePrice); | ||
488 | result.Parameters.AddWithValue("?saleType", unchecked((sbyte)item.SaleType)); | ||
489 | result.Parameters.AddWithValue("?creationDate", item.CreationDate); | ||
490 | result.Parameters.AddWithValue("?groupID", item.GroupID); | ||
491 | result.Parameters.AddWithValue("?groupOwned", item.GroupOwned); | ||
492 | result.Parameters.AddWithValue("?flags", item.Flags); | ||
493 | |||
494 | lock (m_dbLock) | ||
495 | result.ExecuteNonQuery(); | ||
496 | |||
497 | result.Dispose(); | ||
496 | } | 498 | } |
497 | 499 | ||
498 | result.Dispose(); | 500 | using (MySqlCommand result = new MySqlCommand("update inventoryfolders set version=version+1 where folderID = ?folderID", dbcon)) |
499 | |||
500 | result = new MySqlCommand("update inventoryfolders set version=version+1 where folderID = ?folderID", dbcon); | ||
501 | result.Parameters.AddWithValue("?folderID", item.Folder.ToString()); | ||
502 | lock (m_dbLock) | ||
503 | { | 501 | { |
504 | result.ExecuteNonQuery(); | 502 | result.Parameters.AddWithValue("?folderID", item.Folder.ToString()); |
503 | |||
504 | lock (m_dbLock) | ||
505 | result.ExecuteNonQuery(); | ||
505 | } | 506 | } |
506 | result.Dispose(); | ||
507 | } | 507 | } |
508 | } | 508 | } |
509 | catch (MySqlException e) | 509 | catch (MySqlException e) |
@@ -533,12 +533,12 @@ namespace OpenSim.Data.MySQL | |||
533 | { | 533 | { |
534 | dbcon.Open(); | 534 | dbcon.Open(); |
535 | 535 | ||
536 | MySqlCommand cmd = new MySqlCommand("DELETE FROM inventoryitems WHERE inventoryID=?uuid", dbcon); | 536 | using (MySqlCommand cmd = new MySqlCommand("DELETE FROM inventoryitems WHERE inventoryID=?uuid", dbcon)) |
537 | cmd.Parameters.AddWithValue("?uuid", itemID.ToString()); | ||
538 | |||
539 | lock (m_dbLock) | ||
540 | { | 537 | { |
541 | cmd.ExecuteNonQuery(); | 538 | cmd.Parameters.AddWithValue("?uuid", itemID.ToString()); |
539 | |||
540 | lock (m_dbLock) | ||
541 | cmd.ExecuteNonQuery(); | ||
542 | } | 542 | } |
543 | } | 543 | } |
544 | } | 544 | } |
@@ -579,24 +579,26 @@ namespace OpenSim.Data.MySQL | |||
579 | { | 579 | { |
580 | dbcon.Open(); | 580 | dbcon.Open(); |
581 | 581 | ||
582 | MySqlCommand cmd = new MySqlCommand(sql, dbcon); | 582 | using (MySqlCommand cmd = new MySqlCommand(sql, dbcon)) |
583 | cmd.Parameters.AddWithValue("?folderID", folder.ID.ToString()); | ||
584 | cmd.Parameters.AddWithValue("?agentID", folder.Owner.ToString()); | ||
585 | cmd.Parameters.AddWithValue("?parentFolderID", folder.ParentID.ToString()); | ||
586 | cmd.Parameters.AddWithValue("?folderName", folderName); | ||
587 | cmd.Parameters.AddWithValue("?type", folder.Type); | ||
588 | cmd.Parameters.AddWithValue("?version", folder.Version); | ||
589 | |||
590 | try | ||
591 | { | 583 | { |
592 | lock (m_dbLock) | 584 | cmd.Parameters.AddWithValue("?folderID", folder.ID.ToString()); |
585 | cmd.Parameters.AddWithValue("?agentID", folder.Owner.ToString()); | ||
586 | cmd.Parameters.AddWithValue("?parentFolderID", folder.ParentID.ToString()); | ||
587 | cmd.Parameters.AddWithValue("?folderName", folderName); | ||
588 | cmd.Parameters.AddWithValue("?type", folder.Type); | ||
589 | cmd.Parameters.AddWithValue("?version", folder.Version); | ||
590 | |||
591 | try | ||
593 | { | 592 | { |
594 | cmd.ExecuteNonQuery(); | 593 | lock (m_dbLock) |
594 | { | ||
595 | cmd.ExecuteNonQuery(); | ||
596 | } | ||
597 | } | ||
598 | catch (Exception e) | ||
599 | { | ||
600 | m_log.Error(e.ToString()); | ||
595 | } | 601 | } |
596 | } | ||
597 | catch (Exception e) | ||
598 | { | ||
599 | m_log.Error(e.ToString()); | ||
600 | } | 602 | } |
601 | } | 603 | } |
602 | } | 604 | } |
@@ -624,20 +626,22 @@ namespace OpenSim.Data.MySQL | |||
624 | { | 626 | { |
625 | dbcon.Open(); | 627 | dbcon.Open(); |
626 | 628 | ||
627 | MySqlCommand cmd = new MySqlCommand(sql, dbcon); | 629 | using (MySqlCommand cmd = new MySqlCommand(sql, dbcon)) |
628 | cmd.Parameters.AddWithValue("?folderID", folder.ID.ToString()); | ||
629 | cmd.Parameters.AddWithValue("?parentFolderID", folder.ParentID.ToString()); | ||
630 | |||
631 | try | ||
632 | { | 630 | { |
633 | lock (m_dbLock) | 631 | cmd.Parameters.AddWithValue("?folderID", folder.ID.ToString()); |
632 | cmd.Parameters.AddWithValue("?parentFolderID", folder.ParentID.ToString()); | ||
633 | |||
634 | try | ||
634 | { | 635 | { |
635 | cmd.ExecuteNonQuery(); | 636 | lock (m_dbLock) |
637 | { | ||
638 | cmd.ExecuteNonQuery(); | ||
639 | } | ||
640 | } | ||
641 | catch (Exception e) | ||
642 | { | ||
643 | m_log.Error(e.ToString()); | ||
636 | } | 644 | } |
637 | } | ||
638 | catch (Exception e) | ||
639 | { | ||
640 | m_log.Error(e.ToString()); | ||
641 | } | 645 | } |
642 | } | 646 | } |
643 | } | 647 | } |
diff --git a/OpenSim/Data/MySQL/MySQLPresenceData.cs b/OpenSim/Data/MySQL/MySQLPresenceData.cs index fc625f0..7808060 100644 --- a/OpenSim/Data/MySQL/MySQLPresenceData.cs +++ b/OpenSim/Data/MySQL/MySQLPresenceData.cs | |||
@@ -63,13 +63,14 @@ namespace OpenSim.Data.MySQL | |||
63 | 63 | ||
64 | public void LogoutRegionAgents(UUID regionID) | 64 | public void LogoutRegionAgents(UUID regionID) |
65 | { | 65 | { |
66 | MySqlCommand cmd = new MySqlCommand(); | 66 | using (MySqlCommand cmd = new MySqlCommand()) |
67 | 67 | { | |
68 | cmd.CommandText = String.Format("delete from {0} where `RegionID`=?RegionID", m_Realm); | 68 | cmd.CommandText = String.Format("delete from {0} where `RegionID`=?RegionID", m_Realm); |
69 | 69 | ||
70 | cmd.Parameters.AddWithValue("?RegionID", regionID.ToString()); | 70 | cmd.Parameters.AddWithValue("?RegionID", regionID.ToString()); |
71 | 71 | ||
72 | ExecuteNonQuery(cmd); | 72 | ExecuteNonQuery(cmd); |
73 | } | ||
73 | } | 74 | } |
74 | 75 | ||
75 | public bool ReportAgent(UUID sessionID, UUID regionID) | 76 | public bool ReportAgent(UUID sessionID, UUID regionID) |
@@ -81,17 +82,18 @@ namespace OpenSim.Data.MySQL | |||
81 | if (regionID == UUID.Zero) | 82 | if (regionID == UUID.Zero) |
82 | return false; | 83 | return false; |
83 | 84 | ||
84 | MySqlCommand cmd = new MySqlCommand(); | 85 | using (MySqlCommand cmd = new MySqlCommand()) |
85 | 86 | { | |
86 | cmd.CommandText = String.Format("update {0} set RegionID=?RegionID, LastSeen=NOW() where `SessionID`=?SessionID", m_Realm); | 87 | cmd.CommandText = String.Format("update {0} set RegionID=?RegionID, LastSeen=NOW() where `SessionID`=?SessionID", m_Realm); |
87 | 88 | ||
88 | cmd.Parameters.AddWithValue("?SessionID", sessionID.ToString()); | 89 | cmd.Parameters.AddWithValue("?SessionID", sessionID.ToString()); |
89 | cmd.Parameters.AddWithValue("?RegionID", regionID.ToString()); | 90 | cmd.Parameters.AddWithValue("?RegionID", regionID.ToString()); |
90 | 91 | ||
91 | if (ExecuteNonQuery(cmd) == 0) | 92 | if (ExecuteNonQuery(cmd) == 0) |
92 | return false; | 93 | return false; |
94 | } | ||
93 | 95 | ||
94 | return true; | 96 | return true; |
95 | } | 97 | } |
96 | } | 98 | } |
97 | } | 99 | } \ No newline at end of file |
diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs index c20c392..0614879 100644 --- a/OpenSim/Data/MySQL/MySQLRegionData.cs +++ b/OpenSim/Data/MySQL/MySQLRegionData.cs | |||
@@ -162,17 +162,7 @@ namespace OpenSim.Data.MySQL | |||
162 | ret.sizeX = Convert.ToInt32(result["sizeX"]); | 162 | ret.sizeX = Convert.ToInt32(result["sizeX"]); |
163 | ret.sizeY = Convert.ToInt32(result["sizeY"]); | 163 | ret.sizeY = Convert.ToInt32(result["sizeY"]); |
164 | 164 | ||
165 | if (m_ColumnNames == null) | 165 | CheckColumnNames(result); |
166 | { | ||
167 | m_ColumnNames = new List<string>(); | ||
168 | |||
169 | DataTable schemaTable = result.GetSchemaTable(); | ||
170 | foreach (DataRow row in schemaTable.Rows) | ||
171 | { | ||
172 | if (row["ColumnName"] != null) | ||
173 | m_ColumnNames.Add(row["ColumnName"].ToString()); | ||
174 | } | ||
175 | } | ||
176 | 166 | ||
177 | foreach (string s in m_ColumnNames) | 167 | foreach (string s in m_ColumnNames) |
178 | { | 168 | { |
@@ -187,7 +177,11 @@ namespace OpenSim.Data.MySQL | |||
187 | if (s == "locY") | 177 | if (s == "locY") |
188 | continue; | 178 | continue; |
189 | 179 | ||
190 | ret.Data[s] = result[s].ToString(); | 180 | object value = result[s]; |
181 | if (value is DBNull) | ||
182 | ret.Data[s] = null; | ||
183 | else | ||
184 | ret.Data[s] = result[s].ToString(); | ||
191 | } | 185 | } |
192 | 186 | ||
193 | retList.Add(ret); | 187 | retList.Add(ret); |
@@ -198,6 +192,23 @@ namespace OpenSim.Data.MySQL | |||
198 | return retList; | 192 | return retList; |
199 | } | 193 | } |
200 | 194 | ||
195 | private void CheckColumnNames(IDataReader result) | ||
196 | { | ||
197 | if (m_ColumnNames != null) | ||
198 | return; | ||
199 | |||
200 | List<string> columnNames = new List<string>(); | ||
201 | |||
202 | DataTable schemaTable = result.GetSchemaTable(); | ||
203 | foreach (DataRow row in schemaTable.Rows) | ||
204 | { | ||
205 | if (row["ColumnName"] != null) | ||
206 | columnNames.Add(row["ColumnName"].ToString()); | ||
207 | } | ||
208 | |||
209 | m_ColumnNames = columnNames; | ||
210 | } | ||
211 | |||
201 | public bool Store(RegionData data) | 212 | public bool Store(RegionData data) |
202 | { | 213 | { |
203 | if (data.Data.ContainsKey("uuid")) | 214 | if (data.Data.ContainsKey("uuid")) |
@@ -318,11 +329,12 @@ namespace OpenSim.Data.MySQL | |||
318 | if (scopeID != UUID.Zero) | 329 | if (scopeID != UUID.Zero) |
319 | command += " and ScopeID = ?scopeID"; | 330 | command += " and ScopeID = ?scopeID"; |
320 | 331 | ||
321 | MySqlCommand cmd = new MySqlCommand(command); | 332 | using (MySqlCommand cmd = new MySqlCommand(command)) |
322 | 333 | { | |
323 | cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString()); | 334 | cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString()); |
324 | 335 | ||
325 | return RunCommand(cmd); | 336 | return RunCommand(cmd); |
337 | } | ||
326 | } | 338 | } |
327 | } | 339 | } |
328 | } | 340 | } \ No newline at end of file |
diff --git a/OpenSim/Data/MySQL/MySQLSimulationData.cs b/OpenSim/Data/MySQL/MySQLSimulationData.cs index 1999d89..4e7c8af 100644 --- a/OpenSim/Data/MySQL/MySQLSimulationData.cs +++ b/OpenSim/Data/MySQL/MySQLSimulationData.cs | |||
@@ -131,120 +131,120 @@ namespace OpenSim.Data.MySQL | |||
131 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) | 131 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) |
132 | { | 132 | { |
133 | dbcon.Open(); | 133 | dbcon.Open(); |
134 | MySqlCommand cmd = dbcon.CreateCommand(); | ||
135 | 134 | ||
136 | foreach (SceneObjectPart prim in obj.Parts) | 135 | using (MySqlCommand cmd = dbcon.CreateCommand()) |
137 | { | 136 | { |
138 | cmd.Parameters.Clear(); | 137 | foreach (SceneObjectPart prim in obj.Parts) |
138 | { | ||
139 | cmd.Parameters.Clear(); | ||
139 | 140 | ||
140 | cmd.CommandText = "replace into prims (" + | 141 | cmd.CommandText = "replace into prims (" + |
141 | "UUID, CreationDate, " + | 142 | "UUID, CreationDate, " + |
142 | "Name, Text, Description, " + | 143 | "Name, Text, Description, " + |
143 | "SitName, TouchName, ObjectFlags, " + | 144 | "SitName, TouchName, ObjectFlags, " + |
144 | "OwnerMask, NextOwnerMask, GroupMask, " + | 145 | "OwnerMask, NextOwnerMask, GroupMask, " + |
145 | "EveryoneMask, BaseMask, PositionX, " + | 146 | "EveryoneMask, BaseMask, PositionX, " + |
146 | "PositionY, PositionZ, GroupPositionX, " + | 147 | "PositionY, PositionZ, GroupPositionX, " + |
147 | "GroupPositionY, GroupPositionZ, VelocityX, " + | 148 | "GroupPositionY, GroupPositionZ, VelocityX, " + |
148 | "VelocityY, VelocityZ, AngularVelocityX, " + | 149 | "VelocityY, VelocityZ, AngularVelocityX, " + |
149 | "AngularVelocityY, AngularVelocityZ, " + | 150 | "AngularVelocityY, AngularVelocityZ, " + |
150 | "AccelerationX, AccelerationY, " + | 151 | "AccelerationX, AccelerationY, " + |
151 | "AccelerationZ, RotationX, " + | 152 | "AccelerationZ, RotationX, " + |
152 | "RotationY, RotationZ, " + | 153 | "RotationY, RotationZ, " + |
153 | "RotationW, SitTargetOffsetX, " + | 154 | "RotationW, SitTargetOffsetX, " + |
154 | "SitTargetOffsetY, SitTargetOffsetZ, " + | 155 | "SitTargetOffsetY, SitTargetOffsetZ, " + |
155 | "SitTargetOrientW, SitTargetOrientX, " + | 156 | "SitTargetOrientW, SitTargetOrientX, " + |
156 | "SitTargetOrientY, SitTargetOrientZ, " + | 157 | "SitTargetOrientY, SitTargetOrientZ, " + |
157 | "RegionUUID, CreatorID, " + | 158 | "RegionUUID, CreatorID, " + |
158 | "OwnerID, GroupID, " + | 159 | "OwnerID, GroupID, " + |
159 | "LastOwnerID, SceneGroupID, " + | 160 | "LastOwnerID, SceneGroupID, " + |
160 | "PayPrice, PayButton1, " + | 161 | "PayPrice, PayButton1, " + |
161 | "PayButton2, PayButton3, " + | 162 | "PayButton2, PayButton3, " + |
162 | "PayButton4, LoopedSound, " + | 163 | "PayButton4, LoopedSound, " + |
163 | "LoopedSoundGain, TextureAnimation, " + | 164 | "LoopedSoundGain, TextureAnimation, " + |
164 | "OmegaX, OmegaY, OmegaZ, " + | 165 | "OmegaX, OmegaY, OmegaZ, " + |
165 | "CameraEyeOffsetX, CameraEyeOffsetY, " + | 166 | "CameraEyeOffsetX, CameraEyeOffsetY, " + |
166 | "CameraEyeOffsetZ, CameraAtOffsetX, " + | 167 | "CameraEyeOffsetZ, CameraAtOffsetX, " + |
167 | "CameraAtOffsetY, CameraAtOffsetZ, " + | 168 | "CameraAtOffsetY, CameraAtOffsetZ, " + |
168 | "ForceMouselook, ScriptAccessPin, " + | 169 | "ForceMouselook, ScriptAccessPin, " + |
169 | "AllowedDrop, DieAtEdge, " + | 170 | "AllowedDrop, DieAtEdge, " + |
170 | "SalePrice, SaleType, " + | 171 | "SalePrice, SaleType, " + |
171 | "ColorR, ColorG, ColorB, ColorA, " + | 172 | "ColorR, ColorG, ColorB, ColorA, " + |
172 | "ParticleSystem, ClickAction, Material, " + | 173 | "ParticleSystem, ClickAction, Material, " + |
173 | "CollisionSound, CollisionSoundVolume, " + | 174 | "CollisionSound, CollisionSoundVolume, " + |
174 | "PassTouches, " + | 175 | "PassTouches, " + |
175 | "PassCollisions, " + | 176 | "PassCollisions, " + |
176 | "LinkNumber, MediaURL, KeyframeMotion, " + | 177 | "LinkNumber, MediaURL, KeyframeMotion, " + |
177 | "PhysicsShapeType, Density, GravityModifier, " + | 178 | "PhysicsShapeType, Density, GravityModifier, " + |
178 | "Friction, Restitution) values (" + "?UUID, " + | 179 | "Friction, Restitution) values (" + "?UUID, " + |
179 | "?CreationDate, ?Name, ?Text, " + | 180 | "?CreationDate, ?Name, ?Text, " + |
180 | "?Description, ?SitName, ?TouchName, " + | 181 | "?Description, ?SitName, ?TouchName, " + |
181 | "?ObjectFlags, ?OwnerMask, ?NextOwnerMask, " + | 182 | "?ObjectFlags, ?OwnerMask, ?NextOwnerMask, " + |
182 | "?GroupMask, ?EveryoneMask, ?BaseMask, " + | 183 | "?GroupMask, ?EveryoneMask, ?BaseMask, " + |
183 | "?PositionX, ?PositionY, ?PositionZ, " + | 184 | "?PositionX, ?PositionY, ?PositionZ, " + |
184 | "?GroupPositionX, ?GroupPositionY, " + | 185 | "?GroupPositionX, ?GroupPositionY, " + |
185 | "?GroupPositionZ, ?VelocityX, " + | 186 | "?GroupPositionZ, ?VelocityX, " + |
186 | "?VelocityY, ?VelocityZ, ?AngularVelocityX, " + | 187 | "?VelocityY, ?VelocityZ, ?AngularVelocityX, " + |
187 | "?AngularVelocityY, ?AngularVelocityZ, " + | 188 | "?AngularVelocityY, ?AngularVelocityZ, " + |
188 | "?AccelerationX, ?AccelerationY, " + | 189 | "?AccelerationX, ?AccelerationY, " + |
189 | "?AccelerationZ, ?RotationX, " + | 190 | "?AccelerationZ, ?RotationX, " + |
190 | "?RotationY, ?RotationZ, " + | 191 | "?RotationY, ?RotationZ, " + |
191 | "?RotationW, ?SitTargetOffsetX, " + | 192 | "?RotationW, ?SitTargetOffsetX, " + |
192 | "?SitTargetOffsetY, ?SitTargetOffsetZ, " + | 193 | "?SitTargetOffsetY, ?SitTargetOffsetZ, " + |
193 | "?SitTargetOrientW, ?SitTargetOrientX, " + | 194 | "?SitTargetOrientW, ?SitTargetOrientX, " + |
194 | "?SitTargetOrientY, ?SitTargetOrientZ, " + | 195 | "?SitTargetOrientY, ?SitTargetOrientZ, " + |
195 | "?RegionUUID, ?CreatorID, ?OwnerID, " + | 196 | "?RegionUUID, ?CreatorID, ?OwnerID, " + |
196 | "?GroupID, ?LastOwnerID, ?SceneGroupID, " + | 197 | "?GroupID, ?LastOwnerID, ?SceneGroupID, " + |
197 | "?PayPrice, ?PayButton1, ?PayButton2, " + | 198 | "?PayPrice, ?PayButton1, ?PayButton2, " + |
198 | "?PayButton3, ?PayButton4, ?LoopedSound, " + | 199 | "?PayButton3, ?PayButton4, ?LoopedSound, " + |
199 | "?LoopedSoundGain, ?TextureAnimation, " + | 200 | "?LoopedSoundGain, ?TextureAnimation, " + |
200 | "?OmegaX, ?OmegaY, ?OmegaZ, " + | 201 | "?OmegaX, ?OmegaY, ?OmegaZ, " + |
201 | "?CameraEyeOffsetX, ?CameraEyeOffsetY, " + | 202 | "?CameraEyeOffsetX, ?CameraEyeOffsetY, " + |
202 | "?CameraEyeOffsetZ, ?CameraAtOffsetX, " + | 203 | "?CameraEyeOffsetZ, ?CameraAtOffsetX, " + |
203 | "?CameraAtOffsetY, ?CameraAtOffsetZ, " + | 204 | "?CameraAtOffsetY, ?CameraAtOffsetZ, " + |
204 | "?ForceMouselook, ?ScriptAccessPin, " + | 205 | "?ForceMouselook, ?ScriptAccessPin, " + |
205 | "?AllowedDrop, ?DieAtEdge, ?SalePrice, " + | 206 | "?AllowedDrop, ?DieAtEdge, ?SalePrice, " + |
206 | "?SaleType, ?ColorR, ?ColorG, " + | 207 | "?SaleType, ?ColorR, ?ColorG, " + |
207 | "?ColorB, ?ColorA, ?ParticleSystem, " + | 208 | "?ColorB, ?ColorA, ?ParticleSystem, " + |
208 | "?ClickAction, ?Material, ?CollisionSound, " + | 209 | "?ClickAction, ?Material, ?CollisionSound, " + |
209 | "?CollisionSoundVolume, ?PassTouches, ?PassCollisions, " + | 210 | "?CollisionSoundVolume, ?PassTouches, ?PassCollisions, " + |
210 | "?LinkNumber, ?MediaURL, ?KeyframeMotion, " + | 211 | "?LinkNumber, ?MediaURL, ?KeyframeMotion, " + |
211 | "?PhysicsShapeType, ?Density, ?GravityModifier, " + | 212 | "?PhysicsShapeType, ?Density, ?GravityModifier, " + |
212 | "?Friction, ?Restitution)"; | 213 | "?Friction, ?Restitution)"; |
213 | 214 | ||
214 | FillPrimCommand(cmd, prim, obj.UUID, regionUUID); | 215 | FillPrimCommand(cmd, prim, obj.UUID, regionUUID); |
215 | 216 | ||
216 | ExecuteNonQuery(cmd); | 217 | ExecuteNonQuery(cmd); |
217 | 218 | ||
218 | cmd.Parameters.Clear(); | 219 | cmd.Parameters.Clear(); |
219 | 220 | ||
220 | cmd.CommandText = "replace into primshapes (" + | 221 | cmd.CommandText = "replace into primshapes (" + |
221 | "UUID, Shape, ScaleX, ScaleY, " + | 222 | "UUID, Shape, ScaleX, ScaleY, " + |
222 | "ScaleZ, PCode, PathBegin, PathEnd, " + | 223 | "ScaleZ, PCode, PathBegin, PathEnd, " + |
223 | "PathScaleX, PathScaleY, PathShearX, " + | 224 | "PathScaleX, PathScaleY, PathShearX, " + |
224 | "PathShearY, PathSkew, PathCurve, " + | 225 | "PathShearY, PathSkew, PathCurve, " + |
225 | "PathRadiusOffset, PathRevolutions, " + | 226 | "PathRadiusOffset, PathRevolutions, " + |
226 | "PathTaperX, PathTaperY, PathTwist, " + | 227 | "PathTaperX, PathTaperY, PathTwist, " + |
227 | "PathTwistBegin, ProfileBegin, ProfileEnd, " + | 228 | "PathTwistBegin, ProfileBegin, ProfileEnd, " + |
228 | "ProfileCurve, ProfileHollow, Texture, " + | 229 | "ProfileCurve, ProfileHollow, Texture, " + |
229 | "ExtraParams, State, Media) values (?UUID, " + | 230 | "ExtraParams, State, Media) values (?UUID, " + |
230 | "?Shape, ?ScaleX, ?ScaleY, ?ScaleZ, " + | 231 | "?Shape, ?ScaleX, ?ScaleY, ?ScaleZ, " + |
231 | "?PCode, ?PathBegin, ?PathEnd, " + | 232 | "?PCode, ?PathBegin, ?PathEnd, " + |
232 | "?PathScaleX, ?PathScaleY, " + | 233 | "?PathScaleX, ?PathScaleY, " + |
233 | "?PathShearX, ?PathShearY, " + | 234 | "?PathShearX, ?PathShearY, " + |
234 | "?PathSkew, ?PathCurve, ?PathRadiusOffset, " + | 235 | "?PathSkew, ?PathCurve, ?PathRadiusOffset, " + |
235 | "?PathRevolutions, ?PathTaperX, " + | 236 | "?PathRevolutions, ?PathTaperX, " + |
236 | "?PathTaperY, ?PathTwist, " + | 237 | "?PathTaperY, ?PathTwist, " + |
237 | "?PathTwistBegin, ?ProfileBegin, " + | 238 | "?PathTwistBegin, ?ProfileBegin, " + |
238 | "?ProfileEnd, ?ProfileCurve, " + | 239 | "?ProfileEnd, ?ProfileCurve, " + |
239 | "?ProfileHollow, ?Texture, ?ExtraParams, " + | 240 | "?ProfileHollow, ?Texture, ?ExtraParams, " + |
240 | "?State, ?Media)"; | 241 | "?State, ?Media)"; |
241 | 242 | ||
242 | FillShapeCommand(cmd, prim); | 243 | FillShapeCommand(cmd, prim); |
243 | 244 | ||
244 | ExecuteNonQuery(cmd); | 245 | ExecuteNonQuery(cmd); |
246 | } | ||
245 | } | 247 | } |
246 | |||
247 | cmd.Dispose(); | ||
248 | } | 248 | } |
249 | } | 249 | } |
250 | } | 250 | } |
@@ -996,6 +996,68 @@ namespace OpenSim.Data.MySQL | |||
996 | } | 996 | } |
997 | } | 997 | } |
998 | 998 | ||
999 | #region RegionEnvironmentSettings | ||
1000 | public string LoadRegionEnvironmentSettings(UUID regionUUID) | ||
1001 | { | ||
1002 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) | ||
1003 | { | ||
1004 | dbcon.Open(); | ||
1005 | |||
1006 | string command = "select * from `regionenvironment` where region_id = ?region_id"; | ||
1007 | |||
1008 | using (MySqlCommand cmd = new MySqlCommand(command)) | ||
1009 | { | ||
1010 | cmd.Connection = dbcon; | ||
1011 | |||
1012 | cmd.Parameters.AddWithValue("?region_id", regionUUID.ToString()); | ||
1013 | |||
1014 | IDataReader result = ExecuteReader(cmd); | ||
1015 | if (!result.Read()) | ||
1016 | { | ||
1017 | return String.Empty; | ||
1018 | } | ||
1019 | else | ||
1020 | { | ||
1021 | return Convert.ToString(result["llsd_settings"]); | ||
1022 | } | ||
1023 | } | ||
1024 | } | ||
1025 | } | ||
1026 | |||
1027 | public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings) | ||
1028 | { | ||
1029 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) | ||
1030 | { | ||
1031 | dbcon.Open(); | ||
1032 | |||
1033 | using (MySqlCommand cmd = dbcon.CreateCommand()) | ||
1034 | { | ||
1035 | cmd.CommandText = "REPLACE INTO `regionenvironment` (`region_id`, `llsd_settings`) VALUES (?region_id, ?llsd_settings)"; | ||
1036 | |||
1037 | cmd.Parameters.AddWithValue("region_id", regionUUID); | ||
1038 | cmd.Parameters.AddWithValue("llsd_settings", settings); | ||
1039 | |||
1040 | ExecuteNonQuery(cmd); | ||
1041 | } | ||
1042 | } | ||
1043 | } | ||
1044 | |||
1045 | public void RemoveRegionEnvironmentSettings(UUID regionUUID) | ||
1046 | { | ||
1047 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) | ||
1048 | { | ||
1049 | dbcon.Open(); | ||
1050 | |||
1051 | using (MySqlCommand cmd = dbcon.CreateCommand()) | ||
1052 | { | ||
1053 | cmd.CommandText = "delete from `regionenvironment` where region_id = ?region_id"; | ||
1054 | cmd.Parameters.AddWithValue("?region_id", regionUUID.ToString()); | ||
1055 | ExecuteNonQuery(cmd); | ||
1056 | } | ||
1057 | } | ||
1058 | } | ||
1059 | #endregion | ||
1060 | |||
999 | public virtual void StoreRegionSettings(RegionSettings rs) | 1061 | public virtual void StoreRegionSettings(RegionSettings rs) |
1000 | { | 1062 | { |
1001 | lock (m_dbLock) | 1063 | lock (m_dbLock) |
@@ -1874,41 +1936,40 @@ namespace OpenSim.Data.MySQL | |||
1874 | { | 1936 | { |
1875 | RemoveItems(primID); | 1937 | RemoveItems(primID); |
1876 | 1938 | ||
1939 | if (items.Count == 0) | ||
1940 | return; | ||
1941 | |||
1877 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) | 1942 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) |
1878 | { | 1943 | { |
1879 | dbcon.Open(); | 1944 | dbcon.Open(); |
1880 | 1945 | ||
1881 | MySqlCommand cmd = dbcon.CreateCommand(); | 1946 | using (MySqlCommand cmd = dbcon.CreateCommand()) |
1882 | |||
1883 | if (items.Count == 0) | ||
1884 | return; | ||
1885 | |||
1886 | cmd.CommandText = "insert into primitems (" + | ||
1887 | "invType, assetType, name, " + | ||
1888 | "description, creationDate, nextPermissions, " + | ||
1889 | "currentPermissions, basePermissions, " + | ||
1890 | "everyonePermissions, groupPermissions, " + | ||
1891 | "flags, itemID, primID, assetID, " + | ||
1892 | "parentFolderID, creatorID, ownerID, " + | ||
1893 | "groupID, lastOwnerID) values (?invType, " + | ||
1894 | "?assetType, ?name, ?description, " + | ||
1895 | "?creationDate, ?nextPermissions, " + | ||
1896 | "?currentPermissions, ?basePermissions, " + | ||
1897 | "?everyonePermissions, ?groupPermissions, " + | ||
1898 | "?flags, ?itemID, ?primID, ?assetID, " + | ||
1899 | "?parentFolderID, ?creatorID, ?ownerID, " + | ||
1900 | "?groupID, ?lastOwnerID)"; | ||
1901 | |||
1902 | foreach (TaskInventoryItem item in items) | ||
1903 | { | 1947 | { |
1904 | cmd.Parameters.Clear(); | 1948 | cmd.CommandText = "insert into primitems (" + |
1905 | 1949 | "invType, assetType, name, " + | |
1906 | FillItemCommand(cmd, item); | 1950 | "description, creationDate, nextPermissions, " + |
1907 | 1951 | "currentPermissions, basePermissions, " + | |
1908 | ExecuteNonQuery(cmd); | 1952 | "everyonePermissions, groupPermissions, " + |
1953 | "flags, itemID, primID, assetID, " + | ||
1954 | "parentFolderID, creatorID, ownerID, " + | ||
1955 | "groupID, lastOwnerID) values (?invType, " + | ||
1956 | "?assetType, ?name, ?description, " + | ||
1957 | "?creationDate, ?nextPermissions, " + | ||
1958 | "?currentPermissions, ?basePermissions, " + | ||
1959 | "?everyonePermissions, ?groupPermissions, " + | ||
1960 | "?flags, ?itemID, ?primID, ?assetID, " + | ||
1961 | "?parentFolderID, ?creatorID, ?ownerID, " + | ||
1962 | "?groupID, ?lastOwnerID)"; | ||
1963 | |||
1964 | foreach (TaskInventoryItem item in items) | ||
1965 | { | ||
1966 | cmd.Parameters.Clear(); | ||
1967 | |||
1968 | FillItemCommand(cmd, item); | ||
1969 | |||
1970 | ExecuteNonQuery(cmd); | ||
1971 | } | ||
1909 | } | 1972 | } |
1910 | |||
1911 | cmd.Dispose(); | ||
1912 | } | 1973 | } |
1913 | } | 1974 | } |
1914 | } | 1975 | } |
diff --git a/OpenSim/Data/MySQL/MySQLUserAccountData.cs b/OpenSim/Data/MySQL/MySQLUserAccountData.cs index a18ac66..4ff3175 100644 --- a/OpenSim/Data/MySQL/MySQLUserAccountData.cs +++ b/OpenSim/Data/MySQL/MySQLUserAccountData.cs | |||
@@ -66,38 +66,40 @@ namespace OpenSim.Data.MySQL | |||
66 | if (words.Length > 2) | 66 | if (words.Length > 2) |
67 | return new UserAccountData[0]; | 67 | return new UserAccountData[0]; |
68 | 68 | ||
69 | MySqlCommand cmd = new MySqlCommand(); | 69 | using (MySqlCommand cmd = new MySqlCommand()) |
70 | |||
71 | if (words.Length == 1) | ||
72 | { | ||
73 | cmd.CommandText = String.Format("select * from {0} where (ScopeID=?ScopeID or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like ?search or LastName like ?search) and active=1", m_Realm); | ||
74 | cmd.Parameters.AddWithValue("?search", words[0] + "%"); | ||
75 | cmd.Parameters.AddWithValue("?ScopeID", scopeID.ToString()); | ||
76 | } | ||
77 | else | ||
78 | { | 70 | { |
79 | cmd.CommandText = String.Format("select * from {0} where (ScopeID=?ScopeID or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like ?searchFirst and LastName like ?searchLast) and active=1", m_Realm); | 71 | if (words.Length == 1) |
80 | cmd.Parameters.AddWithValue("?searchFirst", words[0] + "%"); | 72 | { |
81 | cmd.Parameters.AddWithValue("?searchLast", words[1] + "%"); | 73 | cmd.CommandText = String.Format("select * from {0} where (ScopeID=?ScopeID or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like ?search or LastName like ?search) and active=1", m_Realm); |
82 | cmd.Parameters.AddWithValue("?ScopeID", scopeID.ToString()); | 74 | cmd.Parameters.AddWithValue("?search", words[0] + "%"); |
83 | } | 75 | cmd.Parameters.AddWithValue("?ScopeID", scopeID.ToString()); |
76 | } | ||
77 | else | ||
78 | { | ||
79 | cmd.CommandText = String.Format("select * from {0} where (ScopeID=?ScopeID or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like ?searchFirst and LastName like ?searchLast) and active=1", m_Realm); | ||
80 | cmd.Parameters.AddWithValue("?searchFirst", words[0] + "%"); | ||
81 | cmd.Parameters.AddWithValue("?searchLast", words[1] + "%"); | ||
82 | cmd.Parameters.AddWithValue("?ScopeID", scopeID.ToString()); | ||
83 | } | ||
84 | 84 | ||
85 | return DoQuery(cmd); | 85 | return DoQuery(cmd); |
86 | } | ||
86 | } | 87 | } |
87 | 88 | ||
88 | public UserAccountData[] GetUsersWhere(UUID scopeID, string where) | 89 | public UserAccountData[] GetUsersWhere(UUID scopeID, string where) |
89 | { | 90 | { |
90 | MySqlCommand cmd = new MySqlCommand(); | 91 | using (MySqlCommand cmd = new MySqlCommand()) |
91 | |||
92 | if (scopeID != UUID.Zero) | ||
93 | { | 92 | { |
94 | where = "(ScopeID=?ScopeID or ScopeID='00000000-0000-0000-0000-000000000000') and (" + where + ")"; | 93 | if (scopeID != UUID.Zero) |
95 | cmd.Parameters.AddWithValue("?ScopeID", scopeID.ToString()); | 94 | { |
96 | } | 95 | where = "(ScopeID=?ScopeID or ScopeID='00000000-0000-0000-0000-000000000000') and (" + where + ")"; |
96 | cmd.Parameters.AddWithValue("?ScopeID", scopeID.ToString()); | ||
97 | } | ||
97 | 98 | ||
98 | cmd.CommandText = String.Format("select * from {0} where " + where, m_Realm); | 99 | cmd.CommandText = String.Format("select * from {0} where " + where, m_Realm); |
99 | 100 | ||
100 | return DoQuery(cmd); | 101 | return DoQuery(cmd); |
102 | } | ||
101 | } | 103 | } |
102 | } | 104 | } |
103 | } | 105 | } |
diff --git a/OpenSim/Data/MySQL/Resources/RegionStore.migrations b/OpenSim/Data/MySQL/Resources/RegionStore.migrations index ef99ef8..db0d0ec 100644 --- a/OpenSim/Data/MySQL/Resources/RegionStore.migrations +++ b/OpenSim/Data/MySQL/Resources/RegionStore.migrations | |||
@@ -883,3 +883,15 @@ ALTER TABLE `regionsettings` MODIFY COLUMN `TelehubObject` VARCHAR(36) NOT NULL | |||
883 | 883 | ||
884 | COMMIT; | 884 | COMMIT; |
885 | 885 | ||
886 | :VERSION 44 #--------------------- Environment Settings | ||
887 | |||
888 | BEGIN; | ||
889 | |||
890 | CREATE TABLE `regionenvironment` ( | ||
891 | `region_id` varchar(36) NOT NULL, | ||
892 | `llsd_settings` TEXT NOT NULL, | ||
893 | PRIMARY KEY (`region_id`) | ||
894 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; | ||
895 | |||
896 | COMMIT; | ||
897 | |||
diff --git a/OpenSim/Data/Null/NullSimulationData.cs b/OpenSim/Data/Null/NullSimulationData.cs index 24b4511..a39ef0b 100644 --- a/OpenSim/Data/Null/NullSimulationData.cs +++ b/OpenSim/Data/Null/NullSimulationData.cs | |||
@@ -76,9 +76,27 @@ namespace OpenSim.Data.Null | |||
76 | //This connector doesn't support the windlight module yet | 76 | //This connector doesn't support the windlight module yet |
77 | } | 77 | } |
78 | 78 | ||
79 | #region Environment Settings | ||
80 | public string LoadRegionEnvironmentSettings(UUID regionUUID) | ||
81 | { | ||
82 | //This connector doesn't support the Environment module yet | ||
83 | return string.Empty; | ||
84 | } | ||
85 | |||
86 | public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings) | ||
87 | { | ||
88 | //This connector doesn't support the Environment module yet | ||
89 | } | ||
90 | |||
91 | public void RemoveRegionEnvironmentSettings(UUID regionUUID) | ||
92 | { | ||
93 | //This connector doesn't support the Environment module yet | ||
94 | } | ||
95 | #endregion | ||
96 | |||
79 | public RegionSettings LoadRegionSettings(UUID regionUUID) | 97 | public RegionSettings LoadRegionSettings(UUID regionUUID) |
80 | { | 98 | { |
81 | RegionSettings rs = new RegionSettings(); | 99 | RegionSettings rs = new RegionSettings(); |
82 | rs.RegionUUID = regionUUID; | 100 | rs.RegionUUID = regionUUID; |
83 | return rs; | 101 | return rs; |
84 | } | 102 | } |
diff --git a/OpenSim/Data/SQLite/Resources/RegionStore.migrations b/OpenSim/Data/SQLite/Resources/RegionStore.migrations index 1ceddf9..e872977 100644 --- a/OpenSim/Data/SQLite/Resources/RegionStore.migrations +++ b/OpenSim/Data/SQLite/Resources/RegionStore.migrations | |||
@@ -564,3 +564,14 @@ COMMIT; | |||
564 | BEGIN; | 564 | BEGIN; |
565 | ALTER TABLE `regionsettings` ADD COLUMN `parcel_tile_ID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'; | 565 | ALTER TABLE `regionsettings` ADD COLUMN `parcel_tile_ID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'; |
566 | COMMIT; | 566 | COMMIT; |
567 | |||
568 | :VERSION 26 | ||
569 | |||
570 | BEGIN; | ||
571 | |||
572 | CREATE TABLE `regionenvironment` ( | ||
573 | `region_id` varchar(36) NOT NULL DEFAULT '000000-0000-0000-0000-000000000000' PRIMARY KEY, | ||
574 | `llsd_settings` TEXT NOT NULL | ||
575 | ); | ||
576 | |||
577 | COMMIT; | ||
diff --git a/OpenSim/Data/SQLite/SQLiteSimulationData.cs b/OpenSim/Data/SQLite/SQLiteSimulationData.cs index 9ec285c..9175a8f 100644 --- a/OpenSim/Data/SQLite/SQLiteSimulationData.cs +++ b/OpenSim/Data/SQLite/SQLiteSimulationData.cs | |||
@@ -61,6 +61,7 @@ namespace OpenSim.Data.SQLite | |||
61 | private const string regionbanListSelect = "select * from regionban"; | 61 | private const string regionbanListSelect = "select * from regionban"; |
62 | private const string regionSettingsSelect = "select * from regionsettings"; | 62 | private const string regionSettingsSelect = "select * from regionsettings"; |
63 | private const string regionWindlightSelect = "select * from regionwindlight"; | 63 | private const string regionWindlightSelect = "select * from regionwindlight"; |
64 | private const string regionEnvironmentSelect = "select * from regionenvironment"; | ||
64 | private const string regionSpawnPointsSelect = "select * from spawn_points"; | 65 | private const string regionSpawnPointsSelect = "select * from spawn_points"; |
65 | 66 | ||
66 | private DataSet ds; | 67 | private DataSet ds; |
@@ -72,6 +73,7 @@ namespace OpenSim.Data.SQLite | |||
72 | private SqliteDataAdapter landAccessListDa; | 73 | private SqliteDataAdapter landAccessListDa; |
73 | private SqliteDataAdapter regionSettingsDa; | 74 | private SqliteDataAdapter regionSettingsDa; |
74 | private SqliteDataAdapter regionWindlightDa; | 75 | private SqliteDataAdapter regionWindlightDa; |
76 | private SqliteDataAdapter regionEnvironmentDa; | ||
75 | private SqliteDataAdapter regionSpawnPointsDa; | 77 | private SqliteDataAdapter regionSpawnPointsDa; |
76 | 78 | ||
77 | private SqliteConnection m_conn; | 79 | private SqliteConnection m_conn; |
@@ -146,6 +148,9 @@ namespace OpenSim.Data.SQLite | |||
146 | SqliteCommand regionWindlightSelectCmd = new SqliteCommand(regionWindlightSelect, m_conn); | 148 | SqliteCommand regionWindlightSelectCmd = new SqliteCommand(regionWindlightSelect, m_conn); |
147 | regionWindlightDa = new SqliteDataAdapter(regionWindlightSelectCmd); | 149 | regionWindlightDa = new SqliteDataAdapter(regionWindlightSelectCmd); |
148 | 150 | ||
151 | SqliteCommand regionEnvironmentSelectCmd = new SqliteCommand(regionEnvironmentSelect, m_conn); | ||
152 | regionEnvironmentDa = new SqliteDataAdapter(regionEnvironmentSelectCmd); | ||
153 | |||
149 | SqliteCommand regionSpawnPointsSelectCmd = new SqliteCommand(regionSpawnPointsSelect, m_conn); | 154 | SqliteCommand regionSpawnPointsSelectCmd = new SqliteCommand(regionSpawnPointsSelect, m_conn); |
150 | regionSpawnPointsDa = new SqliteDataAdapter(regionSpawnPointsSelectCmd); | 155 | regionSpawnPointsDa = new SqliteDataAdapter(regionSpawnPointsSelectCmd); |
151 | 156 | ||
@@ -179,6 +184,9 @@ namespace OpenSim.Data.SQLite | |||
179 | ds.Tables.Add(createRegionWindlightTable()); | 184 | ds.Tables.Add(createRegionWindlightTable()); |
180 | setupRegionWindlightCommands(regionWindlightDa, m_conn); | 185 | setupRegionWindlightCommands(regionWindlightDa, m_conn); |
181 | 186 | ||
187 | ds.Tables.Add(createRegionEnvironmentTable()); | ||
188 | setupRegionEnvironmentCommands(regionEnvironmentDa, m_conn); | ||
189 | |||
182 | ds.Tables.Add(createRegionSpawnPointsTable()); | 190 | ds.Tables.Add(createRegionSpawnPointsTable()); |
183 | setupRegionSpawnPointsCommands(regionSpawnPointsDa, m_conn); | 191 | setupRegionSpawnPointsCommands(regionSpawnPointsDa, m_conn); |
184 | 192 | ||
@@ -260,6 +268,15 @@ namespace OpenSim.Data.SQLite | |||
260 | 268 | ||
261 | try | 269 | try |
262 | { | 270 | { |
271 | regionEnvironmentDa.Fill(ds.Tables["regionenvironment"]); | ||
272 | } | ||
273 | catch (Exception e) | ||
274 | { | ||
275 | m_log.ErrorFormat("[SQLITE REGION DB]: Caught fill error on regionenvironment table :{0}", e.Message); | ||
276 | } | ||
277 | |||
278 | try | ||
279 | { | ||
263 | regionSpawnPointsDa.Fill(ds.Tables["spawn_points"]); | 280 | regionSpawnPointsDa.Fill(ds.Tables["spawn_points"]); |
264 | } | 281 | } |
265 | catch (Exception e) | 282 | catch (Exception e) |
@@ -278,12 +295,13 @@ namespace OpenSim.Data.SQLite | |||
278 | CreateDataSetMapping(landAccessListDa, "landaccesslist"); | 295 | CreateDataSetMapping(landAccessListDa, "landaccesslist"); |
279 | CreateDataSetMapping(regionSettingsDa, "regionsettings"); | 296 | CreateDataSetMapping(regionSettingsDa, "regionsettings"); |
280 | CreateDataSetMapping(regionWindlightDa, "regionwindlight"); | 297 | CreateDataSetMapping(regionWindlightDa, "regionwindlight"); |
298 | CreateDataSetMapping(regionEnvironmentDa, "regionenvironment"); | ||
281 | CreateDataSetMapping(regionSpawnPointsDa, "spawn_points"); | 299 | CreateDataSetMapping(regionSpawnPointsDa, "spawn_points"); |
282 | } | 300 | } |
283 | } | 301 | } |
284 | catch (Exception e) | 302 | catch (Exception e) |
285 | { | 303 | { |
286 | m_log.ErrorFormat("[SQLITE REGION DB]: ", e); | 304 | m_log.ErrorFormat("[SQLITE REGION DB]: {0} - {1}", e.Message, e.StackTrace); |
287 | Environment.Exit(23); | 305 | Environment.Exit(23); |
288 | } | 306 | } |
289 | return; | 307 | return; |
@@ -341,6 +359,11 @@ namespace OpenSim.Data.SQLite | |||
341 | regionWindlightDa.Dispose(); | 359 | regionWindlightDa.Dispose(); |
342 | regionWindlightDa = null; | 360 | regionWindlightDa = null; |
343 | } | 361 | } |
362 | if (regionEnvironmentDa != null) | ||
363 | { | ||
364 | regionEnvironmentDa.Dispose(); | ||
365 | regionEnvironmentDa = null; | ||
366 | } | ||
344 | if (regionSpawnPointsDa != null) | 367 | if (regionSpawnPointsDa != null) |
345 | { | 368 | { |
346 | regionSpawnPointsDa.Dispose(); | 369 | regionSpawnPointsDa.Dispose(); |
@@ -474,6 +497,63 @@ namespace OpenSim.Data.SQLite | |||
474 | } | 497 | } |
475 | } | 498 | } |
476 | 499 | ||
500 | #region Region Environment Settings | ||
501 | public string LoadRegionEnvironmentSettings(UUID regionUUID) | ||
502 | { | ||
503 | lock (ds) | ||
504 | { | ||
505 | DataTable environmentTable = ds.Tables["regionenvironment"]; | ||
506 | DataRow row = environmentTable.Rows.Find(regionUUID.ToString()); | ||
507 | if (row == null) | ||
508 | { | ||
509 | return String.Empty; | ||
510 | } | ||
511 | |||
512 | return (String)row["llsd_settings"]; | ||
513 | } | ||
514 | } | ||
515 | |||
516 | public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings) | ||
517 | { | ||
518 | lock (ds) | ||
519 | { | ||
520 | DataTable environmentTable = ds.Tables["regionenvironment"]; | ||
521 | DataRow row = environmentTable.Rows.Find(regionUUID.ToString()); | ||
522 | |||
523 | if (row == null) | ||
524 | { | ||
525 | row = environmentTable.NewRow(); | ||
526 | row["region_id"] = regionUUID.ToString(); | ||
527 | row["llsd_settings"] = settings; | ||
528 | environmentTable.Rows.Add(row); | ||
529 | } | ||
530 | else | ||
531 | { | ||
532 | row["llsd_settings"] = settings; | ||
533 | } | ||
534 | |||
535 | regionEnvironmentDa.Update(ds, "regionenvironment"); | ||
536 | } | ||
537 | } | ||
538 | |||
539 | public void RemoveRegionEnvironmentSettings(UUID regionUUID) | ||
540 | { | ||
541 | lock (ds) | ||
542 | { | ||
543 | DataTable environmentTable = ds.Tables["regionenvironment"]; | ||
544 | DataRow row = environmentTable.Rows.Find(regionUUID.ToString()); | ||
545 | |||
546 | if (row != null) | ||
547 | { | ||
548 | row.Delete(); | ||
549 | } | ||
550 | |||
551 | regionEnvironmentDa.Update(ds, "regionenvironment"); | ||
552 | } | ||
553 | } | ||
554 | |||
555 | #endregion | ||
556 | |||
477 | public RegionSettings LoadRegionSettings(UUID regionUUID) | 557 | public RegionSettings LoadRegionSettings(UUID regionUUID) |
478 | { | 558 | { |
479 | lock (ds) | 559 | lock (ds) |
@@ -1430,6 +1510,17 @@ namespace OpenSim.Data.SQLite | |||
1430 | return regionwindlight; | 1510 | return regionwindlight; |
1431 | } | 1511 | } |
1432 | 1512 | ||
1513 | private static DataTable createRegionEnvironmentTable() | ||
1514 | { | ||
1515 | DataTable regionEnvironment = new DataTable("regionenvironment"); | ||
1516 | createCol(regionEnvironment, "region_id", typeof(String)); | ||
1517 | createCol(regionEnvironment, "llsd_settings", typeof(String)); | ||
1518 | |||
1519 | regionEnvironment.PrimaryKey = new DataColumn[] { regionEnvironment.Columns["region_id"] }; | ||
1520 | |||
1521 | return regionEnvironment; | ||
1522 | } | ||
1523 | |||
1433 | private static DataTable createRegionSpawnPointsTable() | 1524 | private static DataTable createRegionSpawnPointsTable() |
1434 | { | 1525 | { |
1435 | DataTable spawn_points = new DataTable("spawn_points"); | 1526 | DataTable spawn_points = new DataTable("spawn_points"); |
@@ -2691,6 +2782,14 @@ namespace OpenSim.Data.SQLite | |||
2691 | da.UpdateCommand.Connection = conn; | 2782 | da.UpdateCommand.Connection = conn; |
2692 | } | 2783 | } |
2693 | 2784 | ||
2785 | private void setupRegionEnvironmentCommands(SqliteDataAdapter da, SqliteConnection conn) | ||
2786 | { | ||
2787 | da.InsertCommand = createInsertCommand("regionenvironment", ds.Tables["regionenvironment"]); | ||
2788 | da.InsertCommand.Connection = conn; | ||
2789 | da.UpdateCommand = createUpdateCommand("regionenvironment", "region_id=:region_id", ds.Tables["regionenvironment"]); | ||
2790 | da.UpdateCommand.Connection = conn; | ||
2791 | } | ||
2792 | |||
2694 | private void setupRegionSpawnPointsCommands(SqliteDataAdapter da, SqliteConnection conn) | 2793 | private void setupRegionSpawnPointsCommands(SqliteDataAdapter da, SqliteConnection conn) |
2695 | { | 2794 | { |
2696 | da.InsertCommand = createInsertCommand("spawn_points", ds.Tables["spawn_points"]); | 2795 | da.InsertCommand = createInsertCommand("spawn_points", ds.Tables["spawn_points"]); |
diff --git a/OpenSim/Framework/Console/CommandConsole.cs b/OpenSim/Framework/Console/CommandConsole.cs index c5d6b78..87bdacd 100644 --- a/OpenSim/Framework/Console/CommandConsole.cs +++ b/OpenSim/Framework/Console/CommandConsole.cs | |||
@@ -79,7 +79,11 @@ namespace OpenSim.Framework.Console | |||
79 | public List<CommandDelegate> fn; | 79 | public List<CommandDelegate> fn; |
80 | } | 80 | } |
81 | 81 | ||
82 | public const string GeneralHelpText = "For more information, type 'help <item>' where <item> is one of the following categories:"; | 82 | public const string GeneralHelpText |
83 | = "To enter an argument that contains spaces, surround the argument with double quotes.\nFor example, show object name \"My long object name\"\n"; | ||
84 | |||
85 | public const string ItemHelpText | ||
86 | = "For more information, type 'help <item>' where <item> is one of the following:"; | ||
83 | 87 | ||
84 | /// <value> | 88 | /// <value> |
85 | /// Commands organized by keyword in a tree | 89 | /// Commands organized by keyword in a tree |
@@ -108,7 +112,9 @@ namespace OpenSim.Framework.Console | |||
108 | // General help | 112 | // General help |
109 | if (helpParts.Count == 0) | 113 | if (helpParts.Count == 0) |
110 | { | 114 | { |
115 | help.Add(""); // Will become a newline. | ||
111 | help.Add(GeneralHelpText); | 116 | help.Add(GeneralHelpText); |
117 | help.Add(ItemHelpText); | ||
112 | help.AddRange(CollectModulesHelp(tree)); | 118 | help.AddRange(CollectModulesHelp(tree)); |
113 | } | 119 | } |
114 | else | 120 | else |
@@ -132,7 +138,7 @@ namespace OpenSim.Framework.Console | |||
132 | // Check modules first to see if we just need to display a list of those commands | 138 | // Check modules first to see if we just need to display a list of those commands |
133 | if (TryCollectModuleHelp(originalHelpRequest, help)) | 139 | if (TryCollectModuleHelp(originalHelpRequest, help)) |
134 | { | 140 | { |
135 | help.Insert(0, GeneralHelpText); | 141 | help.Insert(0, ItemHelpText); |
136 | return help; | 142 | return help; |
137 | } | 143 | } |
138 | 144 | ||
diff --git a/OpenSim/Framework/Console/ConsoleDisplayList.cs b/OpenSim/Framework/Console/ConsoleDisplayList.cs new file mode 100644 index 0000000..6885509 --- /dev/null +++ b/OpenSim/Framework/Console/ConsoleDisplayList.cs | |||
@@ -0,0 +1,112 @@ | |||
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.Linq; | ||
31 | using System.Text; | ||
32 | |||
33 | namespace OpenSim.Framework.Console | ||
34 | { | ||
35 | /// <summary> | ||
36 | /// Used to generated a formatted table for the console. | ||
37 | /// </summary> | ||
38 | /// <remarks> | ||
39 | /// Currently subject to change. If you use this, be prepared to change your code when this class changes. | ||
40 | /// </remarks> | ||
41 | public class ConsoleDisplayList | ||
42 | { | ||
43 | /// <summary> | ||
44 | /// The default divider between key and value for a list item. | ||
45 | /// </summary> | ||
46 | public const string DefaultKeyValueDivider = " : "; | ||
47 | |||
48 | /// <summary> | ||
49 | /// The divider used between key and value for a list item. | ||
50 | /// </summary> | ||
51 | public string KeyValueDivider { get; set; } | ||
52 | |||
53 | /// <summary> | ||
54 | /// Table rows | ||
55 | /// </summary> | ||
56 | public List<KeyValuePair<string, string>> Rows { get; private set; } | ||
57 | |||
58 | /// <summary> | ||
59 | /// Number of spaces to indent the list. | ||
60 | /// </summary> | ||
61 | public int Indent { get; set; } | ||
62 | |||
63 | public ConsoleDisplayList() | ||
64 | { | ||
65 | Rows = new List<KeyValuePair<string, string>>(); | ||
66 | KeyValueDivider = DefaultKeyValueDivider; | ||
67 | } | ||
68 | |||
69 | public override string ToString() | ||
70 | { | ||
71 | StringBuilder sb = new StringBuilder(); | ||
72 | AddToStringBuilder(sb); | ||
73 | return sb.ToString(); | ||
74 | } | ||
75 | |||
76 | public void AddToStringBuilder(StringBuilder sb) | ||
77 | { | ||
78 | string formatString = GetFormatString(); | ||
79 | // System.Console.WriteLine("FORMAT STRING [{0}]", formatString); | ||
80 | |||
81 | // rows | ||
82 | foreach (KeyValuePair<string, string> row in Rows) | ||
83 | sb.AppendFormat(formatString, row.Key, row.Value); | ||
84 | } | ||
85 | |||
86 | /// <summary> | ||
87 | /// Gets the format string for the table. | ||
88 | /// </summary> | ||
89 | private string GetFormatString() | ||
90 | { | ||
91 | StringBuilder formatSb = new StringBuilder(); | ||
92 | |||
93 | int longestKey = -1; | ||
94 | |||
95 | foreach (KeyValuePair<string, string> row in Rows) | ||
96 | if (row.Key.Length > longestKey) | ||
97 | longestKey = row.Key.Length; | ||
98 | |||
99 | formatSb.Append(' ', Indent); | ||
100 | |||
101 | // Can only do left formatting for now | ||
102 | formatSb.AppendFormat("{{0,-{0}}}{1}{{1}}\n", longestKey, KeyValueDivider); | ||
103 | |||
104 | return formatSb.ToString(); | ||
105 | } | ||
106 | |||
107 | public void AddRow(object key, object value) | ||
108 | { | ||
109 | Rows.Add(new KeyValuePair<string, string>(key.ToString(), value.ToString())); | ||
110 | } | ||
111 | } | ||
112 | } \ No newline at end of file | ||
diff --git a/OpenSim/Framework/Console/ConsoleDisplayTable.cs b/OpenSim/Framework/Console/ConsoleDisplayTable.cs new file mode 100644 index 0000000..e9d1628 --- /dev/null +++ b/OpenSim/Framework/Console/ConsoleDisplayTable.cs | |||
@@ -0,0 +1,139 @@ | |||
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.Linq; | ||
31 | using System.Text; | ||
32 | |||
33 | namespace OpenSim.Framework.Console | ||
34 | { | ||
35 | /// <summary> | ||
36 | /// Used to generated a formatted table for the console. | ||
37 | /// </summary> | ||
38 | /// <remarks> | ||
39 | /// Currently subject to change. If you use this, be prepared to change your code when this class changes. | ||
40 | /// </remarks> | ||
41 | public class ConsoleDisplayTable | ||
42 | { | ||
43 | /// <summary> | ||
44 | /// Default number of spaces between table columns. | ||
45 | /// </summary> | ||
46 | public const int DefaultTableSpacing = 2; | ||
47 | |||
48 | /// <summary> | ||
49 | /// Table columns. | ||
50 | /// </summary> | ||
51 | public List<ConsoleDisplayTableColumn> Columns { get; private set; } | ||
52 | |||
53 | /// <summary> | ||
54 | /// Table rows | ||
55 | /// </summary> | ||
56 | public List<ConsoleDisplayTableRow> Rows { get; private set; } | ||
57 | |||
58 | /// <summary> | ||
59 | /// Number of spaces to indent the table. | ||
60 | /// </summary> | ||
61 | public int Indent { get; set; } | ||
62 | |||
63 | /// <summary> | ||
64 | /// Spacing between table columns | ||
65 | /// </summary> | ||
66 | public int TableSpacing { get; set; } | ||
67 | |||
68 | public ConsoleDisplayTable() | ||
69 | { | ||
70 | TableSpacing = DefaultTableSpacing; | ||
71 | Columns = new List<ConsoleDisplayTableColumn>(); | ||
72 | Rows = new List<ConsoleDisplayTableRow>(); | ||
73 | } | ||
74 | |||
75 | public override string ToString() | ||
76 | { | ||
77 | StringBuilder sb = new StringBuilder(); | ||
78 | AddToStringBuilder(sb); | ||
79 | return sb.ToString(); | ||
80 | } | ||
81 | |||
82 | public void AddToStringBuilder(StringBuilder sb) | ||
83 | { | ||
84 | string formatString = GetFormatString(); | ||
85 | // System.Console.WriteLine("FORMAT STRING [{0}]", formatString); | ||
86 | |||
87 | // columns | ||
88 | sb.AppendFormat(formatString, Columns.ConvertAll(c => c.Header).ToArray()); | ||
89 | |||
90 | // rows | ||
91 | foreach (ConsoleDisplayTableRow row in Rows) | ||
92 | sb.AppendFormat(formatString, row.Cells.ToArray()); | ||
93 | } | ||
94 | |||
95 | /// <summary> | ||
96 | /// Gets the format string for the table. | ||
97 | /// </summary> | ||
98 | private string GetFormatString() | ||
99 | { | ||
100 | StringBuilder formatSb = new StringBuilder(); | ||
101 | |||
102 | formatSb.Append(' ', Indent); | ||
103 | |||
104 | for (int i = 0; i < Columns.Count; i++) | ||
105 | { | ||
106 | formatSb.Append(' ', TableSpacing); | ||
107 | |||
108 | // Can only do left formatting for now | ||
109 | formatSb.AppendFormat("{{{0},-{1}}}", i, Columns[i].Width); | ||
110 | } | ||
111 | |||
112 | formatSb.Append('\n'); | ||
113 | |||
114 | return formatSb.ToString(); | ||
115 | } | ||
116 | } | ||
117 | |||
118 | public struct ConsoleDisplayTableColumn | ||
119 | { | ||
120 | public string Header { get; set; } | ||
121 | public int Width { get; set; } | ||
122 | |||
123 | public ConsoleDisplayTableColumn(string header, int width) : this() | ||
124 | { | ||
125 | Header = header; | ||
126 | Width = width; | ||
127 | } | ||
128 | } | ||
129 | |||
130 | public struct ConsoleDisplayTableRow | ||
131 | { | ||
132 | public List<string> Cells { get; private set; } | ||
133 | |||
134 | public ConsoleDisplayTableRow(List<string> cells) : this() | ||
135 | { | ||
136 | Cells = cells; | ||
137 | } | ||
138 | } | ||
139 | } \ No newline at end of file | ||
diff --git a/OpenSim/Framework/Console/LocalConsole.cs b/OpenSim/Framework/Console/LocalConsole.cs index 7c8626d..f65813b 100644 --- a/OpenSim/Framework/Console/LocalConsole.cs +++ b/OpenSim/Framework/Console/LocalConsole.cs | |||
@@ -296,6 +296,10 @@ namespace OpenSim.Framework.Console | |||
296 | matches[0].Groups["Category"].Value); | 296 | matches[0].Groups["Category"].Value); |
297 | System.Console.Write("]:"); | 297 | System.Console.Write("]:"); |
298 | } | 298 | } |
299 | else | ||
300 | { | ||
301 | outText = outText.Trim(); | ||
302 | } | ||
299 | } | 303 | } |
300 | 304 | ||
301 | if (level == "error") | 305 | if (level == "error") |
diff --git a/OpenSim/Framework/EstateSettings.cs b/OpenSim/Framework/EstateSettings.cs index 142b783..9020761 100644 --- a/OpenSim/Framework/EstateSettings.cs +++ b/OpenSim/Framework/EstateSettings.cs | |||
@@ -346,7 +346,7 @@ namespace OpenSim.Framework | |||
346 | l_EstateManagers.Remove(avatarID); | 346 | l_EstateManagers.Remove(avatarID); |
347 | } | 347 | } |
348 | 348 | ||
349 | public bool IsEstateManager(UUID avatarID) | 349 | public bool IsEstateManagerOrOwner(UUID avatarID) |
350 | { | 350 | { |
351 | if (IsEstateOwner(avatarID)) | 351 | if (IsEstateOwner(avatarID)) |
352 | return true; | 352 | return true; |
@@ -368,7 +368,7 @@ namespace OpenSim.Framework | |||
368 | if (ban.BannedUserID == avatarID) | 368 | if (ban.BannedUserID == avatarID) |
369 | return true; | 369 | return true; |
370 | 370 | ||
371 | if (!IsEstateManager(avatarID) && !HasAccess(avatarID)) | 371 | if (!IsEstateManagerOrOwner(avatarID) && !HasAccess(avatarID)) |
372 | { | 372 | { |
373 | if (DenyMinors) | 373 | if (DenyMinors) |
374 | { | 374 | { |
@@ -411,7 +411,7 @@ namespace OpenSim.Framework | |||
411 | 411 | ||
412 | public bool HasAccess(UUID user) | 412 | public bool HasAccess(UUID user) |
413 | { | 413 | { |
414 | if (IsEstateManager(user)) | 414 | if (IsEstateManagerOrOwner(user)) |
415 | return true; | 415 | return true; |
416 | 416 | ||
417 | return l_EstateAccess.Contains(user); | 417 | return l_EstateAccess.Contains(user); |
diff --git a/OpenSim/Framework/OSChatMessage.cs b/OpenSim/Framework/OSChatMessage.cs index 54fa275..455756d 100644 --- a/OpenSim/Framework/OSChatMessage.cs +++ b/OpenSim/Framework/OSChatMessage.cs | |||
@@ -51,10 +51,12 @@ namespace OpenSim.Framework | |||
51 | protected object m_senderObject; | 51 | protected object m_senderObject; |
52 | protected ChatTypeEnum m_type; | 52 | protected ChatTypeEnum m_type; |
53 | protected UUID m_fromID; | 53 | protected UUID m_fromID; |
54 | protected UUID m_toID; | ||
54 | 55 | ||
55 | public OSChatMessage() | 56 | public OSChatMessage() |
56 | { | 57 | { |
57 | m_position = new Vector3(); | 58 | m_position = new Vector3(); |
59 | m_toID = UUID.Zero; | ||
58 | } | 60 | } |
59 | 61 | ||
60 | /// <summary> | 62 | /// <summary> |
@@ -102,6 +104,15 @@ namespace OpenSim.Framework | |||
102 | set { m_from = value; } | 104 | set { m_from = value; } |
103 | } | 105 | } |
104 | 106 | ||
107 | /// <summary> | ||
108 | /// The name of the sender (needed for scripts) | ||
109 | /// </summary> | ||
110 | public string To | ||
111 | { | ||
112 | get { return m_from; } | ||
113 | set { m_from = value; } | ||
114 | } | ||
115 | |||
105 | #region IEventArgs Members | 116 | #region IEventArgs Members |
106 | 117 | ||
107 | /// TODO: Sender and SenderObject should just be Sender and of | 118 | /// TODO: Sender and SenderObject should just be Sender and of |
@@ -132,6 +143,15 @@ namespace OpenSim.Framework | |||
132 | } | 143 | } |
133 | 144 | ||
134 | /// <summary> | 145 | /// <summary> |
146 | /// The single recipient or all if not set. | ||
147 | /// </summary> | ||
148 | public UUID TargetUUID | ||
149 | { | ||
150 | get { return m_toID; } | ||
151 | set { m_toID = value; } | ||
152 | } | ||
153 | |||
154 | /// <summary> | ||
135 | /// | 155 | /// |
136 | /// </summary> | 156 | /// </summary> |
137 | public IScene Scene | 157 | public IScene Scene |
diff --git a/OpenSim/Framework/PrimitiveBaseShape.cs b/OpenSim/Framework/PrimitiveBaseShape.cs index c6ccc9e..fcc9873 100644 --- a/OpenSim/Framework/PrimitiveBaseShape.cs +++ b/OpenSim/Framework/PrimitiveBaseShape.cs | |||
@@ -241,10 +241,14 @@ namespace OpenSim.Framework | |||
241 | 241 | ||
242 | m_textureEntry = prim.Textures.GetBytes(); | 242 | m_textureEntry = prim.Textures.GetBytes(); |
243 | 243 | ||
244 | SculptEntry = (prim.Sculpt.Type != OpenMetaverse.SculptType.None); | 244 | if (prim.Sculpt != null) |
245 | SculptData = prim.Sculpt.GetBytes(); | 245 | { |
246 | SculptTexture = prim.Sculpt.SculptTexture; | 246 | SculptEntry = (prim.Sculpt.Type != OpenMetaverse.SculptType.None); |
247 | SculptType = (byte)prim.Sculpt.Type; | 247 | SculptData = prim.Sculpt.GetBytes(); |
248 | SculptTexture = prim.Sculpt.SculptTexture; | ||
249 | SculptType = (byte)prim.Sculpt.Type; | ||
250 | } | ||
251 | else SculptType = (byte)OpenMetaverse.SculptType.None; | ||
248 | } | 252 | } |
249 | 253 | ||
250 | [XmlIgnore] | 254 | [XmlIgnore] |
diff --git a/OpenSim/Framework/RegionSettings.cs b/OpenSim/Framework/RegionSettings.cs index c142bd9..47a2780 100644 --- a/OpenSim/Framework/RegionSettings.cs +++ b/OpenSim/Framework/RegionSettings.cs | |||
@@ -29,6 +29,7 @@ using System; | |||
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.IO; | 30 | using System.IO; |
31 | using OpenMetaverse; | 31 | using OpenMetaverse; |
32 | using System.Runtime.Serialization; | ||
32 | 33 | ||
33 | namespace OpenSim.Framework | 34 | namespace OpenSim.Framework |
34 | { | 35 | { |
@@ -71,6 +72,32 @@ namespace OpenSim.Framework | |||
71 | 72 | ||
72 | return pos + offset; | 73 | return pos + offset; |
73 | } | 74 | } |
75 | |||
76 | /// <summary> | ||
77 | /// Returns a string representation of this SpawnPoint. | ||
78 | /// </summary> | ||
79 | /// <returns></returns> | ||
80 | public override string ToString() | ||
81 | { | ||
82 | return string.Format("{0},{1},{2}", Yaw, Pitch, Distance); | ||
83 | } | ||
84 | |||
85 | /// <summary> | ||
86 | /// Generate a SpawnPoint from a string | ||
87 | /// </summary> | ||
88 | /// <param name="str"></param> | ||
89 | public static SpawnPoint Parse(string str) | ||
90 | { | ||
91 | string[] parts = str.Split(','); | ||
92 | if (parts.Length != 3) | ||
93 | throw new ArgumentException("Invalid string: " + str); | ||
94 | |||
95 | SpawnPoint sp = new SpawnPoint(); | ||
96 | sp.Yaw = float.Parse(parts[0]); | ||
97 | sp.Pitch = float.Parse(parts[1]); | ||
98 | sp.Distance = float.Parse(parts[2]); | ||
99 | return sp; | ||
100 | } | ||
74 | } | 101 | } |
75 | 102 | ||
76 | public class RegionSettings | 103 | public class RegionSettings |
@@ -478,7 +505,7 @@ namespace OpenSim.Framework | |||
478 | } | 505 | } |
479 | 506 | ||
480 | // Connected Telehub object | 507 | // Connected Telehub object |
481 | private UUID m_TelehubObject; | 508 | private UUID m_TelehubObject = UUID.Zero; |
482 | public UUID TelehubObject | 509 | public UUID TelehubObject |
483 | { | 510 | { |
484 | get | 511 | get |
diff --git a/OpenSim/Framework/SLUtil.cs b/OpenSim/Framework/SLUtil.cs index db4541e..537de7a 100644 --- a/OpenSim/Framework/SLUtil.cs +++ b/OpenSim/Framework/SLUtil.cs | |||
@@ -38,239 +38,189 @@ namespace OpenSim.Framework | |||
38 | public static class SLUtil | 38 | public static class SLUtil |
39 | { | 39 | { |
40 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 40 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
41 | 41 | ||
42 | #region SL / file extension / content-type conversions | 42 | #region SL / file extension / content-type conversions |
43 | 43 | ||
44 | public static string SLAssetTypeToContentType(int assetType) | 44 | private class TypeMapping |
45 | { | 45 | { |
46 | switch ((AssetType)assetType) | 46 | private sbyte assetType; |
47 | private InventoryType inventoryType; | ||
48 | private string contentType; | ||
49 | private string contentType2; | ||
50 | private string extension; | ||
51 | |||
52 | public sbyte AssetTypeCode | ||
53 | { | ||
54 | get { return assetType; } | ||
55 | } | ||
56 | |||
57 | public object AssetType | ||
58 | { | ||
59 | get { | ||
60 | if (Enum.IsDefined(typeof(OpenMetaverse.AssetType), assetType)) | ||
61 | return (OpenMetaverse.AssetType)assetType; | ||
62 | else | ||
63 | return OpenMetaverse.AssetType.Unknown; | ||
64 | } | ||
65 | } | ||
66 | |||
67 | public InventoryType InventoryType | ||
68 | { | ||
69 | get { return inventoryType; } | ||
70 | } | ||
71 | |||
72 | public string ContentType | ||
73 | { | ||
74 | get { return contentType; } | ||
75 | } | ||
76 | |||
77 | public string ContentType2 | ||
78 | { | ||
79 | get { return contentType2; } | ||
80 | } | ||
81 | |||
82 | public string Extension | ||
83 | { | ||
84 | get { return extension; } | ||
85 | } | ||
86 | |||
87 | private TypeMapping(sbyte assetType, InventoryType inventoryType, string contentType, string contentType2, string extension) | ||
88 | { | ||
89 | this.assetType = assetType; | ||
90 | this.inventoryType = inventoryType; | ||
91 | this.contentType = contentType; | ||
92 | this.contentType2 = contentType2; | ||
93 | this.extension = extension; | ||
94 | } | ||
95 | |||
96 | public TypeMapping(AssetType assetType, InventoryType inventoryType, string contentType, string contentType2, string extension) | ||
97 | : this((sbyte)assetType, inventoryType, contentType, contentType2, extension) | ||
98 | { | ||
99 | } | ||
100 | |||
101 | public TypeMapping(AssetType assetType, InventoryType inventoryType, string contentType, string extension) | ||
102 | : this((sbyte)assetType, inventoryType, contentType, null, extension) | ||
47 | { | 103 | { |
48 | case AssetType.Texture: | ||
49 | return "image/x-j2c"; | ||
50 | case AssetType.Sound: | ||
51 | return "audio/ogg"; | ||
52 | case AssetType.CallingCard: | ||
53 | return "application/vnd.ll.callingcard"; | ||
54 | case AssetType.Landmark: | ||
55 | return "application/vnd.ll.landmark"; | ||
56 | case AssetType.Clothing: | ||
57 | return "application/vnd.ll.clothing"; | ||
58 | case AssetType.Object: | ||
59 | return "application/vnd.ll.primitive"; | ||
60 | case AssetType.Notecard: | ||
61 | return "application/vnd.ll.notecard"; | ||
62 | case AssetType.Folder: | ||
63 | return "application/vnd.ll.folder"; | ||
64 | case AssetType.RootFolder: | ||
65 | return "application/vnd.ll.rootfolder"; | ||
66 | case AssetType.LSLText: | ||
67 | return "application/vnd.ll.lsltext"; | ||
68 | case AssetType.LSLBytecode: | ||
69 | return "application/vnd.ll.lslbyte"; | ||
70 | case AssetType.TextureTGA: | ||
71 | case AssetType.ImageTGA: | ||
72 | return "image/tga"; | ||
73 | case AssetType.Bodypart: | ||
74 | return "application/vnd.ll.bodypart"; | ||
75 | case AssetType.TrashFolder: | ||
76 | return "application/vnd.ll.trashfolder"; | ||
77 | case AssetType.SnapshotFolder: | ||
78 | return "application/vnd.ll.snapshotfolder"; | ||
79 | case AssetType.LostAndFoundFolder: | ||
80 | return "application/vnd.ll.lostandfoundfolder"; | ||
81 | case AssetType.SoundWAV: | ||
82 | return "audio/x-wav"; | ||
83 | case AssetType.ImageJPEG: | ||
84 | return "image/jpeg"; | ||
85 | case AssetType.Animation: | ||
86 | return "application/vnd.ll.animation"; | ||
87 | case AssetType.Gesture: | ||
88 | return "application/vnd.ll.gesture"; | ||
89 | case AssetType.Simstate: | ||
90 | return "application/x-metaverse-simstate"; | ||
91 | case AssetType.FavoriteFolder: | ||
92 | return "application/vnd.ll.favoritefolder"; | ||
93 | case AssetType.Link: | ||
94 | return "application/vnd.ll.link"; | ||
95 | case AssetType.LinkFolder: | ||
96 | return "application/vnd.ll.linkfolder"; | ||
97 | case AssetType.CurrentOutfitFolder: | ||
98 | return "application/vnd.ll.currentoutfitfolder"; | ||
99 | case AssetType.OutfitFolder: | ||
100 | return "application/vnd.ll.outfitfolder"; | ||
101 | case AssetType.MyOutfitsFolder: | ||
102 | return "application/vnd.ll.myoutfitsfolder"; | ||
103 | case AssetType.Unknown: | ||
104 | default: | ||
105 | return "application/octet-stream"; | ||
106 | } | 104 | } |
107 | } | 105 | } |
108 | 106 | ||
109 | public static string SLInvTypeToContentType(int invType) | 107 | /// <summary> |
108 | /// Maps between AssetType, InventoryType and Content-Type. | ||
109 | /// Where more than one possibility exists, the first one takes precedence. E.g.: | ||
110 | /// AssetType "AssetType.Texture" -> Content-Type "image-xj2c" | ||
111 | /// Content-Type "image/x-j2c" -> InventoryType "InventoryType.Texture" | ||
112 | /// </summary> | ||
113 | private static TypeMapping[] MAPPINGS = new TypeMapping[] { | ||
114 | new TypeMapping(AssetType.Unknown, InventoryType.Unknown, "application/octet-stream", "bin"), | ||
115 | new TypeMapping(AssetType.Texture, InventoryType.Texture, "image/x-j2c", "image/jp2", "j2c"), | ||
116 | new TypeMapping(AssetType.Texture, InventoryType.Snapshot, "image/x-j2c", "image/jp2", "j2c"), | ||
117 | new TypeMapping(AssetType.TextureTGA, InventoryType.Texture, "image/tga", "tga"), | ||
118 | new TypeMapping(AssetType.ImageTGA, InventoryType.Texture, "image/tga", "tga"), | ||
119 | new TypeMapping(AssetType.ImageJPEG, InventoryType.Texture, "image/jpeg", "jpg"), | ||
120 | new TypeMapping(AssetType.Sound, InventoryType.Sound, "audio/ogg", "application/ogg", "ogg"), | ||
121 | new TypeMapping(AssetType.SoundWAV, InventoryType.Sound, "audio/x-wav", "wav"), | ||
122 | new TypeMapping(AssetType.CallingCard, InventoryType.CallingCard, "application/vnd.ll.callingcard", "application/x-metaverse-callingcard", "callingcard"), | ||
123 | new TypeMapping(AssetType.Landmark, InventoryType.Landmark, "application/vnd.ll.landmark", "application/x-metaverse-landmark", "landmark"), | ||
124 | new TypeMapping(AssetType.Clothing, InventoryType.Wearable, "application/vnd.ll.clothing", "application/x-metaverse-clothing", "clothing"), | ||
125 | new TypeMapping(AssetType.Object, InventoryType.Object, "application/vnd.ll.primitive", "application/x-metaverse-primitive", "primitive"), | ||
126 | new TypeMapping(AssetType.Object, InventoryType.Attachment, "application/vnd.ll.primitive", "application/x-metaverse-primitive", "primitive"), | ||
127 | new TypeMapping(AssetType.Notecard, InventoryType.Notecard, "application/vnd.ll.notecard", "application/x-metaverse-notecard", "notecard"), | ||
128 | new TypeMapping(AssetType.Folder, InventoryType.Folder, "application/vnd.ll.folder", "folder"), | ||
129 | new TypeMapping(AssetType.RootFolder, InventoryType.RootCategory, "application/vnd.ll.rootfolder", "rootfolder"), | ||
130 | new TypeMapping(AssetType.LSLText, InventoryType.LSL, "application/vnd.ll.lsltext", "application/x-metaverse-lsl", "lsl"), | ||
131 | new TypeMapping(AssetType.LSLBytecode, InventoryType.LSL, "application/vnd.ll.lslbyte", "application/x-metaverse-lso", "lso"), | ||
132 | new TypeMapping(AssetType.Bodypart, InventoryType.Wearable, "application/vnd.ll.bodypart", "application/x-metaverse-bodypart", "bodypart"), | ||
133 | new TypeMapping(AssetType.TrashFolder, InventoryType.Folder, "application/vnd.ll.trashfolder", "trashfolder"), | ||
134 | new TypeMapping(AssetType.SnapshotFolder, InventoryType.Folder, "application/vnd.ll.snapshotfolder", "snapshotfolder"), | ||
135 | new TypeMapping(AssetType.LostAndFoundFolder, InventoryType.Folder, "application/vnd.ll.lostandfoundfolder", "lostandfoundfolder"), | ||
136 | new TypeMapping(AssetType.Animation, InventoryType.Animation, "application/vnd.ll.animation", "application/x-metaverse-animation", "animation"), | ||
137 | new TypeMapping(AssetType.Gesture, InventoryType.Gesture, "application/vnd.ll.gesture", "application/x-metaverse-gesture", "gesture"), | ||
138 | new TypeMapping(AssetType.Simstate, InventoryType.Snapshot, "application/x-metaverse-simstate", "simstate"), | ||
139 | new TypeMapping(AssetType.FavoriteFolder, InventoryType.Unknown, "application/vnd.ll.favoritefolder", "favoritefolder"), | ||
140 | new TypeMapping(AssetType.Link, InventoryType.Unknown, "application/vnd.ll.link", "link"), | ||
141 | new TypeMapping(AssetType.LinkFolder, InventoryType.Unknown, "application/vnd.ll.linkfolder", "linkfolder"), | ||
142 | new TypeMapping(AssetType.CurrentOutfitFolder, InventoryType.Unknown, "application/vnd.ll.currentoutfitfolder", "currentoutfitfolder"), | ||
143 | new TypeMapping(AssetType.OutfitFolder, InventoryType.Unknown, "application/vnd.ll.outfitfolder", "outfitfolder"), | ||
144 | new TypeMapping(AssetType.MyOutfitsFolder, InventoryType.Unknown, "application/vnd.ll.myoutfitsfolder", "myoutfitsfolder"), | ||
145 | new TypeMapping(AssetType.Mesh, InventoryType.Mesh, "application/vnd.ll.mesh", "llm") | ||
146 | }; | ||
147 | |||
148 | private static Dictionary<sbyte, string> asset2Content; | ||
149 | private static Dictionary<sbyte, string> asset2Extension; | ||
150 | private static Dictionary<InventoryType, string> inventory2Content; | ||
151 | private static Dictionary<string, sbyte> content2Asset; | ||
152 | private static Dictionary<string, InventoryType> content2Inventory; | ||
153 | |||
154 | static SLUtil() | ||
110 | { | 155 | { |
111 | switch ((InventoryType)invType) | 156 | asset2Content = new Dictionary<sbyte, string>(); |
157 | asset2Extension = new Dictionary<sbyte, string>(); | ||
158 | inventory2Content = new Dictionary<InventoryType, string>(); | ||
159 | content2Asset = new Dictionary<string, sbyte>(); | ||
160 | content2Inventory = new Dictionary<string, InventoryType>(); | ||
161 | |||
162 | foreach (TypeMapping mapping in MAPPINGS) | ||
112 | { | 163 | { |
113 | case InventoryType.Animation: | 164 | sbyte assetType = mapping.AssetTypeCode; |
114 | return "application/vnd.ll.animation"; | 165 | if (!asset2Content.ContainsKey(assetType)) |
115 | case InventoryType.CallingCard: | 166 | asset2Content.Add(assetType, mapping.ContentType); |
116 | return "application/vnd.ll.callingcard"; | 167 | if (!asset2Extension.ContainsKey(assetType)) |
117 | case InventoryType.Folder: | 168 | asset2Extension.Add(assetType, mapping.Extension); |
118 | return "application/vnd.ll.folder"; | 169 | if (!inventory2Content.ContainsKey(mapping.InventoryType)) |
119 | case InventoryType.Gesture: | 170 | inventory2Content.Add(mapping.InventoryType, mapping.ContentType); |
120 | return "application/vnd.ll.gesture"; | 171 | if (!content2Asset.ContainsKey(mapping.ContentType)) |
121 | case InventoryType.Landmark: | 172 | content2Asset.Add(mapping.ContentType, assetType); |
122 | return "application/vnd.ll.landmark"; | 173 | if (!content2Inventory.ContainsKey(mapping.ContentType)) |
123 | case InventoryType.LSL: | 174 | content2Inventory.Add(mapping.ContentType, mapping.InventoryType); |
124 | return "application/vnd.ll.lsltext"; | 175 | |
125 | case InventoryType.Notecard: | 176 | if (mapping.ContentType2 != null) |
126 | return "application/vnd.ll.notecard"; | 177 | { |
127 | case InventoryType.Attachment: | 178 | if (!content2Asset.ContainsKey(mapping.ContentType2)) |
128 | case InventoryType.Object: | 179 | content2Asset.Add(mapping.ContentType2, assetType); |
129 | return "application/vnd.ll.primitive"; | 180 | if (!content2Inventory.ContainsKey(mapping.ContentType2)) |
130 | case InventoryType.Sound: | 181 | content2Inventory.Add(mapping.ContentType2, mapping.InventoryType); |
131 | return "audio/ogg"; | 182 | } |
132 | case InventoryType.Snapshot: | ||
133 | case InventoryType.Texture: | ||
134 | return "image/x-j2c"; | ||
135 | case InventoryType.Wearable: | ||
136 | return "application/vnd.ll.clothing"; | ||
137 | default: | ||
138 | return "application/octet-stream"; | ||
139 | } | 183 | } |
140 | } | 184 | } |
185 | |||
186 | public static string SLAssetTypeToContentType(int assetType) | ||
187 | { | ||
188 | string contentType; | ||
189 | if (!asset2Content.TryGetValue((sbyte)assetType, out contentType)) | ||
190 | contentType = asset2Content[(sbyte)AssetType.Unknown]; | ||
191 | return contentType; | ||
192 | } | ||
193 | |||
194 | public static string SLInvTypeToContentType(int invType) | ||
195 | { | ||
196 | string contentType; | ||
197 | if (!inventory2Content.TryGetValue((InventoryType)invType, out contentType)) | ||
198 | contentType = inventory2Content[InventoryType.Unknown]; | ||
199 | return contentType; | ||
200 | } | ||
141 | 201 | ||
142 | public static sbyte ContentTypeToSLAssetType(string contentType) | 202 | public static sbyte ContentTypeToSLAssetType(string contentType) |
143 | { | 203 | { |
144 | switch (contentType) | 204 | sbyte assetType; |
145 | { | 205 | if (!content2Asset.TryGetValue(contentType, out assetType)) |
146 | case "image/x-j2c": | 206 | assetType = (sbyte)AssetType.Unknown; |
147 | case "image/jp2": | 207 | return (sbyte)assetType; |
148 | return (sbyte)AssetType.Texture; | ||
149 | case "application/ogg": | ||
150 | case "audio/ogg": | ||
151 | return (sbyte)AssetType.Sound; | ||
152 | case "application/vnd.ll.callingcard": | ||
153 | case "application/x-metaverse-callingcard": | ||
154 | return (sbyte)AssetType.CallingCard; | ||
155 | case "application/vnd.ll.landmark": | ||
156 | case "application/x-metaverse-landmark": | ||
157 | return (sbyte)AssetType.Landmark; | ||
158 | case "application/vnd.ll.clothing": | ||
159 | case "application/x-metaverse-clothing": | ||
160 | return (sbyte)AssetType.Clothing; | ||
161 | case "application/vnd.ll.primitive": | ||
162 | case "application/x-metaverse-primitive": | ||
163 | return (sbyte)AssetType.Object; | ||
164 | case "application/vnd.ll.notecard": | ||
165 | case "application/x-metaverse-notecard": | ||
166 | return (sbyte)AssetType.Notecard; | ||
167 | case "application/vnd.ll.folder": | ||
168 | return (sbyte)AssetType.Folder; | ||
169 | case "application/vnd.ll.rootfolder": | ||
170 | return (sbyte)AssetType.RootFolder; | ||
171 | case "application/vnd.ll.lsltext": | ||
172 | case "application/x-metaverse-lsl": | ||
173 | return (sbyte)AssetType.LSLText; | ||
174 | case "application/vnd.ll.lslbyte": | ||
175 | case "application/x-metaverse-lso": | ||
176 | return (sbyte)AssetType.LSLBytecode; | ||
177 | case "image/tga": | ||
178 | // Note that AssetType.TextureTGA will be converted to AssetType.ImageTGA | ||
179 | return (sbyte)AssetType.ImageTGA; | ||
180 | case "application/vnd.ll.bodypart": | ||
181 | case "application/x-metaverse-bodypart": | ||
182 | return (sbyte)AssetType.Bodypart; | ||
183 | case "application/vnd.ll.trashfolder": | ||
184 | return (sbyte)AssetType.TrashFolder; | ||
185 | case "application/vnd.ll.snapshotfolder": | ||
186 | return (sbyte)AssetType.SnapshotFolder; | ||
187 | case "application/vnd.ll.lostandfoundfolder": | ||
188 | return (sbyte)AssetType.LostAndFoundFolder; | ||
189 | case "audio/x-wav": | ||
190 | return (sbyte)AssetType.SoundWAV; | ||
191 | case "image/jpeg": | ||
192 | return (sbyte)AssetType.ImageJPEG; | ||
193 | case "application/vnd.ll.animation": | ||
194 | case "application/x-metaverse-animation": | ||
195 | return (sbyte)AssetType.Animation; | ||
196 | case "application/vnd.ll.gesture": | ||
197 | case "application/x-metaverse-gesture": | ||
198 | return (sbyte)AssetType.Gesture; | ||
199 | case "application/x-metaverse-simstate": | ||
200 | return (sbyte)AssetType.Simstate; | ||
201 | case "application/vnd.ll.favoritefolder": | ||
202 | return (sbyte)AssetType.FavoriteFolder; | ||
203 | case "application/vnd.ll.link": | ||
204 | return (sbyte)AssetType.Link; | ||
205 | case "application/vnd.ll.linkfolder": | ||
206 | return (sbyte)AssetType.LinkFolder; | ||
207 | case "application/vnd.ll.currentoutfitfolder": | ||
208 | return (sbyte)AssetType.CurrentOutfitFolder; | ||
209 | case "application/vnd.ll.outfitfolder": | ||
210 | return (sbyte)AssetType.OutfitFolder; | ||
211 | case "application/vnd.ll.myoutfitsfolder": | ||
212 | return (sbyte)AssetType.MyOutfitsFolder; | ||
213 | case "application/octet-stream": | ||
214 | default: | ||
215 | return (sbyte)AssetType.Unknown; | ||
216 | } | ||
217 | } | 208 | } |
218 | 209 | ||
219 | public static sbyte ContentTypeToSLInvType(string contentType) | 210 | public static sbyte ContentTypeToSLInvType(string contentType) |
220 | { | 211 | { |
221 | switch (contentType) | 212 | InventoryType invType; |
222 | { | 213 | if (!content2Inventory.TryGetValue(contentType, out invType)) |
223 | case "image/x-j2c": | 214 | invType = InventoryType.Unknown; |
224 | case "image/jp2": | 215 | return (sbyte)invType; |
225 | case "image/tga": | 216 | } |
226 | case "image/jpeg": | 217 | |
227 | return (sbyte)InventoryType.Texture; | 218 | public static string SLAssetTypeToExtension(int assetType) |
228 | case "application/ogg": | 219 | { |
229 | case "audio/ogg": | 220 | string extension; |
230 | case "audio/x-wav": | 221 | if (!asset2Extension.TryGetValue((sbyte)assetType, out extension)) |
231 | return (sbyte)InventoryType.Sound; | 222 | extension = asset2Extension[(sbyte)AssetType.Unknown]; |
232 | case "application/vnd.ll.callingcard": | 223 | return extension; |
233 | case "application/x-metaverse-callingcard": | ||
234 | return (sbyte)InventoryType.CallingCard; | ||
235 | case "application/vnd.ll.landmark": | ||
236 | case "application/x-metaverse-landmark": | ||
237 | return (sbyte)InventoryType.Landmark; | ||
238 | case "application/vnd.ll.clothing": | ||
239 | case "application/x-metaverse-clothing": | ||
240 | case "application/vnd.ll.bodypart": | ||
241 | case "application/x-metaverse-bodypart": | ||
242 | return (sbyte)InventoryType.Wearable; | ||
243 | case "application/vnd.ll.primitive": | ||
244 | case "application/x-metaverse-primitive": | ||
245 | return (sbyte)InventoryType.Object; | ||
246 | case "application/vnd.ll.notecard": | ||
247 | case "application/x-metaverse-notecard": | ||
248 | return (sbyte)InventoryType.Notecard; | ||
249 | case "application/vnd.ll.folder": | ||
250 | return (sbyte)InventoryType.Folder; | ||
251 | case "application/vnd.ll.rootfolder": | ||
252 | return (sbyte)InventoryType.RootCategory; | ||
253 | case "application/vnd.ll.lsltext": | ||
254 | case "application/x-metaverse-lsl": | ||
255 | case "application/vnd.ll.lslbyte": | ||
256 | case "application/x-metaverse-lso": | ||
257 | return (sbyte)InventoryType.LSL; | ||
258 | case "application/vnd.ll.trashfolder": | ||
259 | case "application/vnd.ll.snapshotfolder": | ||
260 | case "application/vnd.ll.lostandfoundfolder": | ||
261 | return (sbyte)InventoryType.Folder; | ||
262 | case "application/vnd.ll.animation": | ||
263 | case "application/x-metaverse-animation": | ||
264 | return (sbyte)InventoryType.Animation; | ||
265 | case "application/vnd.ll.gesture": | ||
266 | case "application/x-metaverse-gesture": | ||
267 | return (sbyte)InventoryType.Gesture; | ||
268 | case "application/x-metaverse-simstate": | ||
269 | return (sbyte)InventoryType.Snapshot; | ||
270 | case "application/octet-stream": | ||
271 | default: | ||
272 | return (sbyte)InventoryType.Unknown; | ||
273 | } | ||
274 | } | 224 | } |
275 | 225 | ||
276 | #endregion SL / file extension / content-type conversions | 226 | #endregion SL / file extension / content-type conversions |
@@ -377,4 +327,4 @@ namespace OpenSim.Framework | |||
377 | return output; | 327 | return output; |
378 | } | 328 | } |
379 | } | 329 | } |
380 | } \ No newline at end of file | 330 | } |
diff --git a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs index 931898c..f18435d 100644 --- a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs +++ b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs | |||
@@ -30,6 +30,8 @@ using System.Text; | |||
30 | using System.Xml; | 30 | using System.Xml; |
31 | using OpenMetaverse; | 31 | using OpenMetaverse; |
32 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
33 | using log4net; | ||
34 | using System.Reflection; | ||
33 | 35 | ||
34 | namespace OpenSim.Framework.Serialization.External | 36 | namespace OpenSim.Framework.Serialization.External |
35 | { | 37 | { |
@@ -187,7 +189,29 @@ namespace OpenSim.Framework.Serialization.External | |||
187 | break; | 189 | break; |
188 | } | 190 | } |
189 | } | 191 | } |
190 | 192 | ||
193 | xtr.ReadEndElement(); | ||
194 | |||
195 | if (xtr.IsStartElement("Telehub")) | ||
196 | { | ||
197 | xtr.ReadStartElement("Telehub"); | ||
198 | |||
199 | while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement) | ||
200 | { | ||
201 | switch (xtr.Name) | ||
202 | { | ||
203 | case "TelehubObject": | ||
204 | settings.TelehubObject = UUID.Parse(xtr.ReadElementContentAsString()); | ||
205 | break; | ||
206 | case "SpawnPoint": | ||
207 | string str = xtr.ReadElementContentAsString(); | ||
208 | SpawnPoint sp = SpawnPoint.Parse(str); | ||
209 | settings.AddSpawnPoint(sp); | ||
210 | break; | ||
211 | } | ||
212 | } | ||
213 | } | ||
214 | |||
191 | xtr.Close(); | 215 | xtr.Close(); |
192 | sr.Close(); | 216 | sr.Close(); |
193 | 217 | ||
@@ -243,7 +267,16 @@ namespace OpenSim.Framework.Serialization.External | |||
243 | xtw.WriteElementString("SunPosition", settings.SunPosition.ToString()); | 267 | xtw.WriteElementString("SunPosition", settings.SunPosition.ToString()); |
244 | // Note: 'SunVector' isn't saved because this value is owned by the Sun Module, which | 268 | // Note: 'SunVector' isn't saved because this value is owned by the Sun Module, which |
245 | // calculates it automatically according to the date and other factors. | 269 | // calculates it automatically according to the date and other factors. |
246 | xtw.WriteEndElement(); | 270 | xtw.WriteEndElement(); |
271 | |||
272 | xtw.WriteStartElement("Telehub"); | ||
273 | if (settings.TelehubObject != UUID.Zero) | ||
274 | { | ||
275 | xtw.WriteElementString("TelehubObject", settings.TelehubObject.ToString()); | ||
276 | foreach (SpawnPoint sp in settings.SpawnPoints()) | ||
277 | xtw.WriteElementString("SpawnPoint", sp.ToString()); | ||
278 | } | ||
279 | xtw.WriteEndElement(); | ||
247 | 280 | ||
248 | xtw.WriteEndElement(); | 281 | xtw.WriteEndElement(); |
249 | 282 | ||
diff --git a/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs b/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs index a61e4af..09b6f6d 100644 --- a/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs +++ b/OpenSim/Framework/Serialization/Tests/RegionSettingsSerializerTests.cs | |||
@@ -78,6 +78,10 @@ namespace OpenSim.Framework.Serialization.Tests | |||
78 | <FixedSun>true</FixedSun> | 78 | <FixedSun>true</FixedSun> |
79 | <SunPosition>12</SunPosition> | 79 | <SunPosition>12</SunPosition> |
80 | </Terrain> | 80 | </Terrain> |
81 | <Telehub> | ||
82 | <TelehubObject>00000000-0000-0000-0000-111111111111</TelehubObject> | ||
83 | <SpawnPoint>1,-2,0.33</SpawnPoint> | ||
84 | </Telehub> | ||
81 | </RegionSettings>"; | 85 | </RegionSettings>"; |
82 | 86 | ||
83 | private RegionSettings m_rs; | 87 | private RegionSettings m_rs; |
@@ -116,6 +120,8 @@ namespace OpenSim.Framework.Serialization.Tests | |||
116 | m_rs.TerrainTexture4 = UUID.Parse("00000000-0000-0000-0000-000000000080"); | 120 | m_rs.TerrainTexture4 = UUID.Parse("00000000-0000-0000-0000-000000000080"); |
117 | m_rs.UseEstateSun = true; | 121 | m_rs.UseEstateSun = true; |
118 | m_rs.WaterHeight = 23; | 122 | m_rs.WaterHeight = 23; |
123 | m_rs.TelehubObject = UUID.Parse("00000000-0000-0000-0000-111111111111"); | ||
124 | m_rs.AddSpawnPoint(SpawnPoint.Parse("1,-2,0.33")); | ||
119 | } | 125 | } |
120 | 126 | ||
121 | [Test] | 127 | [Test] |
@@ -129,6 +135,8 @@ namespace OpenSim.Framework.Serialization.Tests | |||
129 | Assert.That(deserRs.TerrainTexture2, Is.EqualTo(m_rs.TerrainTexture2)); | 135 | Assert.That(deserRs.TerrainTexture2, Is.EqualTo(m_rs.TerrainTexture2)); |
130 | Assert.That(deserRs.DisablePhysics, Is.EqualTo(m_rs.DisablePhysics)); | 136 | Assert.That(deserRs.DisablePhysics, Is.EqualTo(m_rs.DisablePhysics)); |
131 | Assert.That(deserRs.TerrainLowerLimit, Is.EqualTo(m_rs.TerrainLowerLimit)); | 137 | Assert.That(deserRs.TerrainLowerLimit, Is.EqualTo(m_rs.TerrainLowerLimit)); |
138 | Assert.That(deserRs.TelehubObject, Is.EqualTo(m_rs.TelehubObject)); | ||
139 | Assert.That(deserRs.SpawnPoints()[0].ToString(), Is.EqualTo(m_rs.SpawnPoints()[0].ToString())); | ||
132 | } | 140 | } |
133 | } | 141 | } |
134 | } | 142 | } |
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHTTPHandler.cs b/OpenSim/Framework/Servers/HttpServer/BaseHTTPHandler.cs index 2fe9769..9f8f4a8 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHTTPHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHTTPHandler.cs | |||
@@ -33,9 +33,9 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
33 | { | 33 | { |
34 | public abstract Hashtable Handle(string path, Hashtable Request); | 34 | public abstract Hashtable Handle(string path, Hashtable Request); |
35 | 35 | ||
36 | protected BaseHTTPHandler(string httpMethod, string path) | 36 | protected BaseHTTPHandler(string httpMethod, string path) : this(httpMethod, path, null, null) {} |
37 | : base(httpMethod, path) | 37 | |
38 | { | 38 | protected BaseHTTPHandler(string httpMethod, string path, string name, string description) |
39 | } | 39 | : base(httpMethod, path, name, description) {} |
40 | } | 40 | } |
41 | } | 41 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index ad5af1f..f5addc8 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs | |||
@@ -156,7 +156,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
156 | } | 156 | } |
157 | } | 157 | } |
158 | 158 | ||
159 | public List<string> GetStreamHandlerKeys() | 159 | public List<string> GetStreamHandlerKeys() |
160 | { | 160 | { |
161 | lock (m_streamHandlers) | 161 | lock (m_streamHandlers) |
162 | return new List<string>(m_streamHandlers.Keys); | 162 | return new List<string>(m_streamHandlers.Keys); |
@@ -356,7 +356,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
356 | } | 356 | } |
357 | catch (Exception e) | 357 | catch (Exception e) |
358 | { | 358 | { |
359 | m_log.ErrorFormat("[BASE HTTP SERVER]: OnRequest() failed with {0}{1}", e.Message, e.StackTrace); | 359 | m_log.Error(String.Format("[BASE HTTP SERVER]: OnRequest() failed: {0} ", e.Message), e); |
360 | } | 360 | } |
361 | } | 361 | } |
362 | 362 | ||
@@ -410,6 +410,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
410 | // string reqnum = "unknown"; | 410 | // string reqnum = "unknown"; |
411 | int tickstart = Environment.TickCount; | 411 | int tickstart = Environment.TickCount; |
412 | 412 | ||
413 | IRequestHandler requestHandler = null; | ||
414 | |||
413 | try | 415 | try |
414 | { | 416 | { |
415 | // OpenSim.Framework.WebUtil.OSHeaderRequestID | 417 | // OpenSim.Framework.WebUtil.OSHeaderRequestID |
@@ -438,8 +440,6 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
438 | //response.KeepAlive = true; | 440 | //response.KeepAlive = true; |
439 | response.SendChunked = false; | 441 | response.SendChunked = false; |
440 | 442 | ||
441 | IRequestHandler requestHandler; | ||
442 | |||
443 | string path = request.RawUrl; | 443 | string path = request.RawUrl; |
444 | string handlerKey = GetHandlerKey(request.HttpMethod, path); | 444 | string handlerKey = GetHandlerKey(request.HttpMethod, path); |
445 | 445 | ||
@@ -447,8 +447,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
447 | { | 447 | { |
448 | if (DebugLevel >= 1) | 448 | if (DebugLevel >= 1) |
449 | m_log.DebugFormat( | 449 | m_log.DebugFormat( |
450 | "[BASE HTTP SERVER]: Found stream handler for {0} {1}", | 450 | "[BASE HTTP SERVER]: Found stream handler for {0} {1} {2} {3}", |
451 | request.HttpMethod, request.Url.PathAndQuery); | 451 | request.HttpMethod, request.Url.PathAndQuery, requestHandler.Name, requestHandler.Description); |
452 | 452 | ||
453 | // Okay, so this is bad, but should be considered temporary until everything is IStreamHandler. | 453 | // Okay, so this is bad, but should be considered temporary until everything is IStreamHandler. |
454 | byte[] buffer = null; | 454 | byte[] buffer = null; |
@@ -551,11 +551,11 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
551 | catch (SocketException e) | 551 | catch (SocketException e) |
552 | { | 552 | { |
553 | // This has to be here to prevent a Linux/Mono crash | 553 | // This has to be here to prevent a Linux/Mono crash |
554 | m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); | 554 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); |
555 | } | 555 | } |
556 | catch (IOException e) | 556 | catch (IOException e) |
557 | { | 557 | { |
558 | m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); | 558 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}. ", e.Message), e); |
559 | } | 559 | } |
560 | 560 | ||
561 | return; | 561 | return; |
@@ -658,15 +658,15 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
658 | // | 658 | // |
659 | // An alternative may be to turn off all response write exceptions on the HttpListener, but let's go | 659 | // An alternative may be to turn off all response write exceptions on the HttpListener, but let's go |
660 | // with the minimum first | 660 | // with the minimum first |
661 | m_log.WarnFormat("[BASE HTTP SERVER]: HandleRequest threw {0}.\nNOTE: this may be spurious on Linux", e); | 661 | m_log.Warn(String.Format("[BASE HTTP SERVER]: HandleRequest threw {0}.\nNOTE: this may be spurious on Linux ", e.Message), e); |
662 | } | 662 | } |
663 | catch (IOException e) | 663 | catch (IOException e) |
664 | { | 664 | { |
665 | m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}", e); | 665 | m_log.Error(String.Format("[BASE HTTP SERVER]: HandleRequest() threw {0} ", e.Message), e); |
666 | } | 666 | } |
667 | catch (Exception e) | 667 | catch (Exception e) |
668 | { | 668 | { |
669 | m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}", e.StackTrace); | 669 | m_log.Error(String.Format("[BASE HTTP SERVER]: HandleRequest() threw {0} ", e.Message), e); |
670 | SendHTML500(response); | 670 | SendHTML500(response); |
671 | } | 671 | } |
672 | finally | 672 | finally |
@@ -675,8 +675,16 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
675 | // since its just for reporting, tickdiff limit can be adjusted | 675 | // since its just for reporting, tickdiff limit can be adjusted |
676 | int tickdiff = Environment.TickCount - tickstart; | 676 | int tickdiff = Environment.TickCount - tickstart; |
677 | if (tickdiff > 3000) | 677 | if (tickdiff > 3000) |
678 | { | ||
678 | m_log.InfoFormat( | 679 | m_log.InfoFormat( |
679 | "[BASE HTTP SERVER]: slow {0} request for {1} from {2} took {3} ms", requestMethod, uriString, request.RemoteIPEndPoint.ToString(), tickdiff); | 680 | "[BASE HTTP SERVER]: Slow handling of {0} {1} {2} {3} from {4} took {5}ms", |
681 | requestMethod, | ||
682 | uriString, | ||
683 | requestHandler != null ? requestHandler.Name : "", | ||
684 | requestHandler != null ? requestHandler.Description : "", | ||
685 | request.RemoteIPEndPoint.ToString(), | ||
686 | tickdiff); | ||
687 | } | ||
680 | } | 688 | } |
681 | } | 689 | } |
682 | 690 | ||
@@ -925,11 +933,11 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
925 | catch (SocketException e) | 933 | catch (SocketException e) |
926 | { | 934 | { |
927 | // This has to be here to prevent a Linux/Mono crash | 935 | // This has to be here to prevent a Linux/Mono crash |
928 | m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); | 936 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); |
929 | } | 937 | } |
930 | catch (IOException e) | 938 | catch (IOException e) |
931 | { | 939 | { |
932 | m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); | 940 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e); |
933 | } | 941 | } |
934 | } | 942 | } |
935 | return; | 943 | return; |
@@ -962,11 +970,11 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
962 | catch (SocketException e) | 970 | catch (SocketException e) |
963 | { | 971 | { |
964 | // This has to be here to prevent a Linux/Mono crash | 972 | // This has to be here to prevent a Linux/Mono crash |
965 | m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); | 973 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); |
966 | } | 974 | } |
967 | catch (IOException e) | 975 | catch (IOException e) |
968 | { | 976 | { |
969 | m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); | 977 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e); |
970 | } | 978 | } |
971 | } | 979 | } |
972 | } | 980 | } |
@@ -1077,12 +1085,12 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1077 | } | 1085 | } |
1078 | catch (IOException e) | 1086 | catch (IOException e) |
1079 | { | 1087 | { |
1080 | m_log.WarnFormat("[BASE HTTP SERVER]: LLSD IOException {0}.", e); | 1088 | m_log.Warn(String.Format("[BASE HTTP SERVER]: LLSD IOException {0} ", e.Message), e); |
1081 | } | 1089 | } |
1082 | catch (SocketException e) | 1090 | catch (SocketException e) |
1083 | { | 1091 | { |
1084 | // This has to be here to prevent a Linux/Mono crash | 1092 | // This has to be here to prevent a Linux/Mono crash |
1085 | m_log.WarnFormat("[BASE HTTP SERVER]: LLSD issue {0}.\nNOTE: this may be spurious on Linux.", e); | 1093 | m_log.Warn(String.Format("[BASE HTTP SERVER]: LLSD issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); |
1086 | } | 1094 | } |
1087 | } | 1095 | } |
1088 | } | 1096 | } |
@@ -1334,8 +1342,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1334 | catch (SocketException f) | 1342 | catch (SocketException f) |
1335 | { | 1343 | { |
1336 | // This has to be here to prevent a Linux/Mono crash | 1344 | // This has to be here to prevent a Linux/Mono crash |
1337 | m_log.WarnFormat( | 1345 | m_log.Warn( |
1338 | "[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", f); | 1346 | String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", f.Message), f); |
1339 | } | 1347 | } |
1340 | } | 1348 | } |
1341 | catch(Exception) | 1349 | catch(Exception) |
@@ -1653,11 +1661,11 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1653 | catch (SocketException e) | 1661 | catch (SocketException e) |
1654 | { | 1662 | { |
1655 | // This has to be here to prevent a Linux/Mono crash | 1663 | // This has to be here to prevent a Linux/Mono crash |
1656 | m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); | 1664 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); |
1657 | } | 1665 | } |
1658 | catch (IOException e) | 1666 | catch (IOException e) |
1659 | { | 1667 | { |
1660 | m_log.Warn("[BASE HTTP SERVER]: XmlRpcRequest issue: " + e.Message); | 1668 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0} ", e.Message), e); |
1661 | } | 1669 | } |
1662 | } | 1670 | } |
1663 | } | 1671 | } |
@@ -1694,7 +1702,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1694 | catch (SocketException e) | 1702 | catch (SocketException e) |
1695 | { | 1703 | { |
1696 | // This has to be here to prevent a Linux/Mono crash | 1704 | // This has to be here to prevent a Linux/Mono crash |
1697 | m_log.WarnFormat("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); | 1705 | m_log.Warn(String.Format("[BASE HTTP SERVER]: XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); |
1698 | } | 1706 | } |
1699 | } | 1707 | } |
1700 | } | 1708 | } |
@@ -1730,7 +1738,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1730 | catch (SocketException e) | 1738 | catch (SocketException e) |
1731 | { | 1739 | { |
1732 | // This has to be here to prevent a Linux/Mono crash | 1740 | // This has to be here to prevent a Linux/Mono crash |
1733 | m_log.WarnFormat("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); | 1741 | m_log.Warn(String.Format("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux. ", e.Message), e); |
1734 | } | 1742 | } |
1735 | } | 1743 | } |
1736 | } | 1744 | } |
@@ -1809,7 +1817,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1809 | 1817 | ||
1810 | public void httpServerException(object source, Exception exception) | 1818 | public void httpServerException(object source, Exception exception) |
1811 | { | 1819 | { |
1812 | m_log.ErrorFormat("[BASE HTTP SERVER]: {0} had an exception {1}", source.ToString(), exception.ToString()); | 1820 | m_log.Error(String.Format("[BASE HTTP SERVER]: {0} had an exception: {1} ", source.ToString(), exception.Message), exception); |
1813 | /* | 1821 | /* |
1814 | if (HTTPDRunning)// && NotSocketErrors > 5) | 1822 | if (HTTPDRunning)// && NotSocketErrors > 5) |
1815 | { | 1823 | { |
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseRequestHandler.cs b/OpenSim/Framework/Servers/HttpServer/BaseRequestHandler.cs index a2135a3..ae7aaf2 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseRequestHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseRequestHandler.cs | |||
@@ -45,8 +45,16 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
45 | 45 | ||
46 | private readonly string m_path; | 46 | private readonly string m_path; |
47 | 47 | ||
48 | protected BaseRequestHandler(string httpMethod, string path) | 48 | public string Name { get; private set; } |
49 | |||
50 | public string Description { get; private set; } | ||
51 | |||
52 | protected BaseRequestHandler(string httpMethod, string path) : this(httpMethod, path, null, null) {} | ||
53 | |||
54 | protected BaseRequestHandler(string httpMethod, string path, string name, string description) | ||
49 | { | 55 | { |
56 | Name = name; | ||
57 | Description = description; | ||
50 | m_httpMethod = httpMethod; | 58 | m_httpMethod = httpMethod; |
51 | m_path = path; | 59 | m_path = path; |
52 | } | 60 | } |
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs index f1cde74..6342983 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs | |||
@@ -34,8 +34,9 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
34 | public abstract byte[] Handle(string path, Stream request, | 34 | public abstract byte[] Handle(string path, Stream request, |
35 | IOSHttpRequest httpRequest, IOSHttpResponse httpResponse); | 35 | IOSHttpRequest httpRequest, IOSHttpResponse httpResponse); |
36 | 36 | ||
37 | protected BaseStreamHandler(string httpMethod, string path) : base(httpMethod, path) | 37 | protected BaseStreamHandler(string httpMethod, string path) : this(httpMethod, path, null, null) {} |
38 | { | 38 | |
39 | } | 39 | protected BaseStreamHandler(string httpMethod, string path, string name, string description) |
40 | : base(httpMethod, path, name, description) {} | ||
40 | } | 41 | } |
41 | } | 42 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs index 1699233..b94bfb4 100644 --- a/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs | |||
@@ -36,6 +36,15 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
36 | { | 36 | { |
37 | private BinaryMethod m_method; | 37 | private BinaryMethod m_method; |
38 | 38 | ||
39 | public BinaryStreamHandler(string httpMethod, string path, BinaryMethod binaryMethod) | ||
40 | : this(httpMethod, path, binaryMethod, null, null) {} | ||
41 | |||
42 | public BinaryStreamHandler(string httpMethod, string path, BinaryMethod binaryMethod, string name, string description) | ||
43 | : base(httpMethod, path, name, description) | ||
44 | { | ||
45 | m_method = binaryMethod; | ||
46 | } | ||
47 | |||
39 | public override byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) | 48 | public override byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) |
40 | { | 49 | { |
41 | byte[] data = ReadFully(request); | 50 | byte[] data = ReadFully(request); |
@@ -45,12 +54,6 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
45 | return Encoding.UTF8.GetBytes(responseString); | 54 | return Encoding.UTF8.GetBytes(responseString); |
46 | } | 55 | } |
47 | 56 | ||
48 | public BinaryStreamHandler(string httpMethod, string path, BinaryMethod binaryMethod) | ||
49 | : base(httpMethod, path) | ||
50 | { | ||
51 | m_method = binaryMethod; | ||
52 | } | ||
53 | |||
54 | private static byte[] ReadFully(Stream stream) | 57 | private static byte[] ReadFully(Stream stream) |
55 | { | 58 | { |
56 | byte[] buffer = new byte[1024]; | 59 | byte[] buffer = new byte[1024]; |
@@ -70,4 +73,4 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
70 | } | 73 | } |
71 | } | 74 | } |
72 | } | 75 | } |
73 | } | 76 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs index a449c2d..cb5cce5 100644 --- a/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs | |||
@@ -32,6 +32,25 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
32 | { | 32 | { |
33 | public interface IRequestHandler | 33 | public interface IRequestHandler |
34 | { | 34 | { |
35 | |||
36 | /// <summary> | ||
37 | /// Name for this handler. | ||
38 | /// </summary> | ||
39 | /// <remarks> | ||
40 | /// Used for diagnostics. The path doesn't always describe what the handler does. Can be null if none | ||
41 | /// specified. | ||
42 | /// </remarks> | ||
43 | string Name { get; } | ||
44 | |||
45 | /// <summary> | ||
46 | /// Description for this handler. | ||
47 | /// </summary> | ||
48 | /// <remarks> | ||
49 | /// Used for diagnostics. The path doesn't always describe what the handler does. Can be null if none | ||
50 | /// specified. | ||
51 | /// </remarks> | ||
52 | string Description { get; } | ||
53 | |||
35 | // Return response content type | 54 | // Return response content type |
36 | string ContentType { get; } | 55 | string ContentType { get; } |
37 | 56 | ||
@@ -58,4 +77,4 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
58 | { | 77 | { |
59 | Hashtable Handle(string path, Hashtable request); | 78 | Hashtable Handle(string path, Hashtable request); |
60 | } | 79 | } |
61 | } | 80 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpRequest.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpRequest.cs index fc8daf3..3171759 100644 --- a/OpenSim/Framework/Servers/HttpServer/OSHttpRequest.cs +++ b/OpenSim/Framework/Servers/HttpServer/OSHttpRequest.cs | |||
@@ -107,7 +107,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
107 | 107 | ||
108 | public bool IsSecured | 108 | public bool IsSecured |
109 | { | 109 | { |
110 | get { return _context.Secured; } | 110 | get { return _context.IsSecured; } |
111 | } | 111 | } |
112 | 112 | ||
113 | public bool KeepAlive | 113 | public bool KeepAlive |
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpStatusCodes.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpStatusCodes.cs index 5625227..a736c8b 100644 --- a/OpenSim/Framework/Servers/HttpServer/OSHttpStatusCodes.cs +++ b/OpenSim/Framework/Servers/HttpServer/OSHttpStatusCodes.cs | |||
@@ -28,143 +28,252 @@ | |||
28 | namespace OpenSim.Framework.Servers.HttpServer | 28 | namespace OpenSim.Framework.Servers.HttpServer |
29 | { | 29 | { |
30 | /// <summary> | 30 | /// <summary> |
31 | /// HTTP status codes (almost) as defined by W3C in | 31 | /// HTTP status codes (almost) as defined by W3C in http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html and IETF in http://tools.ietf.org/html/rfc6585 |
32 | /// http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html | ||
33 | /// </summary> | 32 | /// </summary> |
34 | public enum OSHttpStatusCode: int | 33 | public enum OSHttpStatusCode : int |
35 | { | 34 | { |
36 | // 1xx Informational status codes providing a provisional | 35 | #region 1xx Informational status codes providing a provisional response. |
37 | // response. | 36 | |
38 | // 100 Tells client that to keep on going sending its request | 37 | /// <summary> |
39 | InfoContinue = 100, | 38 | /// 100 Tells client that to keep on going sending its request |
40 | // 101 Server understands request, proposes to switch to different | 39 | /// </summary> |
41 | // application level protocol | 40 | InfoContinue = 100, |
42 | InfoSwitchingProtocols = 101, | 41 | |
43 | 42 | /// <summary> | |
44 | 43 | /// 101 Server understands request, proposes to switch to different application level protocol | |
45 | // 2xx Success codes | 44 | /// </summary> |
46 | // 200 Request successful | 45 | InfoSwitchingProtocols = 101, |
47 | SuccessOk = 200, | 46 | |
48 | // 201 Request successful, new resource created | 47 | #endregion |
49 | SuccessOkCreated = 201, | 48 | |
50 | // 202 Request accepted, processing still on-going | 49 | #region 2xx Success codes |
51 | SuccessOkAccepted = 202, | 50 | |
52 | // 203 Request successful, meta information not authoritative | 51 | /// <summary> |
53 | SuccessOkNonAuthoritativeInformation = 203, | 52 | /// 200 Request successful |
54 | // 204 Request successful, nothing to return in the body | 53 | /// </summary> |
55 | SuccessOkNoContent = 204, | 54 | SuccessOk = 200, |
56 | // 205 Request successful, reset displayed content | 55 | |
57 | SuccessOkResetContent = 205, | 56 | /// <summary> |
58 | // 206 Request successful, partial content returned | 57 | /// 201 Request successful, new resource created |
59 | SuccessOkPartialContent = 206, | 58 | /// </summary> |
60 | 59 | SuccessOkCreated = 201, | |
61 | // 3xx Redirect code: user agent needs to go somewhere else | 60 | |
62 | // 300 Redirect: different presentation forms available, take | 61 | /// <summary> |
63 | // a pick | 62 | /// 202 Request accepted, processing still on-going |
64 | RedirectMultipleChoices = 300, | 63 | /// </summary> |
65 | // 301 Redirect: requested resource has moved and now lives | 64 | SuccessOkAccepted = 202, |
66 | // somewhere else | 65 | |
67 | RedirectMovedPermanently = 301, | 66 | /// <summary> |
68 | // 302 Redirect: Resource temporarily somewhere else, location | 67 | /// 203 Request successful, meta information not authoritative |
69 | // might change | 68 | /// </summary> |
70 | RedirectFound = 302, | 69 | SuccessOkNonAuthoritativeInformation = 203, |
71 | // 303 Redirect: See other as result of a POST | 70 | |
72 | RedirectSeeOther = 303, | 71 | /// <summary> |
73 | // 304 Redirect: Resource still the same as before | 72 | /// 204 Request successful, nothing to return in the body |
74 | RedirectNotModified = 304, | 73 | /// </summary> |
75 | // 305 Redirect: Resource must be accessed via proxy provided | 74 | SuccessOkNoContent = 204, |
76 | // in location field | 75 | |
77 | RedirectUseProxy = 305, | 76 | /// <summary> |
78 | // 307 Redirect: Resource temporarily somewhere else, location | 77 | /// 205 Request successful, reset displayed content |
79 | // might change | 78 | /// </summary> |
80 | RedirectMovedTemporarily = 307, | 79 | SuccessOkResetContent = 205, |
81 | 80 | ||
82 | // 4xx Client error: the client borked the request | 81 | /// <summary> |
83 | // 400 Client error: bad request, server does not grok what | 82 | /// 206 Request successful, partial content returned |
84 | // the client wants | 83 | /// </summary> |
85 | ClientErrorBadRequest = 400, | 84 | SuccessOkPartialContent = 206, |
86 | // 401 Client error: the client is not authorized, response | 85 | |
87 | // provides WWW-Authenticate header field with a challenge | 86 | #endregion |
88 | ClientErrorUnauthorized = 401, | 87 | |
89 | // 402 Client error: Payment required (reserved for future use) | 88 | #region 3xx Redirect code: user agent needs to go somewhere else |
90 | ClientErrorPaymentRequired = 402, | 89 | |
91 | // 403 Client error: Server understood request, will not | 90 | /// <summary> |
92 | // deliver, do not try again. | 91 | /// 300 Redirect: different presentation forms available, take a pick |
93 | ClientErrorForbidden = 403, | 92 | /// </summary> |
94 | // 404 Client error: Server cannot find anything matching the | 93 | RedirectMultipleChoices = 300, |
95 | // client request. | 94 | |
96 | ClientErrorNotFound = 404, | 95 | /// <summary> |
97 | // 405 Client error: The method specified by the client in the | 96 | /// 301 Redirect: requested resource has moved and now lives somewhere else |
98 | // request is not allowed for the resource requested | 97 | /// </summary> |
99 | ClientErrorMethodNotAllowed = 405, | 98 | RedirectMovedPermanently = 301, |
100 | // 406 Client error: Server cannot generate suitable response | 99 | |
101 | // for the resource and content characteristics requested by | 100 | /// <summary> |
102 | // the client | 101 | /// 302 Redirect: Resource temporarily somewhere else, location might change |
103 | ClientErrorNotAcceptable = 406, | 102 | /// </summary> |
104 | // 407 Client error: Similar to 401, Server requests that | 103 | RedirectFound = 302, |
105 | // client authenticate itself with the proxy first | 104 | |
106 | ClientErrorProxyAuthRequired = 407, | 105 | /// <summary> |
107 | // 408 Client error: Server got impatient with client and | 106 | /// 303 Redirect: See other as result of a POST |
108 | // decided to give up waiting for the client's request to | 107 | /// </summary> |
109 | // arrive | 108 | RedirectSeeOther = 303, |
110 | ClientErrorRequestTimeout = 408, | 109 | |
111 | // 409 Client error: Server could not fulfill the request for | 110 | /// <summary> |
112 | // a resource as there is a conflict with the current state of | 111 | /// 304 Redirect: Resource still the same as before |
113 | // the resource but thinks client can do something about this | 112 | /// </summary> |
114 | ClientErrorConflict = 409, | 113 | RedirectNotModified = 304, |
115 | // 410 Client error: The resource has moved somewhere else, | 114 | |
116 | // but server has no clue where. | 115 | /// <summary> |
117 | ClientErrorGone = 410, | 116 | /// 305 Redirect: Resource must be accessed via proxy provided in location field |
118 | // 411 Client error: The server is picky again and insists on | 117 | /// </summary> |
119 | // having a content-length header field in the request | 118 | RedirectUseProxy = 305, |
120 | ClientErrorLengthRequired = 411, | 119 | |
121 | // 412 Client error: one or more preconditions supplied in the | 120 | /// <summary> |
122 | // client's request is false | 121 | /// 307 Redirect: Resource temporarily somewhere else, location might change |
123 | ClientErrorPreconditionFailed = 412, | 122 | /// </summary> |
124 | // 413 Client error: For fear of reflux, the server refuses to | 123 | RedirectMovedTemporarily = 307, |
125 | // swallow that much data. | 124 | |
126 | ClientErrorRequestEntityToLarge = 413, | 125 | #endregion |
127 | // 414 Client error: The server considers the Request-URI to | 126 | |
128 | // be indecently long and refuses to even look at it. | 127 | #region 4xx Client error: the client borked the request |
129 | ClientErrorRequestURITooLong = 414, | 128 | |
130 | // 415 Client error: The server has no clue about the media | 129 | /// <summary> |
131 | // type requested by the client (contrary to popular belief it | 130 | /// 400 Client error: bad request, server does not grok what the client wants |
132 | // is not a warez server) | 131 | /// </summary> |
133 | ClientErrorUnsupportedMediaType = 415, | 132 | ClientErrorBadRequest = 400, |
134 | // 416 Client error: The requested range cannot be delivered | 133 | |
135 | // by the server. | 134 | /// <summary> |
135 | /// 401 Client error: the client is not authorized, response provides WWW-Authenticate header field with a challenge | ||
136 | /// </summary> | ||
137 | ClientErrorUnauthorized = 401, | ||
138 | |||
139 | /// <summary> | ||
140 | /// 402 Client error: Payment required (reserved for future use) | ||
141 | /// </summary> | ||
142 | ClientErrorPaymentRequired = 402, | ||
143 | |||
144 | /// <summary> | ||
145 | /// 403 Client error: Server understood request, will not deliver, do not try again. | ||
146 | ClientErrorForbidden = 403, | ||
147 | |||
148 | /// <summary> | ||
149 | /// 404 Client error: Server cannot find anything matching the client request. | ||
150 | /// </summary> | ||
151 | ClientErrorNotFound = 404, | ||
152 | |||
153 | /// <summary> | ||
154 | /// 405 Client error: The method specified by the client in the request is not allowed for the resource requested | ||
155 | /// </summary> | ||
156 | ClientErrorMethodNotAllowed = 405, | ||
157 | |||
158 | /// <summary> | ||
159 | /// 406 Client error: Server cannot generate suitable response for the resource and content characteristics requested by the client | ||
160 | /// </summary> | ||
161 | ClientErrorNotAcceptable = 406, | ||
162 | |||
163 | /// <summary> | ||
164 | /// 407 Client error: Similar to 401, Server requests that client authenticate itself with the proxy first | ||
165 | /// </summary> | ||
166 | ClientErrorProxyAuthRequired = 407, | ||
167 | |||
168 | /// <summary> | ||
169 | /// 408 Client error: Server got impatient with client and decided to give up waiting for the client's request to arrive | ||
170 | /// </summary> | ||
171 | ClientErrorRequestTimeout = 408, | ||
172 | |||
173 | /// <summary> | ||
174 | /// 409 Client error: Server could not fulfill the request for a resource as there is a conflict with the current state of the resource but thinks client can do something about this | ||
175 | /// </summary> | ||
176 | ClientErrorConflict = 409, | ||
177 | |||
178 | /// <summary> | ||
179 | /// 410 Client error: The resource has moved somewhere else, but server has no clue where. | ||
180 | /// </summary> | ||
181 | ClientErrorGone = 410, | ||
182 | |||
183 | /// <summary> | ||
184 | /// 411 Client error: The server is picky again and insists on having a content-length header field in the request | ||
185 | /// </summary> | ||
186 | ClientErrorLengthRequired = 411, | ||
187 | |||
188 | /// <summary> | ||
189 | /// 412 Client error: one or more preconditions supplied in the client's request is false | ||
190 | /// </summary> | ||
191 | ClientErrorPreconditionFailed = 412, | ||
192 | |||
193 | /// <summary> | ||
194 | /// 413 Client error: For fear of reflux, the server refuses to swallow that much data. | ||
195 | /// </summary> | ||
196 | ClientErrorRequestEntityToLarge = 413, | ||
197 | |||
198 | /// <summary> | ||
199 | /// 414 Client error: The server considers the Request-URI to be indecently long and refuses to even look at it. | ||
200 | /// </summary> | ||
201 | ClientErrorRequestURITooLong = 414, | ||
202 | |||
203 | /// <summary> | ||
204 | /// 415 Client error: The server has no clue about the media type requested by the client (contrary to popular belief it is not a warez server) | ||
205 | /// </summary> | ||
206 | ClientErrorUnsupportedMediaType = 415, | ||
207 | |||
208 | /// <summary> | ||
209 | /// 416 Client error: The requested range cannot be delivered by the server. | ||
210 | /// </summary> | ||
136 | ClientErrorRequestRangeNotSatisfiable = 416, | 211 | ClientErrorRequestRangeNotSatisfiable = 416, |
137 | // 417 Client error: The expectations of the client as | 212 | |
138 | // expressed in one or more Expect header fields cannot be met | 213 | /// <summary> |
139 | // by the server, the server is awfully sorry about this. | 214 | /// 417 Client error: The expectations of the client as expressed in one or more Expect header fields cannot be met by the server, the server is awfully sorry about this. |
140 | ClientErrorExpectationFailed = 417, | 215 | /// </summary> |
141 | // 499 Client error: Wildcard error. | 216 | ClientErrorExpectationFailed = 417, |
142 | ClientErrorJoker = 499, | 217 | |
143 | 218 | /// <summary> | |
144 | // 5xx Server errors (rare) | 219 | /// 428 Client error :The 428 status code indicates that the origin server requires the request to be conditional. |
145 | // 500 Server error: something really strange and unexpected | 220 | /// </summary> |
146 | // happened | 221 | ClientErrorPreconditionRequired = 428, |
147 | ServerErrorInternalError = 500, | 222 | |
148 | // 501 Server error: The server does not do the functionality | 223 | /// <summary> |
149 | // required to carry out the client request. not at | 224 | /// 429 Client error: The 429 status code indicates that the user has sent too many requests in a given amount of time ("rate limiting"). |
150 | // all. certainly not before breakfast. but also not after | 225 | /// </summary> |
151 | // breakfast. | 226 | ClientErrorTooManyRequests = 429, |
152 | ServerErrorNotImplemented = 501, | 227 | |
153 | // 502 Server error: While acting as a proxy or a gateway, the | 228 | /// <summary> |
154 | // server got ditched by the upstream server and as a | 229 | /// 431 Client error: The 431 status code indicates that the server is unwilling to process the request because its header fields are too large. The request MAY be resubmitted after reducing the size of the request header fields. |
155 | // consequence regretfully cannot fulfill the client's request | 230 | /// </summary> |
156 | ServerErrorBadGateway = 502, | 231 | ClientErrorRequestHeaderFieldsTooLarge = 431, |
157 | // 503 Server error: Due to unforseen circumstances the server | 232 | |
158 | // cannot currently deliver the service requested. Retry-After | 233 | /// <summary> |
159 | // header might indicate when to try again. | 234 | /// 499 Client error: Wildcard error. |
160 | ServerErrorServiceUnavailable = 503, | 235 | /// </summary> |
161 | // 504 Server error: The server blames the upstream server | 236 | ClientErrorJoker = 499, |
162 | // for not being able to deliver the service requested and | 237 | |
163 | // claims that the upstream server is too slow delivering the | 238 | #endregion |
164 | // goods. | 239 | |
165 | ServerErrorGatewayTimeout = 504, | 240 | #region 5xx Server errors (rare) |
166 | // 505 Server error: The server does not support the HTTP | 241 | |
167 | // version conveyed in the client's request. | 242 | /// <summary> |
168 | ServerErrorHttpVersionNotSupported = 505, | 243 | /// 500 Server error: something really strange and unexpected happened |
244 | /// </summary> | ||
245 | ServerErrorInternalError = 500, | ||
246 | |||
247 | /// <summary> | ||
248 | /// 501 Server error: The server does not do the functionality required to carry out the client request. not at all. certainly not before breakfast. but also not after breakfast. | ||
249 | /// </summary> | ||
250 | ServerErrorNotImplemented = 501, | ||
251 | |||
252 | /// <summary> | ||
253 | /// 502 Server error: While acting as a proxy or a gateway, the server got ditched by the upstream server and as a consequence regretfully cannot fulfill the client's request | ||
254 | /// </summary> | ||
255 | ServerErrorBadGateway = 502, | ||
256 | |||
257 | /// <summary> | ||
258 | /// 503 Server error: Due to unforseen circumstances the server cannot currently deliver the service requested. Retry-After header might indicate when to try again. | ||
259 | /// </summary> | ||
260 | ServerErrorServiceUnavailable = 503, | ||
261 | |||
262 | /// <summary> | ||
263 | /// 504 Server error: The server blames the upstream server for not being able to deliver the service requested and claims that the upstream server is too slow delivering the goods. | ||
264 | /// </summary> | ||
265 | ServerErrorGatewayTimeout = 504, | ||
266 | |||
267 | /// <summary> | ||
268 | /// 505 Server error: The server does not support the HTTP version conveyed in the client's request. | ||
269 | /// </summary> | ||
270 | ServerErrorHttpVersionNotSupported = 505, | ||
271 | |||
272 | /// <summary> | ||
273 | /// 511 Server error: The 511 status code indicates that the client needs to authenticate to gain network access. | ||
274 | /// </summary> | ||
275 | ServerErrorNetworkAuthenticationRequired = 511, | ||
276 | |||
277 | #endregion | ||
169 | } | 278 | } |
170 | } | 279 | } |
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs index 0062d4e..f96fd1f 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs | |||
@@ -66,6 +66,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
66 | ThreadPriority.Normal, | 66 | ThreadPriority.Normal, |
67 | false, | 67 | false, |
68 | true, | 68 | true, |
69 | null, | ||
69 | int.MaxValue); | 70 | int.MaxValue); |
70 | } | 71 | } |
71 | 72 | ||
@@ -75,6 +76,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
75 | ThreadPriority.Normal, | 76 | ThreadPriority.Normal, |
76 | false, | 77 | false, |
77 | true, | 78 | true, |
79 | null, | ||
78 | 1000 * 60 * 10); | 80 | 1000 * 60 * 10); |
79 | } | 81 | } |
80 | 82 | ||
diff --git a/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs b/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs index a467a83..07082a8 100644 --- a/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs | |||
@@ -39,7 +39,11 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
39 | private RestDeserialiseMethod<TRequest, TResponse> m_method; | 39 | private RestDeserialiseMethod<TRequest, TResponse> m_method; |
40 | 40 | ||
41 | public RestDeserialiseHandler(string httpMethod, string path, RestDeserialiseMethod<TRequest, TResponse> method) | 41 | public RestDeserialiseHandler(string httpMethod, string path, RestDeserialiseMethod<TRequest, TResponse> method) |
42 | : base(httpMethod, path) | 42 | : this(httpMethod, path, method, null, null) {} |
43 | |||
44 | public RestDeserialiseHandler( | ||
45 | string httpMethod, string path, RestDeserialiseMethod<TRequest, TResponse> method, string name, string description) | ||
46 | : base(httpMethod, path, name, description) | ||
43 | { | 47 | { |
44 | m_method = method; | 48 | m_method = method; |
45 | } | 49 | } |
diff --git a/OpenSim/Framework/Servers/HttpServer/RestHTTPHandler.cs b/OpenSim/Framework/Servers/HttpServer/RestHTTPHandler.cs index 1f23cac..7f89839 100644 --- a/OpenSim/Framework/Servers/HttpServer/RestHTTPHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/RestHTTPHandler.cs | |||
@@ -38,19 +38,25 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
38 | get { return m_dhttpMethod; } | 38 | get { return m_dhttpMethod; } |
39 | } | 39 | } |
40 | 40 | ||
41 | public override Hashtable Handle(string path, Hashtable request) | 41 | public RestHTTPHandler(string httpMethod, string path, GenericHTTPMethod dhttpMethod) |
42 | : base(httpMethod, path) | ||
42 | { | 43 | { |
44 | m_dhttpMethod = dhttpMethod; | ||
45 | } | ||
46 | |||
47 | public RestHTTPHandler( | ||
48 | string httpMethod, string path, GenericHTTPMethod dhttpMethod, string name, string description) | ||
49 | : base(httpMethod, path, name, description) | ||
50 | { | ||
51 | m_dhttpMethod = dhttpMethod; | ||
52 | } | ||
43 | 53 | ||
54 | public override Hashtable Handle(string path, Hashtable request) | ||
55 | { | ||
44 | string param = GetParam(path); | 56 | string param = GetParam(path); |
45 | request.Add("param", param); | 57 | request.Add("param", param); |
46 | request.Add("path", path); | 58 | request.Add("path", path); |
47 | return m_dhttpMethod(request); | 59 | return m_dhttpMethod(request); |
48 | } | 60 | } |
49 | |||
50 | public RestHTTPHandler(string httpMethod, string path, GenericHTTPMethod dhttpMethod) | ||
51 | : base(httpMethod, path) | ||
52 | { | ||
53 | m_dhttpMethod = dhttpMethod; | ||
54 | } | ||
55 | } | 61 | } |
56 | } | 62 | } |
diff --git a/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs index d2c4002..1f17fee 100644 --- a/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs | |||
@@ -39,6 +39,15 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
39 | get { return m_restMethod; } | 39 | get { return m_restMethod; } |
40 | } | 40 | } |
41 | 41 | ||
42 | public RestStreamHandler(string httpMethod, string path, RestMethod restMethod) | ||
43 | : this(httpMethod, path, restMethod, null, null) {} | ||
44 | |||
45 | public RestStreamHandler(string httpMethod, string path, RestMethod restMethod, string name, string description) | ||
46 | : base(httpMethod, path, name, description) | ||
47 | { | ||
48 | m_restMethod = restMethod; | ||
49 | } | ||
50 | |||
42 | public override byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) | 51 | public override byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) |
43 | { | 52 | { |
44 | Encoding encoding = Encoding.UTF8; | 53 | Encoding encoding = Encoding.UTF8; |
@@ -52,10 +61,5 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
52 | 61 | ||
53 | return Encoding.UTF8.GetBytes(responseString); | 62 | return Encoding.UTF8.GetBytes(responseString); |
54 | } | 63 | } |
55 | |||
56 | public RestStreamHandler(string httpMethod, string path, RestMethod restMethod) : base(httpMethod, path) | ||
57 | { | ||
58 | m_restMethod = restMethod; | ||
59 | } | ||
60 | } | 64 | } |
61 | } | 65 | } |
diff --git a/OpenSim/Framework/Statistics/StatsManager.cs b/OpenSim/Framework/Statistics/StatsManager.cs index 43159ef..436ce2f 100644 --- a/OpenSim/Framework/Statistics/StatsManager.cs +++ b/OpenSim/Framework/Statistics/StatsManager.cs | |||
@@ -34,14 +34,12 @@ namespace OpenSim.Framework.Statistics | |||
34 | { | 34 | { |
35 | private static AssetStatsCollector assetStats; | 35 | private static AssetStatsCollector assetStats; |
36 | private static UserStatsCollector userStats; | 36 | private static UserStatsCollector userStats; |
37 | private static SimExtraStatsCollector simExtraStats; | 37 | private static SimExtraStatsCollector simExtraStats = new SimExtraStatsCollector(); |
38 | 38 | ||
39 | public static AssetStatsCollector AssetStats { get { return assetStats; } } | 39 | public static AssetStatsCollector AssetStats { get { return assetStats; } } |
40 | public static UserStatsCollector UserStats { get { return userStats; } } | 40 | public static UserStatsCollector UserStats { get { return userStats; } } |
41 | public static SimExtraStatsCollector SimExtraStats { get { return simExtraStats; } } | 41 | public static SimExtraStatsCollector SimExtraStats { get { return simExtraStats; } } |
42 | 42 | ||
43 | private StatsManager() {} | ||
44 | |||
45 | /// <summary> | 43 | /// <summary> |
46 | /// Start collecting statistics related to assets. | 44 | /// Start collecting statistics related to assets. |
47 | /// Should only be called once. | 45 | /// Should only be called once. |
@@ -63,16 +61,5 @@ namespace OpenSim.Framework.Statistics | |||
63 | 61 | ||
64 | return userStats; | 62 | return userStats; |
65 | } | 63 | } |
66 | |||
67 | /// <summary> | ||
68 | /// Start collecting extra sim statistics apart from those collected for the client. | ||
69 | /// Should only be called once. | ||
70 | /// </summary> | ||
71 | public static SimExtraStatsCollector StartCollectingSimExtraStats() | ||
72 | { | ||
73 | simExtraStats = new SimExtraStatsCollector(); | ||
74 | |||
75 | return simExtraStats; | ||
76 | } | ||
77 | } | 64 | } |
78 | } | 65 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/TaskInventoryDictionary.cs b/OpenSim/Framework/TaskInventoryDictionary.cs index 814758a..4d07746 100644 --- a/OpenSim/Framework/TaskInventoryDictionary.cs +++ b/OpenSim/Framework/TaskInventoryDictionary.cs | |||
@@ -52,10 +52,10 @@ namespace OpenSim.Framework | |||
52 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 52 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
53 | 53 | ||
54 | private Thread LockedByThread; | 54 | private Thread LockedByThread; |
55 | private string WriterStack; | 55 | // private string WriterStack; |
56 | 56 | ||
57 | private Dictionary<Thread, string> ReadLockers = | 57 | // private Dictionary<Thread, string> ReadLockers = |
58 | new Dictionary<Thread, string>(); | 58 | // new Dictionary<Thread, string>(); |
59 | 59 | ||
60 | /// <value> | 60 | /// <value> |
61 | /// An advanced lock for inventory data | 61 | /// An advanced lock for inventory data |
@@ -98,14 +98,25 @@ namespace OpenSim.Framework | |||
98 | m_log.Error("[TaskInventoryDictionary] Recursive read lock requested. This should not happen and means something needs to be fixed. For now though, it's safe to continue."); | 98 | m_log.Error("[TaskInventoryDictionary] Recursive read lock requested. This should not happen and means something needs to be fixed. For now though, it's safe to continue."); |
99 | try | 99 | try |
100 | { | 100 | { |
101 | StackTrace stackTrace = new StackTrace(); // get call stack | 101 | // That call stack is useful for end users only. RealProgrammers need a full dump. Commented. |
102 | StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames) | 102 | // StackTrace stackTrace = new StackTrace(); // get call stack |
103 | // StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames) | ||
104 | // | ||
105 | // // write call stack method names | ||
106 | // foreach (StackFrame stackFrame in stackFrames) | ||
107 | // { | ||
108 | // m_log.Error("[SceneObjectGroup.m_parts] "+(stackFrame.GetMethod().Name)); // write method name | ||
109 | // } | ||
103 | 110 | ||
104 | // write call stack method names | 111 | // The below is far more useful |
105 | foreach (StackFrame stackFrame in stackFrames) | 112 | // System.Console.WriteLine("------------------------------------------"); |
106 | { | 113 | // System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); |
107 | m_log.Error("[SceneObjectGroup.m_parts] "+(stackFrame.GetMethod().Name)); // write method name | 114 | // System.Console.WriteLine("------------------------------------------"); |
108 | } | 115 | // foreach (KeyValuePair<Thread, string> kvp in ReadLockers) |
116 | // { | ||
117 | // System.Console.WriteLine("Locker name {0} call stack:\n" + kvp.Value, kvp.Key.Name); | ||
118 | // System.Console.WriteLine("------------------------------------------"); | ||
119 | // } | ||
109 | } | 120 | } |
110 | catch | 121 | catch |
111 | {} | 122 | {} |
@@ -114,6 +125,16 @@ namespace OpenSim.Framework | |||
114 | if (m_itemLock.RecursiveWriteCount > 0) | 125 | if (m_itemLock.RecursiveWriteCount > 0) |
115 | { | 126 | { |
116 | m_log.Error("[TaskInventoryDictionary] Recursive write lock requested. This should not happen and means something needs to be fixed."); | 127 | m_log.Error("[TaskInventoryDictionary] Recursive write lock requested. This should not happen and means something needs to be fixed."); |
128 | // try | ||
129 | // { | ||
130 | // System.Console.WriteLine("------------------------------------------"); | ||
131 | // System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); | ||
132 | // System.Console.WriteLine("------------------------------------------"); | ||
133 | // System.Console.WriteLine("Locker's call stack:\n" + WriterStack); | ||
134 | // System.Console.WriteLine("------------------------------------------"); | ||
135 | // } | ||
136 | // catch | ||
137 | // {} | ||
117 | m_itemLock.ExitWriteLock(); | 138 | m_itemLock.ExitWriteLock(); |
118 | } | 139 | } |
119 | 140 | ||
@@ -123,15 +144,16 @@ namespace OpenSim.Framework | |||
123 | if (m_itemLock.IsWriteLockHeld) | 144 | if (m_itemLock.IsWriteLockHeld) |
124 | { | 145 | { |
125 | m_itemLock = new System.Threading.ReaderWriterLockSlim(); | 146 | m_itemLock = new System.Threading.ReaderWriterLockSlim(); |
126 | System.Console.WriteLine("------------------------------------------"); | 147 | // System.Console.WriteLine("------------------------------------------"); |
127 | System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); | 148 | // System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); |
128 | System.Console.WriteLine("------------------------------------------"); | 149 | // System.Console.WriteLine("------------------------------------------"); |
129 | System.Console.WriteLine("Locker's call stack:\n" + WriterStack); | 150 | // System.Console.WriteLine("Locker's call stack:\n" + WriterStack); |
130 | System.Console.WriteLine("------------------------------------------"); | 151 | // System.Console.WriteLine("------------------------------------------"); |
131 | LockedByThread = null; | 152 | // LockedByThread = null; |
132 | ReadLockers.Clear(); | 153 | // ReadLockers.Clear(); |
133 | } | 154 | } |
134 | } | 155 | } |
156 | // ReadLockers[Thread.CurrentThread] = Environment.StackTrace; | ||
135 | } | 157 | } |
136 | else | 158 | else |
137 | { | 159 | { |
@@ -139,6 +161,8 @@ namespace OpenSim.Framework | |||
139 | { | 161 | { |
140 | m_itemLock.ExitReadLock(); | 162 | m_itemLock.ExitReadLock(); |
141 | } | 163 | } |
164 | // if (m_itemLock.RecursiveReadCount == 0) | ||
165 | // ReadLockers.Remove(Thread.CurrentThread); | ||
142 | } | 166 | } |
143 | } | 167 | } |
144 | 168 | ||
@@ -158,6 +182,7 @@ namespace OpenSim.Framework | |||
158 | if (m_itemLock.RecursiveWriteCount > 0) | 182 | if (m_itemLock.RecursiveWriteCount > 0) |
159 | { | 183 | { |
160 | m_log.Error("[TaskInventoryDictionary] Recursive write lock requested. This should not happen and means something needs to be fixed."); | 184 | m_log.Error("[TaskInventoryDictionary] Recursive write lock requested. This should not happen and means something needs to be fixed."); |
185 | |||
161 | m_itemLock.ExitWriteLock(); | 186 | m_itemLock.ExitWriteLock(); |
162 | } | 187 | } |
163 | while (!m_itemLock.TryEnterWriteLock(60000)) | 188 | while (!m_itemLock.TryEnterWriteLock(60000)) |
@@ -165,30 +190,30 @@ namespace OpenSim.Framework | |||
165 | if (m_itemLock.IsWriteLockHeld) | 190 | if (m_itemLock.IsWriteLockHeld) |
166 | { | 191 | { |
167 | m_log.Error("Thread lock detected while trying to aquire WRITE lock in TaskInventoryDictionary. Locked by thread " + LockedByThread.Name + ". I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed."); | 192 | m_log.Error("Thread lock detected while trying to aquire WRITE lock in TaskInventoryDictionary. Locked by thread " + LockedByThread.Name + ". I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed."); |
168 | System.Console.WriteLine("------------------------------------------"); | 193 | // System.Console.WriteLine("------------------------------------------"); |
169 | System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); | 194 | // System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); |
170 | System.Console.WriteLine("------------------------------------------"); | 195 | // System.Console.WriteLine("------------------------------------------"); |
171 | System.Console.WriteLine("Locker's call stack:\n" + WriterStack); | 196 | // System.Console.WriteLine("Locker's call stack:\n" + WriterStack); |
172 | System.Console.WriteLine("------------------------------------------"); | 197 | // System.Console.WriteLine("------------------------------------------"); |
173 | } | 198 | } |
174 | else | 199 | else |
175 | { | 200 | { |
176 | m_log.Error("Thread lock detected while trying to aquire WRITE lock in TaskInventoryDictionary. Locked by a reader. I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed."); | 201 | m_log.Error("Thread lock detected while trying to aquire WRITE lock in TaskInventoryDictionary. Locked by a reader. I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed."); |
177 | System.Console.WriteLine("------------------------------------------"); | 202 | // System.Console.WriteLine("------------------------------------------"); |
178 | System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); | 203 | // System.Console.WriteLine("My call stack:\n" + Environment.StackTrace); |
179 | System.Console.WriteLine("------------------------------------------"); | 204 | // System.Console.WriteLine("------------------------------------------"); |
180 | foreach (KeyValuePair<Thread, string> kvp in ReadLockers) | 205 | // foreach (KeyValuePair<Thread, string> kvp in ReadLockers) |
181 | { | 206 | // { |
182 | System.Console.WriteLine("Locker name {0} call stack:\n" + kvp.Value, kvp.Key.Name); | 207 | // System.Console.WriteLine("Locker name {0} call stack:\n" + kvp.Value, kvp.Key.Name); |
183 | System.Console.WriteLine("------------------------------------------"); | 208 | // System.Console.WriteLine("------------------------------------------"); |
184 | } | 209 | // } |
185 | } | 210 | } |
186 | m_itemLock = new System.Threading.ReaderWriterLockSlim(); | 211 | m_itemLock = new System.Threading.ReaderWriterLockSlim(); |
187 | ReadLockers.Clear(); | 212 | // ReadLockers.Clear(); |
188 | } | 213 | } |
189 | 214 | ||
190 | LockedByThread = Thread.CurrentThread; | 215 | LockedByThread = Thread.CurrentThread; |
191 | WriterStack = Environment.StackTrace; | 216 | // WriterStack = Environment.StackTrace; |
192 | } | 217 | } |
193 | else | 218 | else |
194 | { | 219 | { |
diff --git a/OpenSim/Framework/TaskInventoryItem.cs b/OpenSim/Framework/TaskInventoryItem.cs index 7ef8bf7..fb818ee 100644 --- a/OpenSim/Framework/TaskInventoryItem.cs +++ b/OpenSim/Framework/TaskInventoryItem.cs | |||
@@ -26,6 +26,8 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Reflection; | ||
30 | using log4net; | ||
29 | using OpenMetaverse; | 31 | using OpenMetaverse; |
30 | 32 | ||
31 | namespace OpenSim.Framework | 33 | namespace OpenSim.Framework |
@@ -35,6 +37,8 @@ namespace OpenSim.Framework | |||
35 | /// </summary> | 37 | /// </summary> |
36 | public class TaskInventoryItem : ICloneable | 38 | public class TaskInventoryItem : ICloneable |
37 | { | 39 | { |
40 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
41 | |||
38 | /// <summary> | 42 | /// <summary> |
39 | /// XXX This should really be factored out into some constants class. | 43 | /// XXX This should really be factored out into some constants class. |
40 | /// </summary> | 44 | /// </summary> |
@@ -334,12 +338,18 @@ namespace OpenSim.Framework | |||
334 | } | 338 | } |
335 | } | 339 | } |
336 | 340 | ||
337 | public bool OwnerChanged { | 341 | public bool OwnerChanged |
338 | get { | 342 | { |
343 | get | ||
344 | { | ||
339 | return _ownerChanged; | 345 | return _ownerChanged; |
340 | } | 346 | } |
341 | set { | 347 | set |
348 | { | ||
342 | _ownerChanged = value; | 349 | _ownerChanged = value; |
350 | // m_log.DebugFormat( | ||
351 | // "[TASK INVENTORY ITEM]: Owner changed set {0} for {1} {2} owned by {3}", | ||
352 | // _ownerChanged, Name, ItemID, OwnerID); | ||
343 | } | 353 | } |
344 | } | 354 | } |
345 | 355 | ||
diff --git a/OpenSim/Framework/Tests/MundaneFrameworkTests.cs b/OpenSim/Framework/Tests/MundaneFrameworkTests.cs index 34a3f15..6fde488 100644 --- a/OpenSim/Framework/Tests/MundaneFrameworkTests.cs +++ b/OpenSim/Framework/Tests/MundaneFrameworkTests.cs | |||
@@ -227,10 +227,10 @@ namespace OpenSim.Framework.Tests | |||
227 | es.AddEstateManager(UUID.Zero); | 227 | es.AddEstateManager(UUID.Zero); |
228 | 228 | ||
229 | es.AddEstateManager(bannedUserId); | 229 | es.AddEstateManager(bannedUserId); |
230 | Assert.IsTrue(es.IsEstateManager(bannedUserId), "bannedUserId should be EstateManager but isn't."); | 230 | Assert.IsTrue(es.IsEstateManagerOrOwner(bannedUserId), "bannedUserId should be EstateManager but isn't."); |
231 | 231 | ||
232 | es.RemoveEstateManager(bannedUserId); | 232 | es.RemoveEstateManager(bannedUserId); |
233 | Assert.IsFalse(es.IsEstateManager(bannedUserId), "bannedUserID is estateManager but shouldn't be"); | 233 | Assert.IsFalse(es.IsEstateManagerOrOwner(bannedUserId), "bannedUserID is estateManager but shouldn't be"); |
234 | 234 | ||
235 | Assert.IsFalse(es.HasAccess(bannedUserId), "bannedUserID has access but shouldn't"); | 235 | Assert.IsFalse(es.HasAccess(bannedUserId), "bannedUserID has access but shouldn't"); |
236 | 236 | ||
diff --git a/OpenSim/Framework/Tests/UtilTest.cs b/OpenSim/Framework/Tests/UtilTest.cs index 1ca35df..f0d2a3f 100644 --- a/OpenSim/Framework/Tests/UtilTest.cs +++ b/OpenSim/Framework/Tests/UtilTest.cs | |||
@@ -214,16 +214,13 @@ namespace OpenSim.Framework.Tests | |||
214 | 214 | ||
215 | for (int i = 0; i < contenttypes.Length; i++) | 215 | for (int i = 0; i < contenttypes.Length; i++) |
216 | { | 216 | { |
217 | if (SLUtil.ContentTypeToSLAssetType(contenttypes[i]) == 18) | 217 | int expected; |
218 | { | 218 | if (contenttypes[i] == "image/tga") |
219 | Assert.That(contenttypes[i] == "image/tga"); | 219 | expected = 12; // if we know only the content-type "image/tga", then we assume the asset type is TextureTGA; not ImageTGA |
220 | } | ||
221 | else | 220 | else |
222 | { | 221 | expected = assettypes[i]; |
223 | Assert.That(SLUtil.ContentTypeToSLAssetType(contenttypes[i]) == assettypes[i], | 222 | Assert.AreEqual(expected, SLUtil.ContentTypeToSLAssetType(contenttypes[i]), |
224 | "Expecting {0} but got {1}", assettypes[i], | 223 | String.Format("Incorrect AssetType mapped from Content-Type {0}", contenttypes[i])); |
225 | SLUtil.ContentTypeToSLAssetType(contenttypes[i])); | ||
226 | } | ||
227 | } | 224 | } |
228 | 225 | ||
229 | int[] inventorytypes = new int[] {-1,0,1,2,3,6,7,8,9,10,15,17,18,20}; | 226 | int[] inventorytypes = new int[] {-1,0,1,2,3,6,7,8,9,10,15,17,18,20}; |
@@ -237,7 +234,7 @@ namespace OpenSim.Framework.Tests | |||
237 | "application/vnd.ll.primitive", | 234 | "application/vnd.ll.primitive", |
238 | "application/vnd.ll.notecard", | 235 | "application/vnd.ll.notecard", |
239 | "application/vnd.ll.folder", | 236 | "application/vnd.ll.folder", |
240 | "application/octet-stream", | 237 | "application/vnd.ll.rootfolder", |
241 | "application/vnd.ll.lsltext", | 238 | "application/vnd.ll.lsltext", |
242 | "image/x-j2c", | 239 | "image/x-j2c", |
243 | "application/vnd.ll.primitive", | 240 | "application/vnd.ll.primitive", |
@@ -247,7 +244,8 @@ namespace OpenSim.Framework.Tests | |||
247 | 244 | ||
248 | for (int i=0;i<inventorytypes.Length;i++) | 245 | for (int i=0;i<inventorytypes.Length;i++) |
249 | { | 246 | { |
250 | Assert.That(SLUtil.SLInvTypeToContentType(inventorytypes[i]) == invcontenttypes[i], "Expected {0}, Got {1}", invcontenttypes[i], SLUtil.SLInvTypeToContentType(inventorytypes[i])); | 247 | Assert.AreEqual(invcontenttypes[i], SLUtil.SLInvTypeToContentType(inventorytypes[i]), |
248 | String.Format("Incorrect Content-Type mapped from InventoryType {0}", inventorytypes[i])); | ||
251 | } | 249 | } |
252 | 250 | ||
253 | invcontenttypes = new string[] | 251 | invcontenttypes = new string[] |
@@ -280,7 +278,8 @@ namespace OpenSim.Framework.Tests | |||
280 | 278 | ||
281 | for (int i = 0; i < invtypes.Length; i++) | 279 | for (int i = 0; i < invtypes.Length; i++) |
282 | { | 280 | { |
283 | Assert.That(SLUtil.ContentTypeToSLInvType(invcontenttypes[i]) == invtypes[i], "Expected {0}, Got {1}", invtypes[i], SLUtil.ContentTypeToSLInvType(invcontenttypes[i])); | 281 | Assert.AreEqual(invtypes[i], SLUtil.ContentTypeToSLInvType(invcontenttypes[i]), |
282 | String.Format("Incorrect InventoryType mapped from Content-Type {0}", invcontenttypes[i])); | ||
284 | } | 283 | } |
285 | } | 284 | } |
286 | } | 285 | } |
diff --git a/OpenSim/Framework/Watchdog.cs b/OpenSim/Framework/Watchdog.cs index 881b6aa..68bf477 100644 --- a/OpenSim/Framework/Watchdog.cs +++ b/OpenSim/Framework/Watchdog.cs | |||
@@ -42,7 +42,7 @@ namespace OpenSim.Framework | |||
42 | const double WATCHDOG_INTERVAL_MS = 2500.0d; | 42 | const double WATCHDOG_INTERVAL_MS = 2500.0d; |
43 | 43 | ||
44 | /// <summary>Maximum timeout in milliseconds before a thread is considered dead</summary> | 44 | /// <summary>Maximum timeout in milliseconds before a thread is considered dead</summary> |
45 | const int WATCHDOG_TIMEOUT_MS = 5000; | 45 | public const int WATCHDOG_TIMEOUT_MS = 5000; |
46 | 46 | ||
47 | [System.Diagnostics.DebuggerDisplay("{Thread.Name}")] | 47 | [System.Diagnostics.DebuggerDisplay("{Thread.Name}")] |
48 | public class ThreadWatchdogInfo | 48 | public class ThreadWatchdogInfo |
@@ -58,7 +58,7 @@ namespace OpenSim.Framework | |||
58 | public int FirstTick { get; private set; } | 58 | public int FirstTick { get; private set; } |
59 | 59 | ||
60 | /// <summary> | 60 | /// <summary> |
61 | /// First time this heartbeat update was invoked | 61 | /// Last time this heartbeat update was invoked |
62 | /// </summary> | 62 | /// </summary> |
63 | public int LastTick { get; set; } | 63 | public int LastTick { get; set; } |
64 | 64 | ||
@@ -77,6 +77,11 @@ namespace OpenSim.Framework | |||
77 | /// </summary> | 77 | /// </summary> |
78 | public bool AlarmIfTimeout { get; set; } | 78 | public bool AlarmIfTimeout { get; set; } |
79 | 79 | ||
80 | /// <summary> | ||
81 | /// Method execute if alarm goes off. If null then no alarm method is fired. | ||
82 | /// </summary> | ||
83 | public Func<string> AlarmMethod { get; set; } | ||
84 | |||
80 | public ThreadWatchdogInfo(Thread thread, int timeout) | 85 | public ThreadWatchdogInfo(Thread thread, int timeout) |
81 | { | 86 | { |
82 | Thread = thread; | 87 | Thread = thread; |
@@ -87,16 +92,10 @@ namespace OpenSim.Framework | |||
87 | } | 92 | } |
88 | 93 | ||
89 | /// <summary> | 94 | /// <summary> |
90 | /// This event is called whenever a tracked thread is stopped or | 95 | /// This event is called whenever a tracked thread is |
91 | /// has not called UpdateThread() in time | 96 | /// stopped or has not called UpdateThread() in time< |
92 | /// </summary> | 97 | /// /summary> |
93 | /// <param name="thread">The thread that has been identified as dead</param> | 98 | public static event Action<ThreadWatchdogInfo> OnWatchdogTimeout; |
94 | /// <param name="lastTick">The last time this thread called UpdateThread()</param> | ||
95 | public delegate void WatchdogTimeout(Thread thread, int lastTick); | ||
96 | |||
97 | /// <summary>This event is called whenever a tracked thread is | ||
98 | /// stopped or has not called UpdateThread() in time</summary> | ||
99 | public static event WatchdogTimeout OnWatchdogTimeout; | ||
100 | 99 | ||
101 | private static readonly ILog m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | 100 | private static readonly ILog m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); |
102 | private static Dictionary<int, ThreadWatchdogInfo> m_threads; | 101 | private static Dictionary<int, ThreadWatchdogInfo> m_threads; |
@@ -123,7 +122,7 @@ namespace OpenSim.Framework | |||
123 | public static Thread StartThread( | 122 | public static Thread StartThread( |
124 | ThreadStart start, string name, ThreadPriority priority, bool isBackground, bool alarmIfTimeout) | 123 | ThreadStart start, string name, ThreadPriority priority, bool isBackground, bool alarmIfTimeout) |
125 | { | 124 | { |
126 | return StartThread(start, name, priority, isBackground, alarmIfTimeout, WATCHDOG_TIMEOUT_MS); | 125 | return StartThread(start, name, priority, isBackground, alarmIfTimeout, null, WATCHDOG_TIMEOUT_MS); |
127 | } | 126 | } |
128 | 127 | ||
129 | /// <summary> | 128 | /// <summary> |
@@ -135,17 +134,24 @@ namespace OpenSim.Framework | |||
135 | /// <param name="isBackground">True to run this thread as a background | 134 | /// <param name="isBackground">True to run this thread as a background |
136 | /// thread, otherwise false</param> | 135 | /// thread, otherwise false</param> |
137 | /// <param name="alarmIfTimeout">Trigger an alarm function is we have timed out</param> | 136 | /// <param name="alarmIfTimeout">Trigger an alarm function is we have timed out</param> |
137 | /// <param name="alarmMethod"> | ||
138 | /// Alarm method to call if alarmIfTimeout is true and there is a timeout. | ||
139 | /// Normally, this will just return some useful debugging information. | ||
140 | /// </param> | ||
138 | /// <param name="timeout">Number of milliseconds to wait until we issue a warning about timeout.</param> | 141 | /// <param name="timeout">Number of milliseconds to wait until we issue a warning about timeout.</param> |
139 | /// <returns>The newly created Thread object</returns> | 142 | /// <returns>The newly created Thread object</returns> |
140 | public static Thread StartThread( | 143 | public static Thread StartThread( |
141 | ThreadStart start, string name, ThreadPriority priority, bool isBackground, bool alarmIfTimeout, int timeout) | 144 | ThreadStart start, string name, ThreadPriority priority, bool isBackground, |
145 | bool alarmIfTimeout, Func<string> alarmMethod, int timeout) | ||
142 | { | 146 | { |
143 | Thread thread = new Thread(start); | 147 | Thread thread = new Thread(start); |
144 | thread.Name = name; | 148 | thread.Name = name; |
145 | thread.Priority = priority; | 149 | thread.Priority = priority; |
146 | thread.IsBackground = isBackground; | 150 | thread.IsBackground = isBackground; |
147 | 151 | ||
148 | ThreadWatchdogInfo twi = new ThreadWatchdogInfo(thread, timeout) { AlarmIfTimeout = alarmIfTimeout }; | 152 | ThreadWatchdogInfo twi |
153 | = new ThreadWatchdogInfo(thread, timeout) | ||
154 | { AlarmIfTimeout = alarmIfTimeout, AlarmMethod = alarmMethod }; | ||
149 | 155 | ||
150 | m_log.DebugFormat( | 156 | m_log.DebugFormat( |
151 | "[WATCHDOG]: Started tracking thread {0}, ID {1}", twi.Thread.Name, twi.Thread.ManagedThreadId); | 157 | "[WATCHDOG]: Started tracking thread {0}, ID {1}", twi.Thread.Name, twi.Thread.ManagedThreadId); |
@@ -258,7 +264,7 @@ namespace OpenSim.Framework | |||
258 | /// <param name="e"></param> | 264 | /// <param name="e"></param> |
259 | private static void WatchdogTimerElapsed(object sender, System.Timers.ElapsedEventArgs e) | 265 | private static void WatchdogTimerElapsed(object sender, System.Timers.ElapsedEventArgs e) |
260 | { | 266 | { |
261 | WatchdogTimeout callback = OnWatchdogTimeout; | 267 | Action<ThreadWatchdogInfo> callback = OnWatchdogTimeout; |
262 | 268 | ||
263 | if (callback != null) | 269 | if (callback != null) |
264 | { | 270 | { |
@@ -296,7 +302,7 @@ namespace OpenSim.Framework | |||
296 | 302 | ||
297 | if (callbackInfos != null) | 303 | if (callbackInfos != null) |
298 | foreach (ThreadWatchdogInfo callbackInfo in callbackInfos) | 304 | foreach (ThreadWatchdogInfo callbackInfo in callbackInfos) |
299 | callback(callbackInfo.Thread, callbackInfo.LastTick); | 305 | callback(callbackInfo); |
300 | } | 306 | } |
301 | 307 | ||
302 | m_watchdogTimer.Start(); | 308 | m_watchdogTimer.Start(); |
diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index aac575c..6a40cd5 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs | |||
@@ -53,19 +53,36 @@ namespace OpenSim.Framework | |||
53 | LogManager.GetLogger( | 53 | LogManager.GetLogger( |
54 | MethodBase.GetCurrentMethod().DeclaringType); | 54 | MethodBase.GetCurrentMethod().DeclaringType); |
55 | 55 | ||
56 | private static int m_requestNumber = 0; | 56 | /// <summary> |
57 | /// Request number for diagnostic purposes. | ||
58 | /// </summary> | ||
59 | public static int RequestNumber = 0; | ||
57 | 60 | ||
58 | // this is the header field used to communicate the local request id | 61 | /// <summary> |
59 | // used for performance and debugging | 62 | /// this is the header field used to communicate the local request id |
63 | /// used for performance and debugging | ||
64 | /// </summary> | ||
60 | public const string OSHeaderRequestID = "opensim-request-id"; | 65 | public const string OSHeaderRequestID = "opensim-request-id"; |
61 | 66 | ||
62 | // number of milliseconds a call can take before it is considered | 67 | /// <summary> |
63 | // a "long" call for warning & debugging purposes | 68 | /// Number of milliseconds a call can take before it is considered |
64 | public const int LongCallTime = 500; | 69 | /// a "long" call for warning & debugging purposes |
70 | /// </summary> | ||
71 | public const int LongCallTime = 3000; | ||
65 | 72 | ||
66 | // dictionary of end points | 73 | /// <summary> |
74 | /// The maximum length of any data logged because of a long request time. | ||
75 | /// </summary> | ||
76 | /// <remarks> | ||
77 | /// This is to truncate any really large post data, such as an asset. In theory, the first section should | ||
78 | /// give us useful information about the call (which agent it relates to if applicable, etc.). | ||
79 | /// </remarks> | ||
80 | public const int MaxRequestDiagLength = 100; | ||
81 | |||
82 | /// <summary> | ||
83 | /// Dictionary of end points | ||
84 | /// </summary> | ||
67 | private static Dictionary<string,object> m_endpointSerializer = new Dictionary<string,object>(); | 85 | private static Dictionary<string,object> m_endpointSerializer = new Dictionary<string,object>(); |
68 | |||
69 | 86 | ||
70 | private static object EndPointLock(string url) | 87 | private static object EndPointLock(string url) |
71 | { | 88 | { |
@@ -86,8 +103,7 @@ namespace OpenSim.Framework | |||
86 | return eplock; | 103 | return eplock; |
87 | } | 104 | } |
88 | } | 105 | } |
89 | 106 | ||
90 | |||
91 | #region JSONRequest | 107 | #region JSONRequest |
92 | 108 | ||
93 | /// <summary> | 109 | /// <summary> |
@@ -129,12 +145,13 @@ namespace OpenSim.Framework | |||
129 | 145 | ||
130 | private static OSDMap ServiceOSDRequestWorker(string url, OSDMap data, string method, int timeout, bool compressed) | 146 | private static OSDMap ServiceOSDRequestWorker(string url, OSDMap data, string method, int timeout, bool compressed) |
131 | { | 147 | { |
132 | int reqnum = m_requestNumber++; | 148 | int reqnum = RequestNumber++; |
133 | // m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); | 149 | // m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); |
134 | 150 | ||
135 | string errorMessage = "unknown error"; | 151 | string errorMessage = "unknown error"; |
136 | int tickstart = Util.EnvironmentTickCount(); | 152 | int tickstart = Util.EnvironmentTickCount(); |
137 | int tickdata = 0; | 153 | int tickdata = 0; |
154 | string strBuffer = null; | ||
138 | 155 | ||
139 | try | 156 | try |
140 | { | 157 | { |
@@ -149,7 +166,7 @@ namespace OpenSim.Framework | |||
149 | // If there is some input, write it into the request | 166 | // If there is some input, write it into the request |
150 | if (data != null) | 167 | if (data != null) |
151 | { | 168 | { |
152 | string strBuffer = OSDParser.SerializeJsonString(data); | 169 | strBuffer = OSDParser.SerializeJsonString(data); |
153 | byte[] buffer = System.Text.Encoding.UTF8.GetBytes(strBuffer); | 170 | byte[] buffer = System.Text.Encoding.UTF8.GetBytes(strBuffer); |
154 | 171 | ||
155 | if (compressed) | 172 | if (compressed) |
@@ -210,14 +227,23 @@ namespace OpenSim.Framework | |||
210 | } | 227 | } |
211 | finally | 228 | finally |
212 | { | 229 | { |
213 | // This just dumps a warning for any operation that takes more than 100 ms | ||
214 | int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); | 230 | int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); |
215 | if (tickdiff > LongCallTime) | 231 | if (tickdiff > LongCallTime) |
216 | m_log.DebugFormat("[WEB UTIL]: osd request <{0}> (URI:{1}, METHOD:{2}) took {3}ms overall, {4}ms writing", | 232 | m_log.InfoFormat( |
217 | reqnum,url,method,tickdiff,tickdata); | 233 | "[OSD REQUEST]: Slow request to <{0}> {1} {2} took {3}ms, {4}ms writing, {5}", |
234 | reqnum, | ||
235 | method, | ||
236 | url, | ||
237 | tickdiff, | ||
238 | tickdata, | ||
239 | strBuffer != null | ||
240 | ? (strBuffer.Length > MaxRequestDiagLength ? strBuffer.Remove(MaxRequestDiagLength) : strBuffer) | ||
241 | : ""); | ||
218 | } | 242 | } |
219 | 243 | ||
220 | m_log.DebugFormat("[WEB UTIL]: <{0}> osd request for {1}, method {2} FAILED: {3}", reqnum, url, method, errorMessage); | 244 | m_log.DebugFormat( |
245 | "[WEB UTIL]: <{0}> osd request for {1}, method {2} FAILED: {3}", reqnum, url, method, errorMessage); | ||
246 | |||
221 | return ErrorResponseMap(errorMessage); | 247 | return ErrorResponseMap(errorMessage); |
222 | } | 248 | } |
223 | 249 | ||
@@ -290,17 +316,17 @@ namespace OpenSim.Framework | |||
290 | 316 | ||
291 | private static OSDMap ServiceFormRequestWorker(string url, NameValueCollection data, int timeout) | 317 | private static OSDMap ServiceFormRequestWorker(string url, NameValueCollection data, int timeout) |
292 | { | 318 | { |
293 | int reqnum = m_requestNumber++; | 319 | int reqnum = RequestNumber++; |
294 | string method = (data != null && data["RequestMethod"] != null) ? data["RequestMethod"] : "unknown"; | 320 | string method = (data != null && data["RequestMethod"] != null) ? data["RequestMethod"] : "unknown"; |
295 | // m_log.DebugFormat("[WEB UTIL]: <{0}> start form request for {1}, method {2}",reqnum,url,method); | 321 | // m_log.DebugFormat("[WEB UTIL]: <{0}> start form request for {1}, method {2}",reqnum,url,method); |
296 | 322 | ||
297 | string errorMessage = "unknown error"; | 323 | string errorMessage = "unknown error"; |
298 | int tickstart = Util.EnvironmentTickCount(); | 324 | int tickstart = Util.EnvironmentTickCount(); |
299 | int tickdata = 0; | 325 | int tickdata = 0; |
326 | string queryString = null; | ||
300 | 327 | ||
301 | try | 328 | try |
302 | { | 329 | { |
303 | |||
304 | HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); | 330 | HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); |
305 | request.Method = "POST"; | 331 | request.Method = "POST"; |
306 | request.Timeout = timeout; | 332 | request.Timeout = timeout; |
@@ -311,7 +337,7 @@ namespace OpenSim.Framework | |||
311 | 337 | ||
312 | if (data != null) | 338 | if (data != null) |
313 | { | 339 | { |
314 | string queryString = BuildQueryString(data); | 340 | queryString = BuildQueryString(data); |
315 | byte[] buffer = System.Text.Encoding.UTF8.GetBytes(queryString); | 341 | byte[] buffer = System.Text.Encoding.UTF8.GetBytes(queryString); |
316 | 342 | ||
317 | request.ContentLength = buffer.Length; | 343 | request.ContentLength = buffer.Length; |
@@ -354,11 +380,20 @@ namespace OpenSim.Framework | |||
354 | { | 380 | { |
355 | int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); | 381 | int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); |
356 | if (tickdiff > LongCallTime) | 382 | if (tickdiff > LongCallTime) |
357 | m_log.InfoFormat("[WEB UTIL]: form request <{0}> (URI:{1}, METHOD:{2}) took {3}ms overall, {4}ms writing", | 383 | m_log.InfoFormat( |
358 | reqnum,url,method,tickdiff,tickdata); | 384 | "[SERVICE FORM]: Slow request to <{0}> {1} {2} took {3}ms, {4}ms writing, {5}", |
385 | reqnum, | ||
386 | method, | ||
387 | url, | ||
388 | tickdiff, | ||
389 | tickdata, | ||
390 | queryString != null | ||
391 | ? (queryString.Length > MaxRequestDiagLength) ? queryString.Remove(MaxRequestDiagLength) : queryString | ||
392 | : ""); | ||
359 | } | 393 | } |
360 | 394 | ||
361 | m_log.WarnFormat("[WEB UTIL]: <{0}> form request failed: {1}",reqnum,errorMessage); | 395 | m_log.WarnFormat("[SERVICE FORM]: <{0}> form request to {1} failed: {2}", reqnum, url, errorMessage); |
396 | |||
362 | return ErrorResponseMap(errorMessage); | 397 | return ErrorResponseMap(errorMessage); |
363 | } | 398 | } |
364 | 399 | ||
@@ -638,8 +673,6 @@ namespace OpenSim.Framework | |||
638 | 673 | ||
639 | return new string[0]; | 674 | return new string[0]; |
640 | } | 675 | } |
641 | |||
642 | |||
643 | } | 676 | } |
644 | 677 | ||
645 | public static class AsynchronousRestObjectRequester | 678 | public static class AsynchronousRestObjectRequester |
@@ -662,6 +695,12 @@ namespace OpenSim.Framework | |||
662 | public static void MakeRequest<TRequest, TResponse>(string verb, | 695 | public static void MakeRequest<TRequest, TResponse>(string verb, |
663 | string requestUrl, TRequest obj, Action<TResponse> action) | 696 | string requestUrl, TRequest obj, Action<TResponse> action) |
664 | { | 697 | { |
698 | int reqnum = WebUtil.RequestNumber++; | ||
699 | // m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); | ||
700 | |||
701 | int tickstart = Util.EnvironmentTickCount(); | ||
702 | int tickdata = 0; | ||
703 | |||
665 | // m_log.DebugFormat("[ASYNC REQUEST]: Starting {0} {1}", verb, requestUrl); | 704 | // m_log.DebugFormat("[ASYNC REQUEST]: Starting {0} {1}", verb, requestUrl); |
666 | 705 | ||
667 | Type type = typeof(TRequest); | 706 | Type type = typeof(TRequest); |
@@ -672,12 +711,13 @@ namespace OpenSim.Framework | |||
672 | XmlSerializer deserializer = new XmlSerializer(typeof(TResponse)); | 711 | XmlSerializer deserializer = new XmlSerializer(typeof(TResponse)); |
673 | 712 | ||
674 | request.Method = verb; | 713 | request.Method = verb; |
714 | MemoryStream buffer = null; | ||
675 | 715 | ||
676 | if (verb == "POST") | 716 | if (verb == "POST") |
677 | { | 717 | { |
678 | request.ContentType = "text/xml"; | 718 | request.ContentType = "text/xml"; |
679 | 719 | ||
680 | MemoryStream buffer = new MemoryStream(); | 720 | buffer = new MemoryStream(); |
681 | 721 | ||
682 | XmlWriterSettings settings = new XmlWriterSettings(); | 722 | XmlWriterSettings settings = new XmlWriterSettings(); |
683 | settings.Encoding = Encoding.UTF8; | 723 | settings.Encoding = Encoding.UTF8; |
@@ -699,6 +739,9 @@ namespace OpenSim.Framework | |||
699 | requestStream.Write(buffer.ToArray(), 0, length); | 739 | requestStream.Write(buffer.ToArray(), 0, length); |
700 | requestStream.Close(); | 740 | requestStream.Close(); |
701 | 741 | ||
742 | // capture how much time was spent writing | ||
743 | tickdata = Util.EnvironmentTickCountSubtract(tickstart); | ||
744 | |||
702 | request.BeginGetResponse(delegate(IAsyncResult ar) | 745 | request.BeginGetResponse(delegate(IAsyncResult ar) |
703 | { | 746 | { |
704 | response = request.EndGetResponse(ar); | 747 | response = request.EndGetResponse(ar); |
@@ -724,83 +767,108 @@ namespace OpenSim.Framework | |||
724 | 767 | ||
725 | }, null); | 768 | }, null); |
726 | }, null); | 769 | }, null); |
727 | |||
728 | |||
729 | return; | ||
730 | } | 770 | } |
731 | 771 | else | |
732 | request.BeginGetResponse(delegate(IAsyncResult res2) | ||
733 | { | 772 | { |
734 | try | 773 | request.BeginGetResponse(delegate(IAsyncResult res2) |
735 | { | 774 | { |
736 | // If the server returns a 404, this appears to trigger a System.Net.WebException even though that isn't | ||
737 | // documented in MSDN | ||
738 | response = request.EndGetResponse(res2); | ||
739 | |||
740 | Stream respStream = null; | ||
741 | try | 775 | try |
742 | { | 776 | { |
743 | respStream = response.GetResponseStream(); | 777 | // If the server returns a 404, this appears to trigger a System.Net.WebException even though that isn't |
744 | deserial = (TResponse)deserializer.Deserialize(respStream); | 778 | // documented in MSDN |
745 | } | 779 | response = request.EndGetResponse(res2); |
746 | catch (System.InvalidOperationException) | 780 | |
747 | { | 781 | Stream respStream = null; |
748 | } | 782 | try |
749 | finally | 783 | { |
750 | { | 784 | respStream = response.GetResponseStream(); |
751 | respStream.Close(); | 785 | deserial = (TResponse)deserializer.Deserialize(respStream); |
752 | response.Close(); | 786 | } |
787 | catch (System.InvalidOperationException) | ||
788 | { | ||
789 | } | ||
790 | finally | ||
791 | { | ||
792 | respStream.Close(); | ||
793 | response.Close(); | ||
794 | } | ||
753 | } | 795 | } |
754 | } | 796 | catch (WebException e) |
755 | catch (WebException e) | ||
756 | { | ||
757 | if (e.Status == WebExceptionStatus.ProtocolError) | ||
758 | { | 797 | { |
759 | if (e.Response is HttpWebResponse) | 798 | if (e.Status == WebExceptionStatus.ProtocolError) |
760 | { | 799 | { |
761 | HttpWebResponse httpResponse = (HttpWebResponse)e.Response; | 800 | if (e.Response is HttpWebResponse) |
762 | |||
763 | if (httpResponse.StatusCode != HttpStatusCode.NotFound) | ||
764 | { | 801 | { |
765 | // We don't appear to be handling any other status codes, so log these feailures to that | 802 | HttpWebResponse httpResponse = (HttpWebResponse)e.Response; |
766 | // people don't spend unnecessary hours hunting phantom bugs. | 803 | |
767 | m_log.DebugFormat( | 804 | if (httpResponse.StatusCode != HttpStatusCode.NotFound) |
768 | "[ASYNC REQUEST]: Request {0} {1} failed with unexpected status code {2}", | 805 | { |
769 | verb, requestUrl, httpResponse.StatusCode); | 806 | // We don't appear to be handling any other status codes, so log these feailures to that |
807 | // people don't spend unnecessary hours hunting phantom bugs. | ||
808 | m_log.DebugFormat( | ||
809 | "[ASYNC REQUEST]: Request {0} {1} failed with unexpected status code {2}", | ||
810 | verb, requestUrl, httpResponse.StatusCode); | ||
811 | } | ||
770 | } | 812 | } |
771 | } | 813 | } |
814 | else | ||
815 | { | ||
816 | m_log.ErrorFormat( | ||
817 | "[ASYNC REQUEST]: Request {0} {1} failed with status {2} and message {3}", | ||
818 | verb, requestUrl, e.Status, e.Message); | ||
819 | } | ||
772 | } | 820 | } |
773 | else | 821 | catch (Exception e) |
774 | { | 822 | { |
775 | m_log.ErrorFormat("[ASYNC REQUEST]: Request {0} {1} failed with status {2} and message {3}", verb, requestUrl, e.Status, e.Message); | 823 | m_log.ErrorFormat( |
824 | "[ASYNC REQUEST]: Request {0} {1} failed with exception {2}{3}", | ||
825 | verb, requestUrl, e.Message, e.StackTrace); | ||
776 | } | 826 | } |
777 | } | 827 | |
778 | catch (Exception e) | 828 | // m_log.DebugFormat("[ASYNC REQUEST]: Received {0}", deserial.ToString()); |
779 | { | ||
780 | m_log.ErrorFormat("[ASYNC REQUEST]: Request {0} {1} failed with exception {2}", verb, requestUrl, e); | ||
781 | } | ||
782 | 829 | ||
783 | // m_log.DebugFormat("[ASYNC REQUEST]: Received {0}", deserial.ToString()); | 830 | try |
831 | { | ||
832 | action(deserial); | ||
833 | } | ||
834 | catch (Exception e) | ||
835 | { | ||
836 | m_log.ErrorFormat( | ||
837 | "[ASYNC REQUEST]: Request {0} {1} callback failed with exception {2}{3}", | ||
838 | verb, requestUrl, e.Message, e.StackTrace); | ||
839 | } | ||
840 | |||
841 | }, null); | ||
842 | } | ||
784 | 843 | ||
785 | try | 844 | int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); |
786 | { | 845 | if (tickdiff > WebUtil.LongCallTime) |
787 | action(deserial); | 846 | { |
788 | } | 847 | string originalRequest = null; |
789 | catch (Exception e) | 848 | |
849 | if (buffer != null) | ||
790 | { | 850 | { |
791 | m_log.ErrorFormat( | 851 | originalRequest = Encoding.UTF8.GetString(buffer.ToArray()); |
792 | "[ASYNC REQUEST]: Request {0} {1} callback failed with exception {2}", verb, requestUrl, e); | 852 | |
853 | if (originalRequest.Length > WebUtil.MaxRequestDiagLength) | ||
854 | originalRequest = originalRequest.Remove(WebUtil.MaxRequestDiagLength); | ||
793 | } | 855 | } |
794 | 856 | ||
795 | }, null); | 857 | m_log.InfoFormat( |
858 | "[ASYNC REQUEST]: Slow request to <{0}> {1} {2} took {3}ms, {4}ms writing, {5}", | ||
859 | reqnum, | ||
860 | verb, | ||
861 | requestUrl, | ||
862 | tickdiff, | ||
863 | tickdata, | ||
864 | originalRequest); | ||
865 | } | ||
796 | } | 866 | } |
797 | } | 867 | } |
798 | 868 | ||
799 | public static class SynchronousRestFormsRequester | 869 | public static class SynchronousRestFormsRequester |
800 | { | 870 | { |
801 | private static readonly ILog m_log = | 871 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
802 | LogManager.GetLogger( | ||
803 | MethodBase.GetCurrentMethod().DeclaringType); | ||
804 | 872 | ||
805 | /// <summary> | 873 | /// <summary> |
806 | /// Perform a synchronous REST request. | 874 | /// Perform a synchronous REST request. |
@@ -814,6 +882,12 @@ namespace OpenSim.Framework | |||
814 | /// the request. You'll want to make sure you deal with this as they're not uncommon</exception> | 882 | /// the request. You'll want to make sure you deal with this as they're not uncommon</exception> |
815 | public static string MakeRequest(string verb, string requestUrl, string obj) | 883 | public static string MakeRequest(string verb, string requestUrl, string obj) |
816 | { | 884 | { |
885 | int reqnum = WebUtil.RequestNumber++; | ||
886 | // m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); | ||
887 | |||
888 | int tickstart = Util.EnvironmentTickCount(); | ||
889 | int tickdata = 0; | ||
890 | |||
817 | WebRequest request = WebRequest.Create(requestUrl); | 891 | WebRequest request = WebRequest.Create(requestUrl); |
818 | request.Method = verb; | 892 | request.Method = verb; |
819 | string respstring = String.Empty; | 893 | string respstring = String.Empty; |
@@ -842,12 +916,16 @@ namespace OpenSim.Framework | |||
842 | } | 916 | } |
843 | catch (Exception e) | 917 | catch (Exception e) |
844 | { | 918 | { |
845 | m_log.DebugFormat("[FORMS]: exception occured on sending request to {0}: " + e.ToString(), requestUrl); | 919 | m_log.DebugFormat( |
920 | "[FORMS]: exception occured {0} {1}: {2}{3}", verb, requestUrl, e.Message, e.StackTrace); | ||
846 | } | 921 | } |
847 | finally | 922 | finally |
848 | { | 923 | { |
849 | if (requestStream != null) | 924 | if (requestStream != null) |
850 | requestStream.Close(); | 925 | requestStream.Close(); |
926 | |||
927 | // capture how much time was spent writing | ||
928 | tickdata = Util.EnvironmentTickCountSubtract(tickstart); | ||
851 | } | 929 | } |
852 | } | 930 | } |
853 | 931 | ||
@@ -868,7 +946,9 @@ namespace OpenSim.Framework | |||
868 | } | 946 | } |
869 | catch (Exception e) | 947 | catch (Exception e) |
870 | { | 948 | { |
871 | m_log.DebugFormat("[FORMS]: exception occured on receiving reply " + e.ToString()); | 949 | m_log.DebugFormat( |
950 | "[FORMS]: Exception occured on receiving {0} {1}: {2}{3}", | ||
951 | verb, requestUrl, e.Message, e.StackTrace); | ||
872 | } | 952 | } |
873 | finally | 953 | finally |
874 | { | 954 | { |
@@ -881,9 +961,21 @@ namespace OpenSim.Framework | |||
881 | catch (System.InvalidOperationException) | 961 | catch (System.InvalidOperationException) |
882 | { | 962 | { |
883 | // This is what happens when there is invalid XML | 963 | // This is what happens when there is invalid XML |
884 | m_log.DebugFormat("[FORMS]: InvalidOperationException on receiving request"); | 964 | m_log.DebugFormat("[FORMS]: InvalidOperationException on receiving {0} {1}", verb, requestUrl); |
885 | } | 965 | } |
886 | } | 966 | } |
967 | |||
968 | int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); | ||
969 | if (tickdiff > WebUtil.LongCallTime) | ||
970 | m_log.InfoFormat( | ||
971 | "[FORMS]: Slow request to <{0}> {1} {2} took {3}ms, {4}ms writing, {5}", | ||
972 | reqnum, | ||
973 | verb, | ||
974 | requestUrl, | ||
975 | tickdiff, | ||
976 | tickdata, | ||
977 | obj.Length > WebUtil.MaxRequestDiagLength ? obj.Remove(WebUtil.MaxRequestDiagLength) : obj); | ||
978 | |||
887 | return respstring; | 979 | return respstring; |
888 | } | 980 | } |
889 | } | 981 | } |
@@ -911,6 +1003,12 @@ namespace OpenSim.Framework | |||
911 | 1003 | ||
912 | public static TResponse MakeRequest<TRequest, TResponse>(string verb, string requestUrl, TRequest obj, int pTimeout) | 1004 | public static TResponse MakeRequest<TRequest, TResponse>(string verb, string requestUrl, TRequest obj, int pTimeout) |
913 | { | 1005 | { |
1006 | int reqnum = WebUtil.RequestNumber++; | ||
1007 | // m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); | ||
1008 | |||
1009 | int tickstart = Util.EnvironmentTickCount(); | ||
1010 | int tickdata = 0; | ||
1011 | |||
914 | Type type = typeof(TRequest); | 1012 | Type type = typeof(TRequest); |
915 | TResponse deserial = default(TResponse); | 1013 | TResponse deserial = default(TResponse); |
916 | 1014 | ||
@@ -918,12 +1016,13 @@ namespace OpenSim.Framework | |||
918 | request.Method = verb; | 1016 | request.Method = verb; |
919 | if (pTimeout != 0) | 1017 | if (pTimeout != 0) |
920 | request.Timeout = pTimeout * 1000; | 1018 | request.Timeout = pTimeout * 1000; |
1019 | MemoryStream buffer = null; | ||
921 | 1020 | ||
922 | if ((verb == "POST") || (verb == "PUT")) | 1021 | if ((verb == "POST") || (verb == "PUT")) |
923 | { | 1022 | { |
924 | request.ContentType = "text/xml"; | 1023 | request.ContentType = "text/xml"; |
925 | 1024 | ||
926 | MemoryStream buffer = new MemoryStream(); | 1025 | buffer = new MemoryStream(); |
927 | 1026 | ||
928 | XmlWriterSettings settings = new XmlWriterSettings(); | 1027 | XmlWriterSettings settings = new XmlWriterSettings(); |
929 | settings.Encoding = Encoding.UTF8; | 1028 | settings.Encoding = Encoding.UTF8; |
@@ -946,13 +1045,19 @@ namespace OpenSim.Framework | |||
946 | } | 1045 | } |
947 | catch (Exception e) | 1046 | catch (Exception e) |
948 | { | 1047 | { |
949 | m_log.DebugFormat("[SynchronousRestObjectRequester]: exception in sending data to {0}: {1}", requestUrl, e); | 1048 | m_log.DebugFormat( |
1049 | "[SynchronousRestObjectRequester]: Exception in making request {0} {1}: {2}{3}", | ||
1050 | verb, requestUrl, e.Message, e.StackTrace); | ||
1051 | |||
950 | return deserial; | 1052 | return deserial; |
951 | } | 1053 | } |
952 | finally | 1054 | finally |
953 | { | 1055 | { |
954 | if (requestStream != null) | 1056 | if (requestStream != null) |
955 | requestStream.Close(); | 1057 | requestStream.Close(); |
1058 | |||
1059 | // capture how much time was spent writing | ||
1060 | tickdata = Util.EnvironmentTickCountSubtract(tickstart); | ||
956 | } | 1061 | } |
957 | } | 1062 | } |
958 | 1063 | ||
@@ -968,7 +1073,11 @@ namespace OpenSim.Framework | |||
968 | respStream.Close(); | 1073 | respStream.Close(); |
969 | } | 1074 | } |
970 | else | 1075 | else |
971 | m_log.DebugFormat("[SynchronousRestObjectRequester]: Oops! no content found in response stream from {0} {1}", requestUrl, verb); | 1076 | { |
1077 | m_log.DebugFormat( | ||
1078 | "[SynchronousRestObjectRequester]: Oops! no content found in response stream from {0} {1}", | ||
1079 | verb, requestUrl); | ||
1080 | } | ||
972 | } | 1081 | } |
973 | } | 1082 | } |
974 | catch (WebException e) | 1083 | catch (WebException e) |
@@ -979,17 +1088,44 @@ namespace OpenSim.Framework | |||
979 | return deserial; | 1088 | return deserial; |
980 | else | 1089 | else |
981 | m_log.ErrorFormat( | 1090 | m_log.ErrorFormat( |
982 | "[SynchronousRestObjectRequester]: WebException {0} {1} {2} {3}", | 1091 | "[SynchronousRestObjectRequester]: WebException for {0} {1} {2}: {3} {4}", |
983 | requestUrl, typeof(TResponse).ToString(), e.Message, e.StackTrace); | 1092 | verb, requestUrl, typeof(TResponse).ToString(), e.Message, e.StackTrace); |
984 | } | 1093 | } |
985 | catch (System.InvalidOperationException) | 1094 | catch (System.InvalidOperationException) |
986 | { | 1095 | { |
987 | // This is what happens when there is invalid XML | 1096 | // This is what happens when there is invalid XML |
988 | m_log.DebugFormat("[SynchronousRestObjectRequester]: Invalid XML {0} {1}", requestUrl, typeof(TResponse).ToString()); | 1097 | m_log.DebugFormat( |
1098 | "[SynchronousRestObjectRequester]: Invalid XML from {0} {1} {2}", | ||
1099 | verb, requestUrl, typeof(TResponse).ToString()); | ||
989 | } | 1100 | } |
990 | catch (Exception e) | 1101 | catch (Exception e) |
991 | { | 1102 | { |
992 | m_log.DebugFormat("[SynchronousRestObjectRequester]: Exception on response from {0} {1}", requestUrl, e); | 1103 | m_log.DebugFormat( |
1104 | "[SynchronousRestObjectRequester]: Exception on response from {0} {1}: {2}{3}", | ||
1105 | verb, requestUrl, e.Message, e.StackTrace); | ||
1106 | } | ||
1107 | |||
1108 | int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); | ||
1109 | if (tickdiff > WebUtil.LongCallTime) | ||
1110 | { | ||
1111 | string originalRequest = null; | ||
1112 | |||
1113 | if (buffer != null) | ||
1114 | { | ||
1115 | originalRequest = Encoding.UTF8.GetString(buffer.ToArray()); | ||
1116 | |||
1117 | if (originalRequest.Length > WebUtil.MaxRequestDiagLength) | ||
1118 | originalRequest = originalRequest.Remove(WebUtil.MaxRequestDiagLength); | ||
1119 | } | ||
1120 | |||
1121 | m_log.InfoFormat( | ||
1122 | "[SynchronousRestObjectRequester]: Slow request to <{0}> {1} {2} took {3}ms, {4}ms writing, {5}", | ||
1123 | reqnum, | ||
1124 | verb, | ||
1125 | requestUrl, | ||
1126 | tickdiff, | ||
1127 | tickdata, | ||
1128 | originalRequest); | ||
993 | } | 1129 | } |
994 | 1130 | ||
995 | return deserial; | 1131 | return deserial; |
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index fb1e831..591259b 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs | |||
@@ -28,6 +28,7 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Diagnostics; | ||
31 | using System.IO; | 32 | using System.IO; |
32 | using System.Reflection; | 33 | using System.Reflection; |
33 | using System.Text; | 34 | using System.Text; |
@@ -138,7 +139,7 @@ namespace OpenSim | |||
138 | m_log.Info("===================================================================="); | 139 | m_log.Info("===================================================================="); |
139 | m_log.Info("========================= STARTING OPENSIM ========================="); | 140 | m_log.Info("========================= STARTING OPENSIM ========================="); |
140 | m_log.Info("===================================================================="); | 141 | m_log.Info("===================================================================="); |
141 | 142 | ||
142 | //m_log.InfoFormat("[OPENSIM MAIN]: GC Is Server GC: {0}", GCSettings.IsServerGC.ToString()); | 143 | //m_log.InfoFormat("[OPENSIM MAIN]: GC Is Server GC: {0}", GCSettings.IsServerGC.ToString()); |
143 | // http://msdn.microsoft.com/en-us/library/bb384202.aspx | 144 | // http://msdn.microsoft.com/en-us/library/bb384202.aspx |
144 | //GCSettings.LatencyMode = GCLatencyMode.Batch; | 145 | //GCSettings.LatencyMode = GCLatencyMode.Batch; |
@@ -225,7 +226,7 @@ namespace OpenSim | |||
225 | /// </summary> | 226 | /// </summary> |
226 | private void RegisterConsoleCommands() | 227 | private void RegisterConsoleCommands() |
227 | { | 228 | { |
228 | m_console.Commands.AddCommand("Regions", false, "force update", | 229 | m_console.Commands.AddCommand("Objects", false, "force update", |
229 | "force update", | 230 | "force update", |
230 | "Force the update of all objects on clients", | 231 | "Force the update of all objects on clients", |
231 | HandleForceUpdate); | 232 | HandleForceUpdate); |
@@ -306,7 +307,7 @@ namespace OpenSim | |||
306 | + " If this is not given then the oar is saved to region.oar in the current directory.", | 307 | + " If this is not given then the oar is saved to region.oar in the current directory.", |
307 | SaveOar); | 308 | SaveOar); |
308 | 309 | ||
309 | m_console.Commands.AddCommand("Regions", false, "edit scale", | 310 | m_console.Commands.AddCommand("Objects", false, "edit scale", |
310 | "edit scale <name> <x> <y> <z>", | 311 | "edit scale <name> <x> <y> <z>", |
311 | "Change the scale of a named prim", HandleEditScale); | 312 | "Change the scale of a named prim", HandleEditScale); |
312 | 313 | ||
@@ -349,7 +350,7 @@ namespace OpenSim | |||
349 | "show ratings", | 350 | "show ratings", |
350 | "Show rating data", HandleShow); | 351 | "Show rating data", HandleShow); |
351 | 352 | ||
352 | m_console.Commands.AddCommand("Regions", false, "backup", | 353 | m_console.Commands.AddCommand("Objects", false, "backup", |
353 | "backup", | 354 | "backup", |
354 | "Persist currently unsaved object changes immediately instead of waiting for the normal persistence call.", RunCommand); | 355 | "Persist currently unsaved object changes immediately instead of waiting for the normal persistence call.", RunCommand); |
355 | 356 | ||
@@ -410,7 +411,7 @@ namespace OpenSim | |||
410 | "modules unload <name>", | 411 | "modules unload <name>", |
411 | "Unload a module", HandleModules); | 412 | "Unload a module", HandleModules); |
412 | 413 | ||
413 | m_console.Commands.AddCommand("Regions", false, "kill uuid", | 414 | m_console.Commands.AddCommand("Objects", false, "kill uuid", |
414 | "kill uuid <UUID>", | 415 | "kill uuid <UUID>", |
415 | "Kill an object by UUID", KillUUID); | 416 | "Kill an object by UUID", KillUUID); |
416 | } | 417 | } |
@@ -437,12 +438,16 @@ namespace OpenSim | |||
437 | } | 438 | } |
438 | } | 439 | } |
439 | 440 | ||
440 | private void WatchdogTimeoutHandler(System.Threading.Thread thread, int lastTick) | 441 | private void WatchdogTimeoutHandler(Watchdog.ThreadWatchdogInfo twi) |
441 | { | 442 | { |
442 | int now = Environment.TickCount & Int32.MaxValue; | 443 | int now = Environment.TickCount & Int32.MaxValue; |
443 | 444 | ||
444 | m_log.ErrorFormat("[WATCHDOG]: Timeout detected for thread \"{0}\". ThreadState={1}. Last tick was {2}ms ago", | 445 | m_log.ErrorFormat( |
445 | thread.Name, thread.ThreadState, now - lastTick); | 446 | "[WATCHDOG]: Timeout detected for thread \"{0}\". ThreadState={1}. Last tick was {2}ms ago. {3}", |
447 | twi.Thread.Name, | ||
448 | twi.Thread.ThreadState, | ||
449 | now - twi.LastTick, | ||
450 | twi.AlarmMethod != null ? string.Format("Data: {0}", twi.AlarmMethod()) : ""); | ||
446 | } | 451 | } |
447 | 452 | ||
448 | #region Console Commands | 453 | #region Console Commands |
@@ -481,10 +486,10 @@ namespace OpenSim | |||
481 | else | 486 | else |
482 | presence.ControllingClient.Kick("\nYou have been logged out by an administrator.\n"); | 487 | presence.ControllingClient.Kick("\nYou have been logged out by an administrator.\n"); |
483 | 488 | ||
484 | // ...and close on our side | ||
485 | presence.Scene.IncomingCloseAgent(presence.UUID); | 489 | presence.Scene.IncomingCloseAgent(presence.UUID); |
486 | } | 490 | } |
487 | } | 491 | } |
492 | |||
488 | MainConsole.Instance.Output(""); | 493 | MainConsole.Instance.Output(""); |
489 | } | 494 | } |
490 | 495 | ||
@@ -618,10 +623,11 @@ namespace OpenSim | |||
618 | return; | 623 | return; |
619 | } | 624 | } |
620 | 625 | ||
621 | PopulateRegionEstateInfo(regInfo); | 626 | bool changed = PopulateRegionEstateInfo(regInfo); |
622 | IScene scene; | 627 | IScene scene; |
623 | CreateRegion(regInfo, true, out scene); | 628 | CreateRegion(regInfo, true, out scene); |
624 | regInfo.EstateSettings.Save(); | 629 | if (changed) |
630 | regInfo.EstateSettings.Save(); | ||
625 | } | 631 | } |
626 | 632 | ||
627 | /// <summary> | 633 | /// <summary> |
@@ -969,8 +975,7 @@ namespace OpenSim | |||
969 | if (showParams.Length > 1 && showParams[1] == "full") | 975 | if (showParams.Length > 1 && showParams[1] == "full") |
970 | { | 976 | { |
971 | agents = m_sceneManager.GetCurrentScenePresences(); | 977 | agents = m_sceneManager.GetCurrentScenePresences(); |
972 | } | 978 | } else |
973 | else | ||
974 | { | 979 | { |
975 | agents = m_sceneManager.GetCurrentSceneAvatars(); | 980 | agents = m_sceneManager.GetCurrentSceneAvatars(); |
976 | } | 981 | } |
@@ -979,7 +984,8 @@ namespace OpenSim | |||
979 | 984 | ||
980 | MainConsole.Instance.Output( | 985 | MainConsole.Instance.Output( |
981 | String.Format("{0,-16} {1,-16} {2,-37} {3,-11} {4,-16} {5,-30}", "Firstname", "Lastname", | 986 | String.Format("{0,-16} {1,-16} {2,-37} {3,-11} {4,-16} {5,-30}", "Firstname", "Lastname", |
982 | "Agent ID", "Root/Child", "Region", "Position")); | 987 | "Agent ID", "Root/Child", "Region", "Position") |
988 | ); | ||
983 | 989 | ||
984 | foreach (ScenePresence presence in agents) | 990 | foreach (ScenePresence presence in agents) |
985 | { | 991 | { |
@@ -989,8 +995,7 @@ namespace OpenSim | |||
989 | if (regionInfo == null) | 995 | if (regionInfo == null) |
990 | { | 996 | { |
991 | regionName = "Unresolvable"; | 997 | regionName = "Unresolvable"; |
992 | } | 998 | } else |
993 | else | ||
994 | { | 999 | { |
995 | regionName = regionInfo.RegionName; | 1000 | regionName = regionInfo.RegionName; |
996 | } | 1001 | } |
@@ -1003,7 +1008,8 @@ namespace OpenSim | |||
1003 | presence.UUID, | 1008 | presence.UUID, |
1004 | presence.IsChildAgent ? "Child" : "Root", | 1009 | presence.IsChildAgent ? "Child" : "Root", |
1005 | regionName, | 1010 | regionName, |
1006 | presence.AbsolutePosition.ToString())); | 1011 | presence.AbsolutePosition.ToString()) |
1012 | ); | ||
1007 | } | 1013 | } |
1008 | 1014 | ||
1009 | MainConsole.Instance.Output(String.Empty); | 1015 | MainConsole.Instance.Output(String.Empty); |
@@ -1012,16 +1018,20 @@ namespace OpenSim | |||
1012 | case "connections": | 1018 | case "connections": |
1013 | System.Text.StringBuilder connections = new System.Text.StringBuilder("Connections:\n"); | 1019 | System.Text.StringBuilder connections = new System.Text.StringBuilder("Connections:\n"); |
1014 | m_sceneManager.ForEachScene( | 1020 | m_sceneManager.ForEachScene( |
1015 | delegate(Scene scene) | 1021 | delegate(Scene scene) { |
1016 | { | 1022 | scene.ForEachClient( |
1017 | scene.ForEachClient( | 1023 | delegate(IClientAPI client) { |
1018 | delegate(IClientAPI client) | 1024 | connections.AppendFormat( |
1019 | { | 1025 | "{0}: {1} ({2}) from {3} on circuit {4}\n", |
1020 | connections.AppendFormat("{0}: {1} ({2}) from {3} on circuit {4}\n", | 1026 | scene.RegionInfo.RegionName, |
1021 | scene.RegionInfo.RegionName, client.Name, client.AgentId, client.RemoteEndPoint, client.CircuitCode); | 1027 | client.Name, |
1022 | } | 1028 | client.AgentId, |
1029 | client.RemoteEndPoint, | ||
1030 | client.CircuitCode | ||
1023 | ); | 1031 | ); |
1024 | } | 1032 | } |
1033 | ); | ||
1034 | } | ||
1025 | ); | 1035 | ); |
1026 | 1036 | ||
1027 | MainConsole.Instance.Output(connections.ToString()); | 1037 | MainConsole.Instance.Output(connections.ToString()); |
@@ -1030,13 +1040,17 @@ namespace OpenSim | |||
1030 | case "circuits": | 1040 | case "circuits": |
1031 | System.Text.StringBuilder acd = new System.Text.StringBuilder("Agent Circuits:\n"); | 1041 | System.Text.StringBuilder acd = new System.Text.StringBuilder("Agent Circuits:\n"); |
1032 | m_sceneManager.ForEachScene( | 1042 | m_sceneManager.ForEachScene( |
1033 | delegate(Scene scene) | 1043 | delegate(Scene scene) { |
1034 | { | 1044 | //this.HttpServer. |
1035 | //this.HttpServer. | 1045 | acd.AppendFormat("{0}:\n", scene.RegionInfo.RegionName); |
1036 | acd.AppendFormat("{0}:\n", scene.RegionInfo.RegionName); | 1046 | foreach (AgentCircuitData aCircuit in scene.AuthenticateHandler.GetAgentCircuits().Values) |
1037 | foreach (AgentCircuitData aCircuit in scene.AuthenticateHandler.GetAgentCircuits().Values) | 1047 | acd.AppendFormat( |
1038 | acd.AppendFormat("\t{0} {1} ({2})\n", aCircuit.firstname, aCircuit.lastname, (aCircuit.child ? "Child" : "Root")); | 1048 | "\t{0} {1} ({2})\n", |
1039 | } | 1049 | aCircuit.firstname, |
1050 | aCircuit.lastname, | ||
1051 | (aCircuit.child ? "Child" : "Root") | ||
1052 | ); | ||
1053 | } | ||
1040 | ); | 1054 | ); |
1041 | 1055 | ||
1042 | MainConsole.Instance.Output(acd.ToString()); | 1056 | MainConsole.Instance.Output(acd.ToString()); |
@@ -1077,17 +1091,29 @@ namespace OpenSim | |||
1077 | } | 1091 | } |
1078 | 1092 | ||
1079 | m_sceneManager.ForEachScene( | 1093 | m_sceneManager.ForEachScene( |
1080 | delegate(Scene scene) | 1094 | delegate(Scene scene) { |
1095 | m_log.Error("The currently loaded modules in " + scene.RegionInfo.RegionName + " are:"); | ||
1096 | foreach (IRegionModule module in scene.Modules.Values) | ||
1081 | { | 1097 | { |
1082 | m_log.Error("The currently loaded modules in " + scene.RegionInfo.RegionName + " are:"); | 1098 | if (!module.IsSharedModule) |
1083 | foreach (IRegionModule module in scene.Modules.Values) | ||
1084 | { | 1099 | { |
1085 | if (!module.IsSharedModule) | 1100 | m_log.Error("Region Module: " + module.Name); |
1086 | { | ||
1087 | m_log.Error("Region Module: " + module.Name); | ||
1088 | } | ||
1089 | } | 1101 | } |
1090 | }); | 1102 | } |
1103 | } | ||
1104 | ); | ||
1105 | |||
1106 | m_sceneManager.ForEachScene( | ||
1107 | delegate(Scene scene) { | ||
1108 | MainConsole.Instance.Output("Loaded new region modules in" + scene.RegionInfo.RegionName + " are:"); | ||
1109 | foreach (IRegionModuleBase module in scene.RegionModules.Values) | ||
1110 | { | ||
1111 | Type type = module.GetType().GetInterface("ISharedRegionModule"); | ||
1112 | string module_type = type != null ? "Shared" : "Non-Shared"; | ||
1113 | MainConsole.Instance.OutputFormat("New Region Module ({0}): {1}", module_type, module.Name); | ||
1114 | } | ||
1115 | } | ||
1116 | ); | ||
1091 | 1117 | ||
1092 | MainConsole.Instance.Output(""); | 1118 | MainConsole.Instance.Output(""); |
1093 | break; | 1119 | break; |
diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index ddc7f10..76ac246 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs | |||
@@ -232,7 +232,7 @@ namespace OpenSim | |||
232 | 232 | ||
233 | base.StartupSpecific(); | 233 | base.StartupSpecific(); |
234 | 234 | ||
235 | m_stats = StatsManager.StartCollectingSimExtraStats(); | 235 | m_stats = StatsManager.SimExtraStats; |
236 | 236 | ||
237 | // Create a ModuleLoader instance | 237 | // Create a ModuleLoader instance |
238 | m_moduleLoader = new ModuleLoader(m_config.Source); | 238 | m_moduleLoader = new ModuleLoader(m_config.Source); |
@@ -437,7 +437,7 @@ namespace OpenSim | |||
437 | scene.LoadPrimsFromStorage(regionInfo.originRegionID); | 437 | scene.LoadPrimsFromStorage(regionInfo.originRegionID); |
438 | 438 | ||
439 | // TODO : Try setting resource for region xstats here on scene | 439 | // TODO : Try setting resource for region xstats here on scene |
440 | MainServer.Instance.AddStreamHandler(new Region.Framework.Scenes.RegionStatsHandler(regionInfo)); | 440 | MainServer.Instance.AddStreamHandler(new RegionStatsHandler(regionInfo)); |
441 | 441 | ||
442 | scene.loadAllLandObjectsFromStorage(regionInfo.originRegionID); | 442 | scene.loadAllLandObjectsFromStorage(regionInfo.originRegionID); |
443 | scene.EventManager.TriggerParcelPrimCountUpdate(); | 443 | scene.EventManager.TriggerParcelPrimCountUpdate(); |
@@ -856,6 +856,9 @@ namespace OpenSim | |||
856 | return Util.UTF8.GetBytes("OK"); | 856 | return Util.UTF8.GetBytes("OK"); |
857 | } | 857 | } |
858 | 858 | ||
859 | public string Name { get { return "SimStatus"; } } | ||
860 | public string Description { get { return "Simulator Status"; } } | ||
861 | |||
859 | public string ContentType | 862 | public string ContentType |
860 | { | 863 | { |
861 | get { return "text/plain"; } | 864 | get { return "text/plain"; } |
@@ -880,6 +883,9 @@ namespace OpenSim | |||
880 | { | 883 | { |
881 | OpenSimBase m_opensim; | 884 | OpenSimBase m_opensim; |
882 | string osXStatsURI = String.Empty; | 885 | string osXStatsURI = String.Empty; |
886 | |||
887 | public string Name { get { return "XSimStatus"; } } | ||
888 | public string Description { get { return "Simulator XStatus"; } } | ||
883 | 889 | ||
884 | public XSimStatusHandler(OpenSimBase sim) | 890 | public XSimStatusHandler(OpenSimBase sim) |
885 | { | 891 | { |
@@ -920,6 +926,9 @@ namespace OpenSim | |||
920 | { | 926 | { |
921 | OpenSimBase m_opensim; | 927 | OpenSimBase m_opensim; |
922 | string osUXStatsURI = String.Empty; | 928 | string osUXStatsURI = String.Empty; |
929 | |||
930 | public string Name { get { return "UXSimStatus"; } } | ||
931 | public string Description { get { return "Simulator UXStatus"; } } | ||
923 | 932 | ||
924 | public UXSimStatusHandler(OpenSimBase sim) | 933 | public UXSimStatusHandler(OpenSimBase sim) |
925 | { | 934 | { |
@@ -1051,13 +1060,13 @@ namespace OpenSim | |||
1051 | /// Load the estate information for the provided RegionInfo object. | 1060 | /// Load the estate information for the provided RegionInfo object. |
1052 | /// </summary> | 1061 | /// </summary> |
1053 | /// <param name="regInfo"></param> | 1062 | /// <param name="regInfo"></param> |
1054 | public void PopulateRegionEstateInfo(RegionInfo regInfo) | 1063 | public bool PopulateRegionEstateInfo(RegionInfo regInfo) |
1055 | { | 1064 | { |
1056 | if (EstateDataService != null) | 1065 | if (EstateDataService != null) |
1057 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, false); | 1066 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, false); |
1058 | 1067 | ||
1059 | if (regInfo.EstateSettings.EstateID != 0) | 1068 | if (regInfo.EstateSettings.EstateID != 0) |
1060 | return; | 1069 | return false; // estate info in the database did not change |
1061 | 1070 | ||
1062 | m_log.WarnFormat("[ESTATE] Region {0} is not part of an estate.", regInfo.RegionName); | 1071 | m_log.WarnFormat("[ESTATE] Region {0} is not part of an estate.", regInfo.RegionName); |
1063 | 1072 | ||
@@ -1092,7 +1101,7 @@ namespace OpenSim | |||
1092 | } | 1101 | } |
1093 | 1102 | ||
1094 | if (defaultEstateJoined) | 1103 | if (defaultEstateJoined) |
1095 | return; | 1104 | return true; // need to update the database |
1096 | else | 1105 | else |
1097 | m_log.ErrorFormat( | 1106 | m_log.ErrorFormat( |
1098 | "[OPENSIM BASE]: Joining default estate {0} failed", defaultEstateName); | 1107 | "[OPENSIM BASE]: Joining default estate {0} failed", defaultEstateName); |
@@ -1154,8 +1163,10 @@ namespace OpenSim | |||
1154 | MainConsole.Instance.Output("Joining the estate failed. Please try again."); | 1163 | MainConsole.Instance.Output("Joining the estate failed. Please try again."); |
1155 | } | 1164 | } |
1156 | } | 1165 | } |
1157 | } | 1166 | } |
1158 | } | 1167 | |
1168 | return true; // need to update the database | ||
1169 | } | ||
1159 | } | 1170 | } |
1160 | 1171 | ||
1161 | public class OpenSimConfigSource | 1172 | public class OpenSimConfigSource |
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index ef6dedb..d397893 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs | |||
@@ -158,7 +158,9 @@ namespace OpenSim.Region.ClientStack.Linden | |||
158 | try | 158 | try |
159 | { | 159 | { |
160 | // the root of all evil | 160 | // the root of all evil |
161 | m_HostCapsObj.RegisterHandler("SEED", new RestStreamHandler("POST", capsBase + m_requestPath, SeedCapRequest)); | 161 | m_HostCapsObj.RegisterHandler( |
162 | "SEED", new RestStreamHandler("POST", capsBase + m_requestPath, SeedCapRequest, "SEED", null)); | ||
163 | |||
162 | m_log.DebugFormat( | 164 | m_log.DebugFormat( |
163 | "[CAPS]: Registered seed capability {0} for {1}", capsBase + m_requestPath, m_HostCapsObj.AgentID); | 165 | "[CAPS]: Registered seed capability {0} for {1}", capsBase + m_requestPath, m_HostCapsObj.AgentID); |
164 | 166 | ||
@@ -166,7 +168,10 @@ namespace OpenSim.Region.ClientStack.Linden | |||
166 | // new LLSDStreamhandler<OSDMapRequest, OSDMapLayerResponse>("POST", | 168 | // new LLSDStreamhandler<OSDMapRequest, OSDMapLayerResponse>("POST", |
167 | // capsBase + m_mapLayerPath, | 169 | // capsBase + m_mapLayerPath, |
168 | // GetMapLayer); | 170 | // GetMapLayer); |
169 | IRequestHandler req = new RestStreamHandler("POST", capsBase + m_notecardTaskUpdatePath, ScriptTaskInventory); | 171 | IRequestHandler req |
172 | = new RestStreamHandler( | ||
173 | "POST", capsBase + m_notecardTaskUpdatePath, ScriptTaskInventory, "UpdateScript", null); | ||
174 | |||
170 | m_HostCapsObj.RegisterHandler("UpdateScriptTaskInventory", req); | 175 | m_HostCapsObj.RegisterHandler("UpdateScriptTaskInventory", req); |
171 | m_HostCapsObj.RegisterHandler("UpdateScriptTask", req); | 176 | m_HostCapsObj.RegisterHandler("UpdateScriptTask", req); |
172 | } | 177 | } |
@@ -181,14 +186,22 @@ namespace OpenSim.Region.ClientStack.Linden | |||
181 | try | 186 | try |
182 | { | 187 | { |
183 | // I don't think this one works... | 188 | // I don't think this one works... |
184 | m_HostCapsObj.RegisterHandler("NewFileAgentInventory", new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDAssetUploadResponse>("POST", | 189 | m_HostCapsObj.RegisterHandler( |
185 | capsBase + m_newInventory, | 190 | "NewFileAgentInventory", |
186 | NewAgentInventoryRequest)); | 191 | new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDAssetUploadResponse>( |
187 | IRequestHandler req = new RestStreamHandler("POST", capsBase + m_notecardUpdatePath, NoteCardAgentInventory); | 192 | "POST", |
193 | capsBase + m_newInventory, | ||
194 | NewAgentInventoryRequest, | ||
195 | "NewFileAgentInventory", | ||
196 | null)); | ||
197 | |||
198 | IRequestHandler req | ||
199 | = new RestStreamHandler( | ||
200 | "POST", capsBase + m_notecardUpdatePath, NoteCardAgentInventory, "Update*", null); | ||
201 | |||
188 | m_HostCapsObj.RegisterHandler("UpdateNotecardAgentInventory", req); | 202 | m_HostCapsObj.RegisterHandler("UpdateNotecardAgentInventory", req); |
189 | m_HostCapsObj.RegisterHandler("UpdateScriptAgentInventory", req); | 203 | m_HostCapsObj.RegisterHandler("UpdateScriptAgentInventory", req); |
190 | m_HostCapsObj.RegisterHandler("UpdateScriptAgent", req); | 204 | m_HostCapsObj.RegisterHandler("UpdateScriptAgent", req); |
191 | m_HostCapsObj.RegisterHandler("CopyInventoryFromNotecard", new RestStreamHandler("POST", capsBase + m_copyFromNotecardPath, CopyInventoryFromNotecard)); | ||
192 | IRequestHandler getObjectPhysicsDataHandler = new RestStreamHandler("POST", capsBase + m_getObjectPhysicsDataPath, GetObjectPhysicsData); | 205 | IRequestHandler getObjectPhysicsDataHandler = new RestStreamHandler("POST", capsBase + m_getObjectPhysicsDataPath, GetObjectPhysicsData); |
193 | m_HostCapsObj.RegisterHandler("GetObjectPhysicsData", getObjectPhysicsDataHandler); | 206 | m_HostCapsObj.RegisterHandler("GetObjectPhysicsData", getObjectPhysicsDataHandler); |
194 | IRequestHandler getObjectCostHandler = new RestStreamHandler("POST", capsBase + m_getObjectCostPath, GetObjectCost); | 207 | IRequestHandler getObjectCostHandler = new RestStreamHandler("POST", capsBase + m_getObjectCostPath, GetObjectCost); |
@@ -197,6 +210,12 @@ namespace OpenSim.Region.ClientStack.Linden | |||
197 | m_HostCapsObj.RegisterHandler("ResourceCostSelected", ResourceCostSelectedHandler); | 210 | m_HostCapsObj.RegisterHandler("ResourceCostSelected", ResourceCostSelectedHandler); |
198 | 211 | ||
199 | 212 | ||
213 | |||
214 | m_HostCapsObj.RegisterHandler( | ||
215 | "CopyInventoryFromNotecard", | ||
216 | new RestStreamHandler( | ||
217 | "POST", capsBase + m_copyFromNotecardPath, CopyInventoryFromNotecard, "CopyInventoryFromNotecard", null)); | ||
218 | |||
200 | // As of RC 1.22.9 of the Linden client this is | 219 | // As of RC 1.22.9 of the Linden client this is |
201 | // supported | 220 | // supported |
202 | 221 | ||
@@ -245,7 +264,10 @@ namespace OpenSim.Region.ClientStack.Linden | |||
245 | 264 | ||
246 | if (!m_Scene.CheckClient(m_HostCapsObj.AgentID, httpRequest.RemoteIPEndPoint)) | 265 | if (!m_Scene.CheckClient(m_HostCapsObj.AgentID, httpRequest.RemoteIPEndPoint)) |
247 | { | 266 | { |
248 | m_log.DebugFormat("[CAPS]: Unauthorized CAPS client"); | 267 | m_log.DebugFormat( |
268 | "[CAPS]: Unauthorized CAPS client {0} from {1}", | ||
269 | m_HostCapsObj.AgentID, httpRequest.RemoteIPEndPoint); | ||
270 | |||
249 | return string.Empty; | 271 | return string.Empty; |
250 | } | 272 | } |
251 | 273 | ||
@@ -296,7 +318,9 @@ namespace OpenSim.Region.ClientStack.Linden | |||
296 | m_dumpAssetsToFile); | 318 | m_dumpAssetsToFile); |
297 | uploader.OnUpLoad += TaskScriptUpdated; | 319 | uploader.OnUpLoad += TaskScriptUpdated; |
298 | 320 | ||
299 | m_HostCapsObj.HttpListener.AddStreamHandler(new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps)); | 321 | m_HostCapsObj.HttpListener.AddStreamHandler( |
322 | new BinaryStreamHandler( | ||
323 | "POST", capsBase + uploaderPath, uploader.uploaderCaps, "TaskInventoryScriptUpdater", null)); | ||
300 | 324 | ||
301 | string protocol = "http://"; | 325 | string protocol = "http://"; |
302 | 326 | ||
@@ -423,8 +447,14 @@ namespace OpenSim.Region.ClientStack.Linden | |||
423 | AssetUploader uploader = | 447 | AssetUploader uploader = |
424 | new AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type, | 448 | new AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type, |
425 | llsdRequest.asset_type, capsBase + uploaderPath, m_HostCapsObj.HttpListener, m_dumpAssetsToFile); | 449 | llsdRequest.asset_type, capsBase + uploaderPath, m_HostCapsObj.HttpListener, m_dumpAssetsToFile); |
450 | |||
426 | m_HostCapsObj.HttpListener.AddStreamHandler( | 451 | m_HostCapsObj.HttpListener.AddStreamHandler( |
427 | new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps)); | 452 | new BinaryStreamHandler( |
453 | "POST", | ||
454 | capsBase + uploaderPath, | ||
455 | uploader.uploaderCaps, | ||
456 | "NewAgentInventoryRequest", | ||
457 | m_HostCapsObj.AgentID.ToString())); | ||
428 | 458 | ||
429 | string protocol = "http://"; | 459 | string protocol = "http://"; |
430 | 460 | ||
@@ -740,7 +770,8 @@ namespace OpenSim.Region.ClientStack.Linden | |||
740 | uploader.OnUpLoad += ItemUpdated; | 770 | uploader.OnUpLoad += ItemUpdated; |
741 | 771 | ||
742 | m_HostCapsObj.HttpListener.AddStreamHandler( | 772 | m_HostCapsObj.HttpListener.AddStreamHandler( |
743 | new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps)); | 773 | new BinaryStreamHandler( |
774 | "POST", capsBase + uploaderPath, uploader.uploaderCaps, "NoteCardAgentInventory", null)); | ||
744 | 775 | ||
745 | string protocol = "http://"; | 776 | string protocol = "http://"; |
746 | 777 | ||
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs index a91b02c..01ce194 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs | |||
@@ -109,10 +109,11 @@ namespace OpenSim.Region.ClientStack.Linden | |||
109 | "Comms", | 109 | "Comms", |
110 | false, | 110 | false, |
111 | "debug eq", | 111 | "debug eq", |
112 | "debug eq [0|1]", | 112 | "debug eq [0|1|2]", |
113 | "Turn on event queue debugging", | 113 | "Turn on event queue debugging" |
114 | "debug eq 1 will turn on event queue debugging. This will log all outgoing event queue messages to clients.\n" | 114 | + "<= 0 - turns off all event queue logging" |
115 | + "debug eq 0 will turn off event queue debugging.", | 115 | + ">= 1 - turns on outgoing event logging" |
116 | + ">= 2 - turns on poll notification", | ||
116 | HandleDebugEq); | 117 | HandleDebugEq); |
117 | } | 118 | } |
118 | else | 119 | else |
@@ -235,19 +236,19 @@ namespace OpenSim.Region.ClientStack.Linden | |||
235 | // ClientClosed(client.AgentId); | 236 | // ClientClosed(client.AgentId); |
236 | // } | 237 | // } |
237 | 238 | ||
238 | private void ClientClosed(UUID AgentID, Scene scene) | 239 | private void ClientClosed(UUID agentID, Scene scene) |
239 | { | 240 | { |
240 | // m_log.DebugFormat("[EVENTQUEUE]: Closed client {0} in region {1}", AgentID, m_scene.RegionInfo.RegionName); | 241 | // m_log.DebugFormat("[EVENTQUEUE]: Closed client {0} in region {1}", agentID, m_scene.RegionInfo.RegionName); |
241 | 242 | ||
242 | int count = 0; | 243 | int count = 0; |
243 | while (queues.ContainsKey(AgentID) && queues[AgentID].Count > 0 && count++ < 5) | 244 | while (queues.ContainsKey(agentID) && queues[agentID].Count > 0 && count++ < 5) |
244 | { | 245 | { |
245 | Thread.Sleep(1000); | 246 | Thread.Sleep(1000); |
246 | } | 247 | } |
247 | 248 | ||
248 | lock (queues) | 249 | lock (queues) |
249 | { | 250 | { |
250 | queues.Remove(AgentID); | 251 | queues.Remove(agentID); |
251 | } | 252 | } |
252 | 253 | ||
253 | List<UUID> removeitems = new List<UUID>(); | 254 | List<UUID> removeitems = new List<UUID>(); |
@@ -256,7 +257,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
256 | foreach (UUID ky in m_AvatarQueueUUIDMapping.Keys) | 257 | foreach (UUID ky in m_AvatarQueueUUIDMapping.Keys) |
257 | { | 258 | { |
258 | // m_log.DebugFormat("[EVENTQUEUE]: Found key {0} in m_AvatarQueueUUIDMapping while looking for {1}", ky, AgentID); | 259 | // m_log.DebugFormat("[EVENTQUEUE]: Found key {0} in m_AvatarQueueUUIDMapping while looking for {1}", ky, AgentID); |
259 | if (ky == AgentID) | 260 | if (ky == agentID) |
260 | { | 261 | { |
261 | removeitems.Add(ky); | 262 | removeitems.Add(ky); |
262 | } | 263 | } |
@@ -267,7 +268,12 @@ namespace OpenSim.Region.ClientStack.Linden | |||
267 | UUID eventQueueGetUuid = m_AvatarQueueUUIDMapping[ky]; | 268 | UUID eventQueueGetUuid = m_AvatarQueueUUIDMapping[ky]; |
268 | m_AvatarQueueUUIDMapping.Remove(ky); | 269 | m_AvatarQueueUUIDMapping.Remove(ky); |
269 | 270 | ||
270 | MainServer.Instance.RemovePollServiceHTTPHandler("","/CAPS/EQG/" + eventQueueGetUuid.ToString() + "/"); | 271 | string eqgPath = GenerateEqgCapPath(eventQueueGetUuid); |
272 | MainServer.Instance.RemovePollServiceHTTPHandler("", eqgPath); | ||
273 | |||
274 | // m_log.DebugFormat( | ||
275 | // "[EVENT QUEUE GET MODULE]: Removed EQG handler {0} for {1} in {2}", | ||
276 | // eqgPath, agentID, m_scene.RegionInfo.RegionName); | ||
271 | } | 277 | } |
272 | } | 278 | } |
273 | 279 | ||
@@ -281,7 +287,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
281 | { | 287 | { |
282 | searchval = m_QueueUUIDAvatarMapping[ky]; | 288 | searchval = m_QueueUUIDAvatarMapping[ky]; |
283 | 289 | ||
284 | if (searchval == AgentID) | 290 | if (searchval == agentID) |
285 | { | 291 | { |
286 | removeitems.Add(ky); | 292 | removeitems.Add(ky); |
287 | } | 293 | } |
@@ -305,6 +311,15 @@ namespace OpenSim.Region.ClientStack.Linden | |||
305 | //} | 311 | //} |
306 | } | 312 | } |
307 | 313 | ||
314 | /// <summary> | ||
315 | /// Generate an Event Queue Get handler path for the given eqg uuid. | ||
316 | /// </summary> | ||
317 | /// <param name='eqgUuid'></param> | ||
318 | private string GenerateEqgCapPath(UUID eqgUuid) | ||
319 | { | ||
320 | return string.Format("/CAPS/EQG/{0}/", eqgUuid); | ||
321 | } | ||
322 | |||
308 | public void OnRegisterCaps(UUID agentID, Caps caps) | 323 | public void OnRegisterCaps(UUID agentID, Caps caps) |
309 | { | 324 | { |
310 | // Register an event queue for the client | 325 | // Register an event queue for the client |
@@ -316,8 +331,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
316 | // Let's instantiate a Queue for this agent right now | 331 | // Let's instantiate a Queue for this agent right now |
317 | TryGetQueue(agentID); | 332 | TryGetQueue(agentID); |
318 | 333 | ||
319 | string capsBase = "/CAPS/EQG/"; | 334 | UUID eventQueueGetUUID; |
320 | UUID EventQueueGetUUID = UUID.Zero; | ||
321 | 335 | ||
322 | lock (m_AvatarQueueUUIDMapping) | 336 | lock (m_AvatarQueueUUIDMapping) |
323 | { | 337 | { |
@@ -325,44 +339,50 @@ namespace OpenSim.Region.ClientStack.Linden | |||
325 | if (m_AvatarQueueUUIDMapping.ContainsKey(agentID)) | 339 | if (m_AvatarQueueUUIDMapping.ContainsKey(agentID)) |
326 | { | 340 | { |
327 | //m_log.DebugFormat("[EVENTQUEUE]: Found Existing UUID!"); | 341 | //m_log.DebugFormat("[EVENTQUEUE]: Found Existing UUID!"); |
328 | EventQueueGetUUID = m_AvatarQueueUUIDMapping[agentID]; | 342 | eventQueueGetUUID = m_AvatarQueueUUIDMapping[agentID]; |
329 | } | 343 | } |
330 | else | 344 | else |
331 | { | 345 | { |
332 | EventQueueGetUUID = UUID.Random(); | 346 | eventQueueGetUUID = UUID.Random(); |
333 | //m_log.DebugFormat("[EVENTQUEUE]: Using random UUID!"); | 347 | //m_log.DebugFormat("[EVENTQUEUE]: Using random UUID!"); |
334 | } | 348 | } |
335 | } | 349 | } |
336 | 350 | ||
337 | lock (m_QueueUUIDAvatarMapping) | 351 | lock (m_QueueUUIDAvatarMapping) |
338 | { | 352 | { |
339 | if (!m_QueueUUIDAvatarMapping.ContainsKey(EventQueueGetUUID)) | 353 | if (!m_QueueUUIDAvatarMapping.ContainsKey(eventQueueGetUUID)) |
340 | m_QueueUUIDAvatarMapping.Add(EventQueueGetUUID, agentID); | 354 | m_QueueUUIDAvatarMapping.Add(eventQueueGetUUID, agentID); |
341 | } | 355 | } |
342 | 356 | ||
343 | lock (m_AvatarQueueUUIDMapping) | 357 | lock (m_AvatarQueueUUIDMapping) |
344 | { | 358 | { |
345 | if (!m_AvatarQueueUUIDMapping.ContainsKey(agentID)) | 359 | if (!m_AvatarQueueUUIDMapping.ContainsKey(agentID)) |
346 | m_AvatarQueueUUIDMapping.Add(agentID, EventQueueGetUUID); | 360 | m_AvatarQueueUUIDMapping.Add(agentID, eventQueueGetUUID); |
347 | } | 361 | } |
348 | 362 | ||
363 | string eventQueueGetPath = GenerateEqgCapPath(eventQueueGetUUID); | ||
364 | |||
349 | // Register this as a caps handler | 365 | // Register this as a caps handler |
350 | // FIXME: Confusingly, we need to register separate as a capability so that the client is told about | 366 | // FIXME: Confusingly, we need to register separate as a capability so that the client is told about |
351 | // EventQueueGet when it receive capability information, but then we replace the rest handler immediately | 367 | // EventQueueGet when it receive capability information, but then we replace the rest handler immediately |
352 | // afterwards with the poll service. So for now, we'll pass a null instead to simplify code reading, but | 368 | // afterwards with the poll service. So for now, we'll pass a null instead to simplify code reading, but |
353 | // really it should be possible to directly register the poll handler as a capability. | 369 | // really it should be possible to directly register the poll handler as a capability. |
354 | caps.RegisterHandler("EventQueueGet", | 370 | caps.RegisterHandler("EventQueueGet", new RestHTTPHandler("POST", eventQueueGetPath, null)); |
355 | new RestHTTPHandler("POST", capsBase + EventQueueGetUUID.ToString() + "/", null)); | ||
356 | // delegate(Hashtable m_dhttpMethod) | 371 | // delegate(Hashtable m_dhttpMethod) |
357 | // { | 372 | // { |
358 | // return ProcessQueue(m_dhttpMethod, agentID, caps); | 373 | // return ProcessQueue(m_dhttpMethod, agentID, caps); |
359 | // })); | 374 | // })); |
360 | 375 | ||
361 | // This will persist this beyond the expiry of the caps handlers | 376 | // This will persist this beyond the expiry of the caps handlers |
377 | // TODO: Add EventQueueGet name/description for diagnostics | ||
362 | MainServer.Instance.AddPollServiceHTTPHandler( | 378 | MainServer.Instance.AddPollServiceHTTPHandler( |
363 | capsBase + EventQueueGetUUID.ToString() + "/", | 379 | eventQueueGetPath, |
364 | new PollServiceEventArgs(null, HasEvents, GetEvents, NoEvents, agentID)); | 380 | new PollServiceEventArgs(null, HasEvents, GetEvents, NoEvents, agentID)); |
365 | 381 | ||
382 | // m_log.DebugFormat( | ||
383 | // "[EVENT QUEUE GET MODULE]: Registered EQG handler {0} for {1} in {2}", | ||
384 | // eventQueueGetPath, agentID, m_scene.RegionInfo.RegionName); | ||
385 | |||
366 | Random rnd = new Random(Environment.TickCount); | 386 | Random rnd = new Random(Environment.TickCount); |
367 | lock (m_ids) | 387 | lock (m_ids) |
368 | { | 388 | { |
@@ -384,9 +404,25 @@ namespace OpenSim.Region.ClientStack.Linden | |||
384 | return false; | 404 | return false; |
385 | } | 405 | } |
386 | 406 | ||
407 | /// <summary> | ||
408 | /// Logs a debug line for an outbound event queue message if appropriate. | ||
409 | /// </summary> | ||
410 | /// <param name='element'>Element containing message</param> | ||
411 | private void LogOutboundDebugMessage(OSD element, UUID agentId) | ||
412 | { | ||
413 | if (element is OSDMap) | ||
414 | { | ||
415 | OSDMap ev = (OSDMap)element; | ||
416 | m_log.DebugFormat( | ||
417 | "Eq OUT {0,-30} to {1,-20} {2,-20}", | ||
418 | ev["message"], m_scene.GetScenePresence(agentId).Name, m_scene.RegionInfo.RegionName); | ||
419 | } | ||
420 | } | ||
421 | |||
387 | public Hashtable GetEvents(UUID requestID, UUID pAgentId, string request) | 422 | public Hashtable GetEvents(UUID requestID, UUID pAgentId, string request) |
388 | { | 423 | { |
389 | // m_log.DebugFormat("[EVENT QUEUE GET MODULE]: Invoked GetEvents() for {0}", pAgentId); | 424 | if (DebugLevel >= 2) |
425 | m_log.DebugFormat("POLLED FOR EQ MESSAGES BY {0} in {1}", pAgentId, m_scene.RegionInfo.RegionName); | ||
390 | 426 | ||
391 | Queue<OSD> queue = TryGetQueue(pAgentId); | 427 | Queue<OSD> queue = TryGetQueue(pAgentId); |
392 | OSD element; | 428 | OSD element; |
@@ -410,13 +446,8 @@ namespace OpenSim.Region.ClientStack.Linden | |||
410 | } | 446 | } |
411 | else | 447 | else |
412 | { | 448 | { |
413 | if (DebugLevel > 0 && element is OSDMap) | 449 | if (DebugLevel > 0) |
414 | { | 450 | LogOutboundDebugMessage(element, pAgentId); |
415 | OSDMap ev = (OSDMap)element; | ||
416 | m_log.DebugFormat( | ||
417 | "[EVENT QUEUE GET MODULE]: Eq OUT {0} to {1}", | ||
418 | ev["message"], m_scene.GetScenePresence(pAgentId).Name); | ||
419 | } | ||
420 | 451 | ||
421 | array.Add(element); | 452 | array.Add(element); |
422 | 453 | ||
@@ -426,13 +457,8 @@ namespace OpenSim.Region.ClientStack.Linden | |||
426 | { | 457 | { |
427 | element = queue.Dequeue(); | 458 | element = queue.Dequeue(); |
428 | 459 | ||
429 | if (DebugLevel > 0 && element is OSDMap) | 460 | if (DebugLevel > 0) |
430 | { | 461 | LogOutboundDebugMessage(element, pAgentId); |
431 | OSDMap ev = (OSDMap)element; | ||
432 | m_log.DebugFormat( | ||
433 | "[EVENT QUEUE GET MODULE]: Eq OUT {0} to {1}", | ||
434 | ev["message"], m_scene.GetScenePresence(pAgentId).Name); | ||
435 | } | ||
436 | 462 | ||
437 | array.Add(element); | 463 | array.Add(element); |
438 | thisID++; | 464 | thisID++; |
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs index a5209b7..c25b58c 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs | |||
@@ -60,7 +60,7 @@ namespace OpenSim.Region.ClientStack.Linden.Tests | |||
60 | CapabilitiesModule capsModule = new CapabilitiesModule(); | 60 | CapabilitiesModule capsModule = new CapabilitiesModule(); |
61 | EventQueueGetModule eqgModule = new EventQueueGetModule(); | 61 | EventQueueGetModule eqgModule = new EventQueueGetModule(); |
62 | 62 | ||
63 | m_scene = SceneHelpers.SetupScene(); | 63 | m_scene = new SceneHelpers().SetupScene(); |
64 | SceneHelpers.SetupSceneModules(m_scene, config, capsModule, eqgModule); | 64 | SceneHelpers.SetupSceneModules(m_scene, config, capsModule, eqgModule); |
65 | } | 65 | } |
66 | 66 | ||
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/FetchInventory2Module.cs b/OpenSim/Region/ClientStack/Linden/Caps/FetchInventory2Module.cs index 14501c7..cb5afcc 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/FetchInventory2Module.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/FetchInventory2Module.cs | |||
@@ -132,7 +132,8 @@ namespace OpenSim.Region.ClientStack.Linden | |||
132 | capUrl = "/CAPS/" + UUID.Random(); | 132 | capUrl = "/CAPS/" + UUID.Random(); |
133 | 133 | ||
134 | IRequestHandler reqHandler | 134 | IRequestHandler reqHandler |
135 | = new RestStreamHandler("POST", capUrl, m_fetchHandler.FetchInventoryRequest); | 135 | = new RestStreamHandler( |
136 | "POST", capUrl, m_fetchHandler.FetchInventoryRequest, capName, agentID.ToString()); | ||
136 | 137 | ||
137 | caps.RegisterHandler(capName, reqHandler); | 138 | caps.RegisterHandler(capName, reqHandler); |
138 | } | 139 | } |
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs index e7bd2e7..0d7b1fc 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs | |||
@@ -120,11 +120,13 @@ namespace OpenSim.Region.ClientStack.Linden | |||
120 | { | 120 | { |
121 | // m_log.DebugFormat("[GETMESH]: /CAPS/{0} in region {1}", capID, m_scene.RegionInfo.RegionName); | 121 | // m_log.DebugFormat("[GETMESH]: /CAPS/{0} in region {1}", capID, m_scene.RegionInfo.RegionName); |
122 | GetMeshHandler gmeshHandler = new GetMeshHandler(m_AssetService); | 122 | GetMeshHandler gmeshHandler = new GetMeshHandler(m_AssetService); |
123 | IRequestHandler reqHandler = new RestHTTPHandler("GET", "/CAPS/" + UUID.Random(), | 123 | IRequestHandler reqHandler |
124 | delegate(Hashtable m_dhttpMethod) | 124 | = new RestHTTPHandler( |
125 | { | 125 | "GET", |
126 | return gmeshHandler.ProcessGetMesh(m_dhttpMethod, UUID.Zero, null); | 126 | "/CAPS/" + UUID.Random(), |
127 | }); | 127 | httpMethod => gmeshHandler.ProcessGetMesh(httpMethod, UUID.Zero, null), |
128 | "GetMesh", | ||
129 | agentID.ToString()); | ||
128 | 130 | ||
129 | caps.RegisterHandler("GetMesh", reqHandler); | 131 | caps.RegisterHandler("GetMesh", reqHandler); |
130 | } | 132 | } |
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs index fffcee2..5ae9cc3 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs | |||
@@ -130,7 +130,9 @@ namespace OpenSim.Region.ClientStack.Linden | |||
130 | if (m_URL == "localhost") | 130 | if (m_URL == "localhost") |
131 | { | 131 | { |
132 | // m_log.DebugFormat("[GETTEXTURE]: /CAPS/{0} in region {1}", capID, m_scene.RegionInfo.RegionName); | 132 | // m_log.DebugFormat("[GETTEXTURE]: /CAPS/{0} in region {1}", capID, m_scene.RegionInfo.RegionName); |
133 | caps.RegisterHandler("GetTexture", new GetTextureHandler("/CAPS/" + capID + "/", m_assetService)); | 133 | caps.RegisterHandler( |
134 | "GetTexture", | ||
135 | new GetTextureHandler("/CAPS/" + capID + "/", m_assetService, "GetTexture", agentID.ToString())); | ||
134 | } | 136 | } |
135 | else | 137 | else |
136 | { | 138 | { |
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/MeshUploadFlagModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/MeshUploadFlagModule.cs index 18c7eae..44a6883 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/MeshUploadFlagModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/MeshUploadFlagModule.cs | |||
@@ -117,7 +117,9 @@ namespace OpenSim.Region.ClientStack.Linden | |||
117 | 117 | ||
118 | public void RegisterCaps(UUID agentID, Caps caps) | 118 | public void RegisterCaps(UUID agentID, Caps caps) |
119 | { | 119 | { |
120 | IRequestHandler reqHandler = new RestHTTPHandler("GET", "/CAPS/" + UUID.Random(), MeshUploadFlag); | 120 | IRequestHandler reqHandler |
121 | = new RestHTTPHandler("GET", "/CAPS/" + UUID.Random(), MeshUploadFlag, "MeshUploadFlag", agentID.ToString()); | ||
122 | |||
121 | caps.RegisterHandler("MeshUploadFlag", reqHandler); | 123 | caps.RegisterHandler("MeshUploadFlag", reqHandler); |
122 | m_agentID = agentID; | 124 | m_agentID = agentID; |
123 | } | 125 | } |
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/NewFileAgentInventoryVariablePriceModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/NewFileAgentInventoryVariablePriceModule.cs index 91872c5..52c4f44 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/NewFileAgentInventoryVariablePriceModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/NewFileAgentInventoryVariablePriceModule.cs | |||
@@ -115,67 +115,66 @@ namespace OpenSim.Region.ClientStack.Linden | |||
115 | UUID capID = UUID.Random(); | 115 | UUID capID = UUID.Random(); |
116 | 116 | ||
117 | // m_log.Debug("[NEW FILE AGENT INVENTORY VARIABLE PRICE]: /CAPS/" + capID); | 117 | // m_log.Debug("[NEW FILE AGENT INVENTORY VARIABLE PRICE]: /CAPS/" + capID); |
118 | caps.RegisterHandler("NewFileAgentInventoryVariablePrice", | 118 | caps.RegisterHandler( |
119 | 119 | "NewFileAgentInventoryVariablePrice", | |
120 | new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDNewFileAngentInventoryVariablePriceReplyResponse>("POST", | 120 | new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDNewFileAngentInventoryVariablePriceReplyResponse>( |
121 | "/CAPS/" + capID.ToString(), | 121 | "POST", |
122 | delegate(LLSDAssetUploadRequest req) | 122 | "/CAPS/" + capID.ToString(), |
123 | { | 123 | req => NewAgentInventoryRequest(req, agentID), |
124 | return NewAgentInventoryRequest(req,agentID); | 124 | "NewFileAgentInventoryVariablePrice", |
125 | })); | 125 | agentID.ToString())); |
126 | |||
127 | } | 126 | } |
128 | 127 | ||
129 | #endregion | 128 | #endregion |
130 | 129 | ||
131 | public LLSDNewFileAngentInventoryVariablePriceReplyResponse NewAgentInventoryRequest(LLSDAssetUploadRequest llsdRequest, UUID agentID) | 130 | public LLSDNewFileAngentInventoryVariablePriceReplyResponse NewAgentInventoryRequest(LLSDAssetUploadRequest llsdRequest, UUID agentID) |
132 | { | 131 | { |
133 | |||
134 | //TODO: The Mesh uploader uploads many types of content. If you're going to implement a Money based limit | 132 | //TODO: The Mesh uploader uploads many types of content. If you're going to implement a Money based limit |
135 | // You need to be aware of this and | 133 | // you need to be aware of this |
136 | |||
137 | 134 | ||
138 | //if (llsdRequest.asset_type == "texture" || | 135 | //if (llsdRequest.asset_type == "texture" || |
139 | // llsdRequest.asset_type == "animation" || | 136 | // llsdRequest.asset_type == "animation" || |
140 | // llsdRequest.asset_type == "sound") | 137 | // llsdRequest.asset_type == "sound") |
141 | // { | 138 | // { |
142 | // check user level | 139 | // check user level |
143 | ScenePresence avatar = null; | ||
144 | IClientAPI client = null; | ||
145 | m_scene.TryGetScenePresence(agentID, out avatar); | ||
146 | 140 | ||
147 | if (avatar != null) | 141 | ScenePresence avatar = null; |
142 | IClientAPI client = null; | ||
143 | m_scene.TryGetScenePresence(agentID, out avatar); | ||
144 | |||
145 | if (avatar != null) | ||
146 | { | ||
147 | client = avatar.ControllingClient; | ||
148 | |||
149 | if (avatar.UserLevel < m_levelUpload) | ||
148 | { | 150 | { |
149 | client = avatar.ControllingClient; | 151 | if (client != null) |
150 | 152 | client.SendAgentAlertMessage("Unable to upload asset. Insufficient permissions.", false); | |
151 | if (avatar.UserLevel < m_levelUpload) | 153 | |
152 | { | 154 | LLSDNewFileAngentInventoryVariablePriceReplyResponse errorResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse(); |
153 | if (client != null) | 155 | errorResponse.rsvp = ""; |
154 | client.SendAgentAlertMessage("Unable to upload asset. Insufficient permissions.", false); | 156 | errorResponse.state = "error"; |
155 | 157 | return errorResponse; | |
156 | LLSDNewFileAngentInventoryVariablePriceReplyResponse errorResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse(); | ||
157 | errorResponse.rsvp = ""; | ||
158 | errorResponse.state = "error"; | ||
159 | return errorResponse; | ||
160 | } | ||
161 | } | 158 | } |
159 | } | ||
162 | 160 | ||
163 | // check funds | 161 | // check funds |
164 | IMoneyModule mm = m_scene.RequestModuleInterface<IMoneyModule>(); | 162 | IMoneyModule mm = m_scene.RequestModuleInterface<IMoneyModule>(); |
165 | 163 | ||
166 | if (mm != null) | 164 | if (mm != null) |
165 | { | ||
166 | if (!mm.UploadCovered(agentID, mm.UploadCharge)) | ||
167 | { | 167 | { |
168 | if (!mm.UploadCovered(agentID, mm.UploadCharge)) | 168 | if (client != null) |
169 | { | 169 | client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false); |
170 | if (client != null) | 170 | |
171 | client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false); | 171 | LLSDNewFileAngentInventoryVariablePriceReplyResponse errorResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse(); |
172 | 172 | errorResponse.rsvp = ""; | |
173 | LLSDNewFileAngentInventoryVariablePriceReplyResponse errorResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse(); | 173 | errorResponse.state = "error"; |
174 | errorResponse.rsvp = ""; | 174 | return errorResponse; |
175 | errorResponse.state = "error"; | ||
176 | return errorResponse; | ||
177 | } | ||
178 | } | 175 | } |
176 | } | ||
177 | |||
179 | // } | 178 | // } |
180 | 179 | ||
181 | string assetName = llsdRequest.name; | 180 | string assetName = llsdRequest.name; |
@@ -189,8 +188,14 @@ namespace OpenSim.Region.ClientStack.Linden | |||
189 | AssetUploader uploader = | 188 | AssetUploader uploader = |
190 | new AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type, | 189 | new AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type, |
191 | llsdRequest.asset_type, capsBase + uploaderPath, MainServer.Instance, m_dumpAssetsToFile); | 190 | llsdRequest.asset_type, capsBase + uploaderPath, MainServer.Instance, m_dumpAssetsToFile); |
191 | |||
192 | MainServer.Instance.AddStreamHandler( | 192 | MainServer.Instance.AddStreamHandler( |
193 | new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps)); | 193 | new BinaryStreamHandler( |
194 | "POST", | ||
195 | capsBase + uploaderPath, | ||
196 | uploader.uploaderCaps, | ||
197 | "NewFileAgentInventoryVariablePrice", | ||
198 | agentID.ToString())); | ||
194 | 199 | ||
195 | string protocol = "http://"; | 200 | string protocol = "http://"; |
196 | 201 | ||
@@ -199,10 +204,9 @@ namespace OpenSim.Region.ClientStack.Linden | |||
199 | 204 | ||
200 | string uploaderURL = protocol + m_scene.RegionInfo.ExternalHostName + ":" + MainServer.Instance.Port.ToString() + capsBase + | 205 | string uploaderURL = protocol + m_scene.RegionInfo.ExternalHostName + ":" + MainServer.Instance.Port.ToString() + capsBase + |
201 | uploaderPath; | 206 | uploaderPath; |
202 | 207 | ||
203 | 208 | ||
204 | LLSDNewFileAngentInventoryVariablePriceReplyResponse uploadResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse(); | 209 | LLSDNewFileAngentInventoryVariablePriceReplyResponse uploadResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse(); |
205 | |||
206 | 210 | ||
207 | uploadResponse.rsvp = uploaderURL; | 211 | uploadResponse.rsvp = uploaderURL; |
208 | uploadResponse.state = "upload"; | 212 | uploadResponse.state = "upload"; |
@@ -220,6 +224,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
220 | pinventoryItem, pparentFolder, pdata, pinventoryType, | 224 | pinventoryItem, pparentFolder, pdata, pinventoryType, |
221 | passetType,agentID); | 225 | passetType,agentID); |
222 | }; | 226 | }; |
227 | |||
223 | return uploadResponse; | 228 | return uploadResponse; |
224 | } | 229 | } |
225 | 230 | ||
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/ObjectAdd.cs b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/ObjectAdd.cs index 1c47f0e..4ccfc43 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/ObjectAdd.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/ObjectAdd.cs | |||
@@ -66,12 +66,14 @@ namespace OpenSim.Region.ClientStack.Linden | |||
66 | 66 | ||
67 | // m_log.InfoFormat("[OBJECTADD]: {0}", "/CAPS/OA/" + capuuid + "/"); | 67 | // m_log.InfoFormat("[OBJECTADD]: {0}", "/CAPS/OA/" + capuuid + "/"); |
68 | 68 | ||
69 | caps.RegisterHandler("ObjectAdd", | 69 | caps.RegisterHandler( |
70 | new RestHTTPHandler("POST", "/CAPS/OA/" + capuuid + "/", | 70 | "ObjectAdd", |
71 | delegate(Hashtable m_dhttpMethod) | 71 | new RestHTTPHandler( |
72 | { | 72 | "POST", |
73 | return ProcessAdd(m_dhttpMethod, agentID, caps); | 73 | "/CAPS/OA/" + capuuid + "/", |
74 | })); | 74 | httpMethod => ProcessAdd(httpMethod, agentID, caps), |
75 | "ObjectAdd", | ||
76 | agentID.ToString()));; | ||
75 | } | 77 | } |
76 | 78 | ||
77 | public Hashtable ProcessAdd(Hashtable request, UUID AgentId, Caps cap) | 79 | public Hashtable ProcessAdd(Hashtable request, UUID AgentId, Caps cap) |
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs index 7a3d97e..f0f3984 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs | |||
@@ -106,12 +106,15 @@ namespace OpenSim.Region.ClientStack.Linden | |||
106 | UUID capID = UUID.Random(); | 106 | UUID capID = UUID.Random(); |
107 | 107 | ||
108 | // m_log.Debug("[UPLOAD OBJECT ASSET MODULE]: /CAPS/" + capID); | 108 | // m_log.Debug("[UPLOAD OBJECT ASSET MODULE]: /CAPS/" + capID); |
109 | caps.RegisterHandler("UploadObjectAsset", | 109 | caps.RegisterHandler( |
110 | new RestHTTPHandler("POST", "/CAPS/OA/" + capID + "/", | 110 | "UploadObjectAsset", |
111 | delegate(Hashtable m_dhttpMethod) | 111 | new RestHTTPHandler( |
112 | { | 112 | "POST", |
113 | return ProcessAdd(m_dhttpMethod, agentID, caps); | 113 | "/CAPS/OA/" + capID + "/", |
114 | })); | 114 | httpMethod => ProcessAdd(httpMethod, agentID, caps), |
115 | "UploadObjectAsset", | ||
116 | agentID.ToString())); | ||
117 | |||
115 | /* | 118 | /* |
116 | caps.RegisterHandler("NewFileAgentInventoryVariablePrice", | 119 | caps.RegisterHandler("NewFileAgentInventoryVariablePrice", |
117 | 120 | ||
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs index 1dd8938..8ed0fb3 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs | |||
@@ -154,7 +154,9 @@ namespace OpenSim.Region.ClientStack.Linden | |||
154 | public void RegisterCaps(UUID agentID, Caps caps) | 154 | public void RegisterCaps(UUID agentID, Caps caps) |
155 | { | 155 | { |
156 | IRequestHandler reqHandler | 156 | IRequestHandler reqHandler |
157 | = new RestHTTPHandler("GET", "/CAPS/" + UUID.Random(), HandleSimulatorFeaturesRequest); | 157 | = new RestHTTPHandler( |
158 | "GET", "/CAPS/" + UUID.Random(), | ||
159 | HandleSimulatorFeaturesRequest, "SimulatorFeatures", agentID.ToString()); | ||
158 | 160 | ||
159 | caps.RegisterHandler("SimulatorFeatures", reqHandler); | 161 | caps.RegisterHandler("SimulatorFeatures", reqHandler); |
160 | } | 162 | } |
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs index 45d6071..b3d61a8 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs | |||
@@ -106,7 +106,9 @@ namespace OpenSim.Region.ClientStack.Linden | |||
106 | "POST", | 106 | "POST", |
107 | "/CAPS/" + caps.CapsObjectPath + m_uploadBakedTexturePath, | 107 | "/CAPS/" + caps.CapsObjectPath + m_uploadBakedTexturePath, |
108 | new UploadBakedTextureHandler( | 108 | new UploadBakedTextureHandler( |
109 | caps, m_scene.AssetService, m_persistBakedTextures).UploadBakedTexture)); | 109 | caps, m_scene.AssetService, m_persistBakedTextures).UploadBakedTexture, |
110 | "UploadBakedTexture", | ||
111 | agentID.ToString())); | ||
110 | } | 112 | } |
111 | } | 113 | } |
112 | } \ No newline at end of file | 114 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs index 10f43d1..2359bd6 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs | |||
@@ -144,7 +144,12 @@ namespace OpenSim.Region.ClientStack.Linden | |||
144 | capUrl = "/CAPS/" + UUID.Random(); | 144 | capUrl = "/CAPS/" + UUID.Random(); |
145 | 145 | ||
146 | IRequestHandler reqHandler | 146 | IRequestHandler reqHandler |
147 | = new RestStreamHandler("POST", capUrl, m_webFetchHandler.FetchInventoryDescendentsRequest); | 147 | = new RestStreamHandler( |
148 | "POST", | ||
149 | capUrl, | ||
150 | m_webFetchHandler.FetchInventoryDescendentsRequest, | ||
151 | "FetchInventoryDescendents2", | ||
152 | agentID.ToString()); | ||
148 | 153 | ||
149 | caps.RegisterHandler(capName, reqHandler); | 154 | caps.RegisterHandler(capName, reqHandler); |
150 | } | 155 | } |
@@ -160,4 +165,4 @@ namespace OpenSim.Region.ClientStack.Linden | |||
160 | // capName, capUrl, m_scene.RegionInfo.RegionName, agentID); | 165 | // capName, capUrl, m_scene.RegionInfo.RegionName, agentID); |
161 | } | 166 | } |
162 | } | 167 | } |
163 | } | 168 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/IncomingPacket.cs b/OpenSim/Region/ClientStack/Linden/UDP/IncomingPacket.cs index 90b3ede..1b8535c 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/IncomingPacket.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/IncomingPacket.cs | |||
@@ -39,7 +39,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
39 | public sealed class IncomingPacket | 39 | public sealed class IncomingPacket |
40 | { | 40 | { |
41 | /// <summary>Client this packet came from</summary> | 41 | /// <summary>Client this packet came from</summary> |
42 | public LLUDPClient Client; | 42 | public LLClientView Client; |
43 | |||
43 | /// <summary>Packet data that has been received</summary> | 44 | /// <summary>Packet data that has been received</summary> |
44 | public Packet Packet; | 45 | public Packet Packet; |
45 | 46 | ||
@@ -48,7 +49,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
48 | /// </summary> | 49 | /// </summary> |
49 | /// <param name="client">Reference to the client this packet came from</param> | 50 | /// <param name="client">Reference to the client this packet came from</param> |
50 | /// <param name="packet">Packet data</param> | 51 | /// <param name="packet">Packet data</param> |
51 | public IncomingPacket(LLUDPClient client, Packet packet) | 52 | public IncomingPacket(LLClientView client, Packet packet) |
52 | { | 53 | { |
53 | Client = client; | 54 | Client = client; |
54 | Packet = packet; | 55 | Packet = packet; |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 5a87958..18d8045 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -12161,21 +12161,24 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
12161 | protected void MakeAssetRequest(TransferRequestPacket transferRequest, UUID taskID) | 12161 | protected void MakeAssetRequest(TransferRequestPacket transferRequest, UUID taskID) |
12162 | { | 12162 | { |
12163 | UUID requestID = UUID.Zero; | 12163 | UUID requestID = UUID.Zero; |
12164 | if (transferRequest.TransferInfo.SourceType == (int)SourceType.Asset) | 12164 | int sourceType = transferRequest.TransferInfo.SourceType; |
12165 | |||
12166 | if (sourceType == (int)SourceType.Asset) | ||
12165 | { | 12167 | { |
12166 | requestID = new UUID(transferRequest.TransferInfo.Params, 0); | 12168 | requestID = new UUID(transferRequest.TransferInfo.Params, 0); |
12167 | } | 12169 | } |
12168 | else if (transferRequest.TransferInfo.SourceType == (int)SourceType.SimInventoryItem) | 12170 | else if (sourceType == (int)SourceType.SimInventoryItem) |
12169 | { | 12171 | { |
12170 | requestID = new UUID(transferRequest.TransferInfo.Params, 80); | 12172 | requestID = new UUID(transferRequest.TransferInfo.Params, 80); |
12171 | } | 12173 | } |
12172 | else if (transferRequest.TransferInfo.SourceType == (int)SourceType.SimEstate) | 12174 | else if (sourceType == (int)SourceType.SimEstate) |
12173 | { | 12175 | { |
12174 | requestID = taskID; | 12176 | requestID = taskID; |
12175 | } | 12177 | } |
12176 | 12178 | ||
12177 | 12179 | // m_log.DebugFormat( | |
12178 | // m_log.DebugFormat("[CLIENT]: {0} requesting asset {1}", Name, requestID); | 12180 | // "[LLCLIENTVIEW]: Received transfer request for {0} in {1} type {2} by {3}", |
12181 | // requestID, taskID, (SourceType)sourceType, Name); | ||
12179 | 12182 | ||
12180 | 12183 | ||
12181 | //Note, the bool returned from the below function is useless since it is always false. | 12184 | //Note, the bool returned from the below function is useless since it is always false. |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index 75f783b..3c23dcf 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | |||
@@ -147,21 +147,34 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
147 | private int m_elapsed500MSOutgoingPacketHandler; | 147 | private int m_elapsed500MSOutgoingPacketHandler; |
148 | 148 | ||
149 | /// <summary>Flag to signal when clients should check for resends</summary> | 149 | /// <summary>Flag to signal when clients should check for resends</summary> |
150 | private bool m_resendUnacked; | 150 | protected bool m_resendUnacked; |
151 | |||
151 | /// <summary>Flag to signal when clients should send ACKs</summary> | 152 | /// <summary>Flag to signal when clients should send ACKs</summary> |
152 | private bool m_sendAcks; | 153 | protected bool m_sendAcks; |
154 | |||
153 | /// <summary>Flag to signal when clients should send pings</summary> | 155 | /// <summary>Flag to signal when clients should send pings</summary> |
154 | private bool m_sendPing; | 156 | protected bool m_sendPing; |
155 | 157 | ||
156 | private int m_defaultRTO = 0; | 158 | private int m_defaultRTO = 0; |
157 | private int m_maxRTO = 0; | 159 | private int m_maxRTO = 0; |
158 | 160 | private int m_ackTimeout = 0; | |
161 | private int m_pausedAckTimeout = 0; | ||
159 | private bool m_disableFacelights = false; | 162 | private bool m_disableFacelights = false; |
160 | 163 | ||
161 | public Socket Server { get { return null; } } | 164 | public Socket Server { get { return null; } } |
162 | 165 | ||
163 | private int m_malformedCount = 0; // Guard against a spamming attack | 166 | private int m_malformedCount = 0; // Guard against a spamming attack |
164 | 167 | ||
168 | /// <summary> | ||
169 | /// Record current outgoing client for monitoring purposes. | ||
170 | /// </summary> | ||
171 | private IClientAPI m_currentOutgoingClient; | ||
172 | |||
173 | /// <summary> | ||
174 | /// Recording current incoming client for monitoring purposes. | ||
175 | /// </summary> | ||
176 | private IClientAPI m_currentIncomingClient; | ||
177 | |||
165 | public LLUDPServer(IPAddress listenIP, ref uint port, int proxyPortOffsetParm, bool allow_alternate_port, IConfigSource configSource, AgentCircuitManager circuitManager) | 178 | public LLUDPServer(IPAddress listenIP, ref uint port, int proxyPortOffsetParm, bool allow_alternate_port, IConfigSource configSource, AgentCircuitManager circuitManager) |
166 | : base(listenIP, (int)port) | 179 | : base(listenIP, (int)port) |
167 | { | 180 | { |
@@ -198,11 +211,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
198 | m_defaultRTO = config.GetInt("DefaultRTO", 0); | 211 | m_defaultRTO = config.GetInt("DefaultRTO", 0); |
199 | m_maxRTO = config.GetInt("MaxRTO", 0); | 212 | m_maxRTO = config.GetInt("MaxRTO", 0); |
200 | m_disableFacelights = config.GetBoolean("DisableFacelights", false); | 213 | m_disableFacelights = config.GetBoolean("DisableFacelights", false); |
214 | m_ackTimeout = 1000 * config.GetInt("AckTimeout", 60); | ||
215 | m_pausedAckTimeout = 1000 * config.GetInt("PausedAckTimeout", 300); | ||
201 | } | 216 | } |
202 | else | 217 | else |
203 | { | 218 | { |
204 | PrimUpdatesPerCallback = 100; | 219 | PrimUpdatesPerCallback = 100; |
205 | TextureSendLimit = 20; | 220 | TextureSendLimit = 20; |
221 | m_ackTimeout = 1000 * 60; // 1 minute | ||
222 | m_pausedAckTimeout = 1000 * 300; // 5 minutes | ||
206 | } | 223 | } |
207 | 224 | ||
208 | #region BinaryStats | 225 | #region BinaryStats |
@@ -239,19 +256,56 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
239 | if (m_scene == null) | 256 | if (m_scene == null) |
240 | throw new InvalidOperationException("[LLUDPSERVER]: Cannot LLUDPServer.Start() without an IScene reference"); | 257 | throw new InvalidOperationException("[LLUDPSERVER]: Cannot LLUDPServer.Start() without an IScene reference"); |
241 | 258 | ||
242 | m_log.Info("[LLUDPSERVER]: Starting the LLUDP server in " + (m_asyncPacketHandling ? "asynchronous" : "synchronous") + " mode"); | 259 | m_log.InfoFormat( |
260 | "[LLUDPSERVER]: Starting the LLUDP server in {0} mode", | ||
261 | m_asyncPacketHandling ? "asynchronous" : "synchronous"); | ||
243 | 262 | ||
244 | base.Start(m_recvBufferSize, m_asyncPacketHandling); | 263 | base.Start(m_recvBufferSize, m_asyncPacketHandling); |
245 | 264 | ||
246 | // Start the packet processing threads | 265 | // Start the packet processing threads |
247 | Watchdog.StartThread( | 266 | Watchdog.StartThread( |
248 | IncomingPacketHandler, "Incoming Packets (" + m_scene.RegionInfo.RegionName + ")", ThreadPriority.Normal, false, true); | 267 | IncomingPacketHandler, |
268 | string.Format("Incoming Packets ({0})", m_scene.RegionInfo.RegionName), | ||
269 | ThreadPriority.Normal, | ||
270 | false, | ||
271 | true, | ||
272 | GetWatchdogIncomingAlarmData, | ||
273 | Watchdog.WATCHDOG_TIMEOUT_MS); | ||
274 | |||
249 | Watchdog.StartThread( | 275 | Watchdog.StartThread( |
250 | OutgoingPacketHandler, "Outgoing Packets (" + m_scene.RegionInfo.RegionName + ")", ThreadPriority.Normal, false, true); | 276 | OutgoingPacketHandler, |
277 | string.Format("Outgoing Packets ({0})", m_scene.RegionInfo.RegionName), | ||
278 | ThreadPriority.Normal, | ||
279 | false, | ||
280 | true, | ||
281 | GetWatchdogOutgoingAlarmData, | ||
282 | Watchdog.WATCHDOG_TIMEOUT_MS); | ||
251 | 283 | ||
252 | m_elapsedMSSinceLastStatReport = Environment.TickCount; | 284 | m_elapsedMSSinceLastStatReport = Environment.TickCount; |
253 | } | 285 | } |
254 | 286 | ||
287 | /// <summary> | ||
288 | /// If the outgoing UDP thread times out, then return client that was being processed to help with debugging. | ||
289 | /// </summary> | ||
290 | /// <returns></returns> | ||
291 | private string GetWatchdogIncomingAlarmData() | ||
292 | { | ||
293 | return string.Format( | ||
294 | "Client is {0}", | ||
295 | m_currentIncomingClient != null ? m_currentIncomingClient.Name : "none"); | ||
296 | } | ||
297 | |||
298 | /// <summary> | ||
299 | /// If the outgoing UDP thread times out, then return client that was being processed to help with debugging. | ||
300 | /// </summary> | ||
301 | /// <returns></returns> | ||
302 | private string GetWatchdogOutgoingAlarmData() | ||
303 | { | ||
304 | return string.Format( | ||
305 | "Client is {0}", | ||
306 | m_currentOutgoingClient != null ? m_currentOutgoingClient.Name : "none"); | ||
307 | } | ||
308 | |||
255 | public new void Stop() | 309 | public new void Stop() |
256 | { | 310 | { |
257 | m_log.Info("[LLUDPSERVER]: Shutting down the LLUDP server for " + m_scene.RegionInfo.RegionName); | 311 | m_log.Info("[LLUDPSERVER]: Shutting down the LLUDP server for " + m_scene.RegionInfo.RegionName); |
@@ -485,19 +539,29 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
485 | SendPacket(udpClient, completePing, ThrottleOutPacketType.Unknown, false, null); | 539 | SendPacket(udpClient, completePing, ThrottleOutPacketType.Unknown, false, null); |
486 | } | 540 | } |
487 | 541 | ||
488 | public void HandleUnacked(LLUDPClient udpClient) | 542 | public void HandleUnacked(LLClientView client) |
489 | { | 543 | { |
544 | LLUDPClient udpClient = client.UDPClient; | ||
545 | |||
490 | if (!udpClient.IsConnected) | 546 | if (!udpClient.IsConnected) |
491 | return; | 547 | return; |
492 | 548 | ||
493 | // Disconnect an agent if no packets are received for some time | 549 | // Disconnect an agent if no packets are received for some time |
494 | //FIXME: Make 60 an .ini setting | 550 | int timeoutTicks = m_ackTimeout; |
495 | if ((Environment.TickCount & Int32.MaxValue) - udpClient.TickLastPacketReceived > 1000 * 60) | 551 | |
552 | // Allow more slack if the client is "paused" eg file upload dialogue is open | ||
553 | // Some sort of limit is needed in case the client crashes, loses its network connection | ||
554 | // or some other disaster prevents it from sendung the AgentResume | ||
555 | if (udpClient.IsPaused) | ||
556 | timeoutTicks = m_pausedAckTimeout; | ||
557 | |||
558 | if (!client.IsLoggingOut && | ||
559 | (Environment.TickCount & Int32.MaxValue) - udpClient.TickLastPacketReceived > timeoutTicks) | ||
496 | { | 560 | { |
497 | m_log.Warn("[LLUDPSERVER]: Ack timeout, disconnecting " + udpClient.AgentID); | 561 | m_log.Warn("[LLUDPSERVER]: Ack timeout, disconnecting " + udpClient.AgentID); |
498 | StatsManager.SimExtraStats.AddAbnormalClientThreadTermination(); | 562 | StatsManager.SimExtraStats.AddAbnormalClientThreadTermination(); |
563 | RemoveClient(client); | ||
499 | 564 | ||
500 | RemoveClient(udpClient); | ||
501 | return; | 565 | return; |
502 | } | 566 | } |
503 | 567 | ||
@@ -820,7 +884,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
820 | #endregion Ping Check Handling | 884 | #endregion Ping Check Handling |
821 | 885 | ||
822 | // Inbox insertion | 886 | // Inbox insertion |
823 | packetInbox.Enqueue(new IncomingPacket(udpClient, packet)); | 887 | packetInbox.Enqueue(new IncomingPacket((LLClientView)client, packet)); |
824 | } | 888 | } |
825 | 889 | ||
826 | #region BinaryStats | 890 | #region BinaryStats |
@@ -916,7 +980,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
916 | UDPPacketBuffer buffer = (UDPPacketBuffer)array[0]; | 980 | UDPPacketBuffer buffer = (UDPPacketBuffer)array[0]; |
917 | UseCircuitCodePacket uccp = (UseCircuitCodePacket)array[1]; | 981 | UseCircuitCodePacket uccp = (UseCircuitCodePacket)array[1]; |
918 | 982 | ||
919 | m_log.DebugFormat("[LLUDPSERVER]: Handling UseCircuitCode request from {0}", buffer.RemoteEndPoint); | 983 | m_log.DebugFormat( |
984 | "[LLUDPSERVER]: Handling UseCircuitCode request for circuit {0} from {1}", | ||
985 | uccp.CircuitCode.Code, buffer.RemoteEndPoint); | ||
920 | 986 | ||
921 | remoteEndPoint = (IPEndPoint)buffer.RemoteEndPoint; | 987 | remoteEndPoint = (IPEndPoint)buffer.RemoteEndPoint; |
922 | 988 | ||
@@ -1044,15 +1110,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1044 | return client; | 1110 | return client; |
1045 | } | 1111 | } |
1046 | 1112 | ||
1047 | private void RemoveClient(LLUDPClient udpClient) | 1113 | private void RemoveClient(IClientAPI client) |
1048 | { | 1114 | { |
1049 | // Remove this client from the scene | 1115 | client.IsLoggingOut = true; |
1050 | IClientAPI client; | 1116 | Util.FireAndForget(o => client.Close()); |
1051 | if (m_scene.TryGetClient(udpClient.AgentID, out client)) | ||
1052 | { | ||
1053 | client.IsLoggingOut = true; | ||
1054 | client.Close(false); | ||
1055 | } | ||
1056 | } | 1117 | } |
1057 | 1118 | ||
1058 | private void IncomingPacketHandler() | 1119 | private void IncomingPacketHandler() |
@@ -1161,6 +1222,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1161 | // client. m_packetSent will be set to true if a packet is sent | 1222 | // client. m_packetSent will be set to true if a packet is sent |
1162 | m_scene.ForEachClient(clientPacketHandler); | 1223 | m_scene.ForEachClient(clientPacketHandler); |
1163 | 1224 | ||
1225 | m_currentOutgoingClient = null; | ||
1226 | |||
1164 | // If nothing was sent, sleep for the minimum amount of time before a | 1227 | // If nothing was sent, sleep for the minimum amount of time before a |
1165 | // token bucket could get more tokens | 1228 | // token bucket could get more tokens |
1166 | if (!m_packetSent) | 1229 | if (!m_packetSent) |
@@ -1177,18 +1240,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1177 | Watchdog.RemoveThread(); | 1240 | Watchdog.RemoveThread(); |
1178 | } | 1241 | } |
1179 | 1242 | ||
1180 | private void ClientOutgoingPacketHandler(IClientAPI client) | 1243 | protected void ClientOutgoingPacketHandler(IClientAPI client) |
1181 | { | 1244 | { |
1245 | m_currentOutgoingClient = client; | ||
1246 | |||
1182 | try | 1247 | try |
1183 | { | 1248 | { |
1184 | if (client is LLClientView) | 1249 | if (client is LLClientView) |
1185 | { | 1250 | { |
1186 | LLUDPClient udpClient = ((LLClientView)client).UDPClient; | 1251 | LLClientView llClient = (LLClientView)client; |
1252 | LLUDPClient udpClient = llClient.UDPClient; | ||
1187 | 1253 | ||
1188 | if (udpClient.IsConnected) | 1254 | if (udpClient.IsConnected) |
1189 | { | 1255 | { |
1190 | if (m_resendUnacked) | 1256 | if (m_resendUnacked) |
1191 | HandleUnacked(udpClient); | 1257 | HandleUnacked(llClient); |
1192 | 1258 | ||
1193 | if (m_sendAcks) | 1259 | if (m_sendAcks) |
1194 | SendAcks(udpClient); | 1260 | SendAcks(udpClient); |
@@ -1204,8 +1270,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1204 | } | 1270 | } |
1205 | catch (Exception ex) | 1271 | catch (Exception ex) |
1206 | { | 1272 | { |
1207 | m_log.Error("[LLUDPSERVER]: OutgoingPacketHandler iteration for " + client.Name + | 1273 | m_log.Error( |
1208 | " threw an exception: " + ex.Message, ex); | 1274 | string.Format("[LLUDPSERVER]: OutgoingPacketHandler iteration for {0} threw ", client.Name), ex); |
1209 | } | 1275 | } |
1210 | } | 1276 | } |
1211 | 1277 | ||
@@ -1231,11 +1297,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1231 | { | 1297 | { |
1232 | nticks++; | 1298 | nticks++; |
1233 | watch1.Start(); | 1299 | watch1.Start(); |
1300 | m_currentOutgoingClient = client; | ||
1301 | |||
1234 | try | 1302 | try |
1235 | { | 1303 | { |
1236 | if (client is LLClientView) | 1304 | if (client is LLClientView) |
1237 | { | 1305 | { |
1238 | LLUDPClient udpClient = ((LLClientView)client).UDPClient; | 1306 | LLClientView llClient = (LLClientView)client; |
1307 | LLUDPClient udpClient = llClient.UDPClient; | ||
1239 | 1308 | ||
1240 | if (udpClient.IsConnected) | 1309 | if (udpClient.IsConnected) |
1241 | { | 1310 | { |
@@ -1244,7 +1313,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1244 | nticksUnack++; | 1313 | nticksUnack++; |
1245 | watch2.Start(); | 1314 | watch2.Start(); |
1246 | 1315 | ||
1247 | HandleUnacked(udpClient); | 1316 | HandleUnacked(llClient); |
1248 | 1317 | ||
1249 | watch2.Stop(); | 1318 | watch2.Stop(); |
1250 | avgResendUnackedTicks = (nticksUnack - 1)/(float)nticksUnack * avgResendUnackedTicks + (watch2.ElapsedTicks / (float)nticksUnack); | 1319 | avgResendUnackedTicks = (nticksUnack - 1)/(float)nticksUnack * avgResendUnackedTicks + (watch2.ElapsedTicks / (float)nticksUnack); |
@@ -1315,23 +1384,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1315 | 1384 | ||
1316 | #endregion | 1385 | #endregion |
1317 | 1386 | ||
1318 | private void ProcessInPacket(object state) | 1387 | private void ProcessInPacket(IncomingPacket incomingPacket) |
1319 | { | 1388 | { |
1320 | IncomingPacket incomingPacket = (IncomingPacket)state; | ||
1321 | Packet packet = incomingPacket.Packet; | 1389 | Packet packet = incomingPacket.Packet; |
1322 | LLUDPClient udpClient = incomingPacket.Client; | 1390 | LLClientView client = incomingPacket.Client; |
1323 | IClientAPI client; | ||
1324 | 1391 | ||
1325 | // Sanity check | 1392 | if (client.IsActive) |
1326 | if (packet == null || udpClient == null) | ||
1327 | { | 1393 | { |
1328 | m_log.WarnFormat("[LLUDPSERVER]: Processing a packet with incomplete state. Packet=\"{0}\", UDPClient=\"{1}\"", | 1394 | m_currentIncomingClient = client; |
1329 | packet, udpClient); | ||
1330 | } | ||
1331 | 1395 | ||
1332 | // Make sure this client is still alive | ||
1333 | if (m_scene.TryGetClient(udpClient.AgentID, out client)) | ||
1334 | { | ||
1335 | try | 1396 | try |
1336 | { | 1397 | { |
1337 | // Process this packet | 1398 | // Process this packet |
@@ -1346,21 +1407,30 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1346 | catch (Exception e) | 1407 | catch (Exception e) |
1347 | { | 1408 | { |
1348 | // Don't let a failure in an individual client thread crash the whole sim. | 1409 | // Don't let a failure in an individual client thread crash the whole sim. |
1349 | m_log.ErrorFormat("[LLUDPSERVER]: Client packet handler for {0} for packet {1} threw an exception", udpClient.AgentID, packet.Type); | 1410 | m_log.Error( |
1350 | m_log.Error(e.Message, e); | 1411 | string.Format( |
1412 | "[LLUDPSERVER]: Client packet handler for {0} for packet {1} threw ", | ||
1413 | client.Name, packet.Type), | ||
1414 | e); | ||
1415 | } | ||
1416 | finally | ||
1417 | { | ||
1418 | m_currentIncomingClient = null; | ||
1351 | } | 1419 | } |
1352 | } | 1420 | } |
1353 | else | 1421 | else |
1354 | { | 1422 | { |
1355 | m_log.DebugFormat("[LLUDPSERVER]: Dropping incoming {0} packet for dead client {1}", packet.Type, udpClient.AgentID); | 1423 | m_log.DebugFormat( |
1424 | "[LLUDPSERVER]: Dropped incoming {0} for dead client {1} in {2}", | ||
1425 | packet.Type, client.Name, m_scene.RegionInfo.RegionName); | ||
1356 | } | 1426 | } |
1357 | } | 1427 | } |
1358 | 1428 | ||
1359 | protected void LogoutHandler(IClientAPI client) | 1429 | protected void LogoutHandler(IClientAPI client) |
1360 | { | 1430 | { |
1361 | client.SendLogoutPacket(); | 1431 | client.SendLogoutPacket(); |
1362 | if (client.IsActive) | 1432 | if (!client.IsLoggingOut) |
1363 | RemoveClient(((LLClientView)client).UDPClient); | 1433 | RemoveClient(client); |
1364 | } | 1434 | } |
1365 | } | 1435 | } |
1366 | } | 1436 | } |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs index a575e36..109a8e1 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs | |||
@@ -45,6 +45,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests | |||
45 | [TestFixture] | 45 | [TestFixture] |
46 | public class BasicCircuitTests | 46 | public class BasicCircuitTests |
47 | { | 47 | { |
48 | private Scene m_scene; | ||
49 | private TestLLUDPServer m_udpServer; | ||
50 | |||
48 | [TestFixtureSetUp] | 51 | [TestFixtureSetUp] |
49 | public void FixtureInit() | 52 | public void FixtureInit() |
50 | { | 53 | { |
@@ -61,83 +64,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests | |||
61 | Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod; | 64 | Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod; |
62 | } | 65 | } |
63 | 66 | ||
64 | // /// <summary> | 67 | [SetUp] |
65 | // /// Add a client for testing | 68 | public void SetUp() |
66 | // /// </summary> | 69 | { |
67 | // /// <param name="scene"></param> | 70 | m_scene = new SceneHelpers().SetupScene(); |
68 | // /// <param name="testLLUDPServer"></param> | 71 | } |
69 | // /// <param name="testPacketServer"></param> | ||
70 | // /// <param name="acm">Agent circuit manager used in setting up the stack</param> | ||
71 | // protected void SetupStack( | ||
72 | // IScene scene, out TestLLUDPServer testLLUDPServer, out TestLLPacketServer testPacketServer, | ||
73 | // out AgentCircuitManager acm) | ||
74 | // { | ||
75 | // IConfigSource configSource = new IniConfigSource(); | ||
76 | // ClientStackUserSettings userSettings = new ClientStackUserSettings(); | ||
77 | // testLLUDPServer = new TestLLUDPServer(); | ||
78 | // acm = new AgentCircuitManager(); | ||
79 | // | ||
80 | // uint port = 666; | ||
81 | // testLLUDPServer.Initialise(null, ref port, 0, false, configSource, acm); | ||
82 | // testPacketServer = new TestLLPacketServer(testLLUDPServer, userSettings); | ||
83 | // testLLUDPServer.LocalScene = scene; | ||
84 | // } | ||
85 | |||
86 | // /// <summary> | ||
87 | // /// Set up a client for tests which aren't concerned with this process itself and where only one client is being | ||
88 | // /// tested | ||
89 | // /// </summary> | ||
90 | // /// <param name="circuitCode"></param> | ||
91 | // /// <param name="epSender"></param> | ||
92 | // /// <param name="testLLUDPServer"></param> | ||
93 | // /// <param name="acm"></param> | ||
94 | // protected void AddClient( | ||
95 | // uint circuitCode, EndPoint epSender, TestLLUDPServer testLLUDPServer, AgentCircuitManager acm) | ||
96 | // { | ||
97 | // UUID myAgentUuid = UUID.Parse("00000000-0000-0000-0000-000000000001"); | ||
98 | // UUID mySessionUuid = UUID.Parse("00000000-0000-0000-0000-000000000002"); | ||
99 | // | ||
100 | // AddClient(circuitCode, epSender, myAgentUuid, mySessionUuid, testLLUDPServer, acm); | ||
101 | // } | ||
102 | |||
103 | // /// <summary> | ||
104 | // /// Set up a client for tests which aren't concerned with this process itself | ||
105 | // /// </summary> | ||
106 | // /// <param name="circuitCode"></param> | ||
107 | // /// <param name="epSender"></param> | ||
108 | // /// <param name="agentId"></param> | ||
109 | // /// <param name="sessionId"></param> | ||
110 | // /// <param name="testLLUDPServer"></param> | ||
111 | // /// <param name="acm"></param> | ||
112 | // protected void AddClient( | ||
113 | // uint circuitCode, EndPoint epSender, UUID agentId, UUID sessionId, | ||
114 | // TestLLUDPServer testLLUDPServer, AgentCircuitManager acm) | ||
115 | // { | ||
116 | // AgentCircuitData acd = new AgentCircuitData(); | ||
117 | // acd.AgentID = agentId; | ||
118 | // acd.SessionID = sessionId; | ||
119 | // | ||
120 | // UseCircuitCodePacket uccp = new UseCircuitCodePacket(); | ||
121 | // | ||
122 | // UseCircuitCodePacket.CircuitCodeBlock uccpCcBlock | ||
123 | // = new UseCircuitCodePacket.CircuitCodeBlock(); | ||
124 | // uccpCcBlock.Code = circuitCode; | ||
125 | // uccpCcBlock.ID = agentId; | ||
126 | // uccpCcBlock.SessionID = sessionId; | ||
127 | // uccp.CircuitCode = uccpCcBlock; | ||
128 | // | ||
129 | // acm.AddNewCircuit(circuitCode, acd); | ||
130 | // | ||
131 | // testLLUDPServer.LoadReceive(uccp, epSender); | ||
132 | // testLLUDPServer.ReceiveData(null); | ||
133 | // } | ||
134 | 72 | ||
135 | /// <summary> | 73 | /// <summary> |
136 | /// Build an object name packet for test purposes | 74 | /// Build an object name packet for test purposes |
137 | /// </summary> | 75 | /// </summary> |
138 | /// <param name="objectLocalId"></param> | 76 | /// <param name="objectLocalId"></param> |
139 | /// <param name="objectName"></param> | 77 | /// <param name="objectName"></param> |
140 | protected ObjectNamePacket BuildTestObjectNamePacket(uint objectLocalId, string objectName) | 78 | private ObjectNamePacket BuildTestObjectNamePacket(uint objectLocalId, string objectName) |
141 | { | 79 | { |
142 | ObjectNamePacket onp = new ObjectNamePacket(); | 80 | ObjectNamePacket onp = new ObjectNamePacket(); |
143 | ObjectNamePacket.ObjectDataBlock odb = new ObjectNamePacket.ObjectDataBlock(); | 81 | ObjectNamePacket.ObjectDataBlock odb = new ObjectNamePacket.ObjectDataBlock(); |
@@ -148,6 +86,55 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests | |||
148 | 86 | ||
149 | return onp; | 87 | return onp; |
150 | } | 88 | } |
89 | |||
90 | private void AddUdpServer() | ||
91 | { | ||
92 | AddUdpServer(new IniConfigSource()); | ||
93 | } | ||
94 | |||
95 | private void AddUdpServer(IniConfigSource configSource) | ||
96 | { | ||
97 | uint port = 0; | ||
98 | AgentCircuitManager acm = m_scene.AuthenticateHandler; | ||
99 | |||
100 | m_udpServer = new TestLLUDPServer(IPAddress.Any, ref port, 0, false, configSource, acm); | ||
101 | m_udpServer.AddScene(m_scene); | ||
102 | } | ||
103 | |||
104 | /// <summary> | ||
105 | /// Used by tests that aren't testing this stage. | ||
106 | /// </summary> | ||
107 | private ScenePresence AddClient() | ||
108 | { | ||
109 | UUID myAgentUuid = TestHelpers.ParseTail(0x1); | ||
110 | UUID mySessionUuid = TestHelpers.ParseTail(0x2); | ||
111 | uint myCircuitCode = 123456; | ||
112 | IPEndPoint testEp = new IPEndPoint(IPAddress.Loopback, 999); | ||
113 | |||
114 | UseCircuitCodePacket uccp = new UseCircuitCodePacket(); | ||
115 | |||
116 | UseCircuitCodePacket.CircuitCodeBlock uccpCcBlock | ||
117 | = new UseCircuitCodePacket.CircuitCodeBlock(); | ||
118 | uccpCcBlock.Code = myCircuitCode; | ||
119 | uccpCcBlock.ID = myAgentUuid; | ||
120 | uccpCcBlock.SessionID = mySessionUuid; | ||
121 | uccp.CircuitCode = uccpCcBlock; | ||
122 | |||
123 | byte[] uccpBytes = uccp.ToBytes(); | ||
124 | UDPPacketBuffer upb = new UDPPacketBuffer(testEp, uccpBytes.Length); | ||
125 | upb.DataLength = uccpBytes.Length; // God knows why this isn't set by the constructor. | ||
126 | Buffer.BlockCopy(uccpBytes, 0, upb.Data, 0, uccpBytes.Length); | ||
127 | |||
128 | AgentCircuitData acd = new AgentCircuitData(); | ||
129 | acd.AgentID = myAgentUuid; | ||
130 | acd.SessionID = mySessionUuid; | ||
131 | |||
132 | m_scene.AuthenticateHandler.AddNewCircuit(myCircuitCode, acd); | ||
133 | |||
134 | m_udpServer.PacketReceived(upb); | ||
135 | |||
136 | return m_scene.GetScenePresence(myAgentUuid); | ||
137 | } | ||
151 | 138 | ||
152 | /// <summary> | 139 | /// <summary> |
153 | /// Test adding a client to the stack | 140 | /// Test adding a client to the stack |
@@ -158,19 +145,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests | |||
158 | TestHelpers.InMethod(); | 145 | TestHelpers.InMethod(); |
159 | // XmlConfigurator.Configure(); | 146 | // XmlConfigurator.Configure(); |
160 | 147 | ||
161 | TestScene scene = SceneHelpers.SetupScene(); | 148 | AddUdpServer(); |
162 | uint myCircuitCode = 123456; | 149 | |
163 | UUID myAgentUuid = TestHelpers.ParseTail(0x1); | 150 | UUID myAgentUuid = TestHelpers.ParseTail(0x1); |
164 | UUID mySessionUuid = TestHelpers.ParseTail(0x2); | 151 | UUID mySessionUuid = TestHelpers.ParseTail(0x2); |
152 | uint myCircuitCode = 123456; | ||
165 | IPEndPoint testEp = new IPEndPoint(IPAddress.Loopback, 999); | 153 | IPEndPoint testEp = new IPEndPoint(IPAddress.Loopback, 999); |
166 | 154 | ||
167 | uint port = 0; | ||
168 | AgentCircuitManager acm = scene.AuthenticateHandler; | ||
169 | |||
170 | TestLLUDPServer llUdpServer | ||
171 | = new TestLLUDPServer(IPAddress.Any, ref port, 0, false, new IniConfigSource(), acm); | ||
172 | llUdpServer.AddScene(scene); | ||
173 | |||
174 | UseCircuitCodePacket uccp = new UseCircuitCodePacket(); | 155 | UseCircuitCodePacket uccp = new UseCircuitCodePacket(); |
175 | 156 | ||
176 | UseCircuitCodePacket.CircuitCodeBlock uccpCcBlock | 157 | UseCircuitCodePacket.CircuitCodeBlock uccpCcBlock |
@@ -185,26 +166,26 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests | |||
185 | upb.DataLength = uccpBytes.Length; // God knows why this isn't set by the constructor. | 166 | upb.DataLength = uccpBytes.Length; // God knows why this isn't set by the constructor. |
186 | Buffer.BlockCopy(uccpBytes, 0, upb.Data, 0, uccpBytes.Length); | 167 | Buffer.BlockCopy(uccpBytes, 0, upb.Data, 0, uccpBytes.Length); |
187 | 168 | ||
188 | llUdpServer.PacketReceived(upb); | 169 | m_udpServer.PacketReceived(upb); |
189 | 170 | ||
190 | // Presence shouldn't exist since the circuit manager doesn't know about this circuit for authentication yet | 171 | // Presence shouldn't exist since the circuit manager doesn't know about this circuit for authentication yet |
191 | Assert.That(scene.GetScenePresence(myAgentUuid), Is.Null); | 172 | Assert.That(m_scene.GetScenePresence(myAgentUuid), Is.Null); |
192 | 173 | ||
193 | AgentCircuitData acd = new AgentCircuitData(); | 174 | AgentCircuitData acd = new AgentCircuitData(); |
194 | acd.AgentID = myAgentUuid; | 175 | acd.AgentID = myAgentUuid; |
195 | acd.SessionID = mySessionUuid; | 176 | acd.SessionID = mySessionUuid; |
196 | 177 | ||
197 | acm.AddNewCircuit(myCircuitCode, acd); | 178 | m_scene.AuthenticateHandler.AddNewCircuit(myCircuitCode, acd); |
198 | 179 | ||
199 | llUdpServer.PacketReceived(upb); | 180 | m_udpServer.PacketReceived(upb); |
200 | 181 | ||
201 | // Should succeed now | 182 | // Should succeed now |
202 | ScenePresence sp = scene.GetScenePresence(myAgentUuid); | 183 | ScenePresence sp = m_scene.GetScenePresence(myAgentUuid); |
203 | Assert.That(sp.UUID, Is.EqualTo(myAgentUuid)); | 184 | Assert.That(sp.UUID, Is.EqualTo(myAgentUuid)); |
204 | 185 | ||
205 | Assert.That(llUdpServer.PacketsSent.Count, Is.EqualTo(1)); | 186 | Assert.That(m_udpServer.PacketsSent.Count, Is.EqualTo(1)); |
206 | 187 | ||
207 | Packet packet = llUdpServer.PacketsSent[0]; | 188 | Packet packet = m_udpServer.PacketsSent[0]; |
208 | Assert.That(packet, Is.InstanceOf(typeof(PacketAckPacket))); | 189 | Assert.That(packet, Is.InstanceOf(typeof(PacketAckPacket))); |
209 | 190 | ||
210 | PacketAckPacket ackPacket = packet as PacketAckPacket; | 191 | PacketAckPacket ackPacket = packet as PacketAckPacket; |
@@ -212,6 +193,26 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests | |||
212 | Assert.That(ackPacket.Packets[0].ID, Is.EqualTo(0)); | 193 | Assert.That(ackPacket.Packets[0].ID, Is.EqualTo(0)); |
213 | } | 194 | } |
214 | 195 | ||
196 | [Test] | ||
197 | public void TestLogoutClientDueToAck() | ||
198 | { | ||
199 | TestHelpers.InMethod(); | ||
200 | // TestHelpers.EnableLogging(); | ||
201 | |||
202 | IniConfigSource ics = new IniConfigSource(); | ||
203 | IConfig config = ics.AddConfig("ClientStack.LindenUDP"); | ||
204 | config.Set("AckTimeout", -1); | ||
205 | AddUdpServer(ics); | ||
206 | |||
207 | ScenePresence sp = AddClient(); | ||
208 | m_udpServer.ClientOutgoingPacketHandler(sp.ControllingClient, true, false, false); | ||
209 | |||
210 | ScenePresence spAfterAckTimeout = m_scene.GetScenePresence(sp.UUID); | ||
211 | Assert.That(spAfterAckTimeout, Is.Null); | ||
212 | |||
213 | // TestHelpers.DisableLogging(); | ||
214 | } | ||
215 | |||
215 | // /// <summary> | 216 | // /// <summary> |
216 | // /// Test removing a client from the stack | 217 | // /// Test removing a client from the stack |
217 | // /// </summary> | 218 | // /// </summary> |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs index 1b68d68..5fcf376 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs | |||
@@ -79,7 +79,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests | |||
79 | 79 | ||
80 | J2KDecoderModule j2kdm = new J2KDecoderModule(); | 80 | J2KDecoderModule j2kdm = new J2KDecoderModule(); |
81 | 81 | ||
82 | scene = SceneHelpers.SetupScene(); | 82 | SceneHelpers sceneHelpers = new SceneHelpers(); |
83 | scene = sceneHelpers.SetupScene(); | ||
83 | SceneHelpers.SetupSceneModules(scene, j2kdm); | 84 | SceneHelpers.SetupSceneModules(scene, j2kdm); |
84 | 85 | ||
85 | tc = new TestClient(SceneHelpers.GenerateAgentData(userId), scene); | 86 | tc = new TestClient(SceneHelpers.GenerateAgentData(userId), scene); |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/TestLLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/TestLLUDPServer.cs index 0302385..27b9e5b 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/TestLLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/TestLLUDPServer.cs | |||
@@ -59,6 +59,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests | |||
59 | PacketsSent.Add(packet); | 59 | PacketsSent.Add(packet); |
60 | } | 60 | } |
61 | 61 | ||
62 | public void ClientOutgoingPacketHandler(IClientAPI client, bool resendUnacked, bool sendAcks, bool sendPing) | ||
63 | { | ||
64 | m_resendUnacked = resendUnacked; | ||
65 | m_sendAcks = sendAcks; | ||
66 | m_sendPing = sendPing; | ||
67 | |||
68 | ClientOutgoingPacketHandler(client); | ||
69 | } | ||
70 | |||
62 | //// /// <summary> | 71 | //// /// <summary> |
63 | //// /// The chunks of data to pass to the LLUDPServer when it calls EndReceive | 72 | //// /// The chunks of data to pass to the LLUDPServer when it calls EndReceive |
64 | //// /// </summary> | 73 | //// /// </summary> |
diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs index 6e3a58e..6e78d6d 100644 --- a/OpenSim/Region/ClientStack/RegionApplicationBase.cs +++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs | |||
@@ -111,7 +111,7 @@ namespace OpenSim.Region.ClientStack | |||
111 | server.Start(); | 111 | server.Start(); |
112 | } | 112 | } |
113 | } | 113 | } |
114 | 114 | ||
115 | base.StartupSpecific(); | 115 | base.StartupSpecific(); |
116 | } | 116 | } |
117 | 117 | ||
diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs index 874693e..7081989 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs | |||
@@ -42,8 +42,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction | |||
42 | public class AssetTransactionModule : INonSharedRegionModule, | 42 | public class AssetTransactionModule : INonSharedRegionModule, |
43 | IAgentAssetTransactions | 43 | IAgentAssetTransactions |
44 | { | 44 | { |
45 | // private static readonly ILog m_log = LogManager.GetLogger( | 45 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
46 | // MethodBase.GetCurrentMethod().DeclaringType); | ||
47 | 46 | ||
48 | protected Scene m_Scene; | 47 | protected Scene m_Scene; |
49 | private bool m_dumpAssetsToFile = false; | 48 | private bool m_dumpAssetsToFile = false; |
@@ -209,15 +208,15 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction | |||
209 | /// and comes through this method. | 208 | /// and comes through this method. |
210 | /// </summary> | 209 | /// </summary> |
211 | /// <param name="remoteClient"></param> | 210 | /// <param name="remoteClient"></param> |
211 | /// <param name="part"></param> | ||
212 | /// <param name="transactionID"></param> | 212 | /// <param name="transactionID"></param> |
213 | /// <param name="item"></param> | 213 | /// <param name="item"></param> |
214 | public void HandleTaskItemUpdateFromTransaction(IClientAPI remoteClient, | 214 | public void HandleTaskItemUpdateFromTransaction( |
215 | SceneObjectPart part, UUID transactionID, | 215 | IClientAPI remoteClient, SceneObjectPart part, UUID transactionID, TaskInventoryItem item) |
216 | TaskInventoryItem item) | ||
217 | { | 216 | { |
218 | // m_log.DebugFormat( | 217 | m_log.DebugFormat( |
219 | // "[TRANSACTIONS MANAGER] Called HandleTaskItemUpdateFromTransaction with item {0}", | 218 | "[TRANSACTIONS MANAGER] Called HandleTaskItemUpdateFromTransaction with item {0} in {1} for {2} in {3}", |
220 | // item.Name); | 219 | item.Name, part.Name, remoteClient.Name, m_Scene.RegionInfo.RegionName); |
221 | 220 | ||
222 | AgentAssetTransactions transactions = | 221 | AgentAssetTransactions transactions = |
223 | GetUserTransactions(remoteClient.AgentId); | 222 | GetUserTransactions(remoteClient.AgentId); |
diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs index 127ca1d..7054825 100644 --- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs | |||
@@ -83,7 +83,7 @@ namespace Flotsam.RegionModules.AssetCache | |||
83 | private Dictionary<string, ManualResetEvent> m_CurrentlyWriting = new Dictionary<string, ManualResetEvent>(); | 83 | private Dictionary<string, ManualResetEvent> m_CurrentlyWriting = new Dictionary<string, ManualResetEvent>(); |
84 | private int m_WaitOnInprogressTimeout = 3000; | 84 | private int m_WaitOnInprogressTimeout = 3000; |
85 | #else | 85 | #else |
86 | private List<string> m_CurrentlyWriting = new List<string>(); | 86 | private HashSet<string> m_CurrentlyWriting = new HashSet<string>(); |
87 | #endif | 87 | #endif |
88 | 88 | ||
89 | private bool m_FileCacheEnabled = true; | 89 | private bool m_FileCacheEnabled = true; |
@@ -272,7 +272,11 @@ namespace Flotsam.RegionModules.AssetCache | |||
272 | // the other thread has updated the time for us. | 272 | // the other thread has updated the time for us. |
273 | try | 273 | try |
274 | { | 274 | { |
275 | File.SetLastAccessTime(filename, DateTime.Now); | 275 | lock (m_CurrentlyWriting) |
276 | { | ||
277 | if (!m_CurrentlyWriting.Contains(filename)) | ||
278 | File.SetLastAccessTime(filename, DateTime.Now); | ||
279 | } | ||
276 | } | 280 | } |
277 | catch | 281 | catch |
278 | { | 282 | { |
diff --git a/OpenSim/Region/CoreModules/Asset/Tests/FlotsamAssetCacheTests.cs b/OpenSim/Region/CoreModules/Asset/Tests/FlotsamAssetCacheTests.cs index 5adb845..c91b25f 100644 --- a/OpenSim/Region/CoreModules/Asset/Tests/FlotsamAssetCacheTests.cs +++ b/OpenSim/Region/CoreModules/Asset/Tests/FlotsamAssetCacheTests.cs | |||
@@ -65,7 +65,7 @@ namespace OpenSim.Region.CoreModules.Asset.Tests | |||
65 | config.Configs["AssetCache"].Set("MemoryCacheEnabled", "true"); | 65 | config.Configs["AssetCache"].Set("MemoryCacheEnabled", "true"); |
66 | 66 | ||
67 | m_cache = new FlotsamAssetCache(); | 67 | m_cache = new FlotsamAssetCache(); |
68 | m_scene = SceneHelpers.SetupScene(); | 68 | m_scene = new SceneHelpers().SetupScene(); |
69 | SceneHelpers.SetupSceneModules(m_scene, config, m_cache); | 69 | SceneHelpers.SetupSceneModules(m_scene, config, m_cache); |
70 | } | 70 | } |
71 | 71 | ||
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index fd7cad2..f1deaa8 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | |||
@@ -50,7 +50,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
51 | 51 | ||
52 | private Scene m_scene; | 52 | private Scene m_scene; |
53 | private IDialogModule m_dialogModule; | 53 | private IInventoryAccessModule m_invAccessModule; |
54 | 54 | ||
55 | /// <summary> | 55 | /// <summary> |
56 | /// Are attachments enabled? | 56 | /// Are attachments enabled? |
@@ -72,7 +72,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
72 | public void AddRegion(Scene scene) | 72 | public void AddRegion(Scene scene) |
73 | { | 73 | { |
74 | m_scene = scene; | 74 | m_scene = scene; |
75 | m_dialogModule = m_scene.RequestModuleInterface<IDialogModule>(); | ||
76 | m_scene.RegisterModuleInterface<IAttachmentsModule>(this); | 75 | m_scene.RegisterModuleInterface<IAttachmentsModule>(this); |
77 | 76 | ||
78 | if (Enabled) | 77 | if (Enabled) |
@@ -89,7 +88,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
89 | m_scene.EventManager.OnNewClient -= SubscribeToClientEvents; | 88 | m_scene.EventManager.OnNewClient -= SubscribeToClientEvents; |
90 | } | 89 | } |
91 | 90 | ||
92 | public void RegionLoaded(Scene scene) {} | 91 | public void RegionLoaded(Scene scene) |
92 | { | ||
93 | m_invAccessModule = m_scene.RequestModuleInterface<IInventoryAccessModule>(); | ||
94 | } | ||
93 | 95 | ||
94 | public void Close() | 96 | public void Close() |
95 | { | 97 | { |
@@ -189,7 +191,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
189 | } | 191 | } |
190 | catch (Exception e) | 192 | catch (Exception e) |
191 | { | 193 | { |
192 | m_log.ErrorFormat("[ATTACHMENTS MODULE]: Unable to rez attachment: {0}{1}", e.Message, e.StackTrace); | 194 | UUID agentId = (sp.ControllingClient == null) ? (UUID)null : sp.ControllingClient.AgentId; |
195 | m_log.ErrorFormat("[ATTACHMENTS MODULE]: Unable to rez attachment with itemID {0}, assetID {1}, point {2} for {3}: {4}\n{5}", | ||
196 | attach.ItemID, attach.AssetID, p, agentId, e.Message, e.StackTrace); | ||
193 | } | 197 | } |
194 | } | 198 | } |
195 | } | 199 | } |
@@ -458,7 +462,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
458 | lock (sp.AttachmentsSyncLock) | 462 | lock (sp.AttachmentsSyncLock) |
459 | { | 463 | { |
460 | // Save avatar attachment information | 464 | // Save avatar attachment information |
461 | m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + sp.UUID + ", ItemID: " + itemID); | 465 | // m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + sp.UUID + ", ItemID: " + itemID); |
462 | 466 | ||
463 | bool changed = sp.Appearance.DetachAttachment(itemID); | 467 | bool changed = sp.Appearance.DetachAttachment(itemID); |
464 | if (changed && m_scene.AvatarFactory != null) | 468 | if (changed && m_scene.AvatarFactory != null) |
@@ -538,9 +542,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
538 | 542 | ||
539 | if (grp.HasGroupChanged || (saveAllScripted && grp.ContainsScripts())) | 543 | if (grp.HasGroupChanged || (saveAllScripted && grp.ContainsScripts())) |
540 | { | 544 | { |
541 | m_log.DebugFormat( | 545 | // m_log.DebugFormat( |
542 | "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}", | 546 | // "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}", |
543 | grp.UUID, grp.AttachmentPoint); | 547 | // grp.UUID, grp.AttachmentPoint); |
544 | 548 | ||
545 | string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp); | 549 | string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp); |
546 | 550 | ||
@@ -571,12 +575,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
571 | } | 575 | } |
572 | grp.HasGroupChanged = false; // Prevent it being saved over and over | 576 | grp.HasGroupChanged = false; // Prevent it being saved over and over |
573 | } | 577 | } |
574 | else | 578 | // else |
575 | { | 579 | // { |
576 | m_log.DebugFormat( | 580 | // m_log.DebugFormat( |
577 | "[ATTACHMENTS MODULE]: Don't need to update asset for unchanged attachment {0}, attachpoint {1}", | 581 | // "[ATTACHMENTS MODULE]: Don't need to update asset for unchanged attachment {0}, attachpoint {1}", |
578 | grp.UUID, grp.AttachmentPoint); | 582 | // grp.UUID, grp.AttachmentPoint); |
579 | } | 583 | // } |
580 | } | 584 | } |
581 | 585 | ||
582 | /// <summary> | 586 | /// <summary> |
@@ -594,9 +598,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
594 | private void AttachToAgent( | 598 | private void AttachToAgent( |
595 | IScenePresence sp, SceneObjectGroup so, uint attachmentpoint, Vector3 attachOffset, bool silent) | 599 | IScenePresence sp, SceneObjectGroup so, uint attachmentpoint, Vector3 attachOffset, bool silent) |
596 | { | 600 | { |
597 | // m_log.DebugFormat( | 601 | // m_log.DebugFormat( |
598 | // "[ATTACHMENTS MODULE]: Adding attachment {0} to avatar {1} in pt {2} pos {3} {4}", | 602 | // "[ATTACHMENTS MODULE]: Adding attachment {0} to avatar {1} in pt {2} pos {3} {4}", |
599 | // so.Name, avatar.Name, attachmentpoint, attachOffset, so.RootPart.AttachedPos); | 603 | // so.Name, sp.Name, attachmentpoint, attachOffset, so.RootPart.AttachedPos); |
600 | 604 | ||
601 | so.DetachFromBackup(); | 605 | so.DetachFromBackup(); |
602 | 606 | ||
@@ -645,6 +649,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
645 | /// <returns>The user inventory item created that holds the attachment.</returns> | 649 | /// <returns>The user inventory item created that holds the attachment.</returns> |
646 | private InventoryItemBase AddSceneObjectAsNewAttachmentInInv(IScenePresence sp, SceneObjectGroup grp) | 650 | private InventoryItemBase AddSceneObjectAsNewAttachmentInInv(IScenePresence sp, SceneObjectGroup grp) |
647 | { | 651 | { |
652 | if (m_invAccessModule == null) | ||
653 | return null; | ||
654 | |||
648 | // m_log.DebugFormat( | 655 | // m_log.DebugFormat( |
649 | // "[ATTACHMENTS MODULE]: Called AddSceneObjectAsAttachment for object {0} {1} for {2}", | 656 | // "[ATTACHMENTS MODULE]: Called AddSceneObjectAsAttachment for object {0} {1} for {2}", |
650 | // grp.Name, grp.LocalId, remoteClient.Name); | 657 | // grp.Name, grp.LocalId, remoteClient.Name); |
@@ -721,16 +728,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
721 | // sets itemID so client can show item as 'attached' in inventory | 728 | // sets itemID so client can show item as 'attached' in inventory |
722 | grp.FromItemID = item.ID; | 729 | grp.FromItemID = item.ID; |
723 | 730 | ||
724 | if (m_scene.AddInventoryItem(item)) | ||
725 | { | ||
726 | sp.ControllingClient.SendInventoryItemCreateUpdate(item, 0); | ||
727 | } | ||
728 | else | ||
729 | { | ||
730 | if (m_dialogModule != null) | ||
731 | m_dialogModule.SendAlertToUser(sp.ControllingClient, "Operation failed"); | ||
732 | } | ||
733 | |||
734 | return item; | 731 | return item; |
735 | } | 732 | } |
736 | 733 | ||
@@ -779,76 +776,75 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
779 | protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal( | 776 | protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal( |
780 | IScenePresence sp, UUID itemID, UUID assetID, uint attachmentPt, XmlDocument doc) | 777 | IScenePresence sp, UUID itemID, UUID assetID, uint attachmentPt, XmlDocument doc) |
781 | { | 778 | { |
782 | IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>(); | 779 | if (m_invAccessModule == null) |
783 | if (invAccess != null) | 780 | return null; |
781 | |||
782 | lock (sp.AttachmentsSyncLock) | ||
784 | { | 783 | { |
785 | lock (sp.AttachmentsSyncLock) | 784 | SceneObjectGroup objatt; |
786 | { | ||
787 | SceneObjectGroup objatt; | ||
788 | |||
789 | if (itemID != UUID.Zero) | ||
790 | objatt = invAccess.RezObject(sp.ControllingClient, | ||
791 | itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, | ||
792 | false, false, sp.UUID, true); | ||
793 | else | ||
794 | objatt = invAccess.RezObject(sp.ControllingClient, | ||
795 | null, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, | ||
796 | false, false, sp.UUID, true); | ||
797 | |||
798 | // m_log.DebugFormat( | ||
799 | // "[ATTACHMENTS MODULE]: Retrieved single object {0} for attachment to {1} on point {2}", | ||
800 | // objatt.Name, remoteClient.Name, AttachmentPt); | ||
801 | |||
802 | if (objatt != null) | ||
803 | { | ||
804 | // HasGroupChanged is being set from within RezObject. Ideally it would be set by the caller. | ||
805 | objatt.HasGroupChanged = false; | ||
806 | bool tainted = false; | ||
807 | if (attachmentPt != 0 && attachmentPt != objatt.AttachmentPoint) | ||
808 | tainted = true; | ||
809 | |||
810 | // This will throw if the attachment fails | ||
811 | try | ||
812 | { | ||
813 | AttachObject(sp, objatt, attachmentPt, false, false); | ||
814 | } | ||
815 | catch (Exception e) | ||
816 | { | ||
817 | m_log.ErrorFormat( | ||
818 | "[ATTACHMENTS MODULE]: Failed to attach {0} {1} for {2}, exception {3}{4}", | ||
819 | objatt.Name, objatt.UUID, sp.Name, e.Message, e.StackTrace); | ||
820 | |||
821 | // Make sure the object doesn't stick around and bail | ||
822 | sp.RemoveAttachment(objatt); | ||
823 | m_scene.DeleteSceneObject(objatt, false); | ||
824 | return null; | ||
825 | } | ||
826 | |||
827 | if (tainted) | ||
828 | objatt.HasGroupChanged = true; | ||
829 | |||
830 | if (doc != null) | ||
831 | { | ||
832 | objatt.LoadScriptState(doc); | ||
833 | objatt.ResetOwnerChangeFlag(); | ||
834 | } | ||
835 | 785 | ||
836 | // Fire after attach, so we don't get messy perms dialogs | 786 | if (itemID != UUID.Zero) |
837 | // 4 == AttachedRez | 787 | objatt = m_invAccessModule.RezObject(sp.ControllingClient, |
838 | objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 4); | 788 | itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, |
839 | objatt.ResumeScripts(); | 789 | false, false, sp.UUID, true); |
840 | 790 | else | |
841 | // Do this last so that event listeners have access to all the effects of the attachment | 791 | objatt = m_invAccessModule.RezObject(sp.ControllingClient, |
842 | m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, sp.UUID); | 792 | null, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, |
793 | false, false, sp.UUID, true); | ||
843 | 794 | ||
844 | return objatt; | 795 | // m_log.DebugFormat( |
796 | // "[ATTACHMENTS MODULE]: Retrieved single object {0} for attachment to {1} on point {2}", | ||
797 | // objatt.Name, remoteClient.Name, AttachmentPt); | ||
798 | |||
799 | if (objatt != null) | ||
800 | { | ||
801 | // HasGroupChanged is being set from within RezObject. Ideally it would be set by the caller. | ||
802 | objatt.HasGroupChanged = false; | ||
803 | bool tainted = false; | ||
804 | if (attachmentPt != 0 && attachmentPt != objatt.AttachmentPoint) | ||
805 | tainted = true; | ||
806 | |||
807 | // This will throw if the attachment fails | ||
808 | try | ||
809 | { | ||
810 | AttachObject(sp, objatt, attachmentPt, false, false); | ||
845 | } | 811 | } |
846 | else | 812 | catch (Exception e) |
847 | { | 813 | { |
848 | m_log.WarnFormat( | 814 | m_log.ErrorFormat( |
849 | "[ATTACHMENTS MODULE]: Could not retrieve item {0} for attaching to avatar {1} at point {2}", | 815 | "[ATTACHMENTS MODULE]: Failed to attach {0} {1} for {2}, exception {3}{4}", |
850 | itemID, sp.Name, attachmentPt); | 816 | objatt.Name, objatt.UUID, sp.Name, e.Message, e.StackTrace); |
817 | |||
818 | // Make sure the object doesn't stick around and bail | ||
819 | sp.RemoveAttachment(objatt); | ||
820 | m_scene.DeleteSceneObject(objatt, false); | ||
821 | return null; | ||
851 | } | 822 | } |
823 | |||
824 | if (tainted) | ||
825 | objatt.HasGroupChanged = true; | ||
826 | |||
827 | if (doc != null) | ||
828 | { | ||
829 | objatt.LoadScriptState(doc); | ||
830 | objatt.ResetOwnerChangeFlag(); | ||
831 | } | ||
832 | |||
833 | // Fire after attach, so we don't get messy perms dialogs | ||
834 | // 4 == AttachedRez | ||
835 | objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 4); | ||
836 | objatt.ResumeScripts(); | ||
837 | |||
838 | // Do this last so that event listeners have access to all the effects of the attachment | ||
839 | m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, sp.UUID); | ||
840 | |||
841 | return objatt; | ||
842 | } | ||
843 | else | ||
844 | { | ||
845 | m_log.WarnFormat( | ||
846 | "[ATTACHMENTS MODULE]: Could not retrieve item {0} for attaching to avatar {1} at point {2}", | ||
847 | itemID, sp.Name, attachmentPt); | ||
852 | } | 848 | } |
853 | } | 849 | } |
854 | 850 | ||
@@ -864,9 +860,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
864 | /// <param name="att"></param> | 860 | /// <param name="att"></param> |
865 | private void ShowAttachInUserInventory(IScenePresence sp, uint AttachmentPt, UUID itemID, SceneObjectGroup att) | 861 | private void ShowAttachInUserInventory(IScenePresence sp, uint AttachmentPt, UUID itemID, SceneObjectGroup att) |
866 | { | 862 | { |
867 | // m_log.DebugFormat( | 863 | // m_log.DebugFormat( |
868 | // "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", | 864 | // "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", |
869 | // att.Name, sp.Name, AttachmentPt, itemID); | 865 | // att.Name, sp.Name, AttachmentPt, itemID); |
870 | 866 | ||
871 | if (UUID.Zero == itemID) | 867 | if (UUID.Zero == itemID) |
872 | { | 868 | { |
@@ -929,9 +925,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
929 | 925 | ||
930 | private void Client_OnObjectAttach(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, bool silent) | 926 | private void Client_OnObjectAttach(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, bool silent) |
931 | { | 927 | { |
932 | // m_log.DebugFormat( | 928 | // m_log.DebugFormat( |
933 | // "[ATTACHMENTS MODULE]: Attaching object local id {0} to {1} point {2} from ground (silent = {3})", | 929 | // "[ATTACHMENTS MODULE]: Attaching object local id {0} to {1} point {2} from ground (silent = {3})", |
934 | // objectLocalID, remoteClient.Name, AttachmentPt, silent); | 930 | // objectLocalID, remoteClient.Name, AttachmentPt, silent); |
935 | 931 | ||
936 | if (!Enabled) | 932 | if (!Enabled) |
937 | return; | 933 | return; |
@@ -967,13 +963,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
967 | // Calls attach with a Zero position | 963 | // Calls attach with a Zero position |
968 | if (AttachObject(sp, part.ParentGroup, AttachmentPt, false, true)) | 964 | if (AttachObject(sp, part.ParentGroup, AttachmentPt, false, true)) |
969 | { | 965 | { |
970 | m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.FromItemID, remoteClient.AgentId); | 966 | // m_log.Debug( |
967 | // "[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId | ||
968 | // + ", AttachmentPoint: " + AttachmentPt); | ||
971 | 969 | ||
972 | // Save avatar attachment information | 970 | // Save avatar attachment information |
973 | m_log.Debug( | 971 | m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.FromItemID, remoteClient.AgentId); |
974 | "[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId | ||
975 | + ", AttachmentPoint: " + AttachmentPt); | ||
976 | |||
977 | } | 972 | } |
978 | } | 973 | } |
979 | catch (Exception e) | 974 | catch (Exception e) |
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index 7119ad2..acf0089 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs | |||
@@ -72,7 +72,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests | |||
72 | config.AddConfig("Modules"); | 72 | config.AddConfig("Modules"); |
73 | config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule"); | 73 | config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule"); |
74 | 74 | ||
75 | scene = SceneHelpers.SetupScene(); | 75 | scene = new SceneHelpers().SetupScene(); |
76 | m_attMod = new AttachmentsModule(); | 76 | m_attMod = new AttachmentsModule(); |
77 | SceneHelpers.SetupSceneModules(scene, config, m_attMod, new BasicInventoryAccessModule()); | 77 | SceneHelpers.SetupSceneModules(scene, config, m_attMod, new BasicInventoryAccessModule()); |
78 | } | 78 | } |
@@ -99,12 +99,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests | |||
99 | public void TestAddAttachmentFromGround() | 99 | public void TestAddAttachmentFromGround() |
100 | { | 100 | { |
101 | TestHelpers.InMethod(); | 101 | TestHelpers.InMethod(); |
102 | // log4net.Config.XmlConfigurator.Configure(); | 102 | // TestHelpers.EnableLogging(); |
103 | 103 | ||
104 | AddPresence(); | 104 | AddPresence(); |
105 | string attName = "att"; | 105 | string attName = "att"; |
106 | 106 | ||
107 | SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, attName).ParentGroup; | 107 | SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, attName, m_presence.UUID).ParentGroup; |
108 | 108 | ||
109 | m_attMod.AttachObject(m_presence, so, (uint)AttachmentPoint.Chest, false, false); | 109 | m_attMod.AttachObject(m_presence, so, (uint)AttachmentPoint.Chest, false, false); |
110 | 110 | ||
@@ -123,6 +123,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests | |||
123 | Assert.That( | 123 | Assert.That( |
124 | m_presence.Appearance.GetAttachpoint(attSo.FromItemID), | 124 | m_presence.Appearance.GetAttachpoint(attSo.FromItemID), |
125 | Is.EqualTo((int)AttachmentPoint.Chest)); | 125 | Is.EqualTo((int)AttachmentPoint.Chest)); |
126 | |||
127 | InventoryItemBase attachmentItem = scene.InventoryService.GetItem(new InventoryItemBase(attSo.FromItemID)); | ||
128 | Assert.That(attachmentItem, Is.Not.Null); | ||
129 | Assert.That(attachmentItem.Name, Is.EqualTo(attName)); | ||
130 | |||
131 | InventoryFolderBase targetFolder = scene.InventoryService.GetFolderForType(m_presence.UUID, AssetType.Object); | ||
132 | Assert.That(attachmentItem.Folder, Is.EqualTo(targetFolder.ID)); | ||
133 | |||
134 | // TestHelpers.DisableLogging(); | ||
126 | } | 135 | } |
127 | 136 | ||
128 | [Test] | 137 | [Test] |
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index 2bebd30..875c073 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs | |||
@@ -158,7 +158,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
158 | // Process the baked texture array | 158 | // Process the baked texture array |
159 | if (textureEntry != null) | 159 | if (textureEntry != null) |
160 | { | 160 | { |
161 | m_log.InfoFormat("[AVFACTORY]: Received texture update for {0} {1}", sp.Name, sp.UUID); | 161 | // m_log.DebugFormat("[AVFACTORY]: Received texture update for {0} {1}", sp.Name, sp.UUID); |
162 | 162 | ||
163 | // WriteBakedTexturesReport(sp, m_log.DebugFormat); | 163 | // WriteBakedTexturesReport(sp, m_log.DebugFormat); |
164 | 164 | ||
@@ -208,7 +208,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
208 | ScenePresence sp = m_scene.GetScenePresence(agentId); | 208 | ScenePresence sp = m_scene.GetScenePresence(agentId); |
209 | if (sp == null) | 209 | if (sp == null) |
210 | { | 210 | { |
211 | m_log.WarnFormat("[AVFACTORY]: Agent {0} no longer in the scene", agentId); | 211 | // This is expected if the user has gone away. |
212 | // m_log.DebugFormat("[AVFACTORY]: Agent {0} no longer in the scene", agentId); | ||
212 | return false; | 213 | return false; |
213 | } | 214 | } |
214 | 215 | ||
@@ -248,10 +249,10 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
248 | 249 | ||
249 | if (bakedTextureFace == null) | 250 | if (bakedTextureFace == null) |
250 | { | 251 | { |
251 | m_log.WarnFormat( | 252 | // This can happen legitimately, since some baked textures might not exist |
252 | "[AV FACTORY]: No texture ID set for {0} for {1} in {2} not found when trying to save permanently", | 253 | //m_log.WarnFormat( |
253 | bakeType, sp.Name, m_scene.RegionInfo.RegionName); | 254 | // "[AV FACTORY]: No texture ID set for {0} for {1} in {2} not found when trying to save permanently", |
254 | 255 | // bakeType, sp.Name, m_scene.RegionInfo.RegionName); | |
255 | continue; | 256 | continue; |
256 | } | 257 | } |
257 | 258 | ||
@@ -337,7 +338,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
337 | return false; | 338 | return false; |
338 | } | 339 | } |
339 | 340 | ||
340 | m_log.DebugFormat("[AVFACTORY]: Completed texture check for {0} {1}", sp.Name, sp.UUID); | 341 | // m_log.DebugFormat("[AVFACTORY]: Completed texture check for {0} {1}", sp.Name, sp.UUID); |
341 | 342 | ||
342 | // If we only found default textures, then the appearance is not cached | 343 | // If we only found default textures, then the appearance is not cached |
343 | return (defonly ? false : true); | 344 | return (defonly ? false : true); |
@@ -370,11 +371,21 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
370 | if (missingTexturesOnly) | 371 | if (missingTexturesOnly) |
371 | { | 372 | { |
372 | if (m_scene.AssetService.Get(face.TextureID.ToString()) != null) | 373 | if (m_scene.AssetService.Get(face.TextureID.ToString()) != null) |
374 | { | ||
373 | continue; | 375 | continue; |
376 | } | ||
374 | else | 377 | else |
378 | { | ||
379 | // On inter-simulator teleports, this occurs if baked textures are not being stored by the | ||
380 | // grid asset service (which means that they are not available to the new region and so have | ||
381 | // to be re-requested from the client). | ||
382 | // | ||
383 | // The only available core OpenSimulator behaviour right now | ||
384 | // is not to store these textures, temporarily or otherwise. | ||
375 | m_log.DebugFormat( | 385 | m_log.DebugFormat( |
376 | "[AVFACTORY]: Missing baked texture {0} ({1}) for {2}, requesting rebake.", | 386 | "[AVFACTORY]: Missing baked texture {0} ({1}) for {2}, requesting rebake.", |
377 | face.TextureID, idx, sp.Name); | 387 | face.TextureID, idx, sp.Name); |
388 | } | ||
378 | } | 389 | } |
379 | else | 390 | else |
380 | { | 391 | { |
@@ -417,7 +428,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
417 | // acd.AgentID, i, acd.Appearance.Texture.FaceTextures[i]); | 428 | // acd.AgentID, i, acd.Appearance.Texture.FaceTextures[i]); |
418 | 429 | ||
419 | int ftIndex = (int)AppearanceManager.BakeTypeToAgentTextureIndex(bakeType); | 430 | int ftIndex = (int)AppearanceManager.BakeTypeToAgentTextureIndex(bakeType); |
420 | bakedTextures[bakeType] = faceTextures[ftIndex]; | 431 | Primitive.TextureEntryFace texture = faceTextures[ftIndex]; // this will be null if there's no such baked texture |
432 | bakedTextures[bakeType] = texture; | ||
421 | } | 433 | } |
422 | 434 | ||
423 | return bakedTextures; | 435 | return bakedTextures; |
@@ -482,7 +494,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
482 | ScenePresence sp = m_scene.GetScenePresence(agentid); | 494 | ScenePresence sp = m_scene.GetScenePresence(agentid); |
483 | if (sp == null) | 495 | if (sp == null) |
484 | { | 496 | { |
485 | m_log.WarnFormat("[AVFACTORY]: Agent {0} no longer in the scene", agentid); | 497 | // This is expected if the user has gone away. |
498 | // m_log.DebugFormat("[AVFACTORY]: Agent {0} no longer in the scene", agentid); | ||
486 | return; | 499 | return; |
487 | } | 500 | } |
488 | 501 | ||
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/Tests/AvatarFactoryModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/Tests/AvatarFactoryModuleTests.cs index 11a0a86..848b3bf 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/Tests/AvatarFactoryModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/Tests/AvatarFactoryModuleTests.cs | |||
@@ -53,7 +53,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
53 | UUID userId = TestHelpers.ParseTail(0x1); | 53 | UUID userId = TestHelpers.ParseTail(0x1); |
54 | 54 | ||
55 | AvatarFactoryModule afm = new AvatarFactoryModule(); | 55 | AvatarFactoryModule afm = new AvatarFactoryModule(); |
56 | TestScene scene = SceneHelpers.SetupScene(); | 56 | TestScene scene = new SceneHelpers().SetupScene(); |
57 | SceneHelpers.SetupSceneModules(scene, afm); | 57 | SceneHelpers.SetupSceneModules(scene, afm); |
58 | ScenePresence sp = SceneHelpers.AddScenePresence(scene, userId); | 58 | ScenePresence sp = SceneHelpers.AddScenePresence(scene, userId); |
59 | 59 | ||
@@ -81,7 +81,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
81 | CoreAssetCache assetCache = new CoreAssetCache(); | 81 | CoreAssetCache assetCache = new CoreAssetCache(); |
82 | 82 | ||
83 | AvatarFactoryModule afm = new AvatarFactoryModule(); | 83 | AvatarFactoryModule afm = new AvatarFactoryModule(); |
84 | TestScene scene = SceneHelpers.SetupScene(assetCache); | 84 | TestScene scene = new SceneHelpers(assetCache).SetupScene(); |
85 | SceneHelpers.SetupSceneModules(scene, afm); | 85 | SceneHelpers.SetupSceneModules(scene, afm); |
86 | ScenePresence sp = SceneHelpers.AddScenePresence(scene, userId); | 86 | ScenePresence sp = SceneHelpers.AddScenePresence(scene, userId); |
87 | 87 | ||
diff --git a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs index 4d8fb90..6ffc7e6 100644 --- a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs | |||
@@ -197,6 +197,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
197 | string fromName = c.From; | 197 | string fromName = c.From; |
198 | string fromNamePrefix = ""; | 198 | string fromNamePrefix = ""; |
199 | UUID fromID = UUID.Zero; | 199 | UUID fromID = UUID.Zero; |
200 | UUID targetID = c.TargetUUID; | ||
200 | string message = c.Message; | 201 | string message = c.Message; |
201 | IScene scene = c.Scene; | 202 | IScene scene = c.Scene; |
202 | Vector3 fromPos = c.Position; | 203 | Vector3 fromPos = c.Position; |
@@ -235,17 +236,31 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
235 | message = message.Substring(0, 1000); | 236 | message = message.Substring(0, 1000); |
236 | 237 | ||
237 | // m_log.DebugFormat( | 238 | // m_log.DebugFormat( |
238 | // "[CHAT]: DCTA: fromID {0} fromName {1}, region{2}, cType {3}, sType {4}", | 239 | // "[CHAT]: DCTA: fromID {0} fromName {1}, region{2}, cType {3}, sType {4}, targetID {5}", |
239 | // fromID, fromName, scene.RegionInfo.RegionName, c.Type, sourceType); | 240 | // fromID, fromName, scene.RegionInfo.RegionName, c.Type, sourceType, targetID); |
240 | 241 | ||
241 | HashSet<UUID> receiverIDs = new HashSet<UUID>(); | 242 | HashSet<UUID> receiverIDs = new HashSet<UUID>(); |
242 | 243 | ||
243 | foreach (Scene s in m_scenes) | 244 | foreach (Scene s in m_scenes) |
244 | { | 245 | { |
245 | // This should use ForEachClient, but clients don't have a position. | 246 | if (targetID == UUID.Zero) |
246 | // If camera is moved into client, then camera position can be used | 247 | { |
247 | s.ForEachRootScenePresence( | 248 | // This should use ForEachClient, but clients don't have a position. |
248 | delegate(ScenePresence presence) | 249 | // If camera is moved into client, then camera position can be used |
250 | s.ForEachRootScenePresence( | ||
251 | delegate(ScenePresence presence) | ||
252 | { | ||
253 | if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromName, c.Type, message, sourceType, false)) | ||
254 | receiverIDs.Add(presence.UUID); | ||
255 | } | ||
256 | ); | ||
257 | } | ||
258 | else | ||
259 | { | ||
260 | // This is a send to a specific client eg from llRegionSayTo | ||
261 | // no need to check distance etc, jand send is as say | ||
262 | ScenePresence presence = s.GetScenePresence(targetID); | ||
263 | if (presence != null && !presence.IsChildAgent) | ||
249 | { | 264 | { |
250 | ILandObject Presencecheck = s.LandChannel.GetLandObject(presence.AbsolutePosition.X, presence.AbsolutePosition.Y); | 265 | ILandObject Presencecheck = s.LandChannel.GetLandObject(presence.AbsolutePosition.X, presence.AbsolutePosition.Y); |
251 | if (Presencecheck != null) | 266 | if (Presencecheck != null) |
@@ -256,15 +271,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
256 | // objects on a parcel with access restrictions | 271 | // objects on a parcel with access restrictions |
257 | if (c.Sender == null || Presencecheck.IsEitherBannedOrRestricted(c.Sender.AgentId) != true) | 272 | if (c.Sender == null || Presencecheck.IsEitherBannedOrRestricted(c.Sender.AgentId) != true) |
258 | { | 273 | { |
259 | if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromNamePrefix + fromName, c.Type, message, sourceType)) | 274 | if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromNamePrefix + fromName, c.Type, message, sourceType, false)) |
260 | receiverIDs.Add(presence.UUID); | 275 | receiverIDs.Add(presence.UUID); |
261 | } | 276 | } |
262 | } | 277 | } |
263 | |||
264 | } | 278 | } |
265 | ); | 279 | } |
266 | } | 280 | } |
267 | 281 | ||
268 | (scene as Scene).EventManager.TriggerOnChatToClients( | 282 | (scene as Scene).EventManager.TriggerOnChatToClients( |
269 | fromID, receiverIDs, message, c.Type, fromPos, fromName, sourceType, ChatAudibleLevel.Fully); | 283 | fromID, receiverIDs, message, c.Type, fromPos, fromName, sourceType, ChatAudibleLevel.Fully); |
270 | } | 284 | } |
@@ -344,7 +358,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
344 | /// precondition</returns> | 358 | /// precondition</returns> |
345 | protected virtual bool TrySendChatMessage(ScenePresence presence, Vector3 fromPos, Vector3 regionPos, | 359 | protected virtual bool TrySendChatMessage(ScenePresence presence, Vector3 fromPos, Vector3 regionPos, |
346 | UUID fromAgentID, string fromName, ChatTypeEnum type, | 360 | UUID fromAgentID, string fromName, ChatTypeEnum type, |
347 | string message, ChatSourceType src) | 361 | string message, ChatSourceType src, bool ignoreDistance) |
348 | { | 362 | { |
349 | // don't send stuff to child agents | 363 | // don't send stuff to child agents |
350 | if (presence.IsChildAgent) return false; | 364 | if (presence.IsChildAgent) return false; |
@@ -355,12 +369,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
355 | presence.Scene.RegionInfo.RegionLocY * Constants.RegionSize, 0); | 369 | presence.Scene.RegionInfo.RegionLocY * Constants.RegionSize, 0); |
356 | 370 | ||
357 | int dis = (int)Util.GetDistanceTo(toRegionPos, fromRegionPos); | 371 | int dis = (int)Util.GetDistanceTo(toRegionPos, fromRegionPos); |
358 | 372 | ||
359 | if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance || | 373 | if (!ignoreDistance) |
360 | type == ChatTypeEnum.Say && dis > m_saydistance || | ||
361 | type == ChatTypeEnum.Shout && dis > m_shoutdistance) | ||
362 | { | 374 | { |
363 | return false; | 375 | if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance || |
376 | type == ChatTypeEnum.Say && dis > m_saydistance || | ||
377 | type == ChatTypeEnum.Shout && dis > m_shoutdistance) | ||
378 | { | ||
379 | return false; | ||
380 | } | ||
364 | } | 381 | } |
365 | 382 | ||
366 | // TODO: should change so the message is sent through the avatar rather than direct to the ClientView | 383 | // TODO: should change so the message is sent through the avatar rather than direct to the ClientView |
diff --git a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs index 0babeb5..3a91465 100644 --- a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs | |||
@@ -96,6 +96,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Combat.CombatModule | |||
96 | ScenePresence killingAvatar = null; | 96 | ScenePresence killingAvatar = null; |
97 | // string killingAvatarMessage; | 97 | // string killingAvatarMessage; |
98 | 98 | ||
99 | // check to see if it is an NPC and just remove it | ||
100 | INPCModule NPCmodule = deadAvatar.Scene.RequestModuleInterface<INPCModule>(); | ||
101 | if (NPCmodule != null && NPCmodule.DeleteNPC(deadAvatar.UUID, deadAvatar.Scene)) | ||
102 | { | ||
103 | return; | ||
104 | } | ||
105 | |||
99 | if (killerObjectLocalID == 0) | 106 | if (killerObjectLocalID == 0) |
100 | deadAvatarMessage = "You committed suicide!"; | 107 | deadAvatarMessage = "You committed suicide!"; |
101 | else | 108 | else |
@@ -145,7 +152,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Combat.CombatModule | |||
145 | catch (InvalidOperationException) | 152 | catch (InvalidOperationException) |
146 | { } | 153 | { } |
147 | 154 | ||
148 | deadAvatar.Health = 100; | 155 | deadAvatar.setHealthWithUpdate(100.0f); |
149 | deadAvatar.Scene.TeleportClientHome(deadAvatar.UUID, deadAvatar.ControllingClient); | 156 | deadAvatar.Scene.TeleportClientHome(deadAvatar.UUID, deadAvatar.ControllingClient); |
150 | } | 157 | } |
151 | 158 | ||
@@ -154,14 +161,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Combat.CombatModule | |||
154 | try | 161 | try |
155 | { | 162 | { |
156 | ILandObject obj = avatar.Scene.LandChannel.GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); | 163 | ILandObject obj = avatar.Scene.LandChannel.GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); |
157 | 164 | if ((obj.LandData.Flags & (uint)ParcelFlags.AllowDamage) != 0 | |
158 | if ((obj.LandData.Flags & (uint)ParcelFlags.AllowDamage) != 0) | 165 | || avatar.Scene.RegionInfo.RegionSettings.AllowDamage) |
159 | { | 166 | { |
160 | avatar.Invulnerable = false; | 167 | avatar.Invulnerable = false; |
161 | } | 168 | } |
162 | else | 169 | else |
163 | { | 170 | { |
164 | avatar.Invulnerable = true; | 171 | avatar.Invulnerable = true; |
172 | if (avatar.Health < 100.0f) | ||
173 | { | ||
174 | avatar.setHealthWithUpdate(100.0f); | ||
175 | } | ||
165 | } | 176 | } |
166 | } | 177 | } |
167 | catch (Exception) | 178 | catch (Exception) |
diff --git a/OpenSim/Region/CoreModules/Avatar/Commands/UserCommandsModule.cs b/OpenSim/Region/CoreModules/Avatar/Commands/UserCommandsModule.cs new file mode 100644 index 0000000..4bcd2ac --- /dev/null +++ b/OpenSim/Region/CoreModules/Avatar/Commands/UserCommandsModule.cs | |||
@@ -0,0 +1,189 @@ | |||
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.Reflection; | ||
31 | using System.Text; | ||
32 | using System.Text.RegularExpressions; | ||
33 | using log4net; | ||
34 | using Mono.Addins; | ||
35 | using NDesk.Options; | ||
36 | using Nini.Config; | ||
37 | using OpenMetaverse; | ||
38 | using OpenSim.Framework; | ||
39 | using OpenSim.Framework.Console; | ||
40 | using OpenSim.Framework.Statistics; | ||
41 | using OpenSim.Region.Framework.Interfaces; | ||
42 | using OpenSim.Region.Framework.Scenes; | ||
43 | |||
44 | namespace OpenSim.Region.CoreModules.Avatars.Commands | ||
45 | { | ||
46 | /// <summary> | ||
47 | /// A module that holds commands for manipulating objects in the scene. | ||
48 | /// </summary> | ||
49 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "UserCommandsModule")] | ||
50 | public class UserCommandsModule : ISharedRegionModule | ||
51 | { | ||
52 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
53 | |||
54 | public const string TeleportUserCommandSyntax = "teleport user <first-name> <last-name> <destination>"; | ||
55 | |||
56 | public static Regex InterRegionDestinationRegex | ||
57 | = new Regex(@"^(?<regionName>.+)/(?<x>\d+)/(?<y>\d+)/(?<z>\d+)$", RegexOptions.Compiled); | ||
58 | |||
59 | public static Regex WithinRegionDestinationRegex | ||
60 | = new Regex(@"^(?<x>\d+)/(?<y>\d+)/(?<z>\d+)$", RegexOptions.Compiled); | ||
61 | |||
62 | private Dictionary<UUID, Scene> m_scenes = new Dictionary<UUID, Scene>(); | ||
63 | |||
64 | public string Name { get { return "User Commands Module"; } } | ||
65 | |||
66 | public Type ReplaceableInterface { get { return null; } } | ||
67 | |||
68 | public void Initialise(IConfigSource source) | ||
69 | { | ||
70 | // m_log.DebugFormat("[USER COMMANDS MODULE]: INITIALIZED MODULE"); | ||
71 | } | ||
72 | |||
73 | public void PostInitialise() | ||
74 | { | ||
75 | // m_log.DebugFormat("[USER COMMANDS MODULE]: POST INITIALIZED MODULE"); | ||
76 | } | ||
77 | |||
78 | public void Close() | ||
79 | { | ||
80 | // m_log.DebugFormat("[USER COMMANDS MODULE]: CLOSED MODULE"); | ||
81 | } | ||
82 | |||
83 | public void AddRegion(Scene scene) | ||
84 | { | ||
85 | // m_log.DebugFormat("[USER COMMANDS MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName); | ||
86 | |||
87 | lock (m_scenes) | ||
88 | m_scenes[scene.RegionInfo.RegionID] = scene; | ||
89 | |||
90 | scene.AddCommand( | ||
91 | "Users", | ||
92 | this, | ||
93 | "teleport user", | ||
94 | TeleportUserCommandSyntax, | ||
95 | "Teleport a user in this simulator to the given destination", | ||
96 | "<destination> is in format [<region-name>]/<x>/<y>/<z>, e.g. regionone/20/30/40 or just 20/30/40 to teleport within same region." | ||
97 | + "\nIf the region contains a space then the whole destination must be in quotes, e.g. \"region one/20/30/40\"", | ||
98 | HandleTeleportUser); | ||
99 | } | ||
100 | |||
101 | public void RemoveRegion(Scene scene) | ||
102 | { | ||
103 | // m_log.DebugFormat("[USER COMMANDS MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName); | ||
104 | |||
105 | lock (m_scenes) | ||
106 | m_scenes.Remove(scene.RegionInfo.RegionID); | ||
107 | } | ||
108 | |||
109 | public void RegionLoaded(Scene scene) | ||
110 | { | ||
111 | // m_log.DebugFormat("[USER COMMANDS MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); | ||
112 | } | ||
113 | |||
114 | private ScenePresence GetUser(string firstName, string lastName) | ||
115 | { | ||
116 | ScenePresence userFound = null; | ||
117 | |||
118 | lock (m_scenes) | ||
119 | { | ||
120 | foreach (Scene scene in m_scenes.Values) | ||
121 | { | ||
122 | ScenePresence user = scene.GetScenePresence(firstName, lastName); | ||
123 | if (user != null && !user.IsChildAgent) | ||
124 | { | ||
125 | userFound = user; | ||
126 | break; | ||
127 | } | ||
128 | } | ||
129 | } | ||
130 | |||
131 | return userFound; | ||
132 | } | ||
133 | |||
134 | private void HandleTeleportUser(string module, string[] cmd) | ||
135 | { | ||
136 | if (cmd.Length < 5) | ||
137 | { | ||
138 | MainConsole.Instance.OutputFormat("Usage: " + TeleportUserCommandSyntax); | ||
139 | return; | ||
140 | } | ||
141 | |||
142 | string firstName = cmd[2]; | ||
143 | string lastName = cmd[3]; | ||
144 | string rawDestination = cmd[4]; | ||
145 | |||
146 | ScenePresence user = GetUser(firstName, lastName); | ||
147 | |||
148 | if (user == null) | ||
149 | { | ||
150 | MainConsole.Instance.OutputFormat("No user found with name {0} {1}", firstName, lastName); | ||
151 | return; | ||
152 | } | ||
153 | |||
154 | // MainConsole.Instance.OutputFormat("rawDestination [{0}]", rawDestination); | ||
155 | |||
156 | Match m = WithinRegionDestinationRegex.Match(rawDestination); | ||
157 | |||
158 | if (!m.Success) | ||
159 | { | ||
160 | m = InterRegionDestinationRegex.Match(rawDestination); | ||
161 | |||
162 | if (!m.Success) | ||
163 | { | ||
164 | MainConsole.Instance.OutputFormat("Invalid destination {0}", rawDestination); | ||
165 | return; | ||
166 | } | ||
167 | } | ||
168 | |||
169 | string regionName | ||
170 | = m.Groups["regionName"].Success ? m.Groups["regionName"].Value : user.Scene.RegionInfo.RegionName; | ||
171 | |||
172 | MainConsole.Instance.OutputFormat( | ||
173 | "Teleporting {0} to {1},{2},{3} in {4}", | ||
174 | user.Name, | ||
175 | m.Groups["x"], m.Groups["y"], m.Groups["z"], | ||
176 | regionName); | ||
177 | |||
178 | user.Scene.RequestTeleportLocation( | ||
179 | user.ControllingClient, | ||
180 | regionName, | ||
181 | new Vector3( | ||
182 | float.Parse(m.Groups["x"].Value), | ||
183 | float.Parse(m.Groups["y"].Value), | ||
184 | float.Parse(m.Groups["z"].Value)), | ||
185 | user.Lookat, | ||
186 | (uint)TeleportFlags.ViaLocation); | ||
187 | } | ||
188 | } | ||
189 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index f64c161..24ec435 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs | |||
@@ -162,7 +162,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
162 | } | 162 | } |
163 | } | 163 | } |
164 | 164 | ||
165 | protected void InitModule(IConfigSource config) | 165 | protected virtual void InitModule(IConfigSource config) |
166 | { | 166 | { |
167 | IConfig friendsConfig = config.Configs["Friends"]; | 167 | IConfig friendsConfig = config.Configs["Friends"]; |
168 | if (friendsConfig != null) | 168 | if (friendsConfig != null) |
@@ -449,29 +449,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
449 | /// </summary> | 449 | /// </summary> |
450 | public IClientAPI LocateClientObject(UUID agentID) | 450 | public IClientAPI LocateClientObject(UUID agentID) |
451 | { | 451 | { |
452 | Scene scene = GetClientScene(agentID); | ||
453 | if (scene != null) | ||
454 | { | ||
455 | ScenePresence presence = scene.GetScenePresence(agentID); | ||
456 | if (presence != null) | ||
457 | return presence.ControllingClient; | ||
458 | } | ||
459 | |||
460 | return null; | ||
461 | } | ||
462 | |||
463 | /// <summary> | ||
464 | /// Find the scene for an agent | ||
465 | /// </summary> | ||
466 | private Scene GetClientScene(UUID agentId) | ||
467 | { | ||
468 | lock (m_Scenes) | 452 | lock (m_Scenes) |
469 | { | 453 | { |
470 | foreach (Scene scene in m_Scenes) | 454 | foreach (Scene scene in m_Scenes) |
471 | { | 455 | { |
472 | ScenePresence presence = scene.GetScenePresence(agentId); | 456 | ScenePresence presence = scene.GetScenePresence(agentID); |
473 | if (presence != null && !presence.IsChildAgent) | 457 | if (presence != null && !presence.IsChildAgent) |
474 | return scene; | 458 | return presence.ControllingClient; |
475 | } | 459 | } |
476 | } | 460 | } |
477 | 461 | ||
@@ -498,7 +482,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
498 | Util.FireAndForget( | 482 | Util.FireAndForget( |
499 | delegate | 483 | delegate |
500 | { | 484 | { |
501 | m_log.DebugFormat("[FRIENDS MODULE]: Notifying {0} friends", friendList.Count); | 485 | m_log.DebugFormat( |
486 | "[FRIENDS MODULE]: Notifying {0} friends of {1} of online status {2}", | ||
487 | friendList.Count, agentID, online); | ||
488 | |||
502 | // Notify about this user status | 489 | // Notify about this user status |
503 | StatusNotify(friendList, agentID, online); | 490 | StatusNotify(friendList, agentID, online); |
504 | } | 491 | } |
@@ -515,7 +502,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
515 | { | 502 | { |
516 | // Try local | 503 | // Try local |
517 | if (LocalStatusNotification(userID, friendID, online)) | 504 | if (LocalStatusNotification(userID, friendID, online)) |
518 | return; | 505 | continue; |
519 | 506 | ||
520 | // The friend is not here [as root]. Let's forward. | 507 | // The friend is not here [as root]. Let's forward. |
521 | PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); | 508 | PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); |
@@ -523,11 +510,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
523 | { | 510 | { |
524 | PresenceInfo friendSession = null; | 511 | PresenceInfo friendSession = null; |
525 | foreach (PresenceInfo pinfo in friendSessions) | 512 | foreach (PresenceInfo pinfo in friendSessions) |
513 | { | ||
526 | if (pinfo.RegionID != UUID.Zero) // let's guard against sessions-gone-bad | 514 | if (pinfo.RegionID != UUID.Zero) // let's guard against sessions-gone-bad |
527 | { | 515 | { |
528 | friendSession = pinfo; | 516 | friendSession = pinfo; |
529 | break; | 517 | break; |
530 | } | 518 | } |
519 | } | ||
531 | 520 | ||
532 | if (friendSession != null) | 521 | if (friendSession != null) |
533 | { | 522 | { |
@@ -546,7 +535,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
546 | } | 535 | } |
547 | } | 536 | } |
548 | 537 | ||
549 | private void OnInstantMessage(IClientAPI client, GridInstantMessage im) | 538 | protected virtual void OnInstantMessage(IClientAPI client, GridInstantMessage im) |
550 | { | 539 | { |
551 | if ((InstantMessageDialog)im.dialog == InstantMessageDialog.FriendshipOffered) | 540 | if ((InstantMessageDialog)im.dialog == InstantMessageDialog.FriendshipOffered) |
552 | { | 541 | { |
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs index 9a6d277..06f27e2 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs | |||
@@ -50,6 +50,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
50 | { | 50 | { |
51 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 51 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
52 | 52 | ||
53 | private int m_levelHGFriends = 0; | ||
54 | |||
53 | IUserManagement m_uMan; | 55 | IUserManagement m_uMan; |
54 | public IUserManagement UserManagementModule | 56 | public IUserManagement UserManagementModule |
55 | { | 57 | { |
@@ -87,6 +89,21 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
87 | m_StatusNotifier = new HGStatusNotifier(this); | 89 | m_StatusNotifier = new HGStatusNotifier(this); |
88 | } | 90 | } |
89 | 91 | ||
92 | protected override void InitModule(IConfigSource config) | ||
93 | { | ||
94 | base.InitModule(config); | ||
95 | |||
96 | // Additionally to the base method | ||
97 | IConfig friendsConfig = config.Configs["HGFriendsModule"]; | ||
98 | if (friendsConfig != null) | ||
99 | { | ||
100 | m_levelHGFriends = friendsConfig.GetInt("LevelHGFriends", 0); | ||
101 | |||
102 | // TODO: read in all config variables pertaining to | ||
103 | // HG friendship permissions | ||
104 | } | ||
105 | } | ||
106 | |||
90 | #endregion | 107 | #endregion |
91 | 108 | ||
92 | #region IFriendsSimConnector | 109 | #region IFriendsSimConnector |
@@ -105,6 +122,35 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
105 | 122 | ||
106 | #endregion | 123 | #endregion |
107 | 124 | ||
125 | protected override void OnInstantMessage(IClientAPI client, GridInstantMessage im) | ||
126 | { | ||
127 | if ((InstantMessageDialog)im.dialog == InstantMessageDialog.FriendshipOffered) | ||
128 | { | ||
129 | // we got a friendship offer | ||
130 | UUID principalID = new UUID(im.fromAgentID); | ||
131 | UUID friendID = new UUID(im.toAgentID); | ||
132 | |||
133 | // Check if friendID is foreigner and if principalID has the permission | ||
134 | // to request friendships with foreigners. If not, return immediately. | ||
135 | if (!UserManagementModule.IsLocalGridUser(friendID)) | ||
136 | { | ||
137 | ScenePresence avatar = null; | ||
138 | ((Scene)client.Scene).TryGetScenePresence(principalID, out avatar); | ||
139 | |||
140 | if (avatar == null) | ||
141 | return; | ||
142 | |||
143 | if (avatar.UserLevel < m_levelHGFriends) | ||
144 | { | ||
145 | client.SendAgentAlertMessage("Unable to send friendship invitation to foreigner. Insufficient permissions.", false); | ||
146 | return; | ||
147 | } | ||
148 | } | ||
149 | } | ||
150 | |||
151 | base.OnInstantMessage(client, im); | ||
152 | } | ||
153 | |||
108 | protected override void OnApproveFriendRequest(IClientAPI client, UUID friendID, List<UUID> callingCardFolders) | 154 | protected override void OnApproveFriendRequest(IClientAPI client, UUID friendID, List<UUID> callingCardFolders) |
109 | { | 155 | { |
110 | // Update the local cache. Yes, we need to do it right here | 156 | // Update the local cache. Yes, we need to do it right here |
@@ -369,12 +415,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
369 | 415 | ||
370 | protected override void StoreBackwards(UUID friendID, UUID agentID) | 416 | protected override void StoreBackwards(UUID friendID, UUID agentID) |
371 | { | 417 | { |
372 | Boolean agentIsLocal = true; | 418 | bool agentIsLocal = true; |
373 | Boolean friendIsLocal = true; | 419 | // bool friendIsLocal = true; |
420 | |||
374 | if (UserManagementModule != null) | 421 | if (UserManagementModule != null) |
375 | { | 422 | { |
376 | agentIsLocal = UserManagementModule.IsLocalGridUser(agentID); | 423 | agentIsLocal = UserManagementModule.IsLocalGridUser(agentID); |
377 | friendIsLocal = UserManagementModule.IsLocalGridUser(friendID); | 424 | // friendIsLocal = UserManagementModule.IsLocalGridUser(friendID); |
378 | } | 425 | } |
379 | 426 | ||
380 | // Is the requester a local user? | 427 | // Is the requester a local user? |
@@ -461,7 +508,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
461 | { | 508 | { |
462 | friendUUI = finfo.Friend; | 509 | friendUUI = finfo.Friend; |
463 | theFriendUUID = friendUUI; | 510 | theFriendUUID = friendUUI; |
464 | UUID utmp = UUID.Zero; String url = String.Empty; String first = String.Empty, last = String.Empty, tmp = String.Empty; | 511 | UUID utmp = UUID.Zero; |
512 | string url = String.Empty; | ||
513 | string first = String.Empty; | ||
514 | string last = String.Empty; | ||
515 | |||
465 | // If it's confirming the friendship, we already have the full UUI with the secret | 516 | // If it's confirming the friendship, we already have the full UUI with the secret |
466 | if (Util.ParseUniversalUserIdentifier(theFriendUUID, out utmp, out url, out first, out last, out secret)) | 517 | if (Util.ParseUniversalUserIdentifier(theFriendUUID, out utmp, out url, out first, out last, out secret)) |
467 | { | 518 | { |
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/Tests/FriendModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Friends/Tests/FriendModuleTests.cs index 45b4264..7a197f7 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/Tests/FriendModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/Tests/FriendModuleTests.cs | |||
@@ -78,7 +78,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends.Tests | |||
78 | config.AddConfig("FriendsService"); | 78 | config.AddConfig("FriendsService"); |
79 | config.Configs["FriendsService"].Set("StorageProvider", "OpenSim.Data.Null.dll"); | 79 | config.Configs["FriendsService"].Set("StorageProvider", "OpenSim.Data.Null.dll"); |
80 | 80 | ||
81 | m_scene = SceneHelpers.SetupScene(); | 81 | m_scene = new SceneHelpers().SetupScene(); |
82 | m_fm = new FriendsModule(); | 82 | m_fm = new FriendsModule(); |
83 | SceneHelpers.SetupSceneModules(m_scene, config, m_fm); | 83 | SceneHelpers.SetupSceneModules(m_scene, config, m_fm); |
84 | } | 84 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs index 8560c73..6587ead 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs | |||
@@ -39,6 +39,9 @@ using OpenSim.Framework.Serialization.External; | |||
39 | using OpenSim.Region.CoreModules.World.Archiver; | 39 | using OpenSim.Region.CoreModules.World.Archiver; |
40 | using OpenSim.Region.Framework.Scenes; | 40 | using OpenSim.Region.Framework.Scenes; |
41 | using OpenSim.Services.Interfaces; | 41 | using OpenSim.Services.Interfaces; |
42 | using Ionic.Zlib; | ||
43 | using GZipStream = Ionic.Zlib.GZipStream; | ||
44 | using CompressionMode = Ionic.Zlib.CompressionMode; | ||
42 | 45 | ||
43 | namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | 46 | namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver |
44 | { | 47 | { |
@@ -91,7 +94,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
91 | /// Constructor | 94 | /// Constructor |
92 | /// </summary> | 95 | /// </summary> |
93 | public InventoryArchiveWriteRequest( | 96 | public InventoryArchiveWriteRequest( |
94 | Guid id, InventoryArchiverModule module, Scene scene, | 97 | Guid id, InventoryArchiverModule module, Scene scene, |
95 | UserAccount userInfo, string invPath, string savePath) | 98 | UserAccount userInfo, string invPath, string savePath) |
96 | : this( | 99 | : this( |
97 | id, | 100 | id, |
@@ -99,7 +102,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
99 | scene, | 102 | scene, |
100 | userInfo, | 103 | userInfo, |
101 | invPath, | 104 | invPath, |
102 | new GZipStream(new FileStream(savePath, FileMode.Create), CompressionMode.Compress)) | 105 | new GZipStream(new FileStream(savePath, FileMode.Create), CompressionMode.Compress, CompressionLevel.BestCompression)) |
103 | { | 106 | { |
104 | } | 107 | } |
105 | 108 | ||
@@ -107,7 +110,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
107 | /// Constructor | 110 | /// Constructor |
108 | /// </summary> | 111 | /// </summary> |
109 | public InventoryArchiveWriteRequest( | 112 | public InventoryArchiveWriteRequest( |
110 | Guid id, InventoryArchiverModule module, Scene scene, | 113 | Guid id, InventoryArchiverModule module, Scene scene, |
111 | UserAccount userInfo, string invPath, Stream saveStream) | 114 | UserAccount userInfo, string invPath, Stream saveStream) |
112 | { | 115 | { |
113 | m_id = id; | 116 | m_id = id; |
@@ -125,7 +128,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
125 | { | 128 | { |
126 | Exception reportedException = null; | 129 | Exception reportedException = null; |
127 | bool succeeded = true; | 130 | bool succeeded = true; |
128 | 131 | ||
129 | try | 132 | try |
130 | { | 133 | { |
131 | m_archiveWriter.Close(); | 134 | m_archiveWriter.Close(); |
@@ -146,6 +149,21 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
146 | 149 | ||
147 | protected void SaveInvItem(InventoryItemBase inventoryItem, string path, Dictionary<string, object> options, IUserAccountService userAccountService) | 150 | protected void SaveInvItem(InventoryItemBase inventoryItem, string path, Dictionary<string, object> options, IUserAccountService userAccountService) |
148 | { | 151 | { |
152 | if (options.ContainsKey("exclude")) | ||
153 | { | ||
154 | if (((List<String>)options["exclude"]).Contains(inventoryItem.Name) || | ||
155 | ((List<String>)options["exclude"]).Contains(inventoryItem.ID.ToString())) | ||
156 | { | ||
157 | if (options.ContainsKey("verbose")) | ||
158 | { | ||
159 | m_log.InfoFormat( | ||
160 | "[INVENTORY ARCHIVER]: Skipping inventory item {0} {1} at {2}", | ||
161 | inventoryItem.Name, inventoryItem.ID, path); | ||
162 | } | ||
163 | return; | ||
164 | } | ||
165 | } | ||
166 | |||
149 | if (options.ContainsKey("verbose")) | 167 | if (options.ContainsKey("verbose")) |
150 | m_log.InfoFormat( | 168 | m_log.InfoFormat( |
151 | "[INVENTORY ARCHIVER]: Saving item {0} {1} with asset {2}", | 169 | "[INVENTORY ARCHIVER]: Saving item {0} {1} with asset {2}", |
@@ -175,9 +193,27 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
175 | /// <param name="options"></param> | 193 | /// <param name="options"></param> |
176 | /// <param name="userAccountService"></param> | 194 | /// <param name="userAccountService"></param> |
177 | protected void SaveInvFolder( | 195 | protected void SaveInvFolder( |
178 | InventoryFolderBase inventoryFolder, string path, bool saveThisFolderItself, | 196 | InventoryFolderBase inventoryFolder, string path, bool saveThisFolderItself, |
179 | Dictionary<string, object> options, IUserAccountService userAccountService) | 197 | Dictionary<string, object> options, IUserAccountService userAccountService) |
180 | { | 198 | { |
199 | if (options.ContainsKey("excludefolders")) | ||
200 | { | ||
201 | if (((List<String>)options["excludefolders"]).Contains(inventoryFolder.Name) || | ||
202 | ((List<String>)options["excludefolders"]).Contains(inventoryFolder.ID.ToString())) | ||
203 | { | ||
204 | if (options.ContainsKey("verbose")) | ||
205 | { | ||
206 | m_log.InfoFormat( | ||
207 | "[INVENTORY ARCHIVER]: Skipping folder {0} at {1}", | ||
208 | inventoryFolder.Name, path); | ||
209 | } | ||
210 | return; | ||
211 | } | ||
212 | } | ||
213 | |||
214 | if (options.ContainsKey("verbose")) | ||
215 | m_log.InfoFormat("[INVENTORY ARCHIVER]: Saving folder {0}", inventoryFolder.Name); | ||
216 | |||
181 | if (saveThisFolderItself) | 217 | if (saveThisFolderItself) |
182 | { | 218 | { |
183 | path += CreateArchiveFolderName(inventoryFolder); | 219 | path += CreateArchiveFolderName(inventoryFolder); |
@@ -186,7 +222,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
186 | m_archiveWriter.WriteDir(path); | 222 | m_archiveWriter.WriteDir(path); |
187 | } | 223 | } |
188 | 224 | ||
189 | InventoryCollection contents | 225 | InventoryCollection contents |
190 | = m_scene.InventoryService.GetFolderContent(inventoryFolder.Owner, inventoryFolder.ID); | 226 | = m_scene.InventoryService.GetFolderContent(inventoryFolder.Owner, inventoryFolder.ID); |
191 | 227 | ||
192 | foreach (InventoryFolderBase childFolder in contents.Folders) | 228 | foreach (InventoryFolderBase childFolder in contents.Folders) |
@@ -213,16 +249,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
213 | InventoryFolderBase inventoryFolder = null; | 249 | InventoryFolderBase inventoryFolder = null; |
214 | InventoryItemBase inventoryItem = null; | 250 | InventoryItemBase inventoryItem = null; |
215 | InventoryFolderBase rootFolder = m_scene.InventoryService.GetRootFolder(m_userInfo.PrincipalID); | 251 | InventoryFolderBase rootFolder = m_scene.InventoryService.GetRootFolder(m_userInfo.PrincipalID); |
216 | 252 | ||
217 | bool saveFolderContentsOnly = false; | 253 | bool saveFolderContentsOnly = false; |
218 | 254 | ||
219 | // Eliminate double slashes and any leading / on the path. | 255 | // Eliminate double slashes and any leading / on the path. |
220 | string[] components | 256 | string[] components |
221 | = m_invPath.Split( | 257 | = m_invPath.Split( |
222 | new string[] { InventoryFolderImpl.PATH_DELIMITER }, StringSplitOptions.RemoveEmptyEntries); | 258 | new string[] { InventoryFolderImpl.PATH_DELIMITER }, StringSplitOptions.RemoveEmptyEntries); |
223 | 259 | ||
224 | int maxComponentIndex = components.Length - 1; | 260 | int maxComponentIndex = components.Length - 1; |
225 | 261 | ||
226 | // If the path terminates with a STAR then later on we want to archive all nodes in the folder but not the | 262 | // If the path terminates with a STAR then later on we want to archive all nodes in the folder but not the |
227 | // folder itself. This may get more sophisicated later on | 263 | // folder itself. This may get more sophisicated later on |
228 | if (maxComponentIndex >= 0 && components[maxComponentIndex] == STAR_WILDCARD) | 264 | if (maxComponentIndex >= 0 && components[maxComponentIndex] == STAR_WILDCARD) |
@@ -230,13 +266,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
230 | saveFolderContentsOnly = true; | 266 | saveFolderContentsOnly = true; |
231 | maxComponentIndex--; | 267 | maxComponentIndex--; |
232 | } | 268 | } |
233 | 269 | ||
234 | m_invPath = String.Empty; | 270 | m_invPath = String.Empty; |
235 | for (int i = 0; i <= maxComponentIndex; i++) | 271 | for (int i = 0; i <= maxComponentIndex; i++) |
236 | { | 272 | { |
237 | m_invPath += components[i] + InventoryFolderImpl.PATH_DELIMITER; | 273 | m_invPath += components[i] + InventoryFolderImpl.PATH_DELIMITER; |
238 | } | 274 | } |
239 | 275 | ||
240 | // Annoyingly Split actually returns the original string if the input string consists only of delimiters | 276 | // Annoyingly Split actually returns the original string if the input string consists only of delimiters |
241 | // Therefore if we still start with a / after the split, then we need the root folder | 277 | // Therefore if we still start with a / after the split, then we need the root folder |
242 | if (m_invPath.Length == 0) | 278 | if (m_invPath.Length == 0) |
@@ -246,25 +282,25 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
246 | else | 282 | else |
247 | { | 283 | { |
248 | m_invPath = m_invPath.Remove(m_invPath.LastIndexOf(InventoryFolderImpl.PATH_DELIMITER)); | 284 | m_invPath = m_invPath.Remove(m_invPath.LastIndexOf(InventoryFolderImpl.PATH_DELIMITER)); |
249 | List<InventoryFolderBase> candidateFolders | 285 | List<InventoryFolderBase> candidateFolders |
250 | = InventoryArchiveUtils.FindFolderByPath(m_scene.InventoryService, rootFolder, m_invPath); | 286 | = InventoryArchiveUtils.FindFolderByPath(m_scene.InventoryService, rootFolder, m_invPath); |
251 | if (candidateFolders.Count > 0) | 287 | if (candidateFolders.Count > 0) |
252 | inventoryFolder = candidateFolders[0]; | 288 | inventoryFolder = candidateFolders[0]; |
253 | } | 289 | } |
254 | 290 | ||
255 | // The path may point to an item instead | 291 | // The path may point to an item instead |
256 | if (inventoryFolder == null) | 292 | if (inventoryFolder == null) |
257 | inventoryItem = InventoryArchiveUtils.FindItemByPath(m_scene.InventoryService, rootFolder, m_invPath); | 293 | inventoryItem = InventoryArchiveUtils.FindItemByPath(m_scene.InventoryService, rootFolder, m_invPath); |
258 | 294 | ||
259 | if (null == inventoryFolder && null == inventoryItem) | 295 | if (null == inventoryFolder && null == inventoryItem) |
260 | { | 296 | { |
261 | // We couldn't find the path indicated | 297 | // We couldn't find the path indicated |
262 | string errorMessage = string.Format("Aborted save. Could not find inventory path {0}", m_invPath); | 298 | string errorMessage = string.Format("Aborted save. Could not find inventory path {0}", m_invPath); |
263 | Exception e = new InventoryArchiverException(errorMessage); | 299 | Exception e = new InventoryArchiverException(errorMessage); |
264 | m_module.TriggerInventoryArchiveSaved(m_id, false, m_userInfo, m_invPath, m_saveStream, e); | 300 | m_module.TriggerInventoryArchiveSaved(m_id, false, m_userInfo, m_invPath, m_saveStream, e); |
265 | throw e; | 301 | throw e; |
266 | } | 302 | } |
267 | 303 | ||
268 | m_archiveWriter = new TarArchiveWriter(m_saveStream); | 304 | m_archiveWriter = new TarArchiveWriter(m_saveStream); |
269 | 305 | ||
270 | m_log.InfoFormat("[INVENTORY ARCHIVER]: Adding control file to archive."); | 306 | m_log.InfoFormat("[INVENTORY ARCHIVER]: Adding control file to archive."); |
@@ -278,10 +314,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
278 | { | 314 | { |
279 | m_log.DebugFormat( | 315 | m_log.DebugFormat( |
280 | "[INVENTORY ARCHIVER]: Found folder {0} {1} at {2}", | 316 | "[INVENTORY ARCHIVER]: Found folder {0} {1} at {2}", |
281 | inventoryFolder.Name, | 317 | inventoryFolder.Name, |
282 | inventoryFolder.ID, | 318 | inventoryFolder.ID, |
283 | m_invPath == String.Empty ? InventoryFolderImpl.PATH_DELIMITER : m_invPath); | 319 | m_invPath == String.Empty ? InventoryFolderImpl.PATH_DELIMITER : m_invPath); |
284 | 320 | ||
285 | //recurse through all dirs getting dirs and files | 321 | //recurse through all dirs getting dirs and files |
286 | SaveInvFolder(inventoryFolder, ArchiveConstants.INVENTORY_PATH, !saveFolderContentsOnly, options, userAccountService); | 322 | SaveInvFolder(inventoryFolder, ArchiveConstants.INVENTORY_PATH, !saveFolderContentsOnly, options, userAccountService); |
287 | } | 323 | } |
@@ -290,10 +326,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
290 | m_log.DebugFormat( | 326 | m_log.DebugFormat( |
291 | "[INVENTORY ARCHIVER]: Found item {0} {1} at {2}", | 327 | "[INVENTORY ARCHIVER]: Found item {0} {1} at {2}", |
292 | inventoryItem.Name, inventoryItem.ID, m_invPath); | 328 | inventoryItem.Name, inventoryItem.ID, m_invPath); |
293 | 329 | ||
294 | SaveInvItem(inventoryItem, ArchiveConstants.INVENTORY_PATH, options, userAccountService); | 330 | SaveInvItem(inventoryItem, ArchiveConstants.INVENTORY_PATH, options, userAccountService); |
295 | } | 331 | } |
296 | 332 | ||
297 | // Don't put all this profile information into the archive right now. | 333 | // Don't put all this profile information into the archive right now. |
298 | //SaveUsers(); | 334 | //SaveUsers(); |
299 | 335 | ||
@@ -352,7 +388,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
352 | /// | 388 | /// |
353 | /// These names are prepended with an inventory folder's UUID so that more than one folder can have the | 389 | /// These names are prepended with an inventory folder's UUID so that more than one folder can have the |
354 | /// same name | 390 | /// same name |
355 | /// | 391 | /// |
356 | /// <param name="folder"></param> | 392 | /// <param name="folder"></param> |
357 | /// <returns></returns> | 393 | /// <returns></returns> |
358 | public static string CreateArchiveFolderName(InventoryFolderBase folder) | 394 | public static string CreateArchiveFolderName(InventoryFolderBase folder) |
@@ -366,7 +402,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
366 | /// | 402 | /// |
367 | /// These names are prepended with an inventory item's UUID so that more than one item can have the | 403 | /// These names are prepended with an inventory item's UUID so that more than one item can have the |
368 | /// same name | 404 | /// same name |
369 | /// | 405 | /// |
370 | /// <param name="item"></param> | 406 | /// <param name="item"></param> |
371 | /// <returns></returns> | 407 | /// <returns></returns> |
372 | public static string CreateArchiveItemName(InventoryItemBase item) | 408 | public static string CreateArchiveItemName(InventoryItemBase item) |
@@ -412,7 +448,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
412 | public string CreateControlFile(Dictionary<string, object> options) | 448 | public string CreateControlFile(Dictionary<string, object> options) |
413 | { | 449 | { |
414 | int majorVersion, minorVersion; | 450 | int majorVersion, minorVersion; |
415 | 451 | ||
416 | if (options.ContainsKey("home")) | 452 | if (options.ContainsKey("home")) |
417 | { | 453 | { |
418 | majorVersion = 1; | 454 | majorVersion = 1; |
@@ -422,10 +458,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
422 | { | 458 | { |
423 | majorVersion = 0; | 459 | majorVersion = 0; |
424 | minorVersion = 3; | 460 | minorVersion = 3; |
425 | } | 461 | } |
426 | 462 | ||
427 | m_log.InfoFormat("[INVENTORY ARCHIVER]: Creating version {0}.{1} IAR", majorVersion, minorVersion); | 463 | m_log.InfoFormat("[INVENTORY ARCHIVER]: Creating version {0}.{1} IAR", majorVersion, minorVersion); |
428 | 464 | ||
429 | StringWriter sw = new StringWriter(); | 465 | StringWriter sw = new StringWriter(); |
430 | XmlTextWriter xtw = new XmlTextWriter(sw); | 466 | XmlTextWriter xtw = new XmlTextWriter(sw); |
431 | xtw.Formatting = Formatting.Indented; | 467 | xtw.Formatting = Formatting.Indented; |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs index ac22c3f..cf87010 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs | |||
@@ -47,18 +47,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
47 | public class InventoryArchiverModule : IRegionModule, IInventoryArchiverModule | 47 | public class InventoryArchiverModule : IRegionModule, IInventoryArchiverModule |
48 | { | 48 | { |
49 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 49 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
50 | 50 | ||
51 | public string Name { get { return "Inventory Archiver Module"; } } | 51 | public string Name { get { return "Inventory Archiver Module"; } } |
52 | 52 | ||
53 | public bool IsSharedModule { get { return true; } } | 53 | public bool IsSharedModule { get { return true; } } |
54 | 54 | ||
55 | /// <value> | 55 | /// <value> |
56 | /// Enable or disable checking whether the iar user is actually logged in | 56 | /// Enable or disable checking whether the iar user is actually logged in |
57 | /// </value> | 57 | /// </value> |
58 | // public bool DisablePresenceChecks { get; set; } | 58 | // public bool DisablePresenceChecks { get; set; } |
59 | 59 | ||
60 | public event InventoryArchiveSaved OnInventoryArchiveSaved; | 60 | public event InventoryArchiveSaved OnInventoryArchiveSaved; |
61 | 61 | ||
62 | /// <summary> | 62 | /// <summary> |
63 | /// The file to load and save inventory if no filename has been specified | 63 | /// The file to load and save inventory if no filename has been specified |
64 | /// </summary> | 64 | /// </summary> |
@@ -68,7 +68,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
68 | /// Pending save completions initiated from the console | 68 | /// Pending save completions initiated from the console |
69 | /// </value> | 69 | /// </value> |
70 | protected List<Guid> m_pendingConsoleSaves = new List<Guid>(); | 70 | protected List<Guid> m_pendingConsoleSaves = new List<Guid>(); |
71 | 71 | ||
72 | /// <value> | 72 | /// <value> |
73 | /// All scenes that this module knows about | 73 | /// All scenes that this module knows about |
74 | /// </value> | 74 | /// </value> |
@@ -106,7 +106,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
106 | { | 106 | { |
107 | scene.RegisterModuleInterface<IInventoryArchiverModule>(this); | 107 | scene.RegisterModuleInterface<IInventoryArchiverModule>(this); |
108 | OnInventoryArchiveSaved += SaveInvConsoleCommandCompleted; | 108 | OnInventoryArchiveSaved += SaveInvConsoleCommandCompleted; |
109 | 109 | ||
110 | scene.AddCommand( | 110 | scene.AddCommand( |
111 | "Archiving", this, "load iar", | 111 | "Archiving", this, "load iar", |
112 | "load iar [-m|--merge] <first> <last> <inventory path> <password> [<IAR path>]", | 112 | "load iar [-m|--merge] <first> <last> <inventory path> <password> [<IAR path>]", |
@@ -119,11 +119,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
119 | + "<IAR path> is the filesystem path or URI from which to load the IAR." | 119 | + "<IAR path> is the filesystem path or URI from which to load the IAR." |
120 | + string.Format(" If this is not given then the filename {0} in the current directory is used", DEFAULT_INV_BACKUP_FILENAME), | 120 | + string.Format(" If this is not given then the filename {0} in the current directory is used", DEFAULT_INV_BACKUP_FILENAME), |
121 | HandleLoadInvConsoleCommand); | 121 | HandleLoadInvConsoleCommand); |
122 | 122 | ||
123 | scene.AddCommand( | 123 | scene.AddCommand( |
124 | "Archiving", this, "save iar", | 124 | "Archiving", this, "save iar", |
125 | "save iar [-h|--home=<url>] [--noassets] <first> <last> <inventory path> <password> [<IAR path>] [-c|--creators] [-v|--verbose]", | 125 | "save iar [-h|--home=<url>] [--noassets] <first> <last> <inventory path> <password> [<IAR path>] [-c|--creators] [-e|--exclude=<name/uuid>] [-f|--excludefolder=<foldername/uuid>] [-v|--verbose]", |
126 | "Save user inventory archive (IAR).", | 126 | "Save user inventory archive (IAR).", |
127 | "<first> is the user's first name.\n" | 127 | "<first> is the user's first name.\n" |
128 | + "<last> is the user's last name.\n" | 128 | + "<last> is the user's last name.\n" |
129 | + "<inventory path> is the path inside the user's inventory for the folder/item to be saved.\n" | 129 | + "<inventory path> is the path inside the user's inventory for the folder/item to be saved.\n" |
@@ -131,32 +131,34 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
131 | + string.Format(" If this is not given then the filename {0} in the current directory is used.\n", DEFAULT_INV_BACKUP_FILENAME) | 131 | + string.Format(" If this is not given then the filename {0} in the current directory is used.\n", DEFAULT_INV_BACKUP_FILENAME) |
132 | + "-h|--home=<url> adds the url of the profile service to the saved user information.\n" | 132 | + "-h|--home=<url> adds the url of the profile service to the saved user information.\n" |
133 | + "-c|--creators preserves information about foreign creators.\n" | 133 | + "-c|--creators preserves information about foreign creators.\n" |
134 | + "-e|--exclude=<name/uuid> don't save the inventory item in archive" + Environment.NewLine | ||
135 | + "-f|--excludefolder=<folder/uuid> don't save contents of the folder in archive" + Environment.NewLine | ||
134 | + "-v|--verbose extra debug messages.\n" | 136 | + "-v|--verbose extra debug messages.\n" |
135 | + "--noassets stops assets being saved to the IAR.", | 137 | + "--noassets stops assets being saved to the IAR.", |
136 | HandleSaveInvConsoleCommand); | 138 | HandleSaveInvConsoleCommand); |
137 | 139 | ||
138 | m_aScene = scene; | 140 | m_aScene = scene; |
139 | } | 141 | } |
140 | 142 | ||
141 | m_scenes[scene.RegionInfo.RegionID] = scene; | 143 | m_scenes[scene.RegionInfo.RegionID] = scene; |
142 | } | 144 | } |
143 | 145 | ||
144 | public void PostInitialise() {} | 146 | public void PostInitialise() {} |
145 | 147 | ||
146 | public void Close() {} | 148 | public void Close() {} |
147 | 149 | ||
148 | /// <summary> | 150 | /// <summary> |
149 | /// Trigger the inventory archive saved event. | 151 | /// Trigger the inventory archive saved event. |
150 | /// </summary> | 152 | /// </summary> |
151 | protected internal void TriggerInventoryArchiveSaved( | 153 | protected internal void TriggerInventoryArchiveSaved( |
152 | Guid id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, | 154 | Guid id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, |
153 | Exception reportedException) | 155 | Exception reportedException) |
154 | { | 156 | { |
155 | InventoryArchiveSaved handlerInventoryArchiveSaved = OnInventoryArchiveSaved; | 157 | InventoryArchiveSaved handlerInventoryArchiveSaved = OnInventoryArchiveSaved; |
156 | if (handlerInventoryArchiveSaved != null) | 158 | if (handlerInventoryArchiveSaved != null) |
157 | handlerInventoryArchiveSaved(id, succeeded, userInfo, invPath, saveStream, reportedException); | 159 | handlerInventoryArchiveSaved(id, succeeded, userInfo, invPath, saveStream, reportedException); |
158 | } | 160 | } |
159 | 161 | ||
160 | public bool ArchiveInventory( | 162 | public bool ArchiveInventory( |
161 | Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream) | 163 | Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream) |
162 | { | 164 | { |
@@ -164,7 +166,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
164 | } | 166 | } |
165 | 167 | ||
166 | public bool ArchiveInventory( | 168 | public bool ArchiveInventory( |
167 | Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream, | 169 | Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream, |
168 | Dictionary<string, object> options) | 170 | Dictionary<string, object> options) |
169 | { | 171 | { |
170 | if (m_scenes.Count > 0) | 172 | if (m_scenes.Count > 0) |
@@ -188,7 +190,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
188 | 190 | ||
189 | return false; | 191 | return false; |
190 | } | 192 | } |
191 | 193 | ||
192 | return true; | 194 | return true; |
193 | // } | 195 | // } |
194 | // else | 196 | // else |
@@ -202,15 +204,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
202 | 204 | ||
203 | return false; | 205 | return false; |
204 | } | 206 | } |
205 | 207 | ||
206 | public bool ArchiveInventory( | 208 | public bool ArchiveInventory( |
207 | Guid id, string firstName, string lastName, string invPath, string pass, string savePath, | 209 | Guid id, string firstName, string lastName, string invPath, string pass, string savePath, |
208 | Dictionary<string, object> options) | 210 | Dictionary<string, object> options) |
209 | { | 211 | { |
210 | if (m_scenes.Count > 0) | 212 | if (m_scenes.Count > 0) |
211 | { | 213 | { |
212 | UserAccount userInfo = GetUserInfo(firstName, lastName, pass); | 214 | UserAccount userInfo = GetUserInfo(firstName, lastName, pass); |
213 | 215 | ||
214 | if (userInfo != null) | 216 | if (userInfo != null) |
215 | { | 217 | { |
216 | // if (CheckPresence(userInfo.PrincipalID)) | 218 | // if (CheckPresence(userInfo.PrincipalID)) |
@@ -228,7 +230,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
228 | 230 | ||
229 | return false; | 231 | return false; |
230 | } | 232 | } |
231 | 233 | ||
232 | return true; | 234 | return true; |
233 | // } | 235 | // } |
234 | // else | 236 | // else |
@@ -239,7 +241,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
239 | // } | 241 | // } |
240 | } | 242 | } |
241 | } | 243 | } |
242 | 244 | ||
243 | return false; | 245 | return false; |
244 | } | 246 | } |
245 | 247 | ||
@@ -247,9 +249,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
247 | { | 249 | { |
248 | return DearchiveInventory(firstName, lastName, invPath, pass, loadStream, new Dictionary<string, object>()); | 250 | return DearchiveInventory(firstName, lastName, invPath, pass, loadStream, new Dictionary<string, object>()); |
249 | } | 251 | } |
250 | 252 | ||
251 | public bool DearchiveInventory( | 253 | public bool DearchiveInventory( |
252 | string firstName, string lastName, string invPath, string pass, Stream loadStream, | 254 | string firstName, string lastName, string invPath, string pass, Stream loadStream, |
253 | Dictionary<string, object> options) | 255 | Dictionary<string, object> options) |
254 | { | 256 | { |
255 | if (m_scenes.Count > 0) | 257 | if (m_scenes.Count > 0) |
@@ -295,22 +297,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
295 | 297 | ||
296 | return false; | 298 | return false; |
297 | } | 299 | } |
298 | 300 | ||
299 | public bool DearchiveInventory( | 301 | public bool DearchiveInventory( |
300 | string firstName, string lastName, string invPath, string pass, string loadPath, | 302 | string firstName, string lastName, string invPath, string pass, string loadPath, |
301 | Dictionary<string, object> options) | 303 | Dictionary<string, object> options) |
302 | { | 304 | { |
303 | if (m_scenes.Count > 0) | 305 | if (m_scenes.Count > 0) |
304 | { | 306 | { |
305 | UserAccount userInfo = GetUserInfo(firstName, lastName, pass); | 307 | UserAccount userInfo = GetUserInfo(firstName, lastName, pass); |
306 | 308 | ||
307 | if (userInfo != null) | 309 | if (userInfo != null) |
308 | { | 310 | { |
309 | // if (CheckPresence(userInfo.PrincipalID)) | 311 | // if (CheckPresence(userInfo.PrincipalID)) |
310 | // { | 312 | // { |
311 | InventoryArchiveReadRequest request; | 313 | InventoryArchiveReadRequest request; |
312 | bool merge = (options.ContainsKey("merge") ? (bool)options["merge"] : false); | 314 | bool merge = (options.ContainsKey("merge") ? (bool)options["merge"] : false); |
313 | 315 | ||
314 | try | 316 | try |
315 | { | 317 | { |
316 | request = new InventoryArchiveReadRequest(m_aScene, userInfo, invPath, loadPath, merge); | 318 | request = new InventoryArchiveReadRequest(m_aScene, userInfo, invPath, loadPath, merge); |
@@ -324,7 +326,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
324 | 326 | ||
325 | return false; | 327 | return false; |
326 | } | 328 | } |
327 | 329 | ||
328 | UpdateClientWithLoadedNodes(userInfo, request.Execute()); | 330 | UpdateClientWithLoadedNodes(userInfo, request.Execute()); |
329 | 331 | ||
330 | return true; | 332 | return true; |
@@ -340,7 +342,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
340 | 342 | ||
341 | return false; | 343 | return false; |
342 | } | 344 | } |
343 | 345 | ||
344 | /// <summary> | 346 | /// <summary> |
345 | /// Load inventory from an inventory file archive | 347 | /// Load inventory from an inventory file archive |
346 | /// </summary> | 348 | /// </summary> |
@@ -351,26 +353,26 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
351 | { | 353 | { |
352 | Dictionary<string, object> options = new Dictionary<string, object>(); | 354 | Dictionary<string, object> options = new Dictionary<string, object>(); |
353 | OptionSet optionSet = new OptionSet().Add("m|merge", delegate (string v) { options["merge"] = v != null; }); | 355 | OptionSet optionSet = new OptionSet().Add("m|merge", delegate (string v) { options["merge"] = v != null; }); |
354 | 356 | ||
355 | List<string> mainParams = optionSet.Parse(cmdparams); | 357 | List<string> mainParams = optionSet.Parse(cmdparams); |
356 | 358 | ||
357 | if (mainParams.Count < 6) | 359 | if (mainParams.Count < 6) |
358 | { | 360 | { |
359 | m_log.Error( | 361 | m_log.Error( |
360 | "[INVENTORY ARCHIVER]: usage is load iar [-m|--merge] <first name> <last name> <inventory path> <user password> [<load file path>]"); | 362 | "[INVENTORY ARCHIVER]: usage is load iar [-m|--merge] <first name> <last name> <inventory path> <user password> [<load file path>]"); |
361 | return; | 363 | return; |
362 | } | 364 | } |
363 | 365 | ||
364 | string firstName = mainParams[2]; | 366 | string firstName = mainParams[2]; |
365 | string lastName = mainParams[3]; | 367 | string lastName = mainParams[3]; |
366 | string invPath = mainParams[4]; | 368 | string invPath = mainParams[4]; |
367 | string pass = mainParams[5]; | 369 | string pass = mainParams[5]; |
368 | string loadPath = (mainParams.Count > 6 ? mainParams[6] : DEFAULT_INV_BACKUP_FILENAME); | 370 | string loadPath = (mainParams.Count > 6 ? mainParams[6] : DEFAULT_INV_BACKUP_FILENAME); |
369 | 371 | ||
370 | m_log.InfoFormat( | 372 | m_log.InfoFormat( |
371 | "[INVENTORY ARCHIVER]: Loading archive {0} to inventory path {1} for {2} {3}", | 373 | "[INVENTORY ARCHIVER]: Loading archive {0} to inventory path {1} for {2} {3}", |
372 | loadPath, invPath, firstName, lastName); | 374 | loadPath, invPath, firstName, lastName); |
373 | 375 | ||
374 | if (DearchiveInventory(firstName, lastName, invPath, pass, loadPath, options)) | 376 | if (DearchiveInventory(firstName, lastName, invPath, pass, loadPath, options)) |
375 | m_log.InfoFormat( | 377 | m_log.InfoFormat( |
376 | "[INVENTORY ARCHIVER]: Loaded archive {0} for {1} {2}", | 378 | "[INVENTORY ARCHIVER]: Loaded archive {0} for {1} {2}", |
@@ -381,7 +383,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
381 | m_log.ErrorFormat("[INVENTORY ARCHIVER]: {0}", e.Message); | 383 | m_log.ErrorFormat("[INVENTORY ARCHIVER]: {0}", e.Message); |
382 | } | 384 | } |
383 | } | 385 | } |
384 | 386 | ||
385 | /// <summary> | 387 | /// <summary> |
386 | /// Save inventory to a file archive | 388 | /// Save inventory to a file archive |
387 | /// </summary> | 389 | /// </summary> |
@@ -398,6 +400,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
398 | ops.Add("v|verbose", delegate(string v) { options["verbose"] = v; }); | 400 | ops.Add("v|verbose", delegate(string v) { options["verbose"] = v; }); |
399 | ops.Add("c|creators", delegate(string v) { options["creators"] = v; }); | 401 | ops.Add("c|creators", delegate(string v) { options["creators"] = v; }); |
400 | ops.Add("noassets", delegate(string v) { options["noassets"] = v != null; }); | 402 | ops.Add("noassets", delegate(string v) { options["noassets"] = v != null; }); |
403 | ops.Add("e|exclude=", delegate(string v) | ||
404 | { | ||
405 | if (!options.ContainsKey("exclude")) | ||
406 | options["exclude"] = new List<String>(); | ||
407 | ((List<String>)options["exclude"]).Add(v); | ||
408 | }); | ||
409 | ops.Add("f|excludefolder=", delegate(string v) | ||
410 | { | ||
411 | if (!options.ContainsKey("excludefolders")) | ||
412 | options["excludefolders"] = new List<String>(); | ||
413 | ((List<String>)options["excludefolders"]).Add(v); | ||
414 | }); | ||
401 | 415 | ||
402 | List<string> mainParams = ops.Parse(cmdparams); | 416 | List<string> mainParams = ops.Parse(cmdparams); |
403 | 417 | ||
@@ -406,10 +420,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
406 | if (mainParams.Count < 6) | 420 | if (mainParams.Count < 6) |
407 | { | 421 | { |
408 | m_log.Error( | 422 | m_log.Error( |
409 | "[INVENTORY ARCHIVER]: usage is save iar [-h|--home=<url>] [--noassets] <first name> <last name> <inventory path> <user password> [<save file path>] [-c|--creators] [-v|--verbose]"); | 423 | "[INVENTORY ARCHIVER]: save iar [-h|--home=<url>] [--noassets] <first> <last> <inventory path> <password> [<IAR path>] [-c|--creators] [-e|--exclude=<name/uuid>] [-f|--excludefolder=<foldername/uuid>] [-v|--verbose]"); |
410 | return; | 424 | return; |
411 | } | 425 | } |
412 | 426 | ||
413 | if (options.ContainsKey("home")) | 427 | if (options.ContainsKey("home")) |
414 | m_log.WarnFormat("[INVENTORY ARCHIVER]: Please be aware that inventory archives with creator information are not compatible with OpenSim 0.7.0.2 and earlier. Do not use the -home option if you want to produce a compatible IAR"); | 428 | m_log.WarnFormat("[INVENTORY ARCHIVER]: Please be aware that inventory archives with creator information are not compatible with OpenSim 0.7.0.2 and earlier. Do not use the -home option if you want to produce a compatible IAR"); |
415 | 429 | ||
@@ -418,7 +432,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
418 | string invPath = mainParams[4]; | 432 | string invPath = mainParams[4]; |
419 | string pass = mainParams[5]; | 433 | string pass = mainParams[5]; |
420 | string savePath = (mainParams.Count > 6 ? mainParams[6] : DEFAULT_INV_BACKUP_FILENAME); | 434 | string savePath = (mainParams.Count > 6 ? mainParams[6] : DEFAULT_INV_BACKUP_FILENAME); |
421 | 435 | ||
422 | m_log.InfoFormat( | 436 | m_log.InfoFormat( |
423 | "[INVENTORY ARCHIVER]: Saving archive {0} using inventory path {1} for {2} {3}", | 437 | "[INVENTORY ARCHIVER]: Saving archive {0} using inventory path {1} for {2} {3}", |
424 | savePath, invPath, firstName, lastName); | 438 | savePath, invPath, firstName, lastName); |
@@ -433,9 +447,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
433 | m_log.ErrorFormat("[INVENTORY ARCHIVER]: {0}", e.Message); | 447 | m_log.ErrorFormat("[INVENTORY ARCHIVER]: {0}", e.Message); |
434 | } | 448 | } |
435 | } | 449 | } |
436 | 450 | ||
437 | private void SaveInvConsoleCommandCompleted( | 451 | private void SaveInvConsoleCommandCompleted( |
438 | Guid id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, | 452 | Guid id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, |
439 | Exception reportedException) | 453 | Exception reportedException) |
440 | { | 454 | { |
441 | lock (m_pendingConsoleSaves) | 455 | lock (m_pendingConsoleSaves) |
@@ -445,7 +459,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
445 | else | 459 | else |
446 | return; | 460 | return; |
447 | } | 461 | } |
448 | 462 | ||
449 | if (succeeded) | 463 | if (succeeded) |
450 | { | 464 | { |
451 | m_log.InfoFormat("[INVENTORY ARCHIVER]: Saved archive for {0} {1}", userInfo.FirstName, userInfo.LastName); | 465 | m_log.InfoFormat("[INVENTORY ARCHIVER]: Saved archive for {0} {1}", userInfo.FirstName, userInfo.LastName); |
@@ -453,11 +467,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
453 | else | 467 | else |
454 | { | 468 | { |
455 | m_log.ErrorFormat( | 469 | m_log.ErrorFormat( |
456 | "[INVENTORY ARCHIVER]: Archive save for {0} {1} failed - {2}", | 470 | "[INVENTORY ARCHIVER]: Archive save for {0} {1} failed - {2}", |
457 | userInfo.FirstName, userInfo.LastName, reportedException.Message); | 471 | userInfo.FirstName, userInfo.LastName, reportedException.Message); |
458 | } | 472 | } |
459 | } | 473 | } |
460 | 474 | ||
461 | /// <summary> | 475 | /// <summary> |
462 | /// Get user information for the given name. | 476 | /// Get user information for the given name. |
463 | /// </summary> | 477 | /// </summary> |
@@ -467,13 +481,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
467 | /// <returns></returns> | 481 | /// <returns></returns> |
468 | protected UserAccount GetUserInfo(string firstName, string lastName, string pass) | 482 | protected UserAccount GetUserInfo(string firstName, string lastName, string pass) |
469 | { | 483 | { |
470 | UserAccount account | 484 | UserAccount account |
471 | = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, firstName, lastName); | 485 | = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, firstName, lastName); |
472 | 486 | ||
473 | if (null == account) | 487 | if (null == account) |
474 | { | 488 | { |
475 | m_log.ErrorFormat( | 489 | m_log.ErrorFormat( |
476 | "[INVENTORY ARCHIVER]: Failed to find user info for {0} {1}", | 490 | "[INVENTORY ARCHIVER]: Failed to find user info for {0} {1}", |
477 | firstName, lastName); | 491 | firstName, lastName); |
478 | return null; | 492 | return null; |
479 | } | 493 | } |
@@ -488,7 +502,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
488 | else | 502 | else |
489 | { | 503 | { |
490 | m_log.ErrorFormat( | 504 | m_log.ErrorFormat( |
491 | "[INVENTORY ARCHIVER]: Password for user {0} {1} incorrect. Please try again.", | 505 | "[INVENTORY ARCHIVER]: Password for user {0} {1} incorrect. Please try again.", |
492 | firstName, lastName); | 506 | firstName, lastName); |
493 | return null; | 507 | return null; |
494 | } | 508 | } |
@@ -499,7 +513,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
499 | return null; | 513 | return null; |
500 | } | 514 | } |
501 | } | 515 | } |
502 | 516 | ||
503 | /// <summary> | 517 | /// <summary> |
504 | /// Notify the client of loaded nodes if they are logged in | 518 | /// Notify the client of loaded nodes if they are logged in |
505 | /// </summary> | 519 | /// </summary> |
@@ -508,22 +522,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
508 | { | 522 | { |
509 | if (loadedNodes.Count == 0) | 523 | if (loadedNodes.Count == 0) |
510 | return; | 524 | return; |
511 | 525 | ||
512 | foreach (Scene scene in m_scenes.Values) | 526 | foreach (Scene scene in m_scenes.Values) |
513 | { | 527 | { |
514 | ScenePresence user = scene.GetScenePresence(userInfo.PrincipalID); | 528 | ScenePresence user = scene.GetScenePresence(userInfo.PrincipalID); |
515 | 529 | ||
516 | if (user != null && !user.IsChildAgent) | 530 | if (user != null && !user.IsChildAgent) |
517 | { | 531 | { |
518 | foreach (InventoryNodeBase node in loadedNodes) | 532 | foreach (InventoryNodeBase node in loadedNodes) |
519 | { | 533 | { |
520 | // m_log.DebugFormat( | 534 | // m_log.DebugFormat( |
521 | // "[INVENTORY ARCHIVER]: Notifying {0} of loaded inventory node {1}", | 535 | // "[INVENTORY ARCHIVER]: Notifying {0} of loaded inventory node {1}", |
522 | // user.Name, node.Name); | 536 | // user.Name, node.Name); |
523 | 537 | ||
524 | user.ControllingClient.SendBulkUpdateInventory(node); | 538 | user.ControllingClient.SendBulkUpdateInventory(node); |
525 | } | 539 | } |
526 | 540 | ||
527 | break; | 541 | break; |
528 | } | 542 | } |
529 | } | 543 | } |
@@ -538,7 +552,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
538 | // { | 552 | // { |
539 | // if (DisablePresenceChecks) | 553 | // if (DisablePresenceChecks) |
540 | // return true; | 554 | // return true; |
541 | // | 555 | // |
542 | // foreach (Scene scene in m_scenes.Values) | 556 | // foreach (Scene scene in m_scenes.Values) |
543 | // { | 557 | // { |
544 | // ScenePresence p; | 558 | // ScenePresence p; |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs index 19ef571..90ae69d 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs | |||
@@ -100,7 +100,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
100 | // log4net.Config.XmlConfigurator.Configure(); | 100 | // log4net.Config.XmlConfigurator.Configure(); |
101 | 101 | ||
102 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(); | 102 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(); |
103 | Scene scene = SceneHelpers.SetupScene(); | 103 | Scene scene = new SceneHelpers().SetupScene(); |
104 | SceneHelpers.SetupSceneModules(scene, archiverModule); | 104 | SceneHelpers.SetupSceneModules(scene, archiverModule); |
105 | 105 | ||
106 | UserAccountHelpers.CreateUserWithInventory(scene, m_uaLL1, "hampshire"); | 106 | UserAccountHelpers.CreateUserWithInventory(scene, m_uaLL1, "hampshire"); |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs index e409c8e..b112b6d 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs | |||
@@ -61,7 +61,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
61 | SerialiserModule serialiserModule = new SerialiserModule(); | 61 | SerialiserModule serialiserModule = new SerialiserModule(); |
62 | m_archiverModule = new InventoryArchiverModule(); | 62 | m_archiverModule = new InventoryArchiverModule(); |
63 | 63 | ||
64 | m_scene = SceneHelpers.SetupScene(); | 64 | m_scene = new SceneHelpers().SetupScene(); |
65 | SceneHelpers.SetupSceneModules(m_scene, serialiserModule, m_archiverModule); | 65 | SceneHelpers.SetupSceneModules(m_scene, serialiserModule, m_archiverModule); |
66 | } | 66 | } |
67 | 67 | ||
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/PathTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/PathTests.cs index 417c20c..6eb3605 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/PathTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/PathTests.cs | |||
@@ -62,7 +62,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
62 | 62 | ||
63 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(); | 63 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(); |
64 | 64 | ||
65 | Scene scene = SceneHelpers.SetupScene(); | 65 | Scene scene = new SceneHelpers().SetupScene(); |
66 | SceneHelpers.SetupSceneModules(scene, archiverModule); | 66 | SceneHelpers.SetupSceneModules(scene, archiverModule); |
67 | 67 | ||
68 | // Create user | 68 | // Create user |
@@ -179,7 +179,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
179 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(); | 179 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(); |
180 | 180 | ||
181 | // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene | 181 | // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene |
182 | Scene scene = SceneHelpers.SetupScene(); | 182 | Scene scene = new SceneHelpers().SetupScene(); |
183 | 183 | ||
184 | SceneHelpers.SetupSceneModules(scene, serialiserModule, archiverModule); | 184 | SceneHelpers.SetupSceneModules(scene, serialiserModule, archiverModule); |
185 | 185 | ||
@@ -222,7 +222,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
222 | 222 | ||
223 | SerialiserModule serialiserModule = new SerialiserModule(); | 223 | SerialiserModule serialiserModule = new SerialiserModule(); |
224 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(); | 224 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(); |
225 | Scene scene = SceneHelpers.SetupScene(); | 225 | Scene scene = new SceneHelpers().SetupScene(); |
226 | SceneHelpers.SetupSceneModules(scene, serialiserModule, archiverModule); | 226 | SceneHelpers.SetupSceneModules(scene, serialiserModule, archiverModule); |
227 | 227 | ||
228 | UserAccountHelpers.CreateUserWithInventory(scene, m_uaMT, "password"); | 228 | UserAccountHelpers.CreateUserWithInventory(scene, m_uaMT, "password"); |
@@ -247,7 +247,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
247 | 247 | ||
248 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(); | 248 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(); |
249 | 249 | ||
250 | Scene scene = SceneHelpers.SetupScene(); | 250 | Scene scene = new SceneHelpers().SetupScene(); |
251 | SceneHelpers.SetupSceneModules(scene, archiverModule); | 251 | SceneHelpers.SetupSceneModules(scene, archiverModule); |
252 | 252 | ||
253 | // Create user | 253 | // Create user |
@@ -326,7 +326,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
326 | TestHelpers.InMethod(); | 326 | TestHelpers.InMethod(); |
327 | // log4net.Config.XmlConfigurator.Configure(); | 327 | // log4net.Config.XmlConfigurator.Configure(); |
328 | 328 | ||
329 | Scene scene = SceneHelpers.SetupScene(); | 329 | Scene scene = new SceneHelpers().SetupScene(); |
330 | UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene); | 330 | UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene); |
331 | 331 | ||
332 | Dictionary <string, InventoryFolderBase> foldersCreated = new Dictionary<string, InventoryFolderBase>(); | 332 | Dictionary <string, InventoryFolderBase> foldersCreated = new Dictionary<string, InventoryFolderBase>(); |
@@ -393,7 +393,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
393 | TestHelpers.InMethod(); | 393 | TestHelpers.InMethod(); |
394 | //log4net.Config.XmlConfigurator.Configure(); | 394 | //log4net.Config.XmlConfigurator.Configure(); |
395 | 395 | ||
396 | Scene scene = SceneHelpers.SetupScene(); | 396 | Scene scene = new SceneHelpers().SetupScene(); |
397 | UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene); | 397 | UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene); |
398 | 398 | ||
399 | string folder1ExistingName = "a"; | 399 | string folder1ExistingName = "a"; |
@@ -444,7 +444,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
444 | TestHelpers.InMethod(); | 444 | TestHelpers.InMethod(); |
445 | // log4net.Config.XmlConfigurator.Configure(); | 445 | // log4net.Config.XmlConfigurator.Configure(); |
446 | 446 | ||
447 | Scene scene = SceneHelpers.SetupScene(); | 447 | Scene scene = new SceneHelpers().SetupScene(); |
448 | UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene); | 448 | UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene); |
449 | 449 | ||
450 | string folder1ExistingName = "a"; | 450 | string folder1ExistingName = "a"; |
diff --git a/OpenSim/Region/CoreModules/Avatar/Lure/HGLureModule.cs b/OpenSim/Region/CoreModules/Avatar/Lure/HGLureModule.cs index bc5c1ff..92cf9d1 100644 --- a/OpenSim/Region/CoreModules/Avatar/Lure/HGLureModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Lure/HGLureModule.cs | |||
@@ -240,13 +240,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Lure | |||
240 | { | 240 | { |
241 | ScenePresence sp = scene.GetScenePresence(client.AgentId); | 241 | ScenePresence sp = scene.GetScenePresence(client.AgentId); |
242 | IEntityTransferModule transferMod = scene.RequestModuleInterface<IEntityTransferModule>(); | 242 | IEntityTransferModule transferMod = scene.RequestModuleInterface<IEntityTransferModule>(); |
243 | IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>(); | 243 | |
244 | if (transferMod != null && sp != null && eq != null) | 244 | if (transferMod != null && sp != null) |
245 | transferMod.DoTeleport(sp, gatekeeper, finalDestination, im.Position + new Vector3(0.5f, 0.5f, 0f), Vector3.UnitX, teleportflags, eq); | 245 | transferMod.DoTeleport( |
246 | sp, gatekeeper, finalDestination, im.Position + new Vector3(0.5f, 0.5f, 0f), | ||
247 | Vector3.UnitX, teleportflags); | ||
246 | } | 248 | } |
247 | } | 249 | } |
248 | } | 250 | } |
249 | } | 251 | } |
250 | } | 252 | } |
251 | } | 253 | } |
252 | } | 254 | } \ No newline at end of file |
diff --git a/OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs b/OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs index dcfdf8f..a889984 100644 --- a/OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs | |||
@@ -151,6 +151,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Lure | |||
151 | Scene scene = (Scene)(client.Scene); | 151 | Scene scene = (Scene)(client.Scene); |
152 | ScenePresence presence = scene.GetScenePresence(client.AgentId); | 152 | ScenePresence presence = scene.GetScenePresence(client.AgentId); |
153 | 153 | ||
154 | // Round up Z co-ordinate rather than round-down by casting. This stops tall avatars from being given | ||
155 | // a teleport Z co-ordinate by short avatars that drops them through or embeds them in thin floors on | ||
156 | // arrival. | ||
157 | // | ||
158 | // Ideally we would give the exact float position adjusting for the relative height of the two avatars | ||
159 | // but it looks like a float component isn't possible with a parcel ID. | ||
154 | UUID dest = Util.BuildFakeParcelID( | 160 | UUID dest = Util.BuildFakeParcelID( |
155 | scene.RegionInfo.RegionHandle, | 161 | scene.RegionInfo.RegionHandle, |
156 | (uint)presence.AbsolutePosition.X, | 162 | (uint)presence.AbsolutePosition.X, |
diff --git a/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs index 8101ca2..87ca327 100644 --- a/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs | |||
@@ -57,14 +57,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile | |||
57 | 57 | ||
58 | public void Initialise(IConfigSource config) | 58 | public void Initialise(IConfigSource config) |
59 | { | 59 | { |
60 | // This can be reduced later as the loader will determine | ||
61 | // whether we are needed | ||
62 | if (config.Configs["Profile"] != null) | ||
63 | { | ||
64 | if (config.Configs["Profile"].GetString("Module", string.Empty) != "BasicProfileModule") | ||
65 | return; | ||
66 | } | ||
67 | |||
68 | m_log.DebugFormat("[PROFILE MODULE]: Basic Profile Module enabled"); | 60 | m_log.DebugFormat("[PROFILE MODULE]: Basic Profile Module enabled"); |
69 | m_Enabled = true; | 61 | m_Enabled = true; |
70 | } | 62 | } |
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 2b790f4..7b13213 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -30,7 +30,6 @@ using System.Collections.Generic; | |||
30 | using System.Net; | 30 | using System.Net; |
31 | using System.Reflection; | 31 | using System.Reflection; |
32 | using System.Threading; | 32 | using System.Threading; |
33 | |||
34 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
35 | using OpenSim.Framework.Capabilities; | 34 | using OpenSim.Framework.Capabilities; |
36 | using OpenSim.Framework.Client; | 35 | using OpenSim.Framework.Client; |
@@ -47,29 +46,39 @@ using Nini.Config; | |||
47 | 46 | ||
48 | namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | 47 | namespace OpenSim.Region.CoreModules.Framework.EntityTransfer |
49 | { | 48 | { |
50 | public class EntityTransferModule : ISharedRegionModule, IEntityTransferModule | 49 | public class EntityTransferModule : INonSharedRegionModule, IEntityTransferModule |
51 | { | 50 | { |
52 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 51 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
53 | 52 | ||
53 | public const int DefaultMaxTransferDistance = 4095; | ||
54 | public const bool WaitForAgentArrivedAtDestinationDefault = true; | ||
55 | |||
54 | /// <summary> | 56 | /// <summary> |
55 | /// The maximum distance, in standard region units (256m) that an agent is allowed to transfer. | 57 | /// The maximum distance, in standard region units (256m) that an agent is allowed to transfer. |
56 | /// </summary> | 58 | /// </summary> |
57 | private int m_MaxTransferDistance = 4095; | 59 | public int MaxTransferDistance { get; set; } |
58 | public int MaxTransferDistance | ||
59 | { | ||
60 | get { return m_MaxTransferDistance; } | ||
61 | set { m_MaxTransferDistance = value; } | ||
62 | } | ||
63 | 60 | ||
64 | private int m_levelHGTeleport = 0; | 61 | /// <summary> |
62 | /// If true then on a teleport, the source region waits for a callback from the destination region. If | ||
63 | /// a callback fails to arrive within a set time then the user is pulled back into the source region. | ||
64 | /// </summary> | ||
65 | public bool WaitForAgentArrivedAtDestination { get; set; } | ||
65 | 66 | ||
66 | protected bool m_Enabled = false; | 67 | protected bool m_Enabled = false; |
67 | protected Scene m_aScene; | 68 | |
68 | protected List<Scene> m_Scenes = new List<Scene>(); | 69 | public Scene Scene { get; private set; } |
69 | protected List<UUID> m_agentsInTransit; | 70 | |
71 | /// <summary> | ||
72 | /// Handles recording and manipulation of state for entities that are in transfer within or between regions | ||
73 | /// (cross or teleport). | ||
74 | /// </summary> | ||
75 | private EntityTransferStateMachine m_entityTransferStateMachine; | ||
76 | |||
70 | private ExpiringCache<UUID, ExpiringCache<ulong, DateTime>> m_bannedRegions = | 77 | private ExpiringCache<UUID, ExpiringCache<ulong, DateTime>> m_bannedRegions = |
71 | new ExpiringCache<UUID, ExpiringCache<ulong, DateTime>>(); | 78 | new ExpiringCache<UUID, ExpiringCache<ulong, DateTime>>(); |
72 | 79 | ||
80 | private IEventQueue m_eqModule; | ||
81 | |||
73 | #region ISharedRegionModule | 82 | #region ISharedRegionModule |
74 | 83 | ||
75 | public Type ReplaceableInterface | 84 | public Type ReplaceableInterface |
@@ -105,11 +114,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
105 | IConfig transferConfig = source.Configs["EntityTransfer"]; | 114 | IConfig transferConfig = source.Configs["EntityTransfer"]; |
106 | if (transferConfig != null) | 115 | if (transferConfig != null) |
107 | { | 116 | { |
108 | MaxTransferDistance = transferConfig.GetInt("max_distance", 4095); | 117 | WaitForAgentArrivedAtDestination |
109 | m_levelHGTeleport = transferConfig.GetInt("LevelHGTeleport", 0); | 118 | = transferConfig.GetBoolean("wait_for_callback", WaitForAgentArrivedAtDestinationDefault); |
119 | |||
120 | MaxTransferDistance = transferConfig.GetInt("max_distance", DefaultMaxTransferDistance); | ||
121 | } | ||
122 | else | ||
123 | { | ||
124 | MaxTransferDistance = DefaultMaxTransferDistance; | ||
110 | } | 125 | } |
111 | 126 | ||
112 | m_agentsInTransit = new List<UUID>(); | 127 | m_entityTransferStateMachine = new EntityTransferStateMachine(this); |
128 | |||
113 | m_Enabled = true; | 129 | m_Enabled = true; |
114 | } | 130 | } |
115 | 131 | ||
@@ -122,10 +138,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
122 | if (!m_Enabled) | 138 | if (!m_Enabled) |
123 | return; | 139 | return; |
124 | 140 | ||
125 | if (m_aScene == null) | 141 | Scene = scene; |
126 | m_aScene = scene; | ||
127 | 142 | ||
128 | m_Scenes.Add(scene); | ||
129 | scene.RegisterModuleInterface<IEntityTransferModule>(this); | 143 | scene.RegisterModuleInterface<IEntityTransferModule>(this); |
130 | scene.EventManager.OnNewClient += OnNewClient; | 144 | scene.EventManager.OnNewClient += OnNewClient; |
131 | } | 145 | } |
@@ -136,26 +150,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
136 | client.OnTeleportLandmarkRequest += RequestTeleportLandmark; | 150 | client.OnTeleportLandmarkRequest += RequestTeleportLandmark; |
137 | } | 151 | } |
138 | 152 | ||
139 | public virtual void Close() | 153 | public virtual void Close() {} |
140 | { | ||
141 | if (!m_Enabled) | ||
142 | return; | ||
143 | } | ||
144 | |||
145 | public virtual void RemoveRegion(Scene scene) | ||
146 | { | ||
147 | if (!m_Enabled) | ||
148 | return; | ||
149 | if (scene == m_aScene) | ||
150 | m_aScene = null; | ||
151 | 154 | ||
152 | m_Scenes.Remove(scene); | 155 | public virtual void RemoveRegion(Scene scene) {} |
153 | } | ||
154 | 156 | ||
155 | public virtual void RegionLoaded(Scene scene) | 157 | public virtual void RegionLoaded(Scene scene) |
156 | { | 158 | { |
157 | if (!m_Enabled) | 159 | if (!m_Enabled) |
158 | return; | 160 | return; |
161 | |||
162 | m_eqModule = Scene.RequestModuleInterface<IEventQueue>(); | ||
159 | } | 163 | } |
160 | 164 | ||
161 | #endregion | 165 | #endregion |
@@ -164,170 +168,257 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
164 | 168 | ||
165 | public void Teleport(ScenePresence sp, ulong regionHandle, Vector3 position, Vector3 lookAt, uint teleportFlags) | 169 | public void Teleport(ScenePresence sp, ulong regionHandle, Vector3 position, Vector3 lookAt, uint teleportFlags) |
166 | { | 170 | { |
171 | if (sp.Scene.Permissions.IsGridGod(sp.UUID)) | ||
172 | { | ||
173 | // This user will be a God in the destination scene, too | ||
174 | teleportFlags |= (uint)TeleportFlags.Godlike; | ||
175 | } | ||
176 | |||
167 | if (!sp.Scene.Permissions.CanTeleport(sp.UUID)) | 177 | if (!sp.Scene.Permissions.CanTeleport(sp.UUID)) |
168 | return; | 178 | return; |
169 | 179 | ||
170 | IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>(); | ||
171 | |||
172 | // Reset animations; the viewer does that in teleports. | 180 | // Reset animations; the viewer does that in teleports. |
173 | sp.Animator.ResetAnimations(); | 181 | sp.Animator.ResetAnimations(); |
174 | 182 | ||
183 | string destinationRegionName = "(not found)"; | ||
184 | |||
175 | try | 185 | try |
176 | { | 186 | { |
177 | if (regionHandle == sp.Scene.RegionInfo.RegionHandle) | 187 | if (regionHandle == sp.Scene.RegionInfo.RegionHandle) |
178 | { | 188 | { |
179 | m_log.DebugFormat( | 189 | destinationRegionName = sp.Scene.RegionInfo.RegionName; |
180 | "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation {0} within {1}", | ||
181 | position, sp.Scene.RegionInfo.RegionName); | ||
182 | 190 | ||
183 | // Teleport within the same region | 191 | TeleportAgentWithinRegion(sp, position, lookAt, teleportFlags); |
184 | if (IsOutsideRegion(sp.Scene, position) || position.Z < 0) | 192 | } |
185 | { | 193 | else // Another region possibly in another simulator |
186 | Vector3 emergencyPos = new Vector3(128, 128, 128); | 194 | { |
195 | GridRegion finalDestination; | ||
196 | TeleportAgentToDifferentRegion( | ||
197 | sp, regionHandle, position, lookAt, teleportFlags, out finalDestination); | ||
187 | 198 | ||
188 | m_log.WarnFormat( | 199 | if (finalDestination != null) |
189 | "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", | 200 | destinationRegionName = finalDestination.RegionName; |
190 | position, sp.Name, sp.UUID, emergencyPos); | 201 | } |
191 | position = emergencyPos; | 202 | } |
192 | } | 203 | catch (Exception e) |
204 | { | ||
205 | m_log.ErrorFormat( | ||
206 | "[ENTITY TRANSFER MODULE]: Exception on teleport of {0} from {1}@{2} to {3}@{4}: {5}{6}", | ||
207 | sp.Name, sp.AbsolutePosition, sp.Scene.RegionInfo.RegionName, position, destinationRegionName, | ||
208 | e.Message, e.StackTrace); | ||
193 | 209 | ||
194 | // TODO: Get proper AVG Height | 210 | // Make sure that we clear the in-transit flag so that future teleport attempts don't always fail. |
195 | float localAVHeight = 1.56f; | 211 | m_entityTransferStateMachine.ResetFromTransit(sp.UUID); |
196 | float posZLimit = 22; | ||
197 | 212 | ||
198 | // TODO: Check other Scene HeightField | 213 | sp.ControllingClient.SendTeleportFailed("Internal error"); |
199 | if (position.X > 0 && position.X <= (int)Constants.RegionSize && position.Y > 0 && position.Y <= (int)Constants.RegionSize) | 214 | } |
200 | { | 215 | } |
201 | posZLimit = (float)sp.Scene.Heightmap[(int)position.X, (int)position.Y]; | ||
202 | } | ||
203 | 216 | ||
204 | float newPosZ = posZLimit + localAVHeight; | 217 | /// <summary> |
205 | if (posZLimit >= (position.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ))) | 218 | /// Teleports the agent within its current region. |
206 | { | 219 | /// </summary> |
207 | position.Z = newPosZ; | 220 | /// <param name="sp"></param> |
208 | } | 221 | /// <param name="position"></param> |
222 | /// <param name="lookAt"></param> | ||
223 | /// <param name="teleportFlags"></param | ||
224 | private void TeleportAgentWithinRegion(ScenePresence sp, Vector3 position, Vector3 lookAt, uint teleportFlags) | ||
225 | { | ||
226 | m_log.DebugFormat( | ||
227 | "[ENTITY TRANSFER MODULE]: Teleport for {0} to {1} within {2}", | ||
228 | sp.Name, position, sp.Scene.RegionInfo.RegionName); | ||
209 | 229 | ||
210 | sp.ControllingClient.SendTeleportStart(teleportFlags); | 230 | if (!m_entityTransferStateMachine.SetInTransit(sp.UUID)) |
231 | { | ||
232 | m_log.DebugFormat( | ||
233 | "[ENTITY TRANSFER MODULE]: Ignoring within region teleport request of {0} {1} to {2} - agent is already in transit.", | ||
234 | sp.Name, sp.UUID, position); | ||
211 | 235 | ||
212 | sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); | 236 | return; |
213 | sp.TeleportFlags = (Constants.TeleportFlags)teleportFlags; | 237 | } |
214 | sp.Teleport(position); | ||
215 | 238 | ||
216 | foreach (SceneObjectGroup grp in sp.GetAttachments()) | 239 | // Teleport within the same region |
217 | { | 240 | if (IsOutsideRegion(sp.Scene, position) || position.Z < 0) |
218 | sp.Scene.EventManager.TriggerOnScriptChangedEvent(grp.LocalId, (uint)Changed.TELEPORT); | 241 | { |
219 | } | 242 | Vector3 emergencyPos = new Vector3(128, 128, 128); |
243 | |||
244 | m_log.WarnFormat( | ||
245 | "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", | ||
246 | position, sp.Name, sp.UUID, emergencyPos); | ||
247 | |||
248 | position = emergencyPos; | ||
249 | } | ||
250 | |||
251 | // TODO: Get proper AVG Height | ||
252 | float localAVHeight = 1.56f; | ||
253 | float posZLimit = 22; | ||
254 | |||
255 | // TODO: Check other Scene HeightField | ||
256 | if (position.X > 0 && position.X <= (int)Constants.RegionSize && position.Y > 0 && position.Y <= (int)Constants.RegionSize) | ||
257 | { | ||
258 | posZLimit = (float)sp.Scene.Heightmap[(int)position.X, (int)position.Y]; | ||
259 | } | ||
260 | |||
261 | float newPosZ = posZLimit + localAVHeight; | ||
262 | if (posZLimit >= (position.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ))) | ||
263 | { | ||
264 | position.Z = newPosZ; | ||
265 | } | ||
266 | |||
267 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.Transferring); | ||
268 | |||
269 | sp.ControllingClient.SendTeleportStart(teleportFlags); | ||
270 | |||
271 | sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); | ||
272 | sp.TeleportFlags = (Constants.TeleportFlags)teleportFlags; | ||
273 | sp.Velocity = Vector3.Zero; | ||
274 | sp.Teleport(position); | ||
275 | |||
276 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.ReceivedAtDestination); | ||
277 | |||
278 | foreach (SceneObjectGroup grp in sp.GetAttachments()) | ||
279 | { | ||
280 | sp.Scene.EventManager.TriggerOnScriptChangedEvent(grp.LocalId, (uint)Changed.TELEPORT); | ||
281 | } | ||
282 | |||
283 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); | ||
284 | m_entityTransferStateMachine.ResetFromTransit(sp.UUID); | ||
285 | } | ||
286 | |||
287 | /// <summary> | ||
288 | /// Teleports the agent to a different region. | ||
289 | /// </summary> | ||
290 | /// <param name='sp'></param> | ||
291 | /// <param name='regionHandle'>/param> | ||
292 | /// <param name='position'></param> | ||
293 | /// <param name='lookAt'></param> | ||
294 | /// <param name='teleportFlags'></param> | ||
295 | /// <param name='finalDestination'></param> | ||
296 | private void TeleportAgentToDifferentRegion( | ||
297 | ScenePresence sp, ulong regionHandle, Vector3 position, | ||
298 | Vector3 lookAt, uint teleportFlags, out GridRegion finalDestination) | ||
299 | { | ||
300 | uint x = 0, y = 0; | ||
301 | Utils.LongToUInts(regionHandle, out x, out y); | ||
302 | GridRegion reg = Scene.GridService.GetRegionByPosition(sp.Scene.RegionInfo.ScopeID, (int)x, (int)y); | ||
303 | |||
304 | if (reg != null) | ||
305 | { | ||
306 | finalDestination = GetFinalDestination(reg); | ||
307 | |||
308 | if (finalDestination == null) | ||
309 | { | ||
310 | m_log.WarnFormat( | ||
311 | "[ENTITY TRANSFER MODULE]: Final destination is having problems. Unable to teleport {0} {1}", | ||
312 | sp.Name, sp.UUID); | ||
313 | |||
314 | sp.ControllingClient.SendTeleportFailed("Problem at destination"); | ||
315 | return; | ||
220 | } | 316 | } |
221 | else // Another region possibly in another simulator | 317 | |
318 | // Check that these are not the same coordinates | ||
319 | if (finalDestination.RegionLocX == sp.Scene.RegionInfo.RegionLocX && | ||
320 | finalDestination.RegionLocY == sp.Scene.RegionInfo.RegionLocY) | ||
222 | { | 321 | { |
223 | uint x = 0, y = 0; | 322 | // Can't do. Viewer crashes |
224 | Utils.LongToUInts(regionHandle, out x, out y); | 323 | sp.ControllingClient.SendTeleportFailed("Space warp! You would crash. Move to a different region and try again."); |
225 | GridRegion reg = m_aScene.GridService.GetRegionByPosition(sp.Scene.RegionInfo.ScopeID, (int)x, (int)y); | 324 | return; |
325 | } | ||
226 | 326 | ||
227 | if (reg != null) | 327 | // |
228 | { | 328 | // This is it |
229 | GridRegion finalDestination = GetFinalDestination(reg); | 329 | // |
230 | if (finalDestination == null) | 330 | DoTeleport(sp, reg, finalDestination, position, lookAt, teleportFlags); |
231 | { | 331 | // |
232 | m_log.WarnFormat("[ENTITY TRANSFER MODULE]: Final destination is having problems. Unable to teleport agent."); | 332 | // |
233 | sp.ControllingClient.SendTeleportFailed("Problem at destination"); | 333 | // |
234 | return; | 334 | } |
235 | } | 335 | else |
336 | { | ||
337 | finalDestination = null; | ||
236 | 338 | ||
237 | // check if HyperGrid teleport is allowed, based on user level | 339 | // TP to a place that doesn't exist (anymore) |
238 | int flags = m_aScene.GridService.GetRegionFlags(sp.Scene.RegionInfo.ScopeID, reg.RegionID); | 340 | // Inform the viewer about that |
341 | sp.ControllingClient.SendTeleportFailed("The region you tried to teleport to doesn't exist anymore"); | ||
239 | 342 | ||
240 | if (((flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) && (sp.UserLevel < m_levelHGTeleport)) | 343 | // and set the map-tile to '(Offline)' |
241 | { | 344 | uint regX, regY; |
242 | m_log.WarnFormat("[ENTITY TRANSFER MODULE]: Final destination link is non permitted hypergrid region. Unable to teleport agent."); | 345 | Utils.LongToUInts(regionHandle, out regX, out regY); |
243 | sp.ControllingClient.SendTeleportFailed("HyperGrid teleport not permitted"); | 346 | |
244 | return; | 347 | MapBlockData block = new MapBlockData(); |
245 | } | 348 | block.X = (ushort)(regX / Constants.RegionSize); |
349 | block.Y = (ushort)(regY / Constants.RegionSize); | ||
350 | block.Access = 254; // == not there | ||
246 | 351 | ||
247 | uint curX = 0, curY = 0; | 352 | List<MapBlockData> blocks = new List<MapBlockData>(); |
248 | Utils.LongToUInts(sp.Scene.RegionInfo.RegionHandle, out curX, out curY); | 353 | blocks.Add(block); |
249 | int curCellX = (int)(curX / Constants.RegionSize); | 354 | sp.ControllingClient.SendMapBlock(blocks, 0); |
250 | int curCellY = (int)(curY / Constants.RegionSize); | 355 | } |
251 | int destCellX = (int)(finalDestination.RegionLocX / Constants.RegionSize); | 356 | } |
252 | int destCellY = (int)(finalDestination.RegionLocY / Constants.RegionSize); | ||
253 | 357 | ||
358 | /// <summary> | ||
359 | /// Determines whether this instance is within the max transfer distance. | ||
360 | /// </summary> | ||
361 | /// <param name="sourceRegion"></param> | ||
362 | /// <param name="destRegion"></param> | ||
363 | /// <returns> | ||
364 | /// <c>true</c> if this instance is within max transfer distance; otherwise, <c>false</c>. | ||
365 | /// </returns> | ||
366 | private bool IsWithinMaxTeleportDistance(RegionInfo sourceRegion, GridRegion destRegion) | ||
367 | { | ||
254 | // m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Source co-ords are x={0} y={1}", curRegionX, curRegionY); | 368 | // m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Source co-ords are x={0} y={1}", curRegionX, curRegionY); |
255 | // | 369 | // |
256 | // m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Final dest is x={0} y={1} {2}@{3}", | 370 | // m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Final dest is x={0} y={1} {2}@{3}", |
257 | // destRegionX, destRegionY, finalDestination.RegionID, finalDestination.ServerURI); | 371 | // destRegionX, destRegionY, finalDestination.RegionID, finalDestination.ServerURI); |
258 | 372 | ||
259 | // Check that these are not the same coordinates | 373 | // Insanely, RegionLoc on RegionInfo is the 256m map co-ord whilst GridRegion.RegionLoc is the raw meters position. |
260 | if (finalDestination.RegionLocX == sp.Scene.RegionInfo.RegionLocX && | 374 | return Math.Abs(sourceRegion.RegionLocX - destRegion.RegionCoordX) <= MaxTransferDistance |
261 | finalDestination.RegionLocY == sp.Scene.RegionInfo.RegionLocY) | 375 | && Math.Abs(sourceRegion.RegionLocY - destRegion.RegionCoordY) <= MaxTransferDistance; |
262 | { | 376 | } |
263 | // Can't do. Viewer crashes | ||
264 | sp.ControllingClient.SendTeleportFailed("Space warp! You would crash. Move to a different region and try again."); | ||
265 | return; | ||
266 | } | ||
267 | |||
268 | if (Math.Abs(curCellX - destCellX) > MaxTransferDistance || Math.Abs(curCellY - destCellY) > MaxTransferDistance) | ||
269 | { | ||
270 | sp.ControllingClient.SendTeleportFailed( | ||
271 | string.Format( | ||
272 | "Can't teleport to {0} ({1},{2}) from {3} ({4},{5}), destination is more than {6} regions way", | ||
273 | finalDestination.RegionName, destCellX, destCellY, | ||
274 | sp.Scene.RegionInfo.RegionName, curCellX, curCellY, | ||
275 | MaxTransferDistance)); | ||
276 | |||
277 | return; | ||
278 | } | ||
279 | 377 | ||
280 | // | 378 | public void DoTeleport( |
281 | // This is it | 379 | ScenePresence sp, GridRegion reg, GridRegion finalDestination, |
282 | // | 380 | Vector3 position, Vector3 lookAt, uint teleportFlags) |
283 | DoTeleport(sp, reg, finalDestination, position, lookAt, teleportFlags, eq); | 381 | { |
284 | // | 382 | // Record that this agent is in transit so that we can prevent simultaneous requests and do later detection |
285 | // | 383 | // of whether the destination region completes the teleport. |
286 | // | 384 | if (!m_entityTransferStateMachine.SetInTransit(sp.UUID)) |
287 | } | ||
288 | else | ||
289 | { | ||
290 | // TP to a place that doesn't exist (anymore) | ||
291 | // Inform the viewer about that | ||
292 | sp.ControllingClient.SendTeleportFailed("The region you tried to teleport to doesn't exist anymore"); | ||
293 | |||
294 | // and set the map-tile to '(Offline)' | ||
295 | uint regX, regY; | ||
296 | Utils.LongToUInts(regionHandle, out regX, out regY); | ||
297 | |||
298 | MapBlockData block = new MapBlockData(); | ||
299 | block.X = (ushort)(regX / Constants.RegionSize); | ||
300 | block.Y = (ushort)(regY / Constants.RegionSize); | ||
301 | block.Access = 254; // == not there | ||
302 | |||
303 | List<MapBlockData> blocks = new List<MapBlockData>(); | ||
304 | blocks.Add(block); | ||
305 | sp.ControllingClient.SendMapBlock(blocks, 0); | ||
306 | } | ||
307 | } | ||
308 | } | ||
309 | catch (Exception e) | ||
310 | { | 385 | { |
311 | m_log.WarnFormat("[ENTITY TRANSFER MODULE]: Exception on teleport: {0} {1}", e.Message, e.StackTrace); | 386 | m_log.DebugFormat( |
312 | sp.ControllingClient.SendTeleportFailed("Internal error"); | 387 | "[ENTITY TRANSFER MODULE]: Ignoring teleport request of {0} {1} to {2} ({3}) {4}/{5} - agent is already in transit.", |
388 | sp.Name, sp.UUID, reg.ServerURI, finalDestination.ServerURI, finalDestination.RegionName, position); | ||
389 | |||
390 | return; | ||
313 | } | 391 | } |
314 | } | ||
315 | 392 | ||
316 | public void DoTeleport(ScenePresence sp, GridRegion reg, GridRegion finalDestination, Vector3 position, Vector3 lookAt, uint teleportFlags, IEventQueue eq) | ||
317 | { | ||
318 | if (reg == null || finalDestination == null) | 393 | if (reg == null || finalDestination == null) |
319 | { | 394 | { |
320 | sp.ControllingClient.SendTeleportFailed("Unable to locate destination"); | 395 | sp.ControllingClient.SendTeleportFailed("Unable to locate destination"); |
321 | return; | 396 | m_entityTransferStateMachine.ResetFromTransit(sp.UUID); |
322 | } | ||
323 | 397 | ||
324 | if (IsInTransit(sp.UUID)) // Avie is already on the way. Caller shouldn't do this. | ||
325 | return; | 398 | return; |
399 | } | ||
326 | 400 | ||
327 | m_log.DebugFormat( | 401 | m_log.DebugFormat( |
328 | "[ENTITY TRANSFER MODULE]: Request Teleport to {0} ({1}) {2}/{3}", | 402 | "[ENTITY TRANSFER MODULE]: Teleporting {0} {1} from {2} to {3} ({4}) {5}/{6}", |
403 | sp.Name, sp.UUID, sp.Scene.RegionInfo.RegionName, | ||
329 | reg.ServerURI, finalDestination.ServerURI, finalDestination.RegionName, position); | 404 | reg.ServerURI, finalDestination.ServerURI, finalDestination.RegionName, position); |
330 | 405 | ||
406 | RegionInfo sourceRegion = sp.Scene.RegionInfo; | ||
407 | |||
408 | if (!IsWithinMaxTeleportDistance(sourceRegion, finalDestination)) | ||
409 | { | ||
410 | sp.ControllingClient.SendTeleportFailed( | ||
411 | string.Format( | ||
412 | "Can't teleport to {0} ({1},{2}) from {3} ({4},{5}), destination is more than {6} regions way", | ||
413 | finalDestination.RegionName, finalDestination.RegionCoordX, finalDestination.RegionCoordY, | ||
414 | sourceRegion.RegionName, sourceRegion.RegionLocX, sourceRegion.RegionLocY, | ||
415 | MaxTransferDistance)); | ||
416 | |||
417 | m_entityTransferStateMachine.ResetFromTransit(sp.UUID); | ||
418 | |||
419 | return; | ||
420 | } | ||
421 | |||
331 | uint newRegionX = (uint)(reg.RegionHandle >> 40); | 422 | uint newRegionX = (uint)(reg.RegionHandle >> 40); |
332 | uint newRegionY = (((uint)(reg.RegionHandle)) >> 8); | 423 | uint newRegionY = (((uint)(reg.RegionHandle)) >> 8); |
333 | uint oldRegionX = (uint)(sp.Scene.RegionInfo.RegionHandle >> 40); | 424 | uint oldRegionX = (uint)(sp.Scene.RegionInfo.RegionHandle >> 40); |
@@ -339,17 +430,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
339 | // This may be a costly operation. The reg.ExternalEndPoint field is not a passive field, | 430 | // This may be a costly operation. The reg.ExternalEndPoint field is not a passive field, |
340 | // it's actually doing a lot of work. | 431 | // it's actually doing a lot of work. |
341 | IPEndPoint endPoint = finalDestination.ExternalEndPoint; | 432 | IPEndPoint endPoint = finalDestination.ExternalEndPoint; |
342 | if (endPoint != null && endPoint.Address != null) | 433 | if (endPoint == null || endPoint.Address == null) |
343 | { | 434 | { |
344 | // Fixing a bug where teleporting while sitting results in the avatar ending up removed from | 435 | sp.ControllingClient.SendTeleportFailed("Remote Region appears to be down"); |
345 | // both regions | 436 | m_entityTransferStateMachine.ResetFromTransit(sp.UUID); |
346 | if (sp.ParentID != (uint)0) | ||
347 | sp.StandUp(); | ||
348 | 437 | ||
349 | if (!sp.ValidateAttachments()) | 438 | return; |
350 | m_log.DebugFormat( | 439 | } |
351 | "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for teleport of {0} from {1} to {2}. Continuing.", | 440 | |
352 | sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName); | 441 | if (!sp.ValidateAttachments()) |
442 | m_log.DebugFormat( | ||
443 | "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for teleport of {0} from {1} to {2}. Continuing.", | ||
444 | sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName); | ||
353 | 445 | ||
354 | // if (!sp.ValidateAttachments()) | 446 | // if (!sp.ValidateAttachments()) |
355 | // { | 447 | // { |
@@ -357,218 +449,245 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
357 | // return; | 449 | // return; |
358 | // } | 450 | // } |
359 | 451 | ||
360 | string reason; | 452 | string reason; |
361 | string version; | 453 | string version; |
362 | if (!m_aScene.SimulationService.QueryAccess(finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out version, out reason)) | 454 | if (!Scene.SimulationService.QueryAccess( |
363 | { | 455 | finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out version, out reason)) |
364 | sp.ControllingClient.SendTeleportFailed("Teleport failed: " + reason); | 456 | { |
365 | return; | 457 | sp.ControllingClient.SendTeleportFailed(reason); |
366 | } | 458 | m_entityTransferStateMachine.ResetFromTransit(sp.UUID); |
367 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Destination is running version {0}", version); | ||
368 | |||
369 | sp.ControllingClient.SendTeleportStart(teleportFlags); | ||
370 | |||
371 | // the avatar.Close below will clear the child region list. We need this below for (possibly) | ||
372 | // closing the child agents, so save it here (we need a copy as it is Clear()-ed). | ||
373 | //List<ulong> childRegions = avatar.KnownRegionHandles; | ||
374 | // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport | ||
375 | // failure at this point (unlike a border crossing failure). So perhaps this can never fail | ||
376 | // once we reach here... | ||
377 | //avatar.Scene.RemoveCapsHandler(avatar.UUID); | ||
378 | |||
379 | string capsPath = String.Empty; | ||
380 | |||
381 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); | ||
382 | AgentCircuitData agentCircuit = sp.ControllingClient.RequestClientInfo(); | ||
383 | agentCircuit.startpos = position; | ||
384 | agentCircuit.child = true; | ||
385 | agentCircuit.Appearance = sp.Appearance; | ||
386 | if (currentAgentCircuit != null) | ||
387 | { | ||
388 | agentCircuit.ServiceURLs = currentAgentCircuit.ServiceURLs; | ||
389 | agentCircuit.IPAddress = currentAgentCircuit.IPAddress; | ||
390 | agentCircuit.Viewer = currentAgentCircuit.Viewer; | ||
391 | agentCircuit.Channel = currentAgentCircuit.Channel; | ||
392 | agentCircuit.Mac = currentAgentCircuit.Mac; | ||
393 | agentCircuit.Id0 = currentAgentCircuit.Id0; | ||
394 | } | ||
395 | 459 | ||
396 | if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) | 460 | m_log.DebugFormat( |
397 | { | 461 | "[ENTITY TRANSFER MODULE]: {0} was stopped from teleporting from {1} to {2} because {3}", |
398 | // brand new agent, let's create a new caps seed | 462 | sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName, reason); |
399 | agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | ||
400 | } | ||
401 | 463 | ||
402 | // Let's create an agent there if one doesn't exist yet. | 464 | return; |
403 | bool logout = false; | 465 | } |
404 | if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) | ||
405 | { | ||
406 | sp.ControllingClient.SendTeleportFailed(String.Format("Destination refused: {0}", | ||
407 | reason)); | ||
408 | return; | ||
409 | } | ||
410 | 466 | ||
411 | // OK, it got this agent. Let's close some child agents | 467 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Destination is running version {0}", version); |
412 | sp.CloseChildAgents(newRegionX, newRegionY); | ||
413 | IClientIPEndpoint ipepClient; | ||
414 | if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) | ||
415 | { | ||
416 | //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Creating agent..."); | ||
417 | #region IP Translation for NAT | ||
418 | // Uses ipepClient above | ||
419 | if (sp.ClientView.TryGet(out ipepClient)) | ||
420 | { | ||
421 | endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address); | ||
422 | } | ||
423 | #endregion | ||
424 | capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); | ||
425 | 468 | ||
426 | if (eq != null) | 469 | // Fixing a bug where teleporting while sitting results in the avatar ending up removed from |
427 | { | 470 | // both regions |
428 | eq.EnableSimulator(destinationHandle, endPoint, sp.UUID); | 471 | if (sp.ParentID != (uint)0) |
472 | sp.StandUp(); | ||
429 | 473 | ||
430 | // ES makes the client send a UseCircuitCode message to the destination, | 474 | sp.ControllingClient.SendTeleportStart(teleportFlags); |
431 | // which triggers a bunch of things there. | ||
432 | // So let's wait | ||
433 | Thread.Sleep(200); | ||
434 | 475 | ||
435 | eq.EstablishAgentCommunication(sp.UUID, endPoint, capsPath); | 476 | // the avatar.Close below will clear the child region list. We need this below for (possibly) |
477 | // closing the child agents, so save it here (we need a copy as it is Clear()-ed). | ||
478 | //List<ulong> childRegions = avatar.KnownRegionHandles; | ||
479 | // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport | ||
480 | // failure at this point (unlike a border crossing failure). So perhaps this can never fail | ||
481 | // once we reach here... | ||
482 | //avatar.Scene.RemoveCapsHandler(avatar.UUID); | ||
436 | 483 | ||
437 | } | 484 | string capsPath = String.Empty; |
438 | else | 485 | |
439 | { | 486 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); |
440 | sp.ControllingClient.InformClientOfNeighbour(destinationHandle, endPoint); | 487 | AgentCircuitData agentCircuit = sp.ControllingClient.RequestClientInfo(); |
441 | } | 488 | agentCircuit.startpos = position; |
442 | } | 489 | agentCircuit.child = true; |
443 | else | 490 | agentCircuit.Appearance = sp.Appearance; |
444 | { | 491 | if (currentAgentCircuit != null) |
445 | agentCircuit.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, reg.RegionHandle); | 492 | { |
446 | capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); | 493 | agentCircuit.ServiceURLs = currentAgentCircuit.ServiceURLs; |
447 | } | 494 | agentCircuit.IPAddress = currentAgentCircuit.IPAddress; |
495 | agentCircuit.Viewer = currentAgentCircuit.Viewer; | ||
496 | agentCircuit.Channel = currentAgentCircuit.Channel; | ||
497 | agentCircuit.Mac = currentAgentCircuit.Mac; | ||
498 | agentCircuit.Id0 = currentAgentCircuit.Id0; | ||
499 | } | ||
448 | 500 | ||
501 | if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) | ||
502 | { | ||
503 | // brand new agent, let's create a new caps seed | ||
504 | agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | ||
505 | } | ||
449 | 506 | ||
450 | SetInTransit(sp.UUID); | 507 | // Let's create an agent there if one doesn't exist yet. |
508 | bool logout = false; | ||
509 | if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) | ||
510 | { | ||
511 | sp.ControllingClient.SendTeleportFailed(String.Format("Teleport refused: {0}", reason)); | ||
512 | m_entityTransferStateMachine.ResetFromTransit(sp.UUID); | ||
513 | |||
514 | m_log.DebugFormat( | ||
515 | "[ENTITY TRANSFER MODULE]: Teleport of {0} from {1} to {2} was refused because {3}", | ||
516 | sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName, reason); | ||
517 | |||
518 | return; | ||
519 | } | ||
451 | 520 | ||
452 | // Let's send a full update of the agent. This is a synchronous call. | 521 | // Past this point we have to attempt clean up if the teleport fails, so update transfer state. |
453 | AgentData agent = new AgentData(); | 522 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.Transferring); |
454 | sp.CopyTo(agent); | ||
455 | agent.Position = position; | ||
456 | SetCallbackURL(agent, sp.Scene.RegionInfo); | ||
457 | 523 | ||
458 | //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Updating agent..."); | 524 | // OK, it got this agent. Let's close some child agents |
525 | sp.CloseChildAgents(newRegionX, newRegionY); | ||
459 | 526 | ||
460 | if (!UpdateAgent(reg, finalDestination, agent)) | 527 | IClientIPEndpoint ipepClient; |
528 | if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) | ||
529 | { | ||
530 | //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Creating agent..."); | ||
531 | #region IP Translation for NAT | ||
532 | // Uses ipepClient above | ||
533 | if (sp.ClientView.TryGet(out ipepClient)) | ||
461 | { | 534 | { |
462 | // Region doesn't take it | 535 | endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address); |
463 | m_log.WarnFormat( | ||
464 | "[ENTITY TRANSFER MODULE]: UpdateAgent failed on teleport of {0} to {1}. Returning avatar to source region.", | ||
465 | sp.Name, finalDestination.RegionName); | ||
466 | |||
467 | Fail(sp, finalDestination, logout); | ||
468 | return; | ||
469 | } | 536 | } |
537 | #endregion | ||
538 | capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); | ||
470 | 539 | ||
471 | sp.ControllingClient.SendTeleportProgress(teleportFlags | (uint)TeleportFlags.DisableCancel, "sending_dest"); | 540 | if (m_eqModule != null) |
541 | { | ||
542 | m_eqModule.EnableSimulator(destinationHandle, endPoint, sp.UUID); | ||
472 | 543 | ||
473 | m_log.DebugFormat( | 544 | // ES makes the client send a UseCircuitCode message to the destination, |
474 | "[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, sp.UUID); | 545 | // which triggers a bunch of things there. |
546 | // So let's wait | ||
547 | Thread.Sleep(200); | ||
548 | |||
549 | m_eqModule.EstablishAgentCommunication(sp.UUID, endPoint, capsPath); | ||
475 | 550 | ||
476 | if (eq != null) | ||
477 | { | ||
478 | eq.TeleportFinishEvent(destinationHandle, 13, endPoint, | ||
479 | 0, teleportFlags, capsPath, sp.UUID); | ||
480 | } | 551 | } |
481 | else | 552 | else |
482 | { | 553 | { |
483 | sp.ControllingClient.SendRegionTeleport(destinationHandle, 13, endPoint, 4, | 554 | sp.ControllingClient.InformClientOfNeighbour(destinationHandle, endPoint); |
484 | teleportFlags, capsPath); | ||
485 | } | 555 | } |
556 | } | ||
557 | else | ||
558 | { | ||
559 | agentCircuit.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, reg.RegionHandle); | ||
560 | capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); | ||
561 | } | ||
486 | 562 | ||
487 | // Let's set this to true tentatively. This does not trigger OnChildAgent | 563 | // Let's send a full update of the agent. This is a synchronous call. |
488 | sp.IsChildAgent = true; | 564 | AgentData agent = new AgentData(); |
565 | sp.CopyTo(agent); | ||
566 | agent.Position = position; | ||
567 | SetCallbackURL(agent, sp.Scene.RegionInfo); | ||
489 | 568 | ||
490 | // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which | 569 | //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Updating agent..."); |
491 | // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation | ||
492 | // that the client contacted the destination before we close things here. | ||
493 | if (!WaitForCallback(sp.UUID)) | ||
494 | { | ||
495 | m_log.WarnFormat( | ||
496 | "[ENTITY TRANSFER MODULE]: Teleport of {0} to {1} failed due to no callback from destination region. Returning avatar to source region.", | ||
497 | sp.Name, finalDestination.RegionName); | ||
498 | |||
499 | Fail(sp, finalDestination, logout); | ||
500 | return; | ||
501 | } | ||
502 | 570 | ||
503 | // For backwards compatibility | 571 | if (!UpdateAgent(reg, finalDestination, agent)) |
504 | if (version == "Unknown" || version == string.Empty) | 572 | { |
505 | { | 573 | // Region doesn't take it |
506 | // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it | 574 | m_log.WarnFormat( |
507 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Old simulator, sending attachments one by one..."); | 575 | "[ENTITY TRANSFER MODULE]: UpdateAgent failed on teleport of {0} to {1} from {2}. Returning avatar to source region.", |
508 | CrossAttachmentsIntoNewRegion(finalDestination, sp, true); | 576 | sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName); |
509 | } | 577 | |
578 | Fail(sp, finalDestination, logout); | ||
579 | return; | ||
580 | } | ||
510 | 581 | ||
511 | // May need to logout or other cleanup | 582 | sp.ControllingClient.SendTeleportProgress(teleportFlags | (uint)TeleportFlags.DisableCancel, "sending_dest"); |
512 | AgentHasMovedAway(sp, logout); | ||
513 | 583 | ||
514 | // Well, this is it. The agent is over there. | 584 | m_log.DebugFormat( |
515 | KillEntity(sp.Scene, sp.LocalId); | 585 | "[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} from {1} to {2}", |
586 | capsPath, sp.Scene.RegionInfo.RegionName, sp.Name); | ||
516 | 587 | ||
517 | // Now let's make it officially a child agent | 588 | if (m_eqModule != null) |
518 | sp.MakeChildAgent(); | 589 | { |
590 | m_eqModule.TeleportFinishEvent(destinationHandle, 13, endPoint, 0, teleportFlags, capsPath, sp.UUID); | ||
591 | } | ||
592 | else | ||
593 | { | ||
594 | sp.ControllingClient.SendRegionTeleport(destinationHandle, 13, endPoint, 4, | ||
595 | teleportFlags, capsPath); | ||
596 | } | ||
519 | 597 | ||
520 | // sp.Scene.CleanDroppedAttachments(); | 598 | // Let's set this to true tentatively. This does not trigger OnChildAgent |
599 | sp.IsChildAgent = true; | ||
521 | 600 | ||
522 | // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone | 601 | // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which |
602 | // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation | ||
603 | // that the client contacted the destination before we close things here. | ||
604 | if (!m_entityTransferStateMachine.WaitForAgentArrivedAtDestination(sp.UUID)) | ||
605 | { | ||
606 | m_log.WarnFormat( | ||
607 | "[ENTITY TRANSFER MODULE]: Teleport of {0} to {1} from {2} failed due to no callback from destination region. Returning avatar to source region.", | ||
608 | sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName); | ||
609 | |||
610 | Fail(sp, finalDestination, logout); | ||
611 | return; | ||
612 | } | ||
523 | 613 | ||
524 | if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) | 614 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); |
525 | { | ||
526 | Thread.Sleep(5000); | ||
527 | sp.Close(); | ||
528 | sp.Scene.IncomingCloseAgent(sp.UUID); | ||
529 | } | ||
530 | else | ||
531 | { | ||
532 | // now we have a child agent in this region. | ||
533 | sp.Reset(); | ||
534 | } | ||
535 | 615 | ||
536 | // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! | 616 | // For backwards compatibility |
537 | if (sp.Scene.NeedSceneCacheClear(sp.UUID)) | 617 | if (version == "Unknown" || version == string.Empty) |
538 | { | 618 | { |
539 | m_log.DebugFormat( | 619 | // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it |
540 | "[ENTITY TRANSFER MODULE]: User {0} is going to another region, profile cache removed", | 620 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Old simulator, sending attachments one by one..."); |
541 | sp.UUID); | 621 | CrossAttachmentsIntoNewRegion(finalDestination, sp, true); |
542 | } | 622 | } |
623 | |||
624 | // May need to logout or other cleanup | ||
625 | AgentHasMovedAway(sp, logout); | ||
626 | |||
627 | // Well, this is it. The agent is over there. | ||
628 | KillEntity(sp.Scene, sp.LocalId); | ||
629 | |||
630 | // Now let's make it officially a child agent | ||
631 | sp.MakeChildAgent(); | ||
632 | |||
633 | // sp.Scene.CleanDroppedAttachments(); | ||
634 | |||
635 | // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone | ||
636 | |||
637 | if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) | ||
638 | { | ||
639 | // We need to delay here because Imprudence viewers, unlike v1 or v3, have a short (<200ms, <500ms) delay before | ||
640 | // they regard the new region as the current region after receiving the AgentMovementComplete | ||
641 | // response. If close is sent before then, it will cause the viewer to quit instead. | ||
642 | // | ||
643 | // This sleep can be increased if necessary. However, whilst it's active, | ||
644 | // an agent cannot teleport back to this region if it has teleported away. | ||
645 | Thread.Sleep(2000); | ||
646 | |||
647 | sp.Scene.IncomingCloseAgent(sp.UUID); | ||
543 | } | 648 | } |
544 | else | 649 | else |
545 | { | 650 | { |
546 | sp.ControllingClient.SendTeleportFailed("Remote Region appears to be down"); | 651 | // now we have a child agent in this region. |
652 | sp.Reset(); | ||
547 | } | 653 | } |
654 | |||
655 | // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! | ||
656 | if (sp.Scene.NeedSceneCacheClear(sp.UUID)) | ||
657 | { | ||
658 | m_log.DebugFormat( | ||
659 | "[ENTITY TRANSFER MODULE]: User {0} is going to another region, profile cache removed", | ||
660 | sp.UUID); | ||
661 | } | ||
662 | |||
663 | m_entityTransferStateMachine.ResetFromTransit(sp.UUID); | ||
548 | } | 664 | } |
549 | 665 | ||
550 | protected virtual void Fail(ScenePresence sp, GridRegion finalDestination, bool logout) | 666 | protected virtual void Fail(ScenePresence sp, GridRegion finalDestination, bool logout) |
551 | { | 667 | { |
668 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); | ||
669 | |||
552 | // Client never contacted destination. Let's restore everything back | 670 | // Client never contacted destination. Let's restore everything back |
553 | sp.ControllingClient.SendTeleportFailed("Problems connecting to destination."); | 671 | sp.ControllingClient.SendTeleportFailed("Problems connecting to destination."); |
554 | 672 | ||
555 | // Fail. Reset it back | 673 | // Fail. Reset it back |
556 | sp.IsChildAgent = false; | 674 | sp.IsChildAgent = false; |
557 | ReInstantiateScripts(sp); | 675 | ReInstantiateScripts(sp); |
558 | ResetFromTransit(sp.UUID); | ||
559 | 676 | ||
560 | EnableChildAgents(sp); | 677 | EnableChildAgents(sp); |
561 | 678 | ||
562 | // Finally, kill the agent we just created at the destination. | 679 | // Finally, kill the agent we just created at the destination. |
563 | m_aScene.SimulationService.CloseAgent(finalDestination, sp.UUID); | 680 | Scene.SimulationService.CloseAgent(finalDestination, sp.UUID); |
564 | 681 | ||
565 | sp.Scene.EventManager.TriggerTeleportFail(sp.ControllingClient, logout); | 682 | sp.Scene.EventManager.TriggerTeleportFail(sp.ControllingClient, logout); |
683 | |||
684 | m_entityTransferStateMachine.ResetFromTransit(sp.UUID); | ||
566 | } | 685 | } |
567 | 686 | ||
568 | protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout) | 687 | protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout) |
569 | { | 688 | { |
570 | logout = false; | 689 | logout = false; |
571 | bool success = m_aScene.SimulationService.CreateAgent(finalDestination, agentCircuit, teleportFlags, out reason); | 690 | bool success = Scene.SimulationService.CreateAgent(finalDestination, agentCircuit, teleportFlags, out reason); |
572 | 691 | ||
573 | if (success) | 692 | if (success) |
574 | sp.Scene.EventManager.TriggerTeleportStart(sp.ControllingClient, reg, finalDestination, teleportFlags, logout); | 693 | sp.Scene.EventManager.TriggerTeleportStart(sp.ControllingClient, reg, finalDestination, teleportFlags, logout); |
@@ -578,19 +697,22 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
578 | 697 | ||
579 | protected virtual bool UpdateAgent(GridRegion reg, GridRegion finalDestination, AgentData agent) | 698 | protected virtual bool UpdateAgent(GridRegion reg, GridRegion finalDestination, AgentData agent) |
580 | { | 699 | { |
581 | return m_aScene.SimulationService.UpdateAgent(finalDestination, agent); | 700 | return Scene.SimulationService.UpdateAgent(finalDestination, agent); |
582 | } | 701 | } |
583 | 702 | ||
584 | protected virtual void SetCallbackURL(AgentData agent, RegionInfo region) | 703 | protected virtual void SetCallbackURL(AgentData agent, RegionInfo region) |
585 | { | 704 | { |
586 | agent.CallbackURI = region.ServerURI + "agent/" + agent.AgentID.ToString() + "/" + region.RegionID.ToString() + "/release/"; | 705 | agent.CallbackURI = region.ServerURI + "agent/" + agent.AgentID.ToString() + "/" + region.RegionID.ToString() + "/release/"; |
587 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Set callback URL to {0}", agent.CallbackURI); | ||
588 | 706 | ||
707 | m_log.DebugFormat( | ||
708 | "[ENTITY TRANSFER MODULE]: Set release callback URL to {0} in {1}", | ||
709 | agent.CallbackURI, region.RegionName); | ||
589 | } | 710 | } |
590 | 711 | ||
591 | protected virtual void AgentHasMovedAway(ScenePresence sp, bool logout) | 712 | protected virtual void AgentHasMovedAway(ScenePresence sp, bool logout) |
592 | { | 713 | { |
593 | sp.Scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, true); | 714 | if (sp.Scene.AttachmentsModule != null) |
715 | sp.Scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, true); | ||
594 | } | 716 | } |
595 | 717 | ||
596 | protected void KillEntity(Scene scene, uint localID) | 718 | protected void KillEntity(Scene scene, uint localID) |
@@ -615,7 +737,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
615 | 737 | ||
616 | protected virtual bool IsOutsideRegion(Scene s, Vector3 pos) | 738 | protected virtual bool IsOutsideRegion(Scene s, Vector3 pos) |
617 | { | 739 | { |
618 | |||
619 | if (s.TestBorderCross(pos, Cardinals.N)) | 740 | if (s.TestBorderCross(pos, Cardinals.N)) |
620 | return true; | 741 | return true; |
621 | if (s.TestBorderCross(pos, Cardinals.S)) | 742 | if (s.TestBorderCross(pos, Cardinals.S)) |
@@ -628,7 +749,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
628 | return false; | 749 | return false; |
629 | } | 750 | } |
630 | 751 | ||
631 | |||
632 | #endregion | 752 | #endregion |
633 | 753 | ||
634 | #region Landmark Teleport | 754 | #region Landmark Teleport |
@@ -640,7 +760,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
640 | /// <param name="position"></param> | 760 | /// <param name="position"></param> |
641 | public virtual void RequestTeleportLandmark(IClientAPI remoteClient, AssetLandmark lm) | 761 | public virtual void RequestTeleportLandmark(IClientAPI remoteClient, AssetLandmark lm) |
642 | { | 762 | { |
643 | GridRegion info = m_aScene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID); | 763 | GridRegion info = Scene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID); |
644 | 764 | ||
645 | if (info == null) | 765 | if (info == null) |
646 | { | 766 | { |
@@ -663,10 +783,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
663 | 783 | ||
664 | public virtual bool TeleportHome(UUID id, IClientAPI client) | 784 | public virtual bool TeleportHome(UUID id, IClientAPI client) |
665 | { | 785 | { |
666 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName); | 786 | m_log.DebugFormat( |
787 | "[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.Name, client.AgentId); | ||
667 | 788 | ||
668 | //OpenSim.Services.Interfaces.PresenceInfo pinfo = m_aScene.PresenceService.GetAgent(client.SessionId); | 789 | //OpenSim.Services.Interfaces.PresenceInfo pinfo = Scene.PresenceService.GetAgent(client.SessionId); |
669 | GridUserInfo uinfo = m_aScene.GridUserService.GetGridUserInfo(client.AgentId.ToString()); | 790 | GridUserInfo uinfo = Scene.GridUserService.GetGridUserInfo(client.AgentId.ToString()); |
670 | 791 | ||
671 | if (uinfo != null) | 792 | if (uinfo != null) |
672 | { | 793 | { |
@@ -676,7 +797,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
676 | client.SendTeleportFailed("You don't have a home position set."); | 797 | client.SendTeleportFailed("You don't have a home position set."); |
677 | return false; | 798 | return false; |
678 | } | 799 | } |
679 | GridRegion regionInfo = m_aScene.GridService.GetRegionByUUID(UUID.Zero, uinfo.HomeRegionID); | 800 | GridRegion regionInfo = Scene.GridService.GetRegionByUUID(UUID.Zero, uinfo.HomeRegionID); |
680 | if (regionInfo == null) | 801 | if (regionInfo == null) |
681 | { | 802 | { |
682 | // can't find the Home region: Tell viewer and abort | 803 | // can't find the Home region: Tell viewer and abort |
@@ -684,8 +805,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
684 | return false; | 805 | return false; |
685 | } | 806 | } |
686 | 807 | ||
687 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: User's home region is {0} {1} ({2}-{3})", | 808 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Home region of {0} is {1} ({2}-{3})", |
688 | regionInfo.RegionName, regionInfo.RegionID, regionInfo.RegionLocX / Constants.RegionSize, regionInfo.RegionLocY / Constants.RegionSize); | 809 | client.Name, regionInfo.RegionName, regionInfo.RegionCoordX, regionInfo.RegionCoordY); |
689 | 810 | ||
690 | // a little eekie that this goes back to Scene and with a forced cast, will fix that at some point... | 811 | // a little eekie that this goes back to Scene and with a forced cast, will fix that at some point... |
691 | ((Scene)(client.Scene)).RequestTeleportLocation( | 812 | ((Scene)(client.Scene)).RequestTeleportLocation( |
@@ -736,7 +857,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
736 | 857 | ||
737 | neighbourx--; | 858 | neighbourx--; |
738 | newpos.X = Constants.RegionSize - enterDistance; | 859 | newpos.X = Constants.RegionSize - enterDistance; |
739 | |||
740 | } | 860 | } |
741 | else if (scene.TestBorderCross(pos + eastCross, Cardinals.E)) | 861 | else if (scene.TestBorderCross(pos + eastCross, Cardinals.E)) |
742 | { | 862 | { |
@@ -922,107 +1042,123 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
922 | ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion, | 1042 | ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion, |
923 | bool isFlying, string version) | 1043 | bool isFlying, string version) |
924 | { | 1044 | { |
1045 | if (neighbourRegion == null) | ||
1046 | return agent; | ||
1047 | |||
925 | try | 1048 | try |
926 | { | 1049 | { |
1050 | m_entityTransferStateMachine.SetInTransit(agent.UUID); | ||
1051 | |||
927 | ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize)); | 1052 | ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize)); |
928 | 1053 | ||
929 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} to {2}-{3} running version {4}", agent.Firstname, agent.Lastname, neighbourx, neighboury, version); | 1054 | m_log.DebugFormat( |
1055 | "[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} to {2}-{3} running version {4}", | ||
1056 | agent.Firstname, agent.Lastname, neighbourx, neighboury, version); | ||
930 | 1057 | ||
931 | Scene m_scene = agent.Scene; | 1058 | Scene m_scene = agent.Scene; |
932 | 1059 | ||
933 | if (neighbourRegion != null) | 1060 | if (!agent.ValidateAttachments()) |
1061 | m_log.DebugFormat( | ||
1062 | "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for region crossing of {0} from {1} to {2}. Continuing.", | ||
1063 | agent.Name, agent.Scene.RegionInfo.RegionName, neighbourRegion.RegionName); | ||
1064 | |||
1065 | pos = pos + agent.Velocity; | ||
1066 | Vector3 vel2 = new Vector3(agent.Velocity.X, agent.Velocity.Y, 0); | ||
1067 | |||
1068 | agent.RemoveFromPhysicalScene(); | ||
1069 | |||
1070 | AgentData cAgent = new AgentData(); | ||
1071 | agent.CopyTo(cAgent); | ||
1072 | cAgent.Position = pos; | ||
1073 | if (isFlying) | ||
1074 | cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; | ||
1075 | |||
1076 | // We don't need the callback anymnore | ||
1077 | cAgent.CallbackURI = String.Empty; | ||
1078 | |||
1079 | // Beyond this point, extra cleanup is needed beyond removing transit state | ||
1080 | m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.Transferring); | ||
1081 | |||
1082 | if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent)) | ||
934 | { | 1083 | { |
935 | if (!agent.ValidateAttachments()) | 1084 | // region doesn't take it |
936 | m_log.DebugFormat( | 1085 | m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp); |
937 | "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for region crossing of {0} from {1} to {2}. Continuing.", | ||
938 | agent.Name, agent.Scene.RegionInfo.RegionName, neighbourRegion.RegionName); | ||
939 | 1086 | ||
940 | pos = pos + agent.Velocity; | 1087 | ReInstantiateScripts(agent); |
941 | Vector3 vel2 = new Vector3(agent.Velocity.X, agent.Velocity.Y, 0); | 1088 | agent.AddToPhysicalScene(isFlying); |
1089 | m_entityTransferStateMachine.ResetFromTransit(agent.UUID); | ||
942 | 1090 | ||
943 | agent.RemoveFromPhysicalScene(); | 1091 | return agent; |
944 | SetInTransit(agent.UUID); | 1092 | } |
945 | 1093 | ||
946 | AgentData cAgent = new AgentData(); | 1094 | //AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo(); |
947 | agent.CopyTo(cAgent); | 1095 | agent.ControllingClient.RequestClientInfo(); |
948 | cAgent.Position = pos; | ||
949 | if (isFlying) | ||
950 | cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; | ||
951 | 1096 | ||
952 | // We don't need the callback anymnore | 1097 | //m_log.Debug("BEFORE CROSS"); |
953 | cAgent.CallbackURI = String.Empty; | 1098 | //Scene.DumpChildrenSeeds(UUID); |
1099 | //DumpKnownRegions(); | ||
1100 | string agentcaps; | ||
1101 | if (!agent.KnownRegions.TryGetValue(neighbourRegion.RegionHandle, out agentcaps)) | ||
1102 | { | ||
1103 | m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: No ENTITY TRANSFER MODULE information for region handle {0}, exiting CrossToNewRegion.", | ||
1104 | neighbourRegion.RegionHandle); | ||
1105 | return agent; | ||
1106 | } | ||
1107 | // No turning back | ||
1108 | agent.IsChildAgent = true; | ||
954 | 1109 | ||
955 | if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent)) | 1110 | string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps); |
956 | { | ||
957 | // region doesn't take it | ||
958 | ReInstantiateScripts(agent); | ||
959 | agent.AddToPhysicalScene(isFlying); | ||
960 | ResetFromTransit(agent.UUID); | ||
961 | return agent; | ||
962 | } | ||
963 | |||
964 | //AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo(); | ||
965 | agent.ControllingClient.RequestClientInfo(); | ||
966 | |||
967 | //m_log.Debug("BEFORE CROSS"); | ||
968 | //Scene.DumpChildrenSeeds(UUID); | ||
969 | //DumpKnownRegions(); | ||
970 | string agentcaps; | ||
971 | if (!agent.KnownRegions.TryGetValue(neighbourRegion.RegionHandle, out agentcaps)) | ||
972 | { | ||
973 | m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: No ENTITY TRANSFER MODULE information for region handle {0}, exiting CrossToNewRegion.", | ||
974 | neighbourRegion.RegionHandle); | ||
975 | return agent; | ||
976 | } | ||
977 | // No turning back | ||
978 | agent.IsChildAgent = true; | ||
979 | 1111 | ||
980 | string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps); | 1112 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID); |
981 | |||
982 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID); | ||
983 | 1113 | ||
984 | IEventQueue eq = agent.Scene.RequestModuleInterface<IEventQueue>(); | 1114 | if (m_eqModule != null) |
985 | if (eq != null) | 1115 | { |
986 | { | 1116 | m_eqModule.CrossRegion( |
987 | eq.CrossRegion(neighbourHandle, pos, vel2 /* agent.Velocity */, neighbourRegion.ExternalEndPoint, | 1117 | neighbourHandle, pos, vel2 /* agent.Velocity */, neighbourRegion.ExternalEndPoint, |
988 | capsPath, agent.UUID, agent.ControllingClient.SessionId); | 1118 | capsPath, agent.UUID, agent.ControllingClient.SessionId); |
989 | } | 1119 | } |
990 | else | 1120 | else |
991 | { | 1121 | { |
992 | agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, | 1122 | agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, |
993 | capsPath); | 1123 | capsPath); |
994 | } | 1124 | } |
995 | 1125 | ||
996 | // SUCCESS! | 1126 | // SUCCESS! |
997 | agent.MakeChildAgent(); | 1127 | m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination); |
998 | ResetFromTransit(agent.UUID); | ||
999 | 1128 | ||
1000 | // now we have a child agent in this region. Request all interesting data about other (root) agents | 1129 | // Unlike a teleport, here we do not wait for the destination region to confirm the receipt. |
1001 | agent.SendOtherAgentsAvatarDataToMe(); | 1130 | m_entityTransferStateMachine.UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp); |
1002 | agent.SendOtherAgentsAppearanceToMe(); | ||
1003 | 1131 | ||
1004 | // Backwards compatibility. Best effort | 1132 | agent.MakeChildAgent(); |
1005 | if (version == "Unknown" || version == string.Empty) | ||
1006 | { | ||
1007 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one..."); | ||
1008 | Thread.Sleep(3000); // wait a little now that we're not waiting for the callback | ||
1009 | CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true); | ||
1010 | } | ||
1011 | 1133 | ||
1134 | // FIXME: Possibly this should occur lower down after other commands to close other agents, | ||
1135 | // but not sure yet what the side effects would be. | ||
1136 | m_entityTransferStateMachine.ResetFromTransit(agent.UUID); | ||
1012 | 1137 | ||
1013 | // Next, let's close the child agent connections that are too far away. | 1138 | // now we have a child agent in this region. Request all interesting data about other (root) agents |
1014 | agent.CloseChildAgents(neighbourx, neighboury); | 1139 | agent.SendOtherAgentsAvatarDataToMe(); |
1015 | 1140 | agent.SendOtherAgentsAppearanceToMe(); | |
1016 | AgentHasMovedAway(agent, false); | 1141 | |
1017 | 1142 | // Backwards compatibility. Best effort | |
1018 | // the user may change their profile information in other region, | 1143 | if (version == "Unknown" || version == string.Empty) |
1019 | // so the userinfo in UserProfileCache is not reliable any more, delete it | 1144 | { |
1020 | // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! | 1145 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one..."); |
1021 | if (agent.Scene.NeedSceneCacheClear(agent.UUID)) | 1146 | Thread.Sleep(3000); // wait a little now that we're not waiting for the callback |
1022 | { | 1147 | CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true); |
1023 | m_log.DebugFormat( | 1148 | } |
1024 | "[ENTITY TRANSFER MODULE]: User {0} is going to another region", agent.UUID); | 1149 | |
1025 | } | 1150 | // Next, let's close the child agent connections that are too far away. |
1151 | agent.CloseChildAgents(neighbourx, neighboury); | ||
1152 | |||
1153 | AgentHasMovedAway(agent, false); | ||
1154 | |||
1155 | // the user may change their profile information in other region, | ||
1156 | // so the userinfo in UserProfileCache is not reliable any more, delete it | ||
1157 | // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! | ||
1158 | if (agent.Scene.NeedSceneCacheClear(agent.UUID)) | ||
1159 | { | ||
1160 | m_log.DebugFormat( | ||
1161 | "[ENTITY TRANSFER MODULE]: User {0} is going to another region", agent.UUID); | ||
1026 | } | 1162 | } |
1027 | 1163 | ||
1028 | //m_log.Debug("AFTER CROSS"); | 1164 | //m_log.Debug("AFTER CROSS"); |
@@ -1034,11 +1170,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1034 | m_log.ErrorFormat( | 1170 | m_log.ErrorFormat( |
1035 | "[ENTITY TRANSFER MODULE]: Problem crossing user {0} to new region {1} from {2}. Exception {3}{4}", | 1171 | "[ENTITY TRANSFER MODULE]: Problem crossing user {0} to new region {1} from {2}. Exception {3}{4}", |
1036 | agent.Name, neighbourRegion.RegionName, agent.Scene.RegionInfo.RegionName, e.Message, e.StackTrace); | 1172 | agent.Name, neighbourRegion.RegionName, agent.Scene.RegionInfo.RegionName, e.Message, e.StackTrace); |
1173 | |||
1174 | // TODO: Might be worth attempting other restoration here such as reinstantiation of scripts, etc. | ||
1037 | } | 1175 | } |
1038 | 1176 | ||
1039 | return agent; | 1177 | return agent; |
1040 | } | 1178 | } |
1041 | 1179 | ||
1042 | private void CrossAgentToNewRegionCompleted(IAsyncResult iar) | 1180 | private void CrossAgentToNewRegionCompleted(IAsyncResult iar) |
1043 | { | 1181 | { |
1044 | CrossAgentToNewRegionDelegate icon = (CrossAgentToNewRegionDelegate)iar.AsyncState; | 1182 | CrossAgentToNewRegionDelegate icon = (CrossAgentToNewRegionDelegate)iar.AsyncState; |
@@ -1186,7 +1324,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1186 | { | 1324 | { |
1187 | if (neighbour.RegionHandle != sp.Scene.RegionInfo.RegionHandle) | 1325 | if (neighbour.RegionHandle != sp.Scene.RegionInfo.RegionHandle) |
1188 | { | 1326 | { |
1189 | |||
1190 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); | 1327 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); |
1191 | AgentCircuitData agent = sp.ControllingClient.RequestClientInfo(); | 1328 | AgentCircuitData agent = sp.ControllingClient.RequestClientInfo(); |
1192 | agent.BaseFolder = UUID.Zero; | 1329 | agent.BaseFolder = UUID.Zero; |
@@ -1211,7 +1348,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1211 | seeds.Add(neighbour.RegionHandle, agent.CapsPath); | 1348 | seeds.Add(neighbour.RegionHandle, agent.CapsPath); |
1212 | } | 1349 | } |
1213 | else | 1350 | else |
1351 | { | ||
1214 | agent.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, neighbour.RegionHandle); | 1352 | agent.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, neighbour.RegionHandle); |
1353 | } | ||
1215 | 1354 | ||
1216 | cagents.Add(agent); | 1355 | cagents.Add(agent); |
1217 | } | 1356 | } |
@@ -1322,24 +1461,21 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1322 | // after a cross here | 1461 | // after a cross here |
1323 | Thread.Sleep(500); | 1462 | Thread.Sleep(500); |
1324 | 1463 | ||
1325 | Scene m_scene = sp.Scene; | 1464 | Scene scene = sp.Scene; |
1326 | 1465 | ||
1327 | uint x, y; | 1466 | m_log.DebugFormat( |
1328 | Utils.LongToUInts(reg.RegionHandle, out x, out y); | 1467 | "[ENTITY TRANSFER MODULE]: Informing {0} {1} about neighbour {2} {3} at ({4},{5})", |
1329 | x = x / Constants.RegionSize; | 1468 | sp.Name, sp.UUID, reg.RegionName, endPoint, reg.RegionCoordX, reg.RegionCoordY); |
1330 | y = y / Constants.RegionSize; | ||
1331 | m_log.Debug("[ENTITY TRANSFER MODULE]: Starting to inform client about neighbour " + x + ", " + y + "(" + endPoint + ")"); | ||
1332 | 1469 | ||
1333 | string capsPath = reg.ServerURI + CapsUtil.GetCapsSeedPath(a.CapsPath); | 1470 | string capsPath = reg.ServerURI + CapsUtil.GetCapsSeedPath(a.CapsPath); |
1334 | 1471 | ||
1335 | string reason = String.Empty; | 1472 | string reason = String.Empty; |
1336 | 1473 | ||
1337 | bool regionAccepted = m_scene.SimulationService.CreateAgent(reg, a, (uint)TeleportFlags.Default, out reason); | 1474 | bool regionAccepted = scene.SimulationService.CreateAgent(reg, a, (uint)TeleportFlags.Default, out reason); |
1338 | 1475 | ||
1339 | if (regionAccepted && newAgent) | 1476 | if (regionAccepted && newAgent) |
1340 | { | 1477 | { |
1341 | IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>(); | 1478 | if (m_eqModule != null) |
1342 | if (eq != null) | ||
1343 | { | 1479 | { |
1344 | #region IP Translation for NAT | 1480 | #region IP Translation for NAT |
1345 | IClientIPEndpoint ipepClient; | 1481 | IClientIPEndpoint ipepClient; |
@@ -1351,10 +1487,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1351 | 1487 | ||
1352 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: {0} is sending {1} EnableSimulator for neighbour region {2} @ {3} " + | 1488 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: {0} is sending {1} EnableSimulator for neighbour region {2} @ {3} " + |
1353 | "and EstablishAgentCommunication with seed cap {4}", | 1489 | "and EstablishAgentCommunication with seed cap {4}", |
1354 | m_scene.RegionInfo.RegionName, sp.Name, reg.RegionName, reg.RegionHandle, capsPath); | 1490 | scene.RegionInfo.RegionName, sp.Name, reg.RegionName, reg.RegionHandle, capsPath); |
1355 | 1491 | ||
1356 | eq.EnableSimulator(reg.RegionHandle, endPoint, sp.UUID); | 1492 | m_eqModule.EnableSimulator(reg.RegionHandle, endPoint, sp.UUID); |
1357 | eq.EstablishAgentCommunication(sp.UUID, endPoint, capsPath); | 1493 | m_eqModule.EstablishAgentCommunication(sp.UUID, endPoint, capsPath); |
1358 | } | 1494 | } |
1359 | else | 1495 | else |
1360 | { | 1496 | { |
@@ -1362,8 +1498,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1362 | // TODO: make Event Queue disablable! | 1498 | // TODO: make Event Queue disablable! |
1363 | } | 1499 | } |
1364 | 1500 | ||
1365 | m_log.Debug("[ENTITY TRANSFER MODULE]: Completed inform client about neighbour " + endPoint.ToString()); | 1501 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Completed inform {0} {1} about neighbour {2}", sp.Name, sp.UUID, endPoint); |
1366 | } | 1502 | } |
1503 | |||
1504 | if (!regionAccepted) | ||
1505 | m_log.WarnFormat( | ||
1506 | "[ENTITY TRANSFER MODULE]: Region {0} did not accept {1} {2}: {3}", | ||
1507 | reg.RegionName, sp.Name, sp.UUID, reason); | ||
1367 | } | 1508 | } |
1368 | 1509 | ||
1369 | /// <summary> | 1510 | /// <summary> |
@@ -1471,12 +1612,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1471 | 1612 | ||
1472 | #endregion | 1613 | #endregion |
1473 | 1614 | ||
1474 | |||
1475 | #region Agent Arrived | 1615 | #region Agent Arrived |
1616 | |||
1476 | public void AgentArrivedAtDestination(UUID id) | 1617 | public void AgentArrivedAtDestination(UUID id) |
1477 | { | 1618 | { |
1478 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Agent {0} released", id); | 1619 | m_entityTransferStateMachine.SetAgentArrivedAtDestination(id); |
1479 | ResetFromTransit(id); | ||
1480 | } | 1620 | } |
1481 | 1621 | ||
1482 | #endregion | 1622 | #endregion |
@@ -1747,8 +1887,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1747 | //// And the new channel... | 1887 | //// And the new channel... |
1748 | //if (m_interregionCommsOut != null) | 1888 | //if (m_interregionCommsOut != null) |
1749 | // successYN = m_interregionCommsOut.SendCreateObject(newRegionHandle, grp, true); | 1889 | // successYN = m_interregionCommsOut.SendCreateObject(newRegionHandle, grp, true); |
1750 | if (m_aScene.SimulationService != null) | 1890 | if (Scene.SimulationService != null) |
1751 | successYN = m_aScene.SimulationService.CreateObject(destination, newPosition, grp, true); | 1891 | successYN = Scene.SimulationService.CreateObject(destination, newPosition, grp, true); |
1752 | 1892 | ||
1753 | if (successYN) | 1893 | if (successYN) |
1754 | { | 1894 | { |
@@ -1827,51 +1967,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1827 | 1967 | ||
1828 | #region Misc | 1968 | #region Misc |
1829 | 1969 | ||
1830 | protected bool WaitForCallback(UUID id) | 1970 | public bool IsInTransit(UUID id) |
1831 | { | 1971 | { |
1832 | int count = 200; | 1972 | return m_entityTransferStateMachine.IsInTransit(id); |
1833 | while (m_agentsInTransit.Contains(id) && count-- > 0) | ||
1834 | { | ||
1835 | //m_log.Debug(" >>> Waiting... " + count); | ||
1836 | Thread.Sleep(100); | ||
1837 | } | ||
1838 | |||
1839 | if (count > 0) | ||
1840 | return true; | ||
1841 | else | ||
1842 | return false; | ||
1843 | } | ||
1844 | |||
1845 | protected void SetInTransit(UUID id) | ||
1846 | { | ||
1847 | lock (m_agentsInTransit) | ||
1848 | { | ||
1849 | if (!m_agentsInTransit.Contains(id)) | ||
1850 | m_agentsInTransit.Add(id); | ||
1851 | } | ||
1852 | } | ||
1853 | |||
1854 | protected bool IsInTransit(UUID id) | ||
1855 | { | ||
1856 | lock (m_agentsInTransit) | ||
1857 | { | ||
1858 | if (m_agentsInTransit.Contains(id)) | ||
1859 | return true; | ||
1860 | } | ||
1861 | return false; | ||
1862 | } | ||
1863 | |||
1864 | protected bool ResetFromTransit(UUID id) | ||
1865 | { | ||
1866 | lock (m_agentsInTransit) | ||
1867 | { | ||
1868 | if (m_agentsInTransit.Contains(id)) | ||
1869 | { | ||
1870 | m_agentsInTransit.Remove(id); | ||
1871 | return true; | ||
1872 | } | ||
1873 | } | ||
1874 | return false; | ||
1875 | } | 1973 | } |
1876 | 1974 | ||
1877 | protected void ReInstantiateScripts(ScenePresence sp) | 1975 | protected void ReInstantiateScripts(ScenePresence sp) |
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferStateMachine.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferStateMachine.cs new file mode 100644 index 0000000..d0cab49 --- /dev/null +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferStateMachine.cs | |||
@@ -0,0 +1,269 @@ | |||
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.Reflection; | ||
32 | using System.Threading; | ||
33 | using OpenMetaverse; | ||
34 | using log4net; | ||
35 | using Nini.Config; | ||
36 | using OpenSim.Framework; | ||
37 | using OpenSim.Framework.Capabilities; | ||
38 | using OpenSim.Framework.Client; | ||
39 | using OpenSim.Region.Framework.Interfaces; | ||
40 | using OpenSim.Region.Framework.Scenes; | ||
41 | using OpenSim.Region.Physics.Manager; | ||
42 | using OpenSim.Services.Interfaces; | ||
43 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | ||
44 | |||
45 | namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | ||
46 | { | ||
47 | /// <summary> | ||
48 | /// The possible states that an agent can be in when its being transferred between regions. | ||
49 | /// </summary> | ||
50 | /// <remarks> | ||
51 | /// This is a state machine. | ||
52 | /// | ||
53 | /// [Entry] => Preparing | ||
54 | /// Preparing => { Transferring || CleaningUp || [Exit] } | ||
55 | /// Transferring => { ReceivedAtDestination || CleaningUp } | ||
56 | /// ReceivedAtDestination => CleaningUp | ||
57 | /// CleaningUp => [Exit] | ||
58 | /// | ||
59 | /// In other words, agents normally travel throwing Preparing => Transferring => ReceivedAtDestination => CleaningUp | ||
60 | /// However, any state can transition to CleaningUp if the teleport has failed. | ||
61 | /// </remarks> | ||
62 | enum AgentTransferState | ||
63 | { | ||
64 | Preparing, // The agent is being prepared for transfer | ||
65 | Transferring, // The agent is in the process of being transferred to a destination | ||
66 | ReceivedAtDestination, // The destination has notified us that the agent has been successfully received | ||
67 | CleaningUp // The agent is being changed to child/removed after a transfer | ||
68 | } | ||
69 | |||
70 | /// <summary> | ||
71 | /// Records the state of entities when they are in transfer within or between regions (cross or teleport). | ||
72 | /// </summary> | ||
73 | public class EntityTransferStateMachine | ||
74 | { | ||
75 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
76 | |||
77 | /// <summary> | ||
78 | /// If true then on a teleport, the source region waits for a callback from the destination region. If | ||
79 | /// a callback fails to arrive within a set time then the user is pulled back into the source region. | ||
80 | /// </summary> | ||
81 | public bool EnableWaitForAgentArrivedAtDestination { get; set; } | ||
82 | |||
83 | private EntityTransferModule m_mod; | ||
84 | |||
85 | private Dictionary<UUID, AgentTransferState> m_agentsInTransit = new Dictionary<UUID, AgentTransferState>(); | ||
86 | |||
87 | public EntityTransferStateMachine(EntityTransferModule module) | ||
88 | { | ||
89 | m_mod = module; | ||
90 | } | ||
91 | |||
92 | /// <summary> | ||
93 | /// Set that an agent is in transit. | ||
94 | /// </summary> | ||
95 | /// <param name='id'>The ID of the agent being teleported</param> | ||
96 | /// <returns>true if the agent was not already in transit, false if it was</returns> | ||
97 | internal bool SetInTransit(UUID id) | ||
98 | { | ||
99 | lock (m_agentsInTransit) | ||
100 | { | ||
101 | if (!m_agentsInTransit.ContainsKey(id)) | ||
102 | { | ||
103 | m_agentsInTransit[id] = AgentTransferState.Preparing; | ||
104 | return true; | ||
105 | } | ||
106 | } | ||
107 | |||
108 | return false; | ||
109 | } | ||
110 | |||
111 | /// <summary> | ||
112 | /// Updates the state of an agent that is already in transit. | ||
113 | /// </summary> | ||
114 | /// <param name='id'></param> | ||
115 | /// <param name='newState'></param> | ||
116 | /// <returns></returns> | ||
117 | /// <exception cref='Exception'>Illegal transitions will throw an Exception</exception> | ||
118 | internal void UpdateInTransit(UUID id, AgentTransferState newState) | ||
119 | { | ||
120 | lock (m_agentsInTransit) | ||
121 | { | ||
122 | // Illegal to try and update an agent that's not actually in transit. | ||
123 | if (!m_agentsInTransit.ContainsKey(id)) | ||
124 | throw new Exception( | ||
125 | string.Format( | ||
126 | "Agent with ID {0} is not registered as in transit in {1}", | ||
127 | id, m_mod.Scene.RegionInfo.RegionName)); | ||
128 | |||
129 | AgentTransferState oldState = m_agentsInTransit[id]; | ||
130 | |||
131 | bool transitionOkay = false; | ||
132 | |||
133 | if (newState == AgentTransferState.CleaningUp && oldState != AgentTransferState.CleaningUp) | ||
134 | transitionOkay = true; | ||
135 | else if (newState == AgentTransferState.Transferring && oldState == AgentTransferState.Preparing) | ||
136 | transitionOkay = true; | ||
137 | else if (newState == AgentTransferState.ReceivedAtDestination && oldState == AgentTransferState.Transferring) | ||
138 | transitionOkay = true; | ||
139 | |||
140 | if (transitionOkay) | ||
141 | m_agentsInTransit[id] = newState; | ||
142 | else | ||
143 | throw new Exception( | ||
144 | string.Format( | ||
145 | "Agent with ID {0} is not allowed to move from old transit state {1} to new state {2} in {3}", | ||
146 | id, oldState, newState, m_mod.Scene.RegionInfo.RegionName)); | ||
147 | } | ||
148 | } | ||
149 | |||
150 | internal bool IsInTransit(UUID id) | ||
151 | { | ||
152 | lock (m_agentsInTransit) | ||
153 | return m_agentsInTransit.ContainsKey(id); | ||
154 | } | ||
155 | |||
156 | /// <summary> | ||
157 | /// Removes an agent from the transit state machine. | ||
158 | /// </summary> | ||
159 | /// <param name='id'></param> | ||
160 | /// <returns>true if the agent was flagged as being teleported when this method was called, false otherwise</returns> | ||
161 | internal bool ResetFromTransit(UUID id) | ||
162 | { | ||
163 | lock (m_agentsInTransit) | ||
164 | { | ||
165 | if (m_agentsInTransit.ContainsKey(id)) | ||
166 | { | ||
167 | AgentTransferState state = m_agentsInTransit[id]; | ||
168 | |||
169 | if (state == AgentTransferState.Transferring || state == AgentTransferState.ReceivedAtDestination) | ||
170 | { | ||
171 | // FIXME: For now, we allow exit from any state since a thrown exception in teleport is now guranteed | ||
172 | // to be handled properly - ResetFromTransit() could be invoked at any step along the process | ||
173 | m_log.WarnFormat( | ||
174 | "[ENTITY TRANSFER STATE MACHINE]: Agent with ID {0} should not exit directly from state {1}, should go to {2} state first in {3}", | ||
175 | id, state, AgentTransferState.CleaningUp, m_mod.Scene.RegionInfo.RegionName); | ||
176 | |||
177 | // throw new Exception( | ||
178 | // "Agent with ID {0} cannot exit directly from state {1}, it must go to {2} state first", | ||
179 | // state, AgentTransferState.CleaningUp); | ||
180 | } | ||
181 | |||
182 | m_agentsInTransit.Remove(id); | ||
183 | |||
184 | m_log.DebugFormat( | ||
185 | "[ENTITY TRANSFER STATE MACHINE]: Agent {0} cleared from transit in {1}", | ||
186 | id, m_mod.Scene.RegionInfo.RegionName); | ||
187 | |||
188 | return true; | ||
189 | } | ||
190 | } | ||
191 | |||
192 | m_log.WarnFormat( | ||
193 | "[ENTITY TRANSFER STATE MACHINE]: Agent {0} requested to clear from transit in {1} but was already cleared", | ||
194 | id, m_mod.Scene.RegionInfo.RegionName); | ||
195 | |||
196 | return false; | ||
197 | } | ||
198 | |||
199 | internal bool WaitForAgentArrivedAtDestination(UUID id) | ||
200 | { | ||
201 | if (!m_mod.WaitForAgentArrivedAtDestination) | ||
202 | return true; | ||
203 | |||
204 | lock (m_agentsInTransit) | ||
205 | { | ||
206 | if (!IsInTransit(id)) | ||
207 | throw new Exception( | ||
208 | string.Format( | ||
209 | "Asked to wait for destination callback for agent with ID {0} in {1} but agent is not in transit", | ||
210 | id, m_mod.Scene.RegionInfo.RegionName)); | ||
211 | |||
212 | AgentTransferState currentState = m_agentsInTransit[id]; | ||
213 | |||
214 | if (currentState != AgentTransferState.Transferring && currentState != AgentTransferState.ReceivedAtDestination) | ||
215 | throw new Exception( | ||
216 | string.Format( | ||
217 | "Asked to wait for destination callback for agent with ID {0} in {1} but agent is in state {2}", | ||
218 | id, m_mod.Scene.RegionInfo.RegionName, currentState)); | ||
219 | } | ||
220 | |||
221 | int count = 200; | ||
222 | |||
223 | // There should be no race condition here since no other code should be removing the agent transfer or | ||
224 | // changing the state to another other than Transferring => ReceivedAtDestination. | ||
225 | while (m_agentsInTransit[id] != AgentTransferState.ReceivedAtDestination && count-- > 0) | ||
226 | { | ||
227 | // m_log.Debug(" >>> Waiting... " + count); | ||
228 | Thread.Sleep(100); | ||
229 | } | ||
230 | |||
231 | return count > 0; | ||
232 | } | ||
233 | |||
234 | internal void SetAgentArrivedAtDestination(UUID id) | ||
235 | { | ||
236 | lock (m_agentsInTransit) | ||
237 | { | ||
238 | if (!m_agentsInTransit.ContainsKey(id)) | ||
239 | { | ||
240 | m_log.WarnFormat( | ||
241 | "[ENTITY TRANSFER STATE MACHINE]: Region {0} received notification of arrival in destination of agent {1} but no teleport request is active", | ||
242 | m_mod.Scene.RegionInfo.RegionName, id); | ||
243 | |||
244 | return; | ||
245 | } | ||
246 | |||
247 | AgentTransferState currentState = m_agentsInTransit[id]; | ||
248 | |||
249 | if (currentState == AgentTransferState.ReceivedAtDestination) | ||
250 | { | ||
251 | // An anomoly but don't make this an outright failure - destination region could be overzealous in sending notification. | ||
252 | m_log.WarnFormat( | ||
253 | "[ENTITY TRANSFER STATE MACHINE]: Region {0} received notification of arrival in destination of agent {1} but notification has already previously been received", | ||
254 | m_mod.Scene.RegionInfo.RegionName, id); | ||
255 | } | ||
256 | else if (currentState != AgentTransferState.Transferring) | ||
257 | { | ||
258 | m_log.ErrorFormat( | ||
259 | "[ENTITY TRANSFER STATE MACHINE]: Region {0} received notification of arrival in destination of agent {1} but agent is in state {2}", | ||
260 | m_mod.Scene.RegionInfo.RegionName, id, currentState); | ||
261 | |||
262 | return; | ||
263 | } | ||
264 | |||
265 | m_agentsInTransit[id] = AgentTransferState.ReceivedAtDestination; | ||
266 | } | ||
267 | } | ||
268 | } | ||
269 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index 8b5ad23..7e71fd1 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs | |||
@@ -45,11 +45,12 @@ using Nini.Config; | |||
45 | 45 | ||
46 | namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | 46 | namespace OpenSim.Region.CoreModules.Framework.EntityTransfer |
47 | { | 47 | { |
48 | public class HGEntityTransferModule : EntityTransferModule, ISharedRegionModule, IEntityTransferModule, IUserAgentVerificationModule | 48 | public class HGEntityTransferModule |
49 | : EntityTransferModule, INonSharedRegionModule, IEntityTransferModule, IUserAgentVerificationModule | ||
49 | { | 50 | { |
50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 51 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
51 | 52 | ||
52 | private bool m_Initialized = false; | 53 | private int m_levelHGTeleport = 0; |
53 | 54 | ||
54 | private GatekeeperServiceConnector m_GatekeeperConnector; | 55 | private GatekeeperServiceConnector m_GatekeeperConnector; |
55 | 56 | ||
@@ -63,11 +64,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
63 | public override void Initialise(IConfigSource source) | 64 | public override void Initialise(IConfigSource source) |
64 | { | 65 | { |
65 | IConfig moduleConfig = source.Configs["Modules"]; | 66 | IConfig moduleConfig = source.Configs["Modules"]; |
67 | |||
66 | if (moduleConfig != null) | 68 | if (moduleConfig != null) |
67 | { | 69 | { |
68 | string name = moduleConfig.GetString("EntityTransferModule", ""); | 70 | string name = moduleConfig.GetString("EntityTransferModule", ""); |
69 | if (name == Name) | 71 | if (name == Name) |
70 | { | 72 | { |
73 | IConfig transferConfig = source.Configs["EntityTransfer"]; | ||
74 | if (transferConfig != null) | ||
75 | m_levelHGTeleport = transferConfig.GetInt("LevelHGTeleport", 0); | ||
76 | |||
71 | InitialiseCommon(source); | 77 | InitialiseCommon(source); |
72 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name); | 78 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name); |
73 | } | 79 | } |
@@ -77,10 +83,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
77 | public override void AddRegion(Scene scene) | 83 | public override void AddRegion(Scene scene) |
78 | { | 84 | { |
79 | base.AddRegion(scene); | 85 | base.AddRegion(scene); |
86 | |||
80 | if (m_Enabled) | 87 | if (m_Enabled) |
81 | { | ||
82 | scene.RegisterModuleInterface<IUserAgentVerificationModule>(this); | 88 | scene.RegisterModuleInterface<IUserAgentVerificationModule>(this); |
83 | } | ||
84 | } | 89 | } |
85 | 90 | ||
86 | protected override void OnNewClient(IClientAPI client) | 91 | protected override void OnNewClient(IClientAPI client) |
@@ -93,33 +98,28 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
93 | public override void RegionLoaded(Scene scene) | 98 | public override void RegionLoaded(Scene scene) |
94 | { | 99 | { |
95 | base.RegionLoaded(scene); | 100 | base.RegionLoaded(scene); |
96 | if (m_Enabled) | ||
97 | if (!m_Initialized) | ||
98 | { | ||
99 | m_GatekeeperConnector = new GatekeeperServiceConnector(scene.AssetService); | ||
100 | m_Initialized = true; | ||
101 | |||
102 | } | ||
103 | 101 | ||
102 | if (m_Enabled) | ||
103 | m_GatekeeperConnector = new GatekeeperServiceConnector(scene.AssetService); | ||
104 | } | 104 | } |
105 | |||
105 | public override void RemoveRegion(Scene scene) | 106 | public override void RemoveRegion(Scene scene) |
106 | { | 107 | { |
107 | base.AddRegion(scene); | 108 | base.AddRegion(scene); |
109 | |||
108 | if (m_Enabled) | 110 | if (m_Enabled) |
109 | { | ||
110 | scene.UnregisterModuleInterface<IUserAgentVerificationModule>(this); | 111 | scene.UnregisterModuleInterface<IUserAgentVerificationModule>(this); |
111 | } | ||
112 | } | 112 | } |
113 | 113 | ||
114 | |||
115 | #endregion | 114 | #endregion |
116 | 115 | ||
117 | #region HG overrides of IEntiryTransferModule | 116 | #region HG overrides of IEntiryTransferModule |
118 | 117 | ||
119 | protected override GridRegion GetFinalDestination(GridRegion region) | 118 | protected override GridRegion GetFinalDestination(GridRegion region) |
120 | { | 119 | { |
121 | int flags = m_aScene.GridService.GetRegionFlags(m_aScene.RegionInfo.ScopeID, region.RegionID); | 120 | int flags = Scene.GridService.GetRegionFlags(Scene.RegionInfo.ScopeID, region.RegionID); |
122 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: region {0} flags: {1}", region.RegionID, flags); | 121 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: region {0} flags: {1}", region.RegionID, flags); |
122 | |||
123 | if ((flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) | 123 | if ((flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) |
124 | { | 124 | { |
125 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Destination region {0} is hyperlink", region.RegionID); | 125 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Destination region {0} is hyperlink", region.RegionID); |
@@ -130,6 +130,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
130 | m_log.WarnFormat("[HG ENTITY TRANSFER MODULE]: GetHyperlinkRegion to Gatekeeper {0} failed", region.ServerURI); | 130 | m_log.WarnFormat("[HG ENTITY TRANSFER MODULE]: GetHyperlinkRegion to Gatekeeper {0} failed", region.ServerURI); |
131 | return real_destination; | 131 | return real_destination; |
132 | } | 132 | } |
133 | |||
133 | return region; | 134 | return region; |
134 | } | 135 | } |
135 | 136 | ||
@@ -138,7 +139,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
138 | if (base.NeedsClosing(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) | 139 | if (base.NeedsClosing(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) |
139 | return true; | 140 | return true; |
140 | 141 | ||
141 | int flags = m_aScene.GridService.GetRegionFlags(m_aScene.RegionInfo.ScopeID, reg.RegionID); | 142 | int flags = Scene.GridService.GetRegionFlags(Scene.RegionInfo.ScopeID, reg.RegionID); |
142 | if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) | 143 | if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) |
143 | return true; | 144 | return true; |
144 | 145 | ||
@@ -151,7 +152,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
151 | if (logout) | 152 | if (logout) |
152 | { | 153 | { |
153 | // Log them out of this grid | 154 | // Log them out of this grid |
154 | m_aScene.PresenceService.LogoutAgent(sp.ControllingClient.SessionId); | 155 | Scene.PresenceService.LogoutAgent(sp.ControllingClient.SessionId); |
155 | } | 156 | } |
156 | } | 157 | } |
157 | 158 | ||
@@ -160,10 +161,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
160 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: CreateAgent {0} {1}", reg.ServerURI, finalDestination.ServerURI); | 161 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: CreateAgent {0} {1}", reg.ServerURI, finalDestination.ServerURI); |
161 | reason = string.Empty; | 162 | reason = string.Empty; |
162 | logout = false; | 163 | logout = false; |
163 | int flags = m_aScene.GridService.GetRegionFlags(m_aScene.RegionInfo.ScopeID, reg.RegionID); | 164 | int flags = Scene.GridService.GetRegionFlags(Scene.RegionInfo.ScopeID, reg.RegionID); |
164 | if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) | 165 | if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) |
165 | { | 166 | { |
166 | // this user is going to another grid | 167 | // this user is going to another grid |
168 | // check if HyperGrid teleport is allowed, based on user level | ||
169 | if (sp.UserLevel < m_levelHGTeleport) | ||
170 | { | ||
171 | m_log.WarnFormat("[HG ENTITY TRANSFER MODULE]: Unable to HG teleport agent due to insufficient UserLevel."); | ||
172 | reason = "Hypergrid teleport not allowed"; | ||
173 | return false; | ||
174 | } | ||
175 | |||
167 | if (agentCircuit.ServiceURLs.ContainsKey("HomeURI")) | 176 | if (agentCircuit.ServiceURLs.ContainsKey("HomeURI")) |
168 | { | 177 | { |
169 | string userAgentDriver = agentCircuit.ServiceURLs["HomeURI"].ToString(); | 178 | string userAgentDriver = agentCircuit.ServiceURLs["HomeURI"].ToString(); |
@@ -193,10 +202,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
193 | 202 | ||
194 | public override bool TeleportHome(UUID id, IClientAPI client) | 203 | public override bool TeleportHome(UUID id, IClientAPI client) |
195 | { | 204 | { |
196 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName); | 205 | m_log.DebugFormat( |
206 | "[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.Name, client.AgentId); | ||
197 | 207 | ||
198 | // Let's find out if this is a foreign user or a local user | 208 | // Let's find out if this is a foreign user or a local user |
199 | IUserManagement uMan = m_aScene.RequestModuleInterface<IUserManagement>(); | 209 | IUserManagement uMan = Scene.RequestModuleInterface<IUserManagement>(); |
200 | if (uMan != null && uMan.IsLocalGridUser(id)) | 210 | if (uMan != null && uMan.IsLocalGridUser(id)) |
201 | { | 211 | { |
202 | // local grid user | 212 | // local grid user |
@@ -232,13 +242,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
232 | return false; | 242 | return false; |
233 | } | 243 | } |
234 | 244 | ||
235 | IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>(); | ||
236 | GridRegion homeGatekeeper = MakeRegion(aCircuit); | 245 | GridRegion homeGatekeeper = MakeRegion(aCircuit); |
237 | 246 | ||
238 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: teleporting user {0} {1} home to {2} via {3}:{4}", | 247 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: teleporting user {0} {1} home to {2} via {3}:{4}", |
239 | aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ServerURI, homeGatekeeper.RegionName); | 248 | aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ServerURI, homeGatekeeper.RegionName); |
240 | 249 | ||
241 | DoTeleport(sp, homeGatekeeper, finalDestination, position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome), eq); | 250 | DoTeleport(sp, homeGatekeeper, finalDestination, position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome)); |
242 | return true; | 251 | return true; |
243 | } | 252 | } |
244 | 253 | ||
@@ -252,19 +261,21 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
252 | { | 261 | { |
253 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Teleporting agent via landmark to {0} region {1} position {2}", | 262 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Teleporting agent via landmark to {0} region {1} position {2}", |
254 | (lm.Gatekeeper == string.Empty) ? "local" : lm.Gatekeeper, lm.RegionID, lm.Position); | 263 | (lm.Gatekeeper == string.Empty) ? "local" : lm.Gatekeeper, lm.RegionID, lm.Position); |
264 | |||
255 | if (lm.Gatekeeper == string.Empty) | 265 | if (lm.Gatekeeper == string.Empty) |
256 | { | 266 | { |
257 | base.RequestTeleportLandmark(remoteClient, lm); | 267 | base.RequestTeleportLandmark(remoteClient, lm); |
258 | return; | 268 | return; |
259 | } | 269 | } |
260 | 270 | ||
261 | GridRegion info = m_aScene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID); | 271 | GridRegion info = Scene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID); |
262 | 272 | ||
263 | // Local region? | 273 | // Local region? |
264 | if (info != null) | 274 | if (info != null) |
265 | { | 275 | { |
266 | ((Scene)(remoteClient.Scene)).RequestTeleportLocation(remoteClient, info.RegionHandle, lm.Position, | 276 | ((Scene)(remoteClient.Scene)).RequestTeleportLocation(remoteClient, info.RegionHandle, lm.Position, |
267 | Vector3.Zero, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaLandmark)); | 277 | Vector3.Zero, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaLandmark)); |
278 | |||
268 | return; | 279 | return; |
269 | } | 280 | } |
270 | else | 281 | else |
@@ -275,21 +286,22 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
275 | GridRegion gatekeeper = new GridRegion(); | 286 | GridRegion gatekeeper = new GridRegion(); |
276 | gatekeeper.ServerURI = lm.Gatekeeper; | 287 | gatekeeper.ServerURI = lm.Gatekeeper; |
277 | GridRegion finalDestination = gConn.GetHyperlinkRegion(gatekeeper, new UUID(lm.RegionID)); | 288 | GridRegion finalDestination = gConn.GetHyperlinkRegion(gatekeeper, new UUID(lm.RegionID)); |
289 | |||
278 | if (finalDestination != null) | 290 | if (finalDestination != null) |
279 | { | 291 | { |
280 | ScenePresence sp = scene.GetScenePresence(remoteClient.AgentId); | 292 | ScenePresence sp = scene.GetScenePresence(remoteClient.AgentId); |
281 | IEntityTransferModule transferMod = scene.RequestModuleInterface<IEntityTransferModule>(); | 293 | IEntityTransferModule transferMod = scene.RequestModuleInterface<IEntityTransferModule>(); |
282 | IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>(); | 294 | |
283 | if (transferMod != null && sp != null && eq != null) | 295 | if (transferMod != null && sp != null) |
284 | transferMod.DoTeleport(sp, gatekeeper, finalDestination, lm.Position, | 296 | transferMod.DoTeleport( |
285 | Vector3.UnitX, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaLandmark), eq); | 297 | sp, gatekeeper, finalDestination, lm.Position, Vector3.UnitX, |
298 | (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaLandmark)); | ||
286 | } | 299 | } |
287 | 300 | ||
288 | } | 301 | } |
289 | 302 | ||
290 | // can't find the region: Tell viewer and abort | 303 | // can't find the region: Tell viewer and abort |
291 | remoteClient.SendTeleportFailed("The teleport destination could not be found."); | 304 | remoteClient.SendTeleportFailed("The teleport destination could not be found."); |
292 | |||
293 | } | 305 | } |
294 | 306 | ||
295 | #endregion | 307 | #endregion |
@@ -304,8 +316,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
304 | IUserAgentService security = new UserAgentServiceConnector(url); | 316 | IUserAgentService security = new UserAgentServiceConnector(url); |
305 | return security.VerifyClient(aCircuit.SessionID, token); | 317 | return security.VerifyClient(aCircuit.SessionID, token); |
306 | } | 318 | } |
307 | else | 319 | else |
308 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent {0} {1} does not have a HomeURI OH NO!", aCircuit.firstname, aCircuit.lastname); | 320 | { |
321 | m_log.DebugFormat( | ||
322 | "[HG ENTITY TRANSFER MODULE]: Agent {0} {1} does not have a HomeURI OH NO!", | ||
323 | aCircuit.firstname, aCircuit.lastname); | ||
324 | } | ||
309 | 325 | ||
310 | return false; | 326 | return false; |
311 | } | 327 | } |
@@ -322,8 +338,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
322 | } | 338 | } |
323 | 339 | ||
324 | // Let's find out if this is a foreign user or a local user | 340 | // Let's find out if this is a foreign user or a local user |
325 | IUserManagement uMan = m_aScene.RequestModuleInterface<IUserManagement>(); | 341 | IUserManagement uMan = Scene.RequestModuleInterface<IUserManagement>(); |
326 | UserAccount account = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, obj.AgentId); | 342 | // UserAccount account = Scene.UserAccountService.GetUserAccount(Scene.RegionInfo.ScopeID, obj.AgentId); |
327 | if (uMan != null && uMan.IsLocalGridUser(obj.AgentId)) | 343 | if (uMan != null && uMan.IsLocalGridUser(obj.AgentId)) |
328 | { | 344 | { |
329 | // local grid user | 345 | // local grid user |
@@ -346,7 +362,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
346 | 362 | ||
347 | #endregion | 363 | #endregion |
348 | 364 | ||
349 | |||
350 | private GridRegion MakeRegion(AgentCircuitData aCircuit) | 365 | private GridRegion MakeRegion(AgentCircuitData aCircuit) |
351 | { | 366 | { |
352 | GridRegion region = new GridRegion(); | 367 | GridRegion region = new GridRegion(); |
@@ -363,6 +378,5 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
363 | region.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), (int)0); | 378 | region.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), (int)0); |
364 | return region; | 379 | return region; |
365 | } | 380 | } |
366 | |||
367 | } | 381 | } |
368 | } | 382 | } \ No newline at end of file |
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs index a71584a..cf72b58 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs | |||
@@ -364,8 +364,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
364 | { | 364 | { |
365 | m_log.DebugFormat("[HG INVENTORY ACCESS MODULE]: Changing root inventory for user {0}", client.Name); | 365 | m_log.DebugFormat("[HG INVENTORY ACCESS MODULE]: Changing root inventory for user {0}", client.Name); |
366 | InventoryCollection content = m_Scene.InventoryService.GetFolderContent(client.AgentId, root.ID); | 366 | InventoryCollection content = m_Scene.InventoryService.GetFolderContent(client.AgentId, root.ID); |
367 | List<UUID> fids = new List<UUID>(); | 367 | |
368 | List<UUID> iids = new List<UUID>(); | ||
369 | List<InventoryFolderBase> keep = new List<InventoryFolderBase>(); | 368 | List<InventoryFolderBase> keep = new List<InventoryFolderBase>(); |
370 | 369 | ||
371 | foreach (InventoryFolderBase f in content.Folders) | 370 | foreach (InventoryFolderBase f in content.Folders) |
@@ -395,4 +394,4 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
395 | 394 | ||
396 | #endregion | 395 | #endregion |
397 | } | 396 | } |
398 | } | 397 | } \ No newline at end of file |
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index ee9961f..d30c2e2 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs | |||
@@ -175,7 +175,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
175 | sbyte assetType, | 175 | sbyte assetType, |
176 | byte wearableType, uint nextOwnerMask, int creationDate) | 176 | byte wearableType, uint nextOwnerMask, int creationDate) |
177 | { | 177 | { |
178 | m_log.DebugFormat("[AGENT INVENTORY]: Received request to create inventory item {0} in folder {1}", name, folderID); | 178 | m_log.DebugFormat("[INVENTORY ACCESS MODULE]: Received request to create inventory item {0} in folder {1}", name, folderID); |
179 | 179 | ||
180 | if (!m_Scene.Permissions.CanCreateUserInventory(invType, remoteClient.AgentId)) | 180 | if (!m_Scene.Permissions.CanCreateUserInventory(invType, remoteClient.AgentId)) |
181 | return; | 181 | return; |
@@ -210,13 +210,13 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
210 | else | 210 | else |
211 | { | 211 | { |
212 | m_log.ErrorFormat( | 212 | m_log.ErrorFormat( |
213 | "ScenePresence for agent uuid {0} unexpectedly not found in CreateNewInventoryItem", | 213 | "[INVENTORY ACCESS MODULE]: ScenePresence for agent uuid {0} unexpectedly not found in CreateNewInventoryItem", |
214 | remoteClient.AgentId); | 214 | remoteClient.AgentId); |
215 | } | 215 | } |
216 | } | 216 | } |
217 | else | 217 | else |
218 | { | 218 | { |
219 | IAgentAssetTransactions agentTransactions = m_Scene.RequestModuleInterface<IAgentAssetTransactions>(); | 219 | IAgentAssetTransactions agentTransactions = m_Scene.AgentTransactionsModule; |
220 | if (agentTransactions != null) | 220 | if (agentTransactions != null) |
221 | { | 221 | { |
222 | agentTransactions.HandleItemCreationFromTransaction( | 222 | agentTransactions.HandleItemCreationFromTransaction( |
@@ -288,16 +288,19 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
288 | else | 288 | else |
289 | { | 289 | { |
290 | m_log.ErrorFormat( | 290 | m_log.ErrorFormat( |
291 | "[AGENT INVENTORY]: Could not find item {0} for caps inventory update", | 291 | "[INVENTORY ACCESS MODULE]: Could not find item {0} for caps inventory update", |
292 | itemID); | 292 | itemID); |
293 | } | 293 | } |
294 | 294 | ||
295 | return UUID.Zero; | 295 | return UUID.Zero; |
296 | } | 296 | } |
297 | 297 | ||
298 | public virtual UUID CopyToInventory(DeRezAction action, UUID folderID, | 298 | public virtual List<InventoryItemBase> CopyToInventory( |
299 | List<SceneObjectGroup> objectGroups, IClientAPI remoteClient) | 299 | DeRezAction action, UUID folderID, |
300 | List<SceneObjectGroup> objectGroups, IClientAPI remoteClient, bool asAttachment) | ||
300 | { | 301 | { |
302 | List<InventoryItemBase> copiedItems = new List<InventoryItemBase>(); | ||
303 | |||
301 | Dictionary<UUID, List<SceneObjectGroup>> bundlesToCopy = new Dictionary<UUID, List<SceneObjectGroup>>(); | 304 | Dictionary<UUID, List<SceneObjectGroup>> bundlesToCopy = new Dictionary<UUID, List<SceneObjectGroup>>(); |
302 | 305 | ||
303 | if (CoalesceMultipleObjectsToInventory) | 306 | if (CoalesceMultipleObjectsToInventory) |
@@ -324,16 +327,16 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
324 | } | 327 | } |
325 | } | 328 | } |
326 | 329 | ||
327 | // This is method scoped and will be returned. It will be the | 330 | // m_log.DebugFormat( |
328 | // last created asset id | 331 | // "[INVENTORY ACCESS MODULE]: Copying {0} object bundles to folder {1} action {2} for {3}", |
329 | UUID assetID = UUID.Zero; | 332 | // bundlesToCopy.Count, folderID, action, remoteClient.Name); |
330 | 333 | ||
331 | // Each iteration is really a separate asset being created, | 334 | // Each iteration is really a separate asset being created, |
332 | // with distinct destinations as well. | 335 | // with distinct destinations as well. |
333 | foreach (List<SceneObjectGroup> bundle in bundlesToCopy.Values) | 336 | foreach (List<SceneObjectGroup> bundle in bundlesToCopy.Values) |
334 | assetID = CopyBundleToInventory(action, folderID, bundle, remoteClient); | 337 | copiedItems.Add(CopyBundleToInventory(action, folderID, bundle, remoteClient, asAttachment)); |
335 | 338 | ||
336 | return assetID; | 339 | return copiedItems; |
337 | } | 340 | } |
338 | 341 | ||
339 | /// <summary> | 342 | /// <summary> |
@@ -344,12 +347,13 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
344 | /// <param name="folderID"></param> | 347 | /// <param name="folderID"></param> |
345 | /// <param name="objlist"></param> | 348 | /// <param name="objlist"></param> |
346 | /// <param name="remoteClient"></param> | 349 | /// <param name="remoteClient"></param> |
347 | /// <returns></returns> | 350 | /// <param name="asAttachment">Should be true if the bundle is being copied as an attachment. This prevents |
348 | protected UUID CopyBundleToInventory( | 351 | /// attempted serialization of any script state which would abort any operating scripts.</param> |
349 | DeRezAction action, UUID folderID, List<SceneObjectGroup> objlist, IClientAPI remoteClient) | 352 | /// <returns>The inventory item created by the copy</returns> |
353 | protected InventoryItemBase CopyBundleToInventory( | ||
354 | DeRezAction action, UUID folderID, List<SceneObjectGroup> objlist, IClientAPI remoteClient, | ||
355 | bool asAttachment) | ||
350 | { | 356 | { |
351 | UUID assetID = UUID.Zero; | ||
352 | |||
353 | CoalescedSceneObjects coa = new CoalescedSceneObjects(UUID.Zero); | 357 | CoalescedSceneObjects coa = new CoalescedSceneObjects(UUID.Zero); |
354 | Dictionary<UUID, Vector3> originalPositions = new Dictionary<UUID, Vector3>(); | 358 | Dictionary<UUID, Vector3> originalPositions = new Dictionary<UUID, Vector3>(); |
355 | 359 | ||
@@ -401,18 +405,27 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
401 | 405 | ||
402 | string itemXml; | 406 | string itemXml; |
403 | 407 | ||
408 | // If we're being called from a script, then trying to serialize that same script's state will not complete | ||
409 | // in any reasonable time period. Therefore, we'll avoid it. The worst that can happen is that if | ||
410 | // the client/server crashes rather than logging out normally, the attachment's scripts will resume | ||
411 | // without state on relog. Arguably, this is what we want anyway. | ||
404 | if (objlist.Count > 1) | 412 | if (objlist.Count > 1) |
405 | itemXml = CoalescedSceneObjectsSerializer.ToXml(coa); | 413 | itemXml = CoalescedSceneObjectsSerializer.ToXml(coa, !asAttachment); |
406 | else | 414 | else |
407 | itemXml = SceneObjectSerializer.ToOriginalXmlFormat(objlist[0]); | 415 | itemXml = SceneObjectSerializer.ToOriginalXmlFormat(objlist[0], !asAttachment); |
408 | 416 | ||
409 | // Restore the position of each group now that it has been stored to inventory. | 417 | // Restore the position of each group now that it has been stored to inventory. |
410 | foreach (SceneObjectGroup objectGroup in objlist) | 418 | foreach (SceneObjectGroup objectGroup in objlist) |
411 | objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID]; | 419 | objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID]; |
412 | 420 | ||
413 | InventoryItemBase item = CreateItemForObject(action, remoteClient, objlist[0], folderID); | 421 | InventoryItemBase item = CreateItemForObject(action, remoteClient, objlist[0], folderID); |
422 | |||
423 | // m_log.DebugFormat( | ||
424 | // "[INVENTORY ACCESS MODULE]: Created item is {0}", | ||
425 | // item != null ? item.ID.ToString() : "NULL"); | ||
426 | |||
414 | if (item == null) | 427 | if (item == null) |
415 | return UUID.Zero; | 428 | return null; |
416 | 429 | ||
417 | // Can't know creator is the same, so null it in inventory | 430 | // Can't know creator is the same, so null it in inventory |
418 | if (objlist.Count > 1) | 431 | if (objlist.Count > 1) |
@@ -422,7 +435,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
422 | } | 435 | } |
423 | else | 436 | else |
424 | { | 437 | { |
425 | item.CreatorId = objlist[0].RootPart.CreatorID.ToString(); | 438 | item.CreatorId = objlist[0].RootPart.CreatorID.ToString(); |
439 | item.CreatorData = objlist[0].RootPart.CreatorData; | ||
426 | item.SaleType = objlist[0].RootPart.ObjectSaleType; | 440 | item.SaleType = objlist[0].RootPart.ObjectSaleType; |
427 | item.SalePrice = objlist[0].RootPart.SalePrice; | 441 | item.SalePrice = objlist[0].RootPart.SalePrice; |
428 | } | 442 | } |
@@ -435,8 +449,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
435 | objlist[0].OwnerID.ToString()); | 449 | objlist[0].OwnerID.ToString()); |
436 | m_Scene.AssetService.Store(asset); | 450 | m_Scene.AssetService.Store(asset); |
437 | 451 | ||
438 | item.AssetID = asset.FullID; | 452 | item.AssetID = asset.FullID; |
439 | assetID = asset.FullID; | ||
440 | 453 | ||
441 | if (DeRezAction.SaveToExistingUserInventoryItem == action) | 454 | if (DeRezAction.SaveToExistingUserInventoryItem == action) |
442 | { | 455 | { |
@@ -469,9 +482,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
469 | 482 | ||
470 | // This is a hook to do some per-asset post-processing for subclasses that need that | 483 | // This is a hook to do some per-asset post-processing for subclasses that need that |
471 | if (remoteClient != null) | 484 | if (remoteClient != null) |
472 | ExportAsset(remoteClient.AgentId, assetID); | 485 | ExportAsset(remoteClient.AgentId, asset.FullID); |
473 | 486 | ||
474 | return assetID; | 487 | return item; |
475 | } | 488 | } |
476 | 489 | ||
477 | protected virtual void ExportAsset(UUID agentID, UUID assetID) | 490 | protected virtual void ExportAsset(UUID agentID, UUID assetID) |
@@ -617,7 +630,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
617 | if (null == item) | 630 | if (null == item) |
618 | { | 631 | { |
619 | m_log.DebugFormat( | 632 | m_log.DebugFormat( |
620 | "[AGENT INVENTORY]: Object {0} {1} scheduled for save to inventory has already been deleted.", | 633 | "[INVENTORY ACCESS MODULE]: Object {0} {1} scheduled for save to inventory has already been deleted.", |
621 | so.Name, so.UUID); | 634 | so.Name, so.UUID); |
622 | 635 | ||
623 | return null; | 636 | return null; |
@@ -668,7 +681,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
668 | { | 681 | { |
669 | // Catch all. Use lost & found | 682 | // Catch all. Use lost & found |
670 | // | 683 | // |
671 | |||
672 | folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); | 684 | folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); |
673 | } | 685 | } |
674 | } | 686 | } |
@@ -718,7 +730,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
718 | 730 | ||
719 | if (item == null) | 731 | if (item == null) |
720 | { | 732 | { |
721 | |||
722 | return null; | 733 | return null; |
723 | } | 734 | } |
724 | 735 | ||
@@ -748,7 +759,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
748 | else | 759 | else |
749 | { | 760 | { |
750 | m_log.WarnFormat( | 761 | m_log.WarnFormat( |
751 | "[InventoryAccessModule]: Could not find asset {0} for {1} in RezObject()", | 762 | "[INVENTORY ACCESS MODULE]: Could not find asset {0} for {1} in RezObject()", |
752 | assetID, remoteClient.Name); | 763 | assetID, remoteClient.Name); |
753 | } | 764 | } |
754 | 765 | ||
@@ -859,7 +870,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
859 | SceneObjectPart rootPart = group.RootPart; | 870 | SceneObjectPart rootPart = group.RootPart; |
860 | 871 | ||
861 | // m_log.DebugFormat( | 872 | // m_log.DebugFormat( |
862 | // "[InventoryAccessModule]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", | 873 | // "[INVENTORY ACCESS MODULE]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", |
863 | // group.Name, group.LocalId, group.UUID, | 874 | // group.Name, group.LocalId, group.UUID, |
864 | // group.RootPart.OwnerMask, group.RootPart.NextOwnerMask, group.RootPart.GroupMask, group.RootPart.EveryoneMask, | 875 | // group.RootPart.OwnerMask, group.RootPart.NextOwnerMask, group.RootPart.GroupMask, group.RootPart.EveryoneMask, |
865 | // remoteClient.Name); | 876 | // remoteClient.Name); |
@@ -867,7 +878,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
867 | // Vector3 storedPosition = group.AbsolutePosition; | 878 | // Vector3 storedPosition = group.AbsolutePosition; |
868 | if (group.UUID == UUID.Zero) | 879 | if (group.UUID == UUID.Zero) |
869 | { | 880 | { |
870 | m_log.Debug("[InventoryAccessModule]: Object has UUID.Zero! Position 3"); | 881 | m_log.Debug("[INVENTORY ACCESS MODULE]: Object has UUID.Zero! Position 3"); |
871 | } | 882 | } |
872 | 883 | ||
873 | foreach (SceneObjectPart part in group.Parts) | 884 | foreach (SceneObjectPart part in group.Parts) |
@@ -928,7 +939,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
928 | } | 939 | } |
929 | 940 | ||
930 | // m_log.DebugFormat( | 941 | // m_log.DebugFormat( |
931 | // "[InventoryAccessModule]: Rezzed {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", | 942 | // "[INVENTORY ACCESS MODULE]: Rezzed {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", |
932 | // group.Name, group.LocalId, group.UUID, | 943 | // group.Name, group.LocalId, group.UUID, |
933 | // group.RootPart.OwnerMask, group.RootPart.NextOwnerMask, group.RootPart.GroupMask, group.RootPart.EveryoneMask, | 944 | // group.RootPart.OwnerMask, group.RootPart.NextOwnerMask, group.RootPart.GroupMask, group.RootPart.EveryoneMask, |
934 | // remoteClient.Name); | 945 | // remoteClient.Name); |
@@ -1023,8 +1034,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
1023 | 1034 | ||
1024 | so.FromFolderID = item.Folder; | 1035 | so.FromFolderID = item.Folder; |
1025 | 1036 | ||
1026 | // Console.WriteLine("rootPart.OwnedID {0}, item.Owner {1}, item.CurrentPermissions {2:X}", | 1037 | // m_log.DebugFormat( |
1027 | // rootPart.OwnerID, item.Owner, item.CurrentPermissions); | 1038 | // "[INVENTORY ACCESS MODULE]: rootPart.OwnedID {0}, item.Owner {1}, item.CurrentPermissions {2:X}", |
1039 | // rootPart.OwnerID, item.Owner, item.CurrentPermissions); | ||
1028 | 1040 | ||
1029 | if ((rootPart.OwnerID != item.Owner) || | 1041 | if ((rootPart.OwnerID != item.Owner) || |
1030 | (item.CurrentPermissions & 16) != 0 || | 1042 | (item.CurrentPermissions & 16) != 0 || |
@@ -1160,7 +1172,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
1160 | if (assetRequestItem.AssetID != requestID) | 1172 | if (assetRequestItem.AssetID != requestID) |
1161 | { | 1173 | { |
1162 | m_log.WarnFormat( | 1174 | m_log.WarnFormat( |
1163 | "[CLIENT]: {0} requested asset {1} from item {2} but this does not match item's asset {3}", | 1175 | "[INVENTORY ACCESS MODULE]: {0} requested asset {1} from item {2} but this does not match item's asset {3}", |
1164 | Name, requestID, itemID, assetRequestItem.AssetID); | 1176 | Name, requestID, itemID, assetRequestItem.AssetID); |
1165 | 1177 | ||
1166 | return false; | 1178 | return false; |
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/Tests/InventoryAccessModuleTests.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/Tests/InventoryAccessModuleTests.cs index e74310c..21d8bd7 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/Tests/InventoryAccessModuleTests.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/Tests/InventoryAccessModuleTests.cs | |||
@@ -64,8 +64,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess.Tests | |||
64 | IConfigSource config = new IniConfigSource(); | 64 | IConfigSource config = new IniConfigSource(); |
65 | config.AddConfig("Modules"); | 65 | config.AddConfig("Modules"); |
66 | config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule"); | 66 | config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule"); |
67 | 67 | ||
68 | m_scene = SceneHelpers.SetupScene(); | 68 | SceneHelpers sceneHelpers = new SceneHelpers(); |
69 | m_scene = sceneHelpers.SetupScene(); | ||
69 | SceneHelpers.SetupSceneModules(m_scene, config, m_iam); | 70 | SceneHelpers.SetupSceneModules(m_scene, config, m_iam); |
70 | 71 | ||
71 | // Create user | 72 | // Create user |
@@ -76,7 +77,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess.Tests | |||
76 | 77 | ||
77 | AgentCircuitData acd = new AgentCircuitData(); | 78 | AgentCircuitData acd = new AgentCircuitData(); |
78 | acd.AgentID = m_userId; | 79 | acd.AgentID = m_userId; |
79 | m_tc = new TestClient(acd, m_scene); | 80 | m_tc = new TestClient(acd, m_scene); |
80 | } | 81 | } |
81 | 82 | ||
82 | [Test] | 83 | [Test] |
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs index 7f8271d..4a8c369 100644 --- a/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs +++ b/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs | |||
@@ -49,7 +49,16 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
49 | public bool Enabled { get; private set; } | 49 | public bool Enabled { get; private set; } |
50 | 50 | ||
51 | private Scene m_scene; | 51 | private Scene m_scene; |
52 | private readonly List<IMonitor> m_monitors = new List<IMonitor>(); | 52 | |
53 | /// <summary> | ||
54 | /// These are monitors where we know the static details in advance. | ||
55 | /// </summary> | ||
56 | /// <remarks> | ||
57 | /// Dynamic monitors also exist (we don't know any of the details of what stats we get back here) | ||
58 | /// but these are currently hardcoded. | ||
59 | /// </remarks> | ||
60 | private readonly List<IMonitor> m_staticMonitors = new List<IMonitor>(); | ||
61 | |||
53 | private readonly List<IAlert> m_alerts = new List<IAlert>(); | 62 | private readonly List<IAlert> m_alerts = new List<IAlert>(); |
54 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 63 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
55 | 64 | ||
@@ -84,9 +93,18 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
84 | 93 | ||
85 | public void DebugMonitors(string module, string[] args) | 94 | public void DebugMonitors(string module, string[] args) |
86 | { | 95 | { |
87 | foreach (IMonitor monitor in m_monitors) | 96 | foreach (IMonitor monitor in m_staticMonitors) |
88 | { | 97 | { |
89 | m_log.Info("[MonitorModule]: " + m_scene.RegionInfo.RegionName + " reports " + monitor.GetFriendlyName() + " = " + monitor.GetFriendlyValue()); | 98 | m_log.InfoFormat( |
99 | "[MONITOR MODULE]: {0} reports {1} = {2}", | ||
100 | m_scene.RegionInfo.RegionName, monitor.GetFriendlyName(), monitor.GetFriendlyValue()); | ||
101 | } | ||
102 | |||
103 | foreach (KeyValuePair<string, float> tuple in m_scene.StatsReporter.GetExtraSimStats()) | ||
104 | { | ||
105 | m_log.InfoFormat( | ||
106 | "[MONITOR MODULE]: {0} reports {1} = {2}", | ||
107 | m_scene.RegionInfo.RegionName, tuple.Key, tuple.Value); | ||
90 | } | 108 | } |
91 | } | 109 | } |
92 | 110 | ||
@@ -106,11 +124,12 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
106 | { | 124 | { |
107 | string monID = (string) request["monitor"]; | 125 | string monID = (string) request["monitor"]; |
108 | 126 | ||
109 | foreach (IMonitor monitor in m_monitors) | 127 | foreach (IMonitor monitor in m_staticMonitors) |
110 | { | 128 | { |
111 | string elemName = monitor.ToString(); | 129 | string elemName = monitor.ToString(); |
112 | if (elemName.StartsWith(monitor.GetType().Namespace)) | 130 | if (elemName.StartsWith(monitor.GetType().Namespace)) |
113 | elemName = elemName.Substring(monitor.GetType().Namespace.Length + 1); | 131 | elemName = elemName.Substring(monitor.GetType().Namespace.Length + 1); |
132 | |||
114 | if (elemName == monID || monitor.ToString() == monID) | 133 | if (elemName == monID || monitor.ToString() == monID) |
115 | { | 134 | { |
116 | Hashtable ereply3 = new Hashtable(); | 135 | Hashtable ereply3 = new Hashtable(); |
@@ -123,6 +142,9 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
123 | } | 142 | } |
124 | } | 143 | } |
125 | 144 | ||
145 | // FIXME: Arguably this should also be done with dynamic monitors but I'm not sure what the above code | ||
146 | // is even doing. Why are we inspecting the type of the monitor??? | ||
147 | |||
126 | // No monitor with that name | 148 | // No monitor with that name |
127 | Hashtable ereply2 = new Hashtable(); | 149 | Hashtable ereply2 = new Hashtable(); |
128 | 150 | ||
@@ -134,12 +156,18 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
134 | } | 156 | } |
135 | 157 | ||
136 | string xml = "<data>"; | 158 | string xml = "<data>"; |
137 | foreach (IMonitor monitor in m_monitors) | 159 | foreach (IMonitor monitor in m_staticMonitors) |
138 | { | 160 | { |
139 | string elemName = monitor.GetName(); | 161 | string elemName = monitor.GetName(); |
140 | xml += "<" + elemName + ">" + monitor.GetValue().ToString() + "</" + elemName + ">"; | 162 | xml += "<" + elemName + ">" + monitor.GetValue().ToString() + "</" + elemName + ">"; |
141 | // m_log.DebugFormat("[MONITOR MODULE]: {0} = {1}", elemName, monitor.GetValue()); | 163 | // m_log.DebugFormat("[MONITOR MODULE]: {0} = {1}", elemName, monitor.GetValue()); |
142 | } | 164 | } |
165 | |||
166 | foreach (KeyValuePair<string, float> tuple in m_scene.StatsReporter.GetExtraSimStats()) | ||
167 | { | ||
168 | xml += "<" + tuple.Key + ">" + tuple.Value + "</" + tuple.Key + ">"; | ||
169 | } | ||
170 | |||
143 | xml += "</data>"; | 171 | xml += "</data>"; |
144 | 172 | ||
145 | Hashtable ereply = new Hashtable(); | 173 | Hashtable ereply = new Hashtable(); |
@@ -156,20 +184,20 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
156 | if (!Enabled) | 184 | if (!Enabled) |
157 | return; | 185 | return; |
158 | 186 | ||
159 | m_monitors.Add(new AgentCountMonitor(m_scene)); | 187 | m_staticMonitors.Add(new AgentCountMonitor(m_scene)); |
160 | m_monitors.Add(new ChildAgentCountMonitor(m_scene)); | 188 | m_staticMonitors.Add(new ChildAgentCountMonitor(m_scene)); |
161 | m_monitors.Add(new GCMemoryMonitor()); | 189 | m_staticMonitors.Add(new GCMemoryMonitor()); |
162 | m_monitors.Add(new ObjectCountMonitor(m_scene)); | 190 | m_staticMonitors.Add(new ObjectCountMonitor(m_scene)); |
163 | m_monitors.Add(new PhysicsFrameMonitor(m_scene)); | 191 | m_staticMonitors.Add(new PhysicsFrameMonitor(m_scene)); |
164 | m_monitors.Add(new PhysicsUpdateFrameMonitor(m_scene)); | 192 | m_staticMonitors.Add(new PhysicsUpdateFrameMonitor(m_scene)); |
165 | m_monitors.Add(new PWSMemoryMonitor()); | 193 | m_staticMonitors.Add(new PWSMemoryMonitor()); |
166 | m_monitors.Add(new ThreadCountMonitor()); | 194 | m_staticMonitors.Add(new ThreadCountMonitor()); |
167 | m_monitors.Add(new TotalFrameMonitor(m_scene)); | 195 | m_staticMonitors.Add(new TotalFrameMonitor(m_scene)); |
168 | m_monitors.Add(new EventFrameMonitor(m_scene)); | 196 | m_staticMonitors.Add(new EventFrameMonitor(m_scene)); |
169 | m_monitors.Add(new LandFrameMonitor(m_scene)); | 197 | m_staticMonitors.Add(new LandFrameMonitor(m_scene)); |
170 | m_monitors.Add(new LastFrameTimeMonitor(m_scene)); | 198 | m_staticMonitors.Add(new LastFrameTimeMonitor(m_scene)); |
171 | 199 | ||
172 | m_monitors.Add( | 200 | m_staticMonitors.Add( |
173 | new GenericMonitor( | 201 | new GenericMonitor( |
174 | m_scene, | 202 | m_scene, |
175 | "TimeDilationMonitor", | 203 | "TimeDilationMonitor", |
@@ -177,7 +205,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
177 | m => m.Scene.StatsReporter.LastReportedSimStats[0], | 205 | m => m.Scene.StatsReporter.LastReportedSimStats[0], |
178 | m => m.GetValue().ToString())); | 206 | m => m.GetValue().ToString())); |
179 | 207 | ||
180 | m_monitors.Add( | 208 | m_staticMonitors.Add( |
181 | new GenericMonitor( | 209 | new GenericMonitor( |
182 | m_scene, | 210 | m_scene, |
183 | "SimFPSMonitor", | 211 | "SimFPSMonitor", |
@@ -185,7 +213,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
185 | m => m.Scene.StatsReporter.LastReportedSimStats[1], | 213 | m => m.Scene.StatsReporter.LastReportedSimStats[1], |
186 | m => string.Format("{0}", m.GetValue()))); | 214 | m => string.Format("{0}", m.GetValue()))); |
187 | 215 | ||
188 | m_monitors.Add( | 216 | m_staticMonitors.Add( |
189 | new GenericMonitor( | 217 | new GenericMonitor( |
190 | m_scene, | 218 | m_scene, |
191 | "PhysicsFPSMonitor", | 219 | "PhysicsFPSMonitor", |
@@ -193,7 +221,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
193 | m => m.Scene.StatsReporter.LastReportedSimStats[2], | 221 | m => m.Scene.StatsReporter.LastReportedSimStats[2], |
194 | m => string.Format("{0}", m.GetValue()))); | 222 | m => string.Format("{0}", m.GetValue()))); |
195 | 223 | ||
196 | m_monitors.Add( | 224 | m_staticMonitors.Add( |
197 | new GenericMonitor( | 225 | new GenericMonitor( |
198 | m_scene, | 226 | m_scene, |
199 | "AgentUpdatesPerSecondMonitor", | 227 | "AgentUpdatesPerSecondMonitor", |
@@ -201,15 +229,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
201 | m => m.Scene.StatsReporter.LastReportedSimStats[3], | 229 | m => m.Scene.StatsReporter.LastReportedSimStats[3], |
202 | m => string.Format("{0} per second", m.GetValue()))); | 230 | m => string.Format("{0} per second", m.GetValue()))); |
203 | 231 | ||
204 | m_monitors.Add( | 232 | m_staticMonitors.Add( |
205 | new GenericMonitor( | ||
206 | m_scene, | ||
207 | "ObjectUpdatesPerSecondMonitor", | ||
208 | "Object Updates", | ||
209 | m => m.Scene.StatsReporter.LastReportedObjectUpdates, | ||
210 | m => string.Format("{0} per second", m.GetValue()))); | ||
211 | |||
212 | m_monitors.Add( | ||
213 | new GenericMonitor( | 233 | new GenericMonitor( |
214 | m_scene, | 234 | m_scene, |
215 | "ActiveObjectCountMonitor", | 235 | "ActiveObjectCountMonitor", |
@@ -217,7 +237,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
217 | m => m.Scene.StatsReporter.LastReportedSimStats[7], | 237 | m => m.Scene.StatsReporter.LastReportedSimStats[7], |
218 | m => string.Format("{0}", m.GetValue()))); | 238 | m => string.Format("{0}", m.GetValue()))); |
219 | 239 | ||
220 | m_monitors.Add( | 240 | m_staticMonitors.Add( |
221 | new GenericMonitor( | 241 | new GenericMonitor( |
222 | m_scene, | 242 | m_scene, |
223 | "ActiveScriptsMonitor", | 243 | "ActiveScriptsMonitor", |
@@ -225,7 +245,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
225 | m => m.Scene.StatsReporter.LastReportedSimStats[19], | 245 | m => m.Scene.StatsReporter.LastReportedSimStats[19], |
226 | m => string.Format("{0}", m.GetValue()))); | 246 | m => string.Format("{0}", m.GetValue()))); |
227 | 247 | ||
228 | m_monitors.Add( | 248 | m_staticMonitors.Add( |
229 | new GenericMonitor( | 249 | new GenericMonitor( |
230 | m_scene, | 250 | m_scene, |
231 | "ScriptEventsPerSecondMonitor", | 251 | "ScriptEventsPerSecondMonitor", |
@@ -233,7 +253,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
233 | m => m.Scene.StatsReporter.LastReportedSimStats[20], | 253 | m => m.Scene.StatsReporter.LastReportedSimStats[20], |
234 | m => string.Format("{0} per second", m.GetValue()))); | 254 | m => string.Format("{0} per second", m.GetValue()))); |
235 | 255 | ||
236 | m_monitors.Add( | 256 | m_staticMonitors.Add( |
237 | new GenericMonitor( | 257 | new GenericMonitor( |
238 | m_scene, | 258 | m_scene, |
239 | "InPacketsPerSecondMonitor", | 259 | "InPacketsPerSecondMonitor", |
@@ -241,7 +261,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
241 | m => m.Scene.StatsReporter.LastReportedSimStats[13], | 261 | m => m.Scene.StatsReporter.LastReportedSimStats[13], |
242 | m => string.Format("{0} per second", m.GetValue()))); | 262 | m => string.Format("{0} per second", m.GetValue()))); |
243 | 263 | ||
244 | m_monitors.Add( | 264 | m_staticMonitors.Add( |
245 | new GenericMonitor( | 265 | new GenericMonitor( |
246 | m_scene, | 266 | m_scene, |
247 | "OutPacketsPerSecondMonitor", | 267 | "OutPacketsPerSecondMonitor", |
@@ -249,7 +269,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
249 | m => m.Scene.StatsReporter.LastReportedSimStats[14], | 269 | m => m.Scene.StatsReporter.LastReportedSimStats[14], |
250 | m => string.Format("{0} per second", m.GetValue()))); | 270 | m => string.Format("{0} per second", m.GetValue()))); |
251 | 271 | ||
252 | m_monitors.Add( | 272 | m_staticMonitors.Add( |
253 | new GenericMonitor( | 273 | new GenericMonitor( |
254 | m_scene, | 274 | m_scene, |
255 | "UnackedBytesMonitor", | 275 | "UnackedBytesMonitor", |
@@ -257,7 +277,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
257 | m => m.Scene.StatsReporter.LastReportedSimStats[15], | 277 | m => m.Scene.StatsReporter.LastReportedSimStats[15], |
258 | m => string.Format("{0}", m.GetValue()))); | 278 | m => string.Format("{0}", m.GetValue()))); |
259 | 279 | ||
260 | m_monitors.Add( | 280 | m_staticMonitors.Add( |
261 | new GenericMonitor( | 281 | new GenericMonitor( |
262 | m_scene, | 282 | m_scene, |
263 | "PendingDownloadsMonitor", | 283 | "PendingDownloadsMonitor", |
@@ -265,7 +285,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
265 | m => m.Scene.StatsReporter.LastReportedSimStats[17], | 285 | m => m.Scene.StatsReporter.LastReportedSimStats[17], |
266 | m => string.Format("{0}", m.GetValue()))); | 286 | m => string.Format("{0}", m.GetValue()))); |
267 | 287 | ||
268 | m_monitors.Add( | 288 | m_staticMonitors.Add( |
269 | new GenericMonitor( | 289 | new GenericMonitor( |
270 | m_scene, | 290 | m_scene, |
271 | "PendingUploadsMonitor", | 291 | "PendingUploadsMonitor", |
@@ -273,7 +293,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
273 | m => m.Scene.StatsReporter.LastReportedSimStats[18], | 293 | m => m.Scene.StatsReporter.LastReportedSimStats[18], |
274 | m => string.Format("{0}", m.GetValue()))); | 294 | m => string.Format("{0}", m.GetValue()))); |
275 | 295 | ||
276 | m_monitors.Add( | 296 | m_staticMonitors.Add( |
277 | new GenericMonitor( | 297 | new GenericMonitor( |
278 | m_scene, | 298 | m_scene, |
279 | "TotalFrameTimeMonitor", | 299 | "TotalFrameTimeMonitor", |
@@ -281,7 +301,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
281 | m => m.Scene.StatsReporter.LastReportedSimStats[8], | 301 | m => m.Scene.StatsReporter.LastReportedSimStats[8], |
282 | m => string.Format("{0} ms", m.GetValue()))); | 302 | m => string.Format("{0} ms", m.GetValue()))); |
283 | 303 | ||
284 | m_monitors.Add( | 304 | m_staticMonitors.Add( |
285 | new GenericMonitor( | 305 | new GenericMonitor( |
286 | m_scene, | 306 | m_scene, |
287 | "NetFrameTimeMonitor", | 307 | "NetFrameTimeMonitor", |
@@ -289,7 +309,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
289 | m => m.Scene.StatsReporter.LastReportedSimStats[9], | 309 | m => m.Scene.StatsReporter.LastReportedSimStats[9], |
290 | m => string.Format("{0} ms", m.GetValue()))); | 310 | m => string.Format("{0} ms", m.GetValue()))); |
291 | 311 | ||
292 | m_monitors.Add( | 312 | m_staticMonitors.Add( |
293 | new GenericMonitor( | 313 | new GenericMonitor( |
294 | m_scene, | 314 | m_scene, |
295 | "PhysicsFrameTimeMonitor", | 315 | "PhysicsFrameTimeMonitor", |
@@ -297,7 +317,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
297 | m => m.Scene.StatsReporter.LastReportedSimStats[10], | 317 | m => m.Scene.StatsReporter.LastReportedSimStats[10], |
298 | m => string.Format("{0} ms", m.GetValue()))); | 318 | m => string.Format("{0} ms", m.GetValue()))); |
299 | 319 | ||
300 | m_monitors.Add( | 320 | m_staticMonitors.Add( |
301 | new GenericMonitor( | 321 | new GenericMonitor( |
302 | m_scene, | 322 | m_scene, |
303 | "SimulationFrameTimeMonitor", | 323 | "SimulationFrameTimeMonitor", |
@@ -305,7 +325,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
305 | m => m.Scene.StatsReporter.LastReportedSimStats[12], | 325 | m => m.Scene.StatsReporter.LastReportedSimStats[12], |
306 | m => string.Format("{0} ms", m.GetValue()))); | 326 | m => string.Format("{0} ms", m.GetValue()))); |
307 | 327 | ||
308 | m_monitors.Add( | 328 | m_staticMonitors.Add( |
309 | new GenericMonitor( | 329 | new GenericMonitor( |
310 | m_scene, | 330 | m_scene, |
311 | "AgentFrameTimeMonitor", | 331 | "AgentFrameTimeMonitor", |
@@ -313,7 +333,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
313 | m => m.Scene.StatsReporter.LastReportedSimStats[16], | 333 | m => m.Scene.StatsReporter.LastReportedSimStats[16], |
314 | m => string.Format("{0} ms", m.GetValue()))); | 334 | m => string.Format("{0} ms", m.GetValue()))); |
315 | 335 | ||
316 | m_monitors.Add( | 336 | m_staticMonitors.Add( |
317 | new GenericMonitor( | 337 | new GenericMonitor( |
318 | m_scene, | 338 | m_scene, |
319 | "ImagesFrameTimeMonitor", | 339 | "ImagesFrameTimeMonitor", |
@@ -321,7 +341,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring | |||
321 | m => m.Scene.StatsReporter.LastReportedSimStats[11], | 341 | m => m.Scene.StatsReporter.LastReportedSimStats[11], |
322 | m => string.Format("{0} ms", m.GetValue()))); | 342 | m => string.Format("{0} ms", m.GetValue()))); |
323 | 343 | ||
324 | m_alerts.Add(new DeadlockAlert(m_monitors.Find(x => x is LastFrameTimeMonitor) as LastFrameTimeMonitor)); | 344 | m_alerts.Add(new DeadlockAlert(m_staticMonitors.Find(x => x is LastFrameTimeMonitor) as LastFrameTimeMonitor)); |
325 | 345 | ||
326 | foreach (IAlert alert in m_alerts) | 346 | foreach (IAlert alert in m_alerts) |
327 | { | 347 | { |
diff --git a/OpenSim/Region/CoreModules/LightShare/EnvironmentModule.cs b/OpenSim/Region/CoreModules/LightShare/EnvironmentModule.cs new file mode 100644 index 0000000..1526886 --- /dev/null +++ b/OpenSim/Region/CoreModules/LightShare/EnvironmentModule.cs | |||
@@ -0,0 +1,224 @@ | |||
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.Reflection; | ||
30 | using OpenMetaverse; | ||
31 | using OpenSim.Framework; | ||
32 | using OpenSim.Framework.Capabilities; | ||
33 | using OpenSim.Framework.Servers.HttpServer; | ||
34 | using OpenSim.Region.Framework.Interfaces; | ||
35 | using OpenSim.Region.Framework.Scenes; | ||
36 | using log4net; | ||
37 | using Nini.Config; | ||
38 | using Mono.Addins; | ||
39 | |||
40 | using Caps = OpenSim.Framework.Capabilities.Caps; | ||
41 | |||
42 | |||
43 | namespace OpenSim.Region.CoreModules.World.LightShare | ||
44 | { | ||
45 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "EnvironmentModule")] | ||
46 | |||
47 | public class EnvironmentModule : INonSharedRegionModule, IEnvironmentModule | ||
48 | { | ||
49 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
50 | |||
51 | private Scene m_scene = null; | ||
52 | private UUID regionID = UUID.Zero; | ||
53 | private static bool Enabled = false; | ||
54 | |||
55 | private static readonly string capsName = "EnvironmentSettings"; | ||
56 | private static readonly string capsBase = "/CAPS/0020/"; | ||
57 | |||
58 | private LLSDEnvironmentSetResponse setResponse = null; | ||
59 | |||
60 | #region INonSharedRegionModule | ||
61 | public void Initialise(IConfigSource source) | ||
62 | { | ||
63 | IConfig config = source.Configs["ClientStack.LindenCaps"]; | ||
64 | |||
65 | if (null == config) | ||
66 | return; | ||
67 | |||
68 | if (config.GetString("Cap_EnvironmentSettings", String.Empty) != "localhost") | ||
69 | { | ||
70 | m_log.InfoFormat("[{0}]: Module is disabled.", Name); | ||
71 | return; | ||
72 | } | ||
73 | |||
74 | Enabled = true; | ||
75 | |||
76 | m_log.InfoFormat("[{0}]: Module is enabled.", Name); | ||
77 | } | ||
78 | |||
79 | public void Close() | ||
80 | { | ||
81 | } | ||
82 | |||
83 | public string Name | ||
84 | { | ||
85 | get { return "EnvironmentModule"; } | ||
86 | } | ||
87 | |||
88 | public Type ReplaceableInterface | ||
89 | { | ||
90 | get { return null; } | ||
91 | } | ||
92 | |||
93 | public void AddRegion(Scene scene) | ||
94 | { | ||
95 | if (!Enabled) | ||
96 | return; | ||
97 | |||
98 | scene.RegisterModuleInterface<IEnvironmentModule>(this); | ||
99 | m_scene = scene; | ||
100 | regionID = scene.RegionInfo.RegionID; | ||
101 | } | ||
102 | |||
103 | public void RegionLoaded(Scene scene) | ||
104 | { | ||
105 | if (!Enabled) | ||
106 | return; | ||
107 | |||
108 | setResponse = new LLSDEnvironmentSetResponse(); | ||
109 | scene.EventManager.OnRegisterCaps += OnRegisterCaps; | ||
110 | } | ||
111 | |||
112 | public void RemoveRegion(Scene scene) | ||
113 | { | ||
114 | if (Enabled) | ||
115 | return; | ||
116 | |||
117 | scene.EventManager.OnRegisterCaps -= OnRegisterCaps; | ||
118 | m_scene = null; | ||
119 | } | ||
120 | #endregion | ||
121 | |||
122 | #region IEnvironmentModule | ||
123 | public void ResetEnvironmentSettings(UUID regionUUID) | ||
124 | { | ||
125 | if (!Enabled) | ||
126 | return; | ||
127 | |||
128 | m_scene.SimulationDataService.RemoveRegionEnvironmentSettings(regionUUID); | ||
129 | } | ||
130 | #endregion | ||
131 | |||
132 | #region Events | ||
133 | private void OnRegisterCaps(UUID agentID, Caps caps) | ||
134 | { | ||
135 | // m_log.DebugFormat("[{0}]: Register capability for agentID {1} in region {2}", | ||
136 | // Name, agentID, caps.RegionName); | ||
137 | |||
138 | string capsPath = capsBase + UUID.Random(); | ||
139 | |||
140 | // Get handler | ||
141 | caps.RegisterHandler( | ||
142 | capsName, | ||
143 | new RestStreamHandler( | ||
144 | "GET", | ||
145 | capsPath, | ||
146 | (request, path, param, httpRequest, httpResponse) | ||
147 | => GetEnvironmentSettings(request, path, param, agentID, caps), | ||
148 | capsName, | ||
149 | agentID.ToString())); | ||
150 | |||
151 | // Set handler | ||
152 | caps.HttpListener.AddStreamHandler( | ||
153 | new RestStreamHandler( | ||
154 | "POST", | ||
155 | capsPath, | ||
156 | (request, path, param, httpRequest, httpResponse) | ||
157 | => SetEnvironmentSettings(request, path, param, agentID, caps), | ||
158 | capsName, | ||
159 | agentID.ToString())); | ||
160 | } | ||
161 | #endregion | ||
162 | |||
163 | private string GetEnvironmentSettings(string request, string path, string param, | ||
164 | UUID agentID, Caps caps) | ||
165 | { | ||
166 | // m_log.DebugFormat("[{0}]: Environment GET handle for agentID {1} in region {2}", | ||
167 | // Name, agentID, caps.RegionName); | ||
168 | |||
169 | string env = String.Empty; | ||
170 | |||
171 | try | ||
172 | { | ||
173 | env = m_scene.SimulationDataService.LoadRegionEnvironmentSettings(regionID); | ||
174 | } | ||
175 | catch (Exception e) | ||
176 | { | ||
177 | m_log.ErrorFormat("[{0}]: Unable to load environment settings for region {1}, Exception: {2} - {3}", | ||
178 | Name, caps.RegionName, e.Message, e.StackTrace); | ||
179 | } | ||
180 | |||
181 | if (String.IsNullOrEmpty(env)) | ||
182 | env = EnvironmentSettings.EmptySettings(UUID.Zero, regionID); | ||
183 | |||
184 | return env; | ||
185 | } | ||
186 | |||
187 | private string SetEnvironmentSettings(string request, string path, string param, | ||
188 | UUID agentID, Caps caps) | ||
189 | { | ||
190 | |||
191 | // m_log.DebugFormat("[{0}]: Environment SET handle from agentID {1} in region {2}", | ||
192 | // Name, agentID, caps.RegionName); | ||
193 | |||
194 | setResponse.regionID = regionID; | ||
195 | setResponse.success = false; | ||
196 | |||
197 | if (!m_scene.Permissions.CanIssueEstateCommand(agentID, false)) | ||
198 | { | ||
199 | setResponse.fail_reason = "Insufficient estate permissions, settings has not been saved."; | ||
200 | return LLSDHelpers.SerialiseLLSDReply(setResponse); | ||
201 | } | ||
202 | |||
203 | try | ||
204 | { | ||
205 | m_scene.SimulationDataService.StoreRegionEnvironmentSettings(regionID, request); | ||
206 | setResponse.success = true; | ||
207 | |||
208 | m_log.InfoFormat("[{0}]: New Environment settings has been saved from agentID {1} in region {2}", | ||
209 | Name, agentID, caps.RegionName); | ||
210 | } | ||
211 | catch (Exception e) | ||
212 | { | ||
213 | m_log.ErrorFormat("[{0}]: Environment settings has not been saved for region {1}, Exception: {2} - {3}", | ||
214 | Name, caps.RegionName, e.Message, e.StackTrace); | ||
215 | |||
216 | setResponse.success = false; | ||
217 | setResponse.fail_reason = String.Format("Environment Set for region {0} has failed, settings has not been saved.", caps.RegionName); | ||
218 | } | ||
219 | |||
220 | return LLSDHelpers.SerialiseLLSDReply(setResponse); | ||
221 | } | ||
222 | } | ||
223 | } | ||
224 | |||
diff --git a/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule.cs b/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule.cs index 9255791..e91e8b9 100644 --- a/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule.cs | |||
@@ -64,6 +64,8 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules | |||
64 | private TimeSpan m_QueueTimeout = new TimeSpan(2, 0, 0); // 2 hours without llGetNextEmail drops the queue | 64 | private TimeSpan m_QueueTimeout = new TimeSpan(2, 0, 0); // 2 hours without llGetNextEmail drops the queue |
65 | private string m_InterObjectHostname = "lsl.opensim.local"; | 65 | private string m_InterObjectHostname = "lsl.opensim.local"; |
66 | 66 | ||
67 | private int m_MaxEmailSize = 4096; // largest email allowed by default, as per lsl docs. | ||
68 | |||
67 | // Scenes by Region Handle | 69 | // Scenes by Region Handle |
68 | private Dictionary<ulong, Scene> m_Scenes = | 70 | private Dictionary<ulong, Scene> m_Scenes = |
69 | new Dictionary<ulong, Scene>(); | 71 | new Dictionary<ulong, Scene>(); |
@@ -127,6 +129,7 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules | |||
127 | SMTP_SERVER_PORT = SMTPConfig.GetInt("SMTP_SERVER_PORT", SMTP_SERVER_PORT); | 129 | SMTP_SERVER_PORT = SMTPConfig.GetInt("SMTP_SERVER_PORT", SMTP_SERVER_PORT); |
128 | SMTP_SERVER_LOGIN = SMTPConfig.GetString("SMTP_SERVER_LOGIN", SMTP_SERVER_LOGIN); | 130 | SMTP_SERVER_LOGIN = SMTPConfig.GetString("SMTP_SERVER_LOGIN", SMTP_SERVER_LOGIN); |
129 | SMTP_SERVER_PASSWORD = SMTPConfig.GetString("SMTP_SERVER_PASSWORD", SMTP_SERVER_PASSWORD); | 131 | SMTP_SERVER_PASSWORD = SMTPConfig.GetString("SMTP_SERVER_PASSWORD", SMTP_SERVER_PASSWORD); |
132 | m_MaxEmailSize = SMTPConfig.GetInt("email_max_size", m_MaxEmailSize); | ||
130 | } | 133 | } |
131 | catch (Exception e) | 134 | catch (Exception e) |
132 | { | 135 | { |
@@ -176,18 +179,6 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules | |||
176 | get { return true; } | 179 | get { return true; } |
177 | } | 180 | } |
178 | 181 | ||
179 | /// <summary> | ||
180 | /// Delay function using thread in seconds | ||
181 | /// </summary> | ||
182 | /// <param name="seconds"></param> | ||
183 | private void DelayInSeconds(int delay) | ||
184 | { | ||
185 | delay = (int)((float)delay * 1000); | ||
186 | if (delay == 0) | ||
187 | return; | ||
188 | System.Threading.Thread.Sleep(delay); | ||
189 | } | ||
190 | |||
191 | private bool IsLocal(UUID objectID) | 182 | private bool IsLocal(UUID objectID) |
192 | { | 183 | { |
193 | string unused; | 184 | string unused; |
@@ -267,10 +258,9 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules | |||
267 | m_log.Error("[EMAIL] REGEX Problem in EMail Address: "+address); | 258 | m_log.Error("[EMAIL] REGEX Problem in EMail Address: "+address); |
268 | return; | 259 | return; |
269 | } | 260 | } |
270 | //FIXME:Check if subject + body = 4096 Byte | 261 | if ((subject.Length + body.Length) > m_MaxEmailSize) |
271 | if ((subject.Length + body.Length) > 1024) | ||
272 | { | 262 | { |
273 | m_log.Error("[EMAIL] subject + body > 1024 Byte"); | 263 | m_log.Error("[EMAIL] subject + body larger than limit of " + m_MaxEmailSize + " bytes"); |
274 | return; | 264 | return; |
275 | } | 265 | } |
276 | 266 | ||
@@ -345,10 +335,6 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules | |||
345 | // TODO FIX | 335 | // TODO FIX |
346 | } | 336 | } |
347 | } | 337 | } |
348 | |||
349 | //DONE: Message as Second Life style | ||
350 | //20 second delay - AntiSpam System - for now only 10 seconds | ||
351 | DelayInSeconds(10); | ||
352 | } | 338 | } |
353 | 339 | ||
354 | /// <summary> | 340 | /// <summary> |
diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs index f4cf6b4..1865ab8 100644 --- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs | |||
@@ -85,6 +85,10 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
85 | private IHttpServer m_HttpsServer = null; | 85 | private IHttpServer m_HttpsServer = null; |
86 | 86 | ||
87 | private string m_ExternalHostNameForLSL = ""; | 87 | private string m_ExternalHostNameForLSL = ""; |
88 | public string ExternalHostNameForLSL | ||
89 | { | ||
90 | get { return m_ExternalHostNameForLSL; } | ||
91 | } | ||
88 | 92 | ||
89 | public Type ReplaceableInterface | 93 | public Type ReplaceableInterface |
90 | { | 94 | { |
@@ -147,6 +151,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
147 | public void Close() | 151 | public void Close() |
148 | { | 152 | { |
149 | } | 153 | } |
154 | |||
150 | public UUID RequestURL(IScriptModule engine, SceneObjectPart host, UUID itemID) | 155 | public UUID RequestURL(IScriptModule engine, SceneObjectPart host, UUID itemID) |
151 | { | 156 | { |
152 | UUID urlcode = UUID.Random(); | 157 | UUID urlcode = UUID.Random(); |
@@ -176,6 +181,10 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
176 | uri, | 181 | uri, |
177 | new PollServiceEventArgs(HttpRequestHandler, HasEvents, GetEvents, NoEvents, urlcode)); | 182 | new PollServiceEventArgs(HttpRequestHandler, HasEvents, GetEvents, NoEvents, urlcode)); |
178 | 183 | ||
184 | m_log.DebugFormat( | ||
185 | "[URL MODULE]: Set up incoming request url {0} for {1} in {2} {3}", | ||
186 | uri, itemID, host.Name, host.LocalId); | ||
187 | |||
179 | engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_GRANTED", url }); | 188 | engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_GRANTED", url }); |
180 | } | 189 | } |
181 | 190 | ||
@@ -218,6 +227,10 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
218 | uri, | 227 | uri, |
219 | new PollServiceEventArgs(HttpRequestHandler, HasEvents, GetEvents, NoEvents, urlcode)); | 228 | new PollServiceEventArgs(HttpRequestHandler, HasEvents, GetEvents, NoEvents, urlcode)); |
220 | 229 | ||
230 | m_log.DebugFormat( | ||
231 | "[URL MODULE]: Set up incoming secure request url {0} for {1} in {2} {3}", | ||
232 | uri, itemID, host.Name, host.LocalId); | ||
233 | |||
221 | engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_GRANTED", url }); | 234 | engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_GRANTED", url }); |
222 | } | 235 | } |
223 | 236 | ||
@@ -241,6 +254,10 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp | |||
241 | m_RequestMap.Remove(req); | 254 | m_RequestMap.Remove(req); |
242 | } | 255 | } |
243 | 256 | ||
257 | // m_log.DebugFormat( | ||
258 | // "[URL MODULE]: Releasing url {0} for {1} in {2}", | ||
259 | // url, data.itemID, data.hostID); | ||
260 | |||
244 | RemoveUrl(data); | 261 | RemoveUrl(data); |
245 | m_UrlMap.Remove(url); | 262 | m_UrlMap.Remove(url); |
246 | } | 263 | } |
diff --git a/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs b/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs index 176c86d..8358bc0 100644 --- a/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs | |||
@@ -308,56 +308,56 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
308 | /// <param name='msg'> | 308 | /// <param name='msg'> |
309 | /// Message. | 309 | /// Message. |
310 | /// </param> | 310 | /// </param> |
311 | public bool DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg, out string error) | 311 | public void DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg) |
312 | { | 312 | { |
313 | error = null; | ||
314 | // Is id an avatar? | 313 | // Is id an avatar? |
315 | ScenePresence sp = m_scene.GetScenePresence(target); | 314 | ScenePresence sp = m_scene.GetScenePresence(target); |
316 | 315 | ||
317 | if (sp != null) | 316 | if (sp != null) |
318 | { | 317 | { |
319 | // Send message to avatar | 318 | // ignore if a child agent this is restricted to inside one region |
319 | if (sp.IsChildAgent) | ||
320 | return; | ||
321 | |||
322 | // Send message to the avatar. | ||
323 | // Channel zero only goes to the avatar | ||
324 | // non zero channel messages only go to the attachments | ||
320 | if (channel == 0) | 325 | if (channel == 0) |
321 | { | 326 | { |
322 | m_scene.SimChatBroadcast(Utils.StringToBytes(msg), ChatTypeEnum.Broadcast, 0, pos, name, id, false); | 327 | m_scene.SimChatToAgent(target, Utils.StringToBytes(msg), pos, name, id, false); |
323 | } | 328 | } |
324 | 329 | else | |
325 | List<SceneObjectGroup> attachments = sp.GetAttachments(); | ||
326 | |||
327 | if (attachments.Count == 0) | ||
328 | return true; | ||
329 | |||
330 | // Get uuid of attachments | ||
331 | List<UUID> targets = new List<UUID>(); | ||
332 | foreach (SceneObjectGroup sog in attachments) | ||
333 | { | 330 | { |
334 | if (!sog.IsDeleted) | 331 | List<SceneObjectGroup> attachments = sp.GetAttachments(); |
335 | targets.Add(sog.UUID); | 332 | if (attachments.Count == 0) |
336 | } | 333 | return; |
337 | 334 | ||
338 | // Need to check each attachment | 335 | // Get uuid of attachments |
339 | foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg)) | 336 | List<UUID> targets = new List<UUID>(); |
340 | { | 337 | foreach (SceneObjectGroup sog in attachments) |
341 | if (li.GetHostID().Equals(id)) | 338 | { |
342 | continue; | 339 | if (!sog.IsDeleted) |
340 | targets.Add(sog.UUID); | ||
341 | } | ||
343 | 342 | ||
344 | if (m_scene.GetSceneObjectPart(li.GetHostID()) == null) | 343 | // Need to check each attachment |
345 | continue; | 344 | foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg)) |
345 | { | ||
346 | if (li.GetHostID().Equals(id)) | ||
347 | continue; | ||
346 | 348 | ||
347 | if (targets.Contains(li.GetHostID())) | 349 | if (m_scene.GetSceneObjectPart(li.GetHostID()) == null) |
348 | QueueMessage(new ListenerInfo(li, name, id, msg)); | 350 | continue; |
349 | } | ||
350 | 351 | ||
351 | return true; | 352 | if (targets.Contains(li.GetHostID())) |
352 | } | 353 | QueueMessage(new ListenerInfo(li, name, id, msg)); |
354 | } | ||
355 | } | ||
353 | 356 | ||
354 | // Need to toss an error here | 357 | return; |
355 | if (channel == 0) | ||
356 | { | ||
357 | error = "Cannot use llRegionSayTo to message objects on channel 0"; | ||
358 | return false; | ||
359 | } | 358 | } |
360 | 359 | ||
360 | // No avatar found so look for an object | ||
361 | foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg)) | 361 | foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg)) |
362 | { | 362 | { |
363 | // Dont process if this message is from yourself! | 363 | // Dont process if this message is from yourself! |
@@ -375,7 +375,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
375 | } | 375 | } |
376 | } | 376 | } |
377 | 377 | ||
378 | return true; | 378 | return; |
379 | } | 379 | } |
380 | 380 | ||
381 | protected void QueueMessage(ListenerInfo li) | 381 | protected void QueueMessage(ListenerInfo li) |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs index 8df1c7b..a7dd0dd 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs | |||
@@ -122,7 +122,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Hypergrid | |||
122 | ISimulationService simService = scene.RequestModuleInterface<ISimulationService>(); | 122 | ISimulationService simService = scene.RequestModuleInterface<ISimulationService>(); |
123 | IFriendsSimConnector friendsConn = scene.RequestModuleInterface<IFriendsSimConnector>(); | 123 | IFriendsSimConnector friendsConn = scene.RequestModuleInterface<IFriendsSimConnector>(); |
124 | Object[] args = new Object[] { m_Config }; | 124 | Object[] args = new Object[] { m_Config }; |
125 | IFriendsService friendsService = ServerUtils.LoadPlugin<IFriendsService>(m_LocalServiceDll, args); | 125 | // IFriendsService friendsService = ServerUtils.LoadPlugin<IFriendsService>(m_LocalServiceDll, args) |
126 | ServerUtils.LoadPlugin<IFriendsService>(m_LocalServiceDll, args); | ||
126 | 127 | ||
127 | m_HypergridHandler = new GatekeeperServiceInConnector(m_Config, MainServer.Instance, simService); | 128 | m_HypergridHandler = new GatekeeperServiceInConnector(m_Config, MainServer.Instance, simService); |
128 | 129 | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs index 8395f83..008465f 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs | |||
@@ -149,7 +149,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset | |||
149 | 149 | ||
150 | m_aScene = scene; | 150 | m_aScene = scene; |
151 | 151 | ||
152 | scene.RegisterModuleInterface<IAssetService>(this); | 152 | m_aScene.RegisterModuleInterface<IAssetService>(this); |
153 | } | 153 | } |
154 | 154 | ||
155 | public void RemoveRegion(Scene scene) | 155 | public void RemoveRegion(Scene scene) |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/AuthorizationService.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/AuthorizationService.cs index f0d21e6..4470799 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/AuthorizationService.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/AuthorizationService.cs | |||
@@ -55,7 +55,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization | |||
55 | MethodBase.GetCurrentMethod().DeclaringType); | 55 | MethodBase.GetCurrentMethod().DeclaringType); |
56 | 56 | ||
57 | private IUserManagement m_UserManagement; | 57 | private IUserManagement m_UserManagement; |
58 | private IGridService m_GridService; | 58 | // private IGridService m_GridService; |
59 | 59 | ||
60 | private Scene m_Scene; | 60 | private Scene m_Scene; |
61 | AccessFlags m_accessValue = AccessFlags.None; | 61 | AccessFlags m_accessValue = AccessFlags.None; |
@@ -65,7 +65,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization | |||
65 | { | 65 | { |
66 | m_Scene = scene; | 66 | m_Scene = scene; |
67 | m_UserManagement = scene.RequestModuleInterface<IUserManagement>(); | 67 | m_UserManagement = scene.RequestModuleInterface<IUserManagement>(); |
68 | m_GridService = scene.GridService; | 68 | // m_GridService = scene.GridService; |
69 | 69 | ||
70 | if (config != null) | 70 | if (config != null) |
71 | { | 71 | { |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/MapImage/MapImageServiceModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/MapImage/MapImageServiceModule.cs index 3b862da..6cd077a 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/MapImage/MapImageServiceModule.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/MapImage/MapImageServiceModule.cs | |||
@@ -149,9 +149,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.MapImage | |||
149 | lock (m_scenes) | 149 | lock (m_scenes) |
150 | m_scenes[scene.RegionInfo.RegionID] = scene; | 150 | m_scenes[scene.RegionInfo.RegionID] = scene; |
151 | 151 | ||
152 | scene.EventManager.OnPrimsLoaded += new EventManager.PrimsLoaded(EventManager_OnPrimsLoaded); | 152 | scene.EventManager.OnLoginsEnabled += OnLoginsEnabled; |
153 | } | 153 | } |
154 | 154 | ||
155 | |||
155 | ///<summary> | 156 | ///<summary> |
156 | /// | 157 | /// |
157 | ///</summary> | 158 | ///</summary> |
@@ -166,9 +167,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.MapImage | |||
166 | 167 | ||
167 | #endregion ISharedRegionModule | 168 | #endregion ISharedRegionModule |
168 | 169 | ||
169 | void EventManager_OnPrimsLoaded(Scene s) | 170 | void OnLoginsEnabled(string regionName) |
170 | { | 171 | { |
171 | UploadMapTile(s); | 172 | Scene scene = null; |
173 | foreach (Scene s in m_scenes.Values) | ||
174 | if (s.RegionInfo.RegionName == regionName) | ||
175 | { | ||
176 | scene = s; | ||
177 | break; | ||
178 | } | ||
179 | if (scene != null) | ||
180 | UploadMapTile(scene); | ||
172 | } | 181 | } |
173 | 182 | ||
174 | 183 | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs index 6e75692..008992e 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs | |||
@@ -26,6 +26,7 @@ | |||
26 | */ | 26 | */ |
27 | using System; | 27 | using System; |
28 | using System.Collections.Generic; | 28 | using System.Collections.Generic; |
29 | using System.Linq; | ||
29 | using System.Reflection; | 30 | using System.Reflection; |
30 | using log4net; | 31 | using log4net; |
31 | using Nini.Config; | 32 | using Nini.Config; |
@@ -41,22 +42,20 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
41 | public class LocalSimulationConnectorModule : ISharedRegionModule, ISimulationService | 42 | public class LocalSimulationConnectorModule : ISharedRegionModule, ISimulationService |
42 | { | 43 | { |
43 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 44 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
44 | // Version of this service | ||
45 | private const string m_Version = "SIMULATION/0.1"; | ||
46 | 45 | ||
47 | private List<Scene> m_sceneList = new List<Scene>(); | 46 | /// <summary> |
47 | /// Version of this service | ||
48 | /// </summary> | ||
49 | private const string m_Version = "SIMULATION/0.1"; | ||
48 | 50 | ||
49 | private IEntityTransferModule m_AgentTransferModule; | 51 | /// <summary> |
50 | protected IEntityTransferModule AgentTransferModule | 52 | /// Map region ID to scene. |
51 | { | 53 | /// </summary> |
52 | get | 54 | private Dictionary<UUID, Scene> m_scenes = new Dictionary<UUID, Scene>(); |
53 | { | ||
54 | if (m_AgentTransferModule == null) | ||
55 | m_AgentTransferModule = m_sceneList[0].RequestModuleInterface<IEntityTransferModule>(); | ||
56 | return m_AgentTransferModule; | ||
57 | } | ||
58 | } | ||
59 | 55 | ||
56 | /// <summary> | ||
57 | /// Is this module enabled? | ||
58 | /// </summary> | ||
60 | private bool m_ModuleEnabled = false; | 59 | private bool m_ModuleEnabled = false; |
61 | 60 | ||
62 | #region IRegionModule | 61 | #region IRegionModule |
@@ -129,12 +128,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
129 | /// <param name="scene"></param> | 128 | /// <param name="scene"></param> |
130 | public void RemoveScene(Scene scene) | 129 | public void RemoveScene(Scene scene) |
131 | { | 130 | { |
132 | lock (m_sceneList) | 131 | lock (m_scenes) |
133 | { | 132 | { |
134 | if (m_sceneList.Contains(scene)) | 133 | if (m_scenes.ContainsKey(scene.RegionInfo.RegionID)) |
135 | { | 134 | m_scenes.Remove(scene.RegionInfo.RegionID); |
136 | m_sceneList.Remove(scene); | 135 | else |
137 | } | 136 | m_log.WarnFormat( |
137 | "[LOCAL SIMULATION CONNECTOR]: Tried to remove region {0} but it was not present", | ||
138 | scene.RegionInfo.RegionName); | ||
138 | } | 139 | } |
139 | } | 140 | } |
140 | 141 | ||
@@ -144,13 +145,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
144 | /// <param name="scene"></param> | 145 | /// <param name="scene"></param> |
145 | public void Init(Scene scene) | 146 | public void Init(Scene scene) |
146 | { | 147 | { |
147 | if (!m_sceneList.Contains(scene)) | 148 | lock (m_scenes) |
148 | { | 149 | { |
149 | lock (m_sceneList) | 150 | if (!m_scenes.ContainsKey(scene.RegionInfo.RegionID)) |
150 | { | 151 | m_scenes[scene.RegionInfo.RegionID] = scene; |
151 | m_sceneList.Add(scene); | 152 | else |
152 | } | 153 | m_log.WarnFormat( |
153 | 154 | "[LOCAL SIMULATION CONNECTOR]: Tried to add region {0} but it is already present", | |
155 | scene.RegionInfo.RegionName); | ||
154 | } | 156 | } |
155 | } | 157 | } |
156 | 158 | ||
@@ -158,15 +160,24 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
158 | 160 | ||
159 | #region ISimulation | 161 | #region ISimulation |
160 | 162 | ||
161 | public IScene GetScene(ulong regionhandle) | 163 | public IScene GetScene(UUID regionId) |
162 | { | 164 | { |
163 | foreach (Scene s in m_sceneList) | 165 | if (m_scenes.ContainsKey(regionId)) |
164 | { | 166 | { |
165 | if (s.RegionInfo.RegionHandle == regionhandle) | 167 | return m_scenes[regionId]; |
166 | return s; | 168 | } |
169 | else | ||
170 | { | ||
171 | // FIXME: This was pre-existing behaviour but possibly not a good idea, since it hides an error rather | ||
172 | // than making it obvious and fixable. Need to see if the error message comes up in practice. | ||
173 | Scene s = m_scenes.Values.ToArray()[0]; | ||
174 | |||
175 | m_log.ErrorFormat( | ||
176 | "[LOCAL SIMULATION CONNECTOR]: Region with id {0} not found. Returning {1} {2} instead", | ||
177 | regionId, s.RegionInfo.RegionName, s.RegionInfo.RegionID); | ||
178 | |||
179 | return s; | ||
167 | } | 180 | } |
168 | // ? weird. should not happen | ||
169 | return m_sceneList[0]; | ||
170 | } | 181 | } |
171 | 182 | ||
172 | public ISimulationService GetInnerService() | 183 | public ISimulationService GetInnerService() |
@@ -187,13 +198,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
187 | return false; | 198 | return false; |
188 | } | 199 | } |
189 | 200 | ||
190 | foreach (Scene s in m_sceneList) | 201 | if (m_scenes.ContainsKey(destination.RegionID)) |
191 | { | 202 | { |
192 | if (s.RegionInfo.RegionHandle == destination.RegionHandle) | 203 | // m_log.DebugFormat("[LOCAL SIMULATION CONNECTOR]: Found region {0} to send SendCreateChildAgent", destination.RegionName); |
193 | { | 204 | return m_scenes[destination.RegionID].NewUserConnection(aCircuit, teleportFlags, out reason); |
194 | m_log.DebugFormat("[LOCAL SIMULATION CONNECTOR]: Found region {0} to send SendCreateChildAgent", destination.RegionName); | ||
195 | return s.NewUserConnection(aCircuit, teleportFlags, out reason); | ||
196 | } | ||
197 | } | 205 | } |
198 | 206 | ||
199 | reason = "Did not find region " + destination.RegionName; | 207 | reason = "Did not find region " + destination.RegionName; |
@@ -205,17 +213,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
205 | if (destination == null) | 213 | if (destination == null) |
206 | return false; | 214 | return false; |
207 | 215 | ||
208 | foreach (Scene s in m_sceneList) | 216 | if (m_scenes.ContainsKey(destination.RegionID)) |
209 | { | 217 | { |
210 | if (s.RegionInfo.RegionHandle == destination.RegionHandle) | 218 | // m_log.DebugFormat( |
211 | { | 219 | // "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", |
212 | m_log.DebugFormat( | 220 | // s.RegionInfo.RegionName, destination.RegionHandle); |
213 | "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", | ||
214 | s.RegionInfo.RegionName, destination.RegionHandle); | ||
215 | 221 | ||
216 | s.IncomingChildAgentDataUpdate(cAgentData); | 222 | return m_scenes[destination.RegionID].IncomingChildAgentDataUpdate(cAgentData); |
217 | return true; | ||
218 | } | ||
219 | } | 223 | } |
220 | 224 | ||
221 | // m_log.DebugFormat("[LOCAL COMMS]: Did not find region {0} for ChildAgentUpdate", regionHandle); | 225 | // m_log.DebugFormat("[LOCAL COMMS]: Did not find region {0} for ChildAgentUpdate", regionHandle); |
@@ -231,11 +235,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
231 | // simulator so when we receive the update we need to hand it to each of the | 235 | // simulator so when we receive the update we need to hand it to each of the |
232 | // scenes; scenes each check to see if the is a scene presence for the avatar | 236 | // scenes; scenes each check to see if the is a scene presence for the avatar |
233 | // note that we really don't need the GridRegion for this call | 237 | // note that we really don't need the GridRegion for this call |
234 | foreach (Scene s in m_sceneList) | 238 | foreach (Scene s in m_scenes.Values) |
235 | { | 239 | { |
236 | //m_log.Debug("[LOCAL COMMS]: Found region to send ChildAgentUpdate"); | 240 | //m_log.Debug("[LOCAL COMMS]: Found region to send ChildAgentUpdate"); |
237 | s.IncomingChildAgentDataUpdate(cAgentData); | 241 | s.IncomingChildAgentDataUpdate(cAgentData); |
238 | } | 242 | } |
243 | |||
239 | //m_log.Debug("[LOCAL COMMS]: region not found for ChildAgentUpdate"); | 244 | //m_log.Debug("[LOCAL COMMS]: region not found for ChildAgentUpdate"); |
240 | return true; | 245 | return true; |
241 | } | 246 | } |
@@ -247,14 +252,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
247 | if (destination == null) | 252 | if (destination == null) |
248 | return false; | 253 | return false; |
249 | 254 | ||
250 | foreach (Scene s in m_sceneList) | 255 | if (m_scenes.ContainsKey(destination.RegionID)) |
251 | { | 256 | { |
252 | if (s.RegionInfo.RegionHandle == destination.RegionHandle) | 257 | // m_log.DebugFormat( |
253 | { | 258 | // "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", |
254 | //m_log.Debug("[LOCAL COMMS]: Found region to send ChildAgentUpdate"); | 259 | // s.RegionInfo.RegionName, destination.RegionHandle); |
255 | return s.IncomingRetrieveRootAgent(id, out agent); | 260 | |
256 | } | 261 | return m_scenes[destination.RegionID].IncomingRetrieveRootAgent(id, out agent); |
257 | } | 262 | } |
263 | |||
258 | //m_log.Debug("[LOCAL COMMS]: region not found for ChildAgentUpdate"); | 264 | //m_log.Debug("[LOCAL COMMS]: region not found for ChildAgentUpdate"); |
259 | return false; | 265 | return false; |
260 | } | 266 | } |
@@ -266,59 +272,49 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
266 | if (destination == null) | 272 | if (destination == null) |
267 | return false; | 273 | return false; |
268 | 274 | ||
269 | foreach (Scene s in m_sceneList) | 275 | if (m_scenes.ContainsKey(destination.RegionID)) |
270 | { | 276 | { |
271 | if (s.RegionInfo.RegionID == destination.RegionID) | 277 | // m_log.DebugFormat( |
272 | return s.QueryAccess(id, position, out reason); | 278 | // "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", |
279 | // s.RegionInfo.RegionName, destination.RegionHandle); | ||
280 | |||
281 | return m_scenes[destination.RegionID].QueryAccess(id, position, out reason); | ||
273 | } | 282 | } |
283 | |||
284 | //m_log.Debug("[LOCAL COMMS]: region not found for QueryAccess"); | ||
274 | return false; | 285 | return false; |
275 | } | 286 | } |
276 | 287 | ||
277 | public bool ReleaseAgent(UUID origin, UUID id, string uri) | 288 | public bool ReleaseAgent(UUID originId, UUID agentId, string uri) |
278 | { | 289 | { |
279 | foreach (Scene s in m_sceneList) | 290 | if (m_scenes.ContainsKey(originId)) |
280 | { | 291 | { |
281 | if (s.RegionInfo.RegionID == origin) | 292 | // m_log.DebugFormat( |
282 | { | 293 | // "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", |
283 | m_log.Debug("[LOCAL COMMS]: Found region to SendReleaseAgent"); | 294 | // s.RegionInfo.RegionName, destination.RegionHandle); |
284 | AgentTransferModule.AgentArrivedAtDestination(id); | 295 | |
285 | return true; | 296 | m_scenes[originId].EntityTransferModule.AgentArrivedAtDestination(agentId); |
286 | // return s.IncomingReleaseAgent(id); | 297 | return true; |
287 | } | ||
288 | } | 298 | } |
299 | |||
289 | //m_log.Debug("[LOCAL COMMS]: region not found in SendReleaseAgent " + origin); | 300 | //m_log.Debug("[LOCAL COMMS]: region not found in SendReleaseAgent " + origin); |
290 | return false; | 301 | return false; |
291 | } | 302 | } |
292 | 303 | ||
293 | public bool CloseAgent(GridRegion destination, UUID id) | 304 | public bool CloseChildAgent(GridRegion destination, UUID id) |
294 | { | 305 | { |
295 | if (destination == null) | 306 | return CloseAgent(destination, id); |
296 | return false; | ||
297 | |||
298 | foreach (Scene s in m_sceneList) | ||
299 | { | ||
300 | if (s.RegionInfo.RegionID == destination.RegionID) | ||
301 | { | ||
302 | //m_log.Debug("[LOCAL COMMS]: Found region to SendCloseAgent"); | ||
303 | return s.IncomingCloseAgent(id); | ||
304 | } | ||
305 | } | ||
306 | //m_log.Debug("[LOCAL COMMS]: region not found in SendCloseAgent"); | ||
307 | return false; | ||
308 | } | 307 | } |
309 | 308 | ||
310 | public bool CloseChildAgent(GridRegion destination, UUID id) | 309 | public bool CloseAgent(GridRegion destination, UUID id) |
311 | { | 310 | { |
312 | if (destination == null) | 311 | if (destination == null) |
313 | return false; | 312 | return false; |
314 | 313 | ||
315 | foreach (Scene s in m_sceneList) | 314 | if (m_scenes.ContainsKey(destination.RegionID)) |
316 | { | 315 | { |
317 | if (s.RegionInfo.RegionID == destination.RegionID) | 316 | Util.FireAndForget(delegate { m_scenes[destination.RegionID].IncomingCloseAgent(id); }); |
318 | { | 317 | return true; |
319 | //m_log.Debug("[LOCAL COMMS]: Found region to SendCloseAgent"); | ||
320 | return s.IncomingCloseChildAgent(id); | ||
321 | } | ||
322 | } | 318 | } |
323 | //m_log.Debug("[LOCAL COMMS]: region not found in SendCloseAgent"); | 319 | //m_log.Debug("[LOCAL COMMS]: region not found in SendCloseAgent"); |
324 | return false; | 320 | return false; |
@@ -333,25 +329,28 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
333 | if (destination == null) | 329 | if (destination == null) |
334 | return false; | 330 | return false; |
335 | 331 | ||
336 | foreach (Scene s in m_sceneList) | 332 | if (m_scenes.ContainsKey(destination.RegionID)) |
337 | { | 333 | { |
338 | if (s.RegionInfo.RegionHandle == destination.RegionHandle) | 334 | // m_log.DebugFormat( |
335 | // "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", | ||
336 | // s.RegionInfo.RegionName, destination.RegionHandle); | ||
337 | |||
338 | Scene s = m_scenes[destination.RegionID]; | ||
339 | |||
340 | if (isLocalCall) | ||
341 | { | ||
342 | // We need to make a local copy of the object | ||
343 | ISceneObject sogClone = sog.CloneForNewScene(); | ||
344 | sogClone.SetState(sog.GetStateSnapshot(), s); | ||
345 | return s.IncomingCreateObject(newPosition, sogClone); | ||
346 | } | ||
347 | else | ||
339 | { | 348 | { |
340 | //m_log.Debug("[LOCAL COMMS]: Found region to SendCreateObject"); | 349 | // Use the object as it came through the wire |
341 | if (isLocalCall) | 350 | return s.IncomingCreateObject(newPosition, sog); |
342 | { | ||
343 | // We need to make a local copy of the object | ||
344 | ISceneObject sogClone = sog.CloneForNewScene(); | ||
345 | sogClone.SetState(sog.GetStateSnapshot(), s); | ||
346 | return s.IncomingCreateObject(newPosition, sogClone); | ||
347 | } | ||
348 | else | ||
349 | { | ||
350 | // Use the object as it came through the wire | ||
351 | return s.IncomingCreateObject(newPosition, sog); | ||
352 | } | ||
353 | } | 351 | } |
354 | } | 352 | } |
353 | |||
355 | return false; | 354 | return false; |
356 | } | 355 | } |
357 | 356 | ||
@@ -360,13 +359,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
360 | if (destination == null) | 359 | if (destination == null) |
361 | return false; | 360 | return false; |
362 | 361 | ||
363 | foreach (Scene s in m_sceneList) | 362 | if (m_scenes.ContainsKey(destination.RegionID)) |
364 | { | 363 | { |
365 | if (s.RegionInfo.RegionHandle == destination.RegionHandle) | 364 | // m_log.DebugFormat( |
366 | { | 365 | // "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", |
367 | return s.IncomingCreateObject(userID, itemID); | 366 | // s.RegionInfo.RegionName, destination.RegionHandle); |
368 | } | 367 | |
368 | return m_scenes[destination.RegionID].IncomingCreateObject(userID, itemID); | ||
369 | } | 369 | } |
370 | |||
370 | return false; | 371 | return false; |
371 | } | 372 | } |
372 | 373 | ||
@@ -377,18 +378,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
377 | 378 | ||
378 | public bool IsLocalRegion(ulong regionhandle) | 379 | public bool IsLocalRegion(ulong regionhandle) |
379 | { | 380 | { |
380 | foreach (Scene s in m_sceneList) | 381 | foreach (Scene s in m_scenes.Values) |
381 | if (s.RegionInfo.RegionHandle == regionhandle) | 382 | if (s.RegionInfo.RegionHandle == regionhandle) |
382 | return true; | 383 | return true; |
384 | |||
383 | return false; | 385 | return false; |
384 | } | 386 | } |
385 | 387 | ||
386 | public bool IsLocalRegion(UUID id) | 388 | public bool IsLocalRegion(UUID id) |
387 | { | 389 | { |
388 | foreach (Scene s in m_sceneList) | 390 | return m_scenes.ContainsKey(id); |
389 | if (s.RegionInfo.RegionID == id) | ||
390 | return true; | ||
391 | return false; | ||
392 | } | 391 | } |
393 | 392 | ||
394 | #endregion | 393 | #endregion |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs index 4b70692..d395413 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs | |||
@@ -151,9 +151,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
151 | 151 | ||
152 | #region IInterregionComms | 152 | #region IInterregionComms |
153 | 153 | ||
154 | public IScene GetScene(ulong handle) | 154 | public IScene GetScene(UUID regionId) |
155 | { | 155 | { |
156 | return m_localBackend.GetScene(handle); | 156 | return m_localBackend.GetScene(regionId); |
157 | } | 157 | } |
158 | 158 | ||
159 | public ISimulationService GetInnerService() | 159 | public ISimulationService GetInnerService() |
@@ -226,13 +226,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
226 | return m_remoteConnector.RetrieveAgent(destination, id, out agent); | 226 | return m_remoteConnector.RetrieveAgent(destination, id, out agent); |
227 | 227 | ||
228 | return false; | 228 | return false; |
229 | |||
230 | } | 229 | } |
231 | 230 | ||
232 | public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string version, out string reason) | 231 | public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string version, out string reason) |
233 | { | 232 | { |
234 | reason = "Communications failure"; | 233 | reason = "Communications failure"; |
235 | version = "Unknown"; | 234 | version = "Unknown"; |
235 | |||
236 | if (destination == null) | 236 | if (destination == null) |
237 | return false; | 237 | return false; |
238 | 238 | ||
@@ -245,7 +245,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
245 | return m_remoteConnector.QueryAccess(destination, id, position, out version, out reason); | 245 | return m_remoteConnector.QueryAccess(destination, id, position, out version, out reason); |
246 | 246 | ||
247 | return false; | 247 | return false; |
248 | |||
249 | } | 248 | } |
250 | 249 | ||
251 | public bool ReleaseAgent(UUID origin, UUID id, string uri) | 250 | public bool ReleaseAgent(UUID origin, UUID id, string uri) |
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index 38db239..619550c 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs | |||
@@ -41,6 +41,7 @@ using OpenSim.Framework.Serialization.External; | |||
41 | using OpenSim.Region.CoreModules.World.Terrain; | 41 | using OpenSim.Region.CoreModules.World.Terrain; |
42 | using OpenSim.Region.Framework.Interfaces; | 42 | using OpenSim.Region.Framework.Interfaces; |
43 | using OpenSim.Region.Framework.Scenes; | 43 | using OpenSim.Region.Framework.Scenes; |
44 | using OpenSim.Region.Framework.Scenes.Serialization; | ||
44 | using OpenSim.Services.Interfaces; | 45 | using OpenSim.Services.Interfaces; |
45 | 46 | ||
46 | namespace OpenSim.Region.CoreModules.World.Archiver | 47 | namespace OpenSim.Region.CoreModules.World.Archiver |
@@ -245,6 +246,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
245 | // Reload serialized prims | 246 | // Reload serialized prims |
246 | m_log.InfoFormat("[ARCHIVER]: Loading {0} scene objects. Please wait.", serialisedSceneObjects.Count); | 247 | m_log.InfoFormat("[ARCHIVER]: Loading {0} scene objects. Please wait.", serialisedSceneObjects.Count); |
247 | 248 | ||
249 | UUID oldTelehubUUID = m_scene.RegionInfo.RegionSettings.TelehubObject; | ||
250 | |||
248 | IRegionSerialiserModule serialiser = m_scene.RequestModuleInterface<IRegionSerialiserModule>(); | 251 | IRegionSerialiserModule serialiser = m_scene.RequestModuleInterface<IRegionSerialiserModule>(); |
249 | int sceneObjectsLoadedCount = 0; | 252 | int sceneObjectsLoadedCount = 0; |
250 | 253 | ||
@@ -266,11 +269,21 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
266 | 269 | ||
267 | SceneObjectGroup sceneObject = serialiser.DeserializeGroupFromXml2(serialisedSceneObject); | 270 | SceneObjectGroup sceneObject = serialiser.DeserializeGroupFromXml2(serialisedSceneObject); |
268 | 271 | ||
272 | bool isTelehub = (sceneObject.UUID == oldTelehubUUID); | ||
273 | |||
269 | // For now, give all incoming scene objects new uuids. This will allow scenes to be cloned | 274 | // For now, give all incoming scene objects new uuids. This will allow scenes to be cloned |
270 | // on the same region server and multiple examples a single object archive to be imported | 275 | // on the same region server and multiple examples a single object archive to be imported |
271 | // to the same scene (when this is possible). | 276 | // to the same scene (when this is possible). |
272 | sceneObject.ResetIDs(); | 277 | sceneObject.ResetIDs(); |
273 | 278 | ||
279 | if (isTelehub) | ||
280 | { | ||
281 | // Change the Telehub Object to the new UUID | ||
282 | m_scene.RegionInfo.RegionSettings.TelehubObject = sceneObject.UUID; | ||
283 | m_scene.RegionInfo.RegionSettings.Save(); | ||
284 | oldTelehubUUID = UUID.Zero; | ||
285 | } | ||
286 | |||
274 | // Try to retain the original creator/owner/lastowner if their uuid is present on this grid | 287 | // Try to retain the original creator/owner/lastowner if their uuid is present on this grid |
275 | // or creator data is present. Otherwise, use the estate owner instead. | 288 | // or creator data is present. Otherwise, use the estate owner instead. |
276 | foreach (SceneObjectPart part in sceneObject.Parts) | 289 | foreach (SceneObjectPart part in sceneObject.Parts) |
@@ -347,7 +360,14 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
347 | int ignoredObjects = serialisedSceneObjects.Count - sceneObjectsLoadedCount; | 360 | int ignoredObjects = serialisedSceneObjects.Count - sceneObjectsLoadedCount; |
348 | 361 | ||
349 | if (ignoredObjects > 0) | 362 | if (ignoredObjects > 0) |
350 | m_log.WarnFormat("[ARCHIVER]: Ignored {0} scene objects that already existed in the scene", ignoredObjects); | 363 | m_log.WarnFormat("[ARCHIVER]: Ignored {0} scene objects that already existed in the scene", ignoredObjects); |
364 | |||
365 | if (oldTelehubUUID != UUID.Zero) | ||
366 | { | ||
367 | m_log.WarnFormat("Telehub object not found: {0}", oldTelehubUUID); | ||
368 | m_scene.RegionInfo.RegionSettings.TelehubObject = UUID.Zero; | ||
369 | m_scene.RegionInfo.RegionSettings.ClearSpawnPoints(); | ||
370 | } | ||
351 | } | 371 | } |
352 | 372 | ||
353 | /// <summary> | 373 | /// <summary> |
@@ -523,6 +543,10 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
523 | currentRegionSettings.TerrainTexture4 = loadedRegionSettings.TerrainTexture4; | 543 | currentRegionSettings.TerrainTexture4 = loadedRegionSettings.TerrainTexture4; |
524 | currentRegionSettings.UseEstateSun = loadedRegionSettings.UseEstateSun; | 544 | currentRegionSettings.UseEstateSun = loadedRegionSettings.UseEstateSun; |
525 | currentRegionSettings.WaterHeight = loadedRegionSettings.WaterHeight; | 545 | currentRegionSettings.WaterHeight = loadedRegionSettings.WaterHeight; |
546 | currentRegionSettings.TelehubObject = loadedRegionSettings.TelehubObject; | ||
547 | currentRegionSettings.ClearSpawnPoints(); | ||
548 | foreach (SpawnPoint sp in loadedRegionSettings.SpawnPoints()) | ||
549 | currentRegionSettings.AddSpawnPoint(sp); | ||
526 | 550 | ||
527 | currentRegionSettings.Save(); | 551 | currentRegionSettings.Save(); |
528 | 552 | ||
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs index 4d459bf..4edaaca 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs | |||
@@ -40,6 +40,9 @@ using OpenSim.Framework.Serialization; | |||
40 | using OpenSim.Region.CoreModules.World.Terrain; | 40 | using OpenSim.Region.CoreModules.World.Terrain; |
41 | using OpenSim.Region.Framework.Interfaces; | 41 | using OpenSim.Region.Framework.Interfaces; |
42 | using OpenSim.Region.Framework.Scenes; | 42 | using OpenSim.Region.Framework.Scenes; |
43 | using Ionic.Zlib; | ||
44 | using GZipStream = Ionic.Zlib.GZipStream; | ||
45 | using CompressionMode = Ionic.Zlib.CompressionMode; | ||
43 | 46 | ||
44 | namespace OpenSim.Region.CoreModules.World.Archiver | 47 | namespace OpenSim.Region.CoreModules.World.Archiver |
45 | { | 48 | { |
@@ -64,7 +67,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
64 | /// Determine whether this archive will save assets. Default is true. | 67 | /// Determine whether this archive will save assets. Default is true. |
65 | /// </summary> | 68 | /// </summary> |
66 | public bool SaveAssets { get; set; } | 69 | public bool SaveAssets { get; set; } |
67 | 70 | ||
71 | protected ArchiverModule m_module; | ||
68 | protected Scene m_scene; | 72 | protected Scene m_scene; |
69 | protected Stream m_saveStream; | 73 | protected Stream m_saveStream; |
70 | protected Guid m_requestId; | 74 | protected Guid m_requestId; |
@@ -72,17 +76,17 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
72 | /// <summary> | 76 | /// <summary> |
73 | /// Constructor | 77 | /// Constructor |
74 | /// </summary> | 78 | /// </summary> |
75 | /// <param name="scene"></param> | 79 | /// <param name="module">Calling module</param> |
76 | /// <param name="savePath">The path to which to save data.</param> | 80 | /// <param name="savePath">The path to which to save data.</param> |
77 | /// <param name="requestId">The id associated with this request</param> | 81 | /// <param name="requestId">The id associated with this request</param> |
78 | /// <exception cref="System.IO.IOException"> | 82 | /// <exception cref="System.IO.IOException"> |
79 | /// If there was a problem opening a stream for the file specified by the savePath | 83 | /// If there was a problem opening a stream for the file specified by the savePath |
80 | /// </exception> | 84 | /// </exception> |
81 | public ArchiveWriteRequestPreparation(Scene scene, string savePath, Guid requestId) : this(scene, requestId) | 85 | public ArchiveWriteRequestPreparation(ArchiverModule module, string savePath, Guid requestId) : this(module, requestId) |
82 | { | 86 | { |
83 | try | 87 | try |
84 | { | 88 | { |
85 | m_saveStream = new GZipStream(new FileStream(savePath, FileMode.Create), CompressionMode.Compress); | 89 | m_saveStream = new GZipStream(new FileStream(savePath, FileMode.Create), CompressionMode.Compress, CompressionLevel.BestCompression); |
86 | } | 90 | } |
87 | catch (EntryPointNotFoundException e) | 91 | catch (EntryPointNotFoundException e) |
88 | { | 92 | { |
@@ -96,17 +100,23 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
96 | /// <summary> | 100 | /// <summary> |
97 | /// Constructor. | 101 | /// Constructor. |
98 | /// </summary> | 102 | /// </summary> |
99 | /// <param name="scene"></param> | 103 | /// <param name="module">Calling module</param> |
100 | /// <param name="saveStream">The stream to which to save data.</param> | 104 | /// <param name="saveStream">The stream to which to save data.</param> |
101 | /// <param name="requestId">The id associated with this request</param> | 105 | /// <param name="requestId">The id associated with this request</param> |
102 | public ArchiveWriteRequestPreparation(Scene scene, Stream saveStream, Guid requestId) : this(scene, requestId) | 106 | public ArchiveWriteRequestPreparation(ArchiverModule module, Stream saveStream, Guid requestId) : this(module, requestId) |
103 | { | 107 | { |
104 | m_saveStream = saveStream; | 108 | m_saveStream = saveStream; |
105 | } | 109 | } |
106 | 110 | ||
107 | protected ArchiveWriteRequestPreparation(Scene scene, Guid requestId) | 111 | protected ArchiveWriteRequestPreparation(ArchiverModule module, Guid requestId) |
108 | { | 112 | { |
109 | m_scene = scene; | 113 | m_module = module; |
114 | |||
115 | // FIXME: This is only here for regression test purposes since they do not supply a module. Need to fix | ||
116 | // this. | ||
117 | if (m_module != null) | ||
118 | m_scene = m_module.Scene; | ||
119 | |||
110 | m_requestId = requestId; | 120 | m_requestId = requestId; |
111 | 121 | ||
112 | SaveAssets = true; | 122 | SaveAssets = true; |
@@ -297,10 +307,15 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
297 | if (checkPermissions.Contains("T") && !canTransfer) | 307 | if (checkPermissions.Contains("T") && !canTransfer) |
298 | partPermitted = false; | 308 | partPermitted = false; |
299 | 309 | ||
310 | // If the user is the Creator of the object then it can always be included in the OAR | ||
311 | bool creator = (obj.CreatorID.Guid == user.Guid); | ||
312 | if (creator) | ||
313 | partPermitted = true; | ||
314 | |||
300 | //string name = (objGroup.PrimCount == 1) ? objGroup.Name : string.Format("{0} ({1}/{2})", obj.Name, primNumber, objGroup.PrimCount); | 315 | //string name = (objGroup.PrimCount == 1) ? objGroup.Name : string.Format("{0} ({1}/{2})", obj.Name, primNumber, objGroup.PrimCount); |
301 | //m_log.DebugFormat("[ARCHIVER]: Object permissions: {0}: Base={1:X4}, Owner={2:X4}, Everyone={3:X4}, permissionClass={4}, checkPermissions={5}, canCopy={6}, canTransfer={7}, permitted={8}", | 316 | //m_log.DebugFormat("[ARCHIVER]: Object permissions: {0}: Base={1:X4}, Owner={2:X4}, Everyone={3:X4}, permissionClass={4}, checkPermissions={5}, canCopy={6}, canTransfer={7}, creator={8}, permitted={9}", |
302 | // name, obj.BaseMask, obj.OwnerMask, obj.EveryoneMask, | 317 | // name, obj.BaseMask, obj.OwnerMask, obj.EveryoneMask, |
303 | // permissionClass, checkPermissions, canCopy, canTransfer, permitted); | 318 | // permissionClass, checkPermissions, canCopy, canTransfer, creator, partPermitted); |
304 | 319 | ||
305 | if (!partPermitted) | 320 | if (!partPermitted) |
306 | { | 321 | { |
@@ -320,7 +335,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
320 | /// <returns></returns> | 335 | /// <returns></returns> |
321 | public string CreateControlFile(Dictionary<string, object> options) | 336 | public string CreateControlFile(Dictionary<string, object> options) |
322 | { | 337 | { |
323 | int majorVersion = MAX_MAJOR_VERSION, minorVersion = 7; | 338 | int majorVersion = MAX_MAJOR_VERSION, minorVersion = 8; |
324 | // | 339 | // |
325 | // if (options.ContainsKey("version")) | 340 | // if (options.ContainsKey("version")) |
326 | // { | 341 | // { |
@@ -356,32 +371,66 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
356 | //if (majorVersion == 1) | 371 | //if (majorVersion == 1) |
357 | //{ | 372 | //{ |
358 | // m_log.WarnFormat("[ARCHIVER]: Please be aware that version 1.0 OARs are not compatible with OpenSim 0.7.0.2 and earlier. Please use the --version=0 option if you want to produce a compatible OAR"); | 373 | // m_log.WarnFormat("[ARCHIVER]: Please be aware that version 1.0 OARs are not compatible with OpenSim 0.7.0.2 and earlier. Please use the --version=0 option if you want to produce a compatible OAR"); |
359 | //} | 374 | //} |
375 | |||
376 | String s; | ||
360 | 377 | ||
361 | StringWriter sw = new StringWriter(); | 378 | using (StringWriter sw = new StringWriter()) |
362 | XmlTextWriter xtw = new XmlTextWriter(sw); | 379 | { |
363 | xtw.Formatting = Formatting.Indented; | 380 | using (XmlTextWriter xtw = new XmlTextWriter(sw)) |
364 | xtw.WriteStartDocument(); | 381 | { |
365 | xtw.WriteStartElement("archive"); | 382 | xtw.Formatting = Formatting.Indented; |
366 | xtw.WriteAttributeString("major_version", majorVersion.ToString()); | 383 | xtw.WriteStartDocument(); |
367 | xtw.WriteAttributeString("minor_version", minorVersion.ToString()); | 384 | xtw.WriteStartElement("archive"); |
368 | 385 | xtw.WriteAttributeString("major_version", majorVersion.ToString()); | |
369 | xtw.WriteStartElement("creation_info"); | 386 | xtw.WriteAttributeString("minor_version", minorVersion.ToString()); |
370 | DateTime now = DateTime.UtcNow; | 387 | |
371 | TimeSpan t = now - new DateTime(1970, 1, 1); | 388 | xtw.WriteStartElement("creation_info"); |
372 | xtw.WriteElementString("datetime", ((int)t.TotalSeconds).ToString()); | 389 | DateTime now = DateTime.UtcNow; |
373 | xtw.WriteElementString("id", UUID.Random().ToString()); | 390 | TimeSpan t = now - new DateTime(1970, 1, 1); |
374 | xtw.WriteEndElement(); | 391 | xtw.WriteElementString("datetime", ((int)t.TotalSeconds).ToString()); |
375 | 392 | xtw.WriteElementString("id", UUID.Random().ToString()); | |
376 | xtw.WriteElementString("assets_included", SaveAssets.ToString()); | 393 | xtw.WriteEndElement(); |
377 | 394 | ||
378 | xtw.WriteEndElement(); | 395 | xtw.WriteStartElement("region_info"); |
379 | 396 | ||
380 | xtw.Flush(); | 397 | bool isMegaregion; |
381 | xtw.Close(); | 398 | Vector2 size; |
382 | 399 | IRegionCombinerModule rcMod = null; | |
383 | String s = sw.ToString(); | 400 | |
384 | sw.Close(); | 401 | // FIXME: This is only here for regression test purposes since they do not supply a module. Need to fix |
402 | // this, possibly by doing control file creation somewhere else. | ||
403 | if (m_module != null) | ||
404 | rcMod = m_module.RegionCombinerModule; | ||
405 | |||
406 | if (rcMod != null) | ||
407 | isMegaregion = rcMod.IsRootForMegaregion(m_scene.RegionInfo.RegionID); | ||
408 | else | ||
409 | isMegaregion = false; | ||
410 | |||
411 | if (isMegaregion) | ||
412 | size = rcMod.GetSizeOfMegaregion(m_scene.RegionInfo.RegionID); | ||
413 | else | ||
414 | size = new Vector2((float)Constants.RegionSize, (float)Constants.RegionSize); | ||
415 | |||
416 | xtw.WriteElementString("is_megaregion", isMegaregion.ToString()); | ||
417 | xtw.WriteElementString("size_in_meters", string.Format("{0},{1}", size.X, size.Y)); | ||
418 | |||
419 | xtw.WriteEndElement(); | ||
420 | |||
421 | xtw.WriteElementString("assets_included", SaveAssets.ToString()); | ||
422 | |||
423 | xtw.WriteEndElement(); | ||
424 | |||
425 | xtw.Flush(); | ||
426 | } | ||
427 | |||
428 | s = sw.ToString(); | ||
429 | } | ||
430 | |||
431 | // if (m_scene != null) | ||
432 | // Console.WriteLine( | ||
433 | // "[ARCHIVE WRITE REQUEST PREPARATION]: Control file for {0} is: {1}", m_scene.RegionInfo.RegionName, s); | ||
385 | 434 | ||
386 | return s; | 435 | return s; |
387 | } | 436 | } |
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs index f5a5a8d..bf3b124 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs | |||
@@ -45,7 +45,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
45 | private static readonly ILog m_log = | 45 | private static readonly ILog m_log = |
46 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 46 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
47 | 47 | ||
48 | private Scene m_scene; | 48 | public Scene Scene { get; private set; } |
49 | public IRegionCombinerModule RegionCombinerModule { get; private set; } | ||
49 | 50 | ||
50 | /// <value> | 51 | /// <value> |
51 | /// The file used to load and save an opensimulator archive if no filename has been specified | 52 | /// The file used to load and save an opensimulator archive if no filename has been specified |
@@ -70,13 +71,14 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
70 | 71 | ||
71 | public void AddRegion(Scene scene) | 72 | public void AddRegion(Scene scene) |
72 | { | 73 | { |
73 | m_scene = scene; | 74 | Scene = scene; |
74 | m_scene.RegisterModuleInterface<IRegionArchiverModule>(this); | 75 | Scene.RegisterModuleInterface<IRegionArchiverModule>(this); |
75 | //m_log.DebugFormat("[ARCHIVER]: Enabled for region {0}", scene.RegionInfo.RegionName); | 76 | //m_log.DebugFormat("[ARCHIVER]: Enabled for region {0}", scene.RegionInfo.RegionName); |
76 | } | 77 | } |
77 | 78 | ||
78 | public void RegionLoaded(Scene scene) | 79 | public void RegionLoaded(Scene scene) |
79 | { | 80 | { |
81 | RegionCombinerModule = scene.RequestModuleInterface<IRegionCombinerModule>(); | ||
80 | } | 82 | } |
81 | 83 | ||
82 | public void RemoveRegion(Scene scene) | 84 | public void RemoveRegion(Scene scene) |
@@ -165,9 +167,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
165 | public void ArchiveRegion(string savePath, Guid requestId, Dictionary<string, object> options) | 167 | public void ArchiveRegion(string savePath, Guid requestId, Dictionary<string, object> options) |
166 | { | 168 | { |
167 | m_log.InfoFormat( | 169 | m_log.InfoFormat( |
168 | "[ARCHIVER]: Writing archive for region {0} to {1}", m_scene.RegionInfo.RegionName, savePath); | 170 | "[ARCHIVER]: Writing archive for region {0} to {1}", Scene.RegionInfo.RegionName, savePath); |
169 | 171 | ||
170 | new ArchiveWriteRequestPreparation(m_scene, savePath, requestId).ArchiveRegion(options); | 172 | new ArchiveWriteRequestPreparation(this, savePath, requestId).ArchiveRegion(options); |
171 | } | 173 | } |
172 | 174 | ||
173 | public void ArchiveRegion(Stream saveStream) | 175 | public void ArchiveRegion(Stream saveStream) |
@@ -182,7 +184,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
182 | 184 | ||
183 | public void ArchiveRegion(Stream saveStream, Guid requestId, Dictionary<string, object> options) | 185 | public void ArchiveRegion(Stream saveStream, Guid requestId, Dictionary<string, object> options) |
184 | { | 186 | { |
185 | new ArchiveWriteRequestPreparation(m_scene, saveStream, requestId).ArchiveRegion(options); | 187 | new ArchiveWriteRequestPreparation(this, saveStream, requestId).ArchiveRegion(options); |
186 | } | 188 | } |
187 | 189 | ||
188 | public void DearchiveRegion(string loadPath) | 190 | public void DearchiveRegion(string loadPath) |
@@ -193,9 +195,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
193 | public void DearchiveRegion(string loadPath, bool merge, bool skipAssets, Guid requestId) | 195 | public void DearchiveRegion(string loadPath, bool merge, bool skipAssets, Guid requestId) |
194 | { | 196 | { |
195 | m_log.InfoFormat( | 197 | m_log.InfoFormat( |
196 | "[ARCHIVER]: Loading archive to region {0} from {1}", m_scene.RegionInfo.RegionName, loadPath); | 198 | "[ARCHIVER]: Loading archive to region {0} from {1}", Scene.RegionInfo.RegionName, loadPath); |
197 | 199 | ||
198 | new ArchiveReadRequest(m_scene, loadPath, merge, skipAssets, requestId).DearchiveRegion(); | 200 | new ArchiveReadRequest(Scene, loadPath, merge, skipAssets, requestId).DearchiveRegion(); |
199 | } | 201 | } |
200 | 202 | ||
201 | public void DearchiveRegion(Stream loadStream) | 203 | public void DearchiveRegion(Stream loadStream) |
@@ -205,7 +207,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
205 | 207 | ||
206 | public void DearchiveRegion(Stream loadStream, bool merge, bool skipAssets, Guid requestId) | 208 | public void DearchiveRegion(Stream loadStream, bool merge, bool skipAssets, Guid requestId) |
207 | { | 209 | { |
208 | new ArchiveReadRequest(m_scene, loadStream, merge, skipAssets, requestId).DearchiveRegion(); | 210 | new ArchiveReadRequest(Scene, loadStream, merge, skipAssets, requestId).DearchiveRegion(); |
209 | } | 211 | } |
210 | } | 212 | } |
211 | } | 213 | } |
diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs index 63f1363..5deaf52 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs | |||
@@ -68,7 +68,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
68 | SerialiserModule serialiserModule = new SerialiserModule(); | 68 | SerialiserModule serialiserModule = new SerialiserModule(); |
69 | TerrainModule terrainModule = new TerrainModule(); | 69 | TerrainModule terrainModule = new TerrainModule(); |
70 | 70 | ||
71 | m_scene = SceneHelpers.SetupScene(); | 71 | m_scene = new SceneHelpers().SetupScene(); |
72 | SceneHelpers.SetupSceneModules(m_scene, m_archiverModule, serialiserModule, terrainModule); | 72 | SceneHelpers.SetupSceneModules(m_scene, m_archiverModule, serialiserModule, terrainModule); |
73 | } | 73 | } |
74 | 74 | ||
@@ -102,9 +102,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
102 | PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere(); | 102 | PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere(); |
103 | Vector3 groupPosition = new Vector3(10, 20, 30); | 103 | Vector3 groupPosition = new Vector3(10, 20, 30); |
104 | Quaternion rotationOffset = new Quaternion(20, 30, 40, 50); | 104 | Quaternion rotationOffset = new Quaternion(20, 30, 40, 50); |
105 | Vector3 offsetPosition = new Vector3(5, 10, 15); | 105 | // Vector3 offsetPosition = new Vector3(5, 10, 15); |
106 | 106 | ||
107 | return new SceneObjectPart(ownerId, shape, groupPosition, rotationOffset, offsetPosition) { Name = partName }; | 107 | return new SceneObjectPart(ownerId, shape, groupPosition, rotationOffset, Vector3.Zero) { Name = partName }; |
108 | } | 108 | } |
109 | 109 | ||
110 | protected SceneObjectPart CreateSceneObjectPart2() | 110 | protected SceneObjectPart CreateSceneObjectPart2() |
@@ -292,6 +292,59 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
292 | } | 292 | } |
293 | 293 | ||
294 | /// <summary> | 294 | /// <summary> |
295 | /// Test loading an OpenSim Region Archive where the scene object parts are not ordered by link number (e.g. | ||
296 | /// 2 can come after 3). | ||
297 | /// </summary> | ||
298 | [Test] | ||
299 | public void TestLoadOarUnorderedParts() | ||
300 | { | ||
301 | TestHelpers.InMethod(); | ||
302 | |||
303 | UUID ownerId = TestHelpers.ParseTail(0xaaaa); | ||
304 | |||
305 | MemoryStream archiveWriteStream = new MemoryStream(); | ||
306 | TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream); | ||
307 | |||
308 | tar.WriteFile( | ||
309 | ArchiveConstants.CONTROL_FILE_PATH, | ||
310 | new ArchiveWriteRequestPreparation(null, (Stream)null, Guid.Empty).CreateControlFile(new Dictionary<string, Object>())); | ||
311 | |||
312 | SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, ownerId, "obj1-", 0x11); | ||
313 | SceneObjectPart sop2 | ||
314 | = SceneHelpers.CreateSceneObjectPart("obj1-Part2", TestHelpers.ParseTail(0x12), ownerId); | ||
315 | SceneObjectPart sop3 | ||
316 | = SceneHelpers.CreateSceneObjectPart("obj1-Part3", TestHelpers.ParseTail(0x13), ownerId); | ||
317 | |||
318 | // Add the parts so they will be written out in reverse order to the oar | ||
319 | sog1.AddPart(sop3); | ||
320 | sop3.LinkNum = 3; | ||
321 | sog1.AddPart(sop2); | ||
322 | sop2.LinkNum = 2; | ||
323 | |||
324 | tar.WriteFile( | ||
325 | ArchiveConstants.CreateOarObjectPath(sog1.Name, sog1.UUID, sog1.AbsolutePosition), | ||
326 | SceneObjectSerializer.ToXml2Format(sog1)); | ||
327 | |||
328 | tar.Close(); | ||
329 | |||
330 | MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray()); | ||
331 | |||
332 | lock (this) | ||
333 | { | ||
334 | m_scene.EventManager.OnOarFileLoaded += LoadCompleted; | ||
335 | m_archiverModule.DearchiveRegion(archiveReadStream); | ||
336 | } | ||
337 | |||
338 | Assert.That(m_lastErrorMessage, Is.Null); | ||
339 | |||
340 | SceneObjectPart part2 = m_scene.GetSceneObjectPart("obj1-Part2"); | ||
341 | Assert.That(part2.LinkNum, Is.EqualTo(2)); | ||
342 | |||
343 | SceneObjectPart part3 = m_scene.GetSceneObjectPart("obj1-Part3"); | ||
344 | Assert.That(part3.LinkNum, Is.EqualTo(3)); | ||
345 | } | ||
346 | |||
347 | /// <summary> | ||
295 | /// Test loading an OpenSim Region Archive. | 348 | /// Test loading an OpenSim Region Archive. |
296 | /// </summary> | 349 | /// </summary> |
297 | [Test] | 350 | [Test] |
@@ -463,7 +516,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
463 | SerialiserModule serialiserModule = new SerialiserModule(); | 516 | SerialiserModule serialiserModule = new SerialiserModule(); |
464 | TerrainModule terrainModule = new TerrainModule(); | 517 | TerrainModule terrainModule = new TerrainModule(); |
465 | 518 | ||
466 | TestScene scene2 = SceneHelpers.SetupScene(); | 519 | TestScene scene2 = new SceneHelpers().SetupScene(); |
467 | SceneHelpers.SetupSceneModules(scene2, archiverModule, serialiserModule, terrainModule); | 520 | SceneHelpers.SetupSceneModules(scene2, archiverModule, serialiserModule, terrainModule); |
468 | 521 | ||
469 | // Make sure there's a valid owner for the owner we saved (this should have been wiped if the code is | 522 | // Make sure there's a valid owner for the owner we saved (this should have been wiped if the code is |
@@ -534,6 +587,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
534 | rs.TerrainTexture4 = UUID.Parse("00000000-0000-0000-0000-000000000080"); | 587 | rs.TerrainTexture4 = UUID.Parse("00000000-0000-0000-0000-000000000080"); |
535 | rs.UseEstateSun = true; | 588 | rs.UseEstateSun = true; |
536 | rs.WaterHeight = 23; | 589 | rs.WaterHeight = 23; |
590 | rs.TelehubObject = UUID.Parse("00000000-0000-0000-0000-111111111111"); | ||
591 | rs.AddSpawnPoint(SpawnPoint.Parse("1,-2,0.33")); | ||
537 | 592 | ||
538 | tar.WriteFile(ArchiveConstants.SETTINGS_PATH + "region1.xml", RegionSettingsSerializer.Serialize(rs)); | 593 | tar.WriteFile(ArchiveConstants.SETTINGS_PATH + "region1.xml", RegionSettingsSerializer.Serialize(rs)); |
539 | 594 | ||
@@ -580,6 +635,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
580 | Assert.That(loadedRs.TerrainTexture4, Is.EqualTo(UUID.Parse("00000000-0000-0000-0000-000000000080"))); | 635 | Assert.That(loadedRs.TerrainTexture4, Is.EqualTo(UUID.Parse("00000000-0000-0000-0000-000000000080"))); |
581 | Assert.That(loadedRs.UseEstateSun, Is.True); | 636 | Assert.That(loadedRs.UseEstateSun, Is.True); |
582 | Assert.That(loadedRs.WaterHeight, Is.EqualTo(23)); | 637 | Assert.That(loadedRs.WaterHeight, Is.EqualTo(23)); |
638 | Assert.AreEqual(UUID.Zero, loadedRs.TelehubObject); // because no object was found with the original UUID | ||
639 | Assert.AreEqual(0, loadedRs.SpawnPoints().Count); | ||
583 | } | 640 | } |
584 | 641 | ||
585 | /// <summary> | 642 | /// <summary> |
@@ -607,7 +664,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
607 | SerialiserModule serialiserModule = new SerialiserModule(); | 664 | SerialiserModule serialiserModule = new SerialiserModule(); |
608 | TerrainModule terrainModule = new TerrainModule(); | 665 | TerrainModule terrainModule = new TerrainModule(); |
609 | 666 | ||
610 | Scene scene = SceneHelpers.SetupScene(); | 667 | Scene scene = new SceneHelpers().SetupScene(); |
611 | SceneHelpers.SetupSceneModules(scene, archiverModule, serialiserModule, terrainModule); | 668 | SceneHelpers.SetupSceneModules(scene, archiverModule, serialiserModule, terrainModule); |
612 | 669 | ||
613 | m_scene.AddNewSceneObject(new SceneObjectGroup(part2), false); | 670 | m_scene.AddNewSceneObject(new SceneObjectGroup(part2), false); |
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs index d2bbea3..3b84d57 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs | |||
@@ -73,7 +73,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
73 | "set terrain heights <corner> <min> <max> [<x>] [<y>]", | 73 | "set terrain heights <corner> <min> <max> [<x>] [<y>]", |
74 | "Sets the terrain texture heights on corner #<corner> to <min>/<max>, if <x> or <y> are specified, it will only " + | 74 | "Sets the terrain texture heights on corner #<corner> to <min>/<max>, if <x> or <y> are specified, it will only " + |
75 | "set it on regions with a matching coordinate. Specify -1 in <x> or <y> to wildcard" + | 75 | "set it on regions with a matching coordinate. Specify -1 in <x> or <y> to wildcard" + |
76 | " that coordinate. Corner # SW = 0, NW = 1, SE = 2, NE = 3.", | 76 | " that coordinate. Corner # SW = 0, NW = 1, SE = 2, NE = 3, all corners = -1.", |
77 | consoleSetTerrainHeights); | 77 | consoleSetTerrainHeights); |
78 | 78 | ||
79 | m_module.Scene.AddCommand( | 79 | m_module.Scene.AddCommand( |
@@ -143,6 +143,16 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
143 | 143 | ||
144 | switch (corner) | 144 | switch (corner) |
145 | { | 145 | { |
146 | case -1: | ||
147 | m_module.Scene.RegionInfo.RegionSettings.Elevation1SW = lowValue; | ||
148 | m_module.Scene.RegionInfo.RegionSettings.Elevation2SW = highValue; | ||
149 | m_module.Scene.RegionInfo.RegionSettings.Elevation1NW = lowValue; | ||
150 | m_module.Scene.RegionInfo.RegionSettings.Elevation2NW = highValue; | ||
151 | m_module.Scene.RegionInfo.RegionSettings.Elevation1SE = lowValue; | ||
152 | m_module.Scene.RegionInfo.RegionSettings.Elevation2SE = highValue; | ||
153 | m_module.Scene.RegionInfo.RegionSettings.Elevation1NE = lowValue; | ||
154 | m_module.Scene.RegionInfo.RegionSettings.Elevation2NE = highValue; | ||
155 | break; | ||
146 | case 0: | 156 | case 0: |
147 | m_module.Scene.RegionInfo.RegionSettings.Elevation1SW = lowValue; | 157 | m_module.Scene.RegionInfo.RegionSettings.Elevation1SW = lowValue; |
148 | m_module.Scene.RegionInfo.RegionSettings.Elevation2SW = highValue; | 158 | m_module.Scene.RegionInfo.RegionSettings.Elevation2SW = highValue; |
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 97a2f4a..fdef9d8 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs | |||
@@ -170,12 +170,18 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
170 | sendRegionInfoPacketToAll(); | 170 | sendRegionInfoPacketToAll(); |
171 | } | 171 | } |
172 | 172 | ||
173 | public void setEstateTerrainBaseTexture(IClientAPI remoteClient, int corner, UUID texture) | 173 | public void setEstateTerrainBaseTexture(int level, UUID texture) |
174 | { | ||
175 | setEstateTerrainBaseTexture(null, level, texture); | ||
176 | sendRegionHandshakeToAll(); | ||
177 | } | ||
178 | |||
179 | public void setEstateTerrainBaseTexture(IClientAPI remoteClient, int level, UUID texture) | ||
174 | { | 180 | { |
175 | if (texture == UUID.Zero) | 181 | if (texture == UUID.Zero) |
176 | return; | 182 | return; |
177 | 183 | ||
178 | switch (corner) | 184 | switch (level) |
179 | { | 185 | { |
180 | case 0: | 186 | case 0: |
181 | Scene.RegionInfo.RegionSettings.TerrainTexture1 = texture; | 187 | Scene.RegionInfo.RegionSettings.TerrainTexture1 = texture; |
@@ -195,6 +201,11 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
195 | sendRegionInfoPacketToAll(); | 201 | sendRegionInfoPacketToAll(); |
196 | } | 202 | } |
197 | 203 | ||
204 | public void setEstateTerrainTextureHeights(int corner, float lowValue, float highValue) | ||
205 | { | ||
206 | setEstateTerrainTextureHeights(null, corner, lowValue, highValue); | ||
207 | } | ||
208 | |||
198 | public void setEstateTerrainTextureHeights(IClientAPI client, int corner, float lowValue, float highValue) | 209 | public void setEstateTerrainTextureHeights(IClientAPI client, int corner, float lowValue, float highValue) |
199 | { | 210 | { |
200 | switch (corner) | 211 | switch (corner) |
@@ -993,7 +1004,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
993 | { | 1004 | { |
994 | RegionHandshakeArgs args = new RegionHandshakeArgs(); | 1005 | RegionHandshakeArgs args = new RegionHandshakeArgs(); |
995 | 1006 | ||
996 | args.isEstateManager = Scene.RegionInfo.EstateSettings.IsEstateManager(remoteClient.AgentId); | 1007 | args.isEstateManager = Scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(remoteClient.AgentId); |
997 | if (Scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero && Scene.RegionInfo.EstateSettings.EstateOwner == remoteClient.AgentId) | 1008 | if (Scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero && Scene.RegionInfo.EstateSettings.EstateOwner == remoteClient.AgentId) |
998 | args.isEstateManager = true; | 1009 | args.isEstateManager = true; |
999 | 1010 | ||
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index add1551..51dcb67 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs | |||
@@ -1395,21 +1395,26 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
1395 | private void EventManagerOnRegisterCaps(UUID agentID, Caps caps) | 1395 | private void EventManagerOnRegisterCaps(UUID agentID, Caps caps) |
1396 | { | 1396 | { |
1397 | string capsBase = "/CAPS/" + caps.CapsObjectPath; | 1397 | string capsBase = "/CAPS/" + caps.CapsObjectPath; |
1398 | caps.RegisterHandler("RemoteParcelRequest", | 1398 | caps.RegisterHandler( |
1399 | new RestStreamHandler("POST", capsBase + remoteParcelRequestPath, | 1399 | "RemoteParcelRequest", |
1400 | delegate(string request, string path, string param, | 1400 | new RestStreamHandler( |
1401 | IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) | 1401 | "POST", |
1402 | { | 1402 | capsBase + remoteParcelRequestPath, |
1403 | return RemoteParcelRequest(request, path, param, agentID, caps); | 1403 | (request, path, param, httpRequest, httpResponse) |
1404 | })); | 1404 | => RemoteParcelRequest(request, path, param, agentID, caps), |
1405 | "RemoteParcelRequest", | ||
1406 | agentID.ToString())); | ||
1407 | |||
1405 | UUID parcelCapID = UUID.Random(); | 1408 | UUID parcelCapID = UUID.Random(); |
1406 | caps.RegisterHandler("ParcelPropertiesUpdate", | 1409 | caps.RegisterHandler( |
1407 | new RestStreamHandler("POST", "/CAPS/" + parcelCapID, | 1410 | "ParcelPropertiesUpdate", |
1408 | delegate(string request, string path, string param, | 1411 | new RestStreamHandler( |
1409 | IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) | 1412 | "POST", |
1410 | { | 1413 | "/CAPS/" + parcelCapID, |
1411 | return ProcessPropertiesUpdate(request, path, param, agentID, caps); | 1414 | (request, path, param, httpRequest, httpResponse) |
1412 | })); | 1415 | => ProcessPropertiesUpdate(request, path, param, agentID, caps), |
1416 | "ParcelPropertiesUpdate", | ||
1417 | agentID.ToString())); | ||
1413 | } | 1418 | } |
1414 | private string ProcessPropertiesUpdate(string request, string path, string param, UUID agentID, Caps caps) | 1419 | private string ProcessPropertiesUpdate(string request, string path, string param, UUID agentID, Caps caps) |
1415 | { | 1420 | { |
@@ -1774,7 +1779,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
1774 | 1779 | ||
1775 | Vector3 pos = m_scene.GetNearestAllowedPosition(targetAvatar, land); | 1780 | Vector3 pos = m_scene.GetNearestAllowedPosition(targetAvatar, land); |
1776 | 1781 | ||
1777 | targetAvatar.TeleportWithMomentum(pos); | 1782 | targetAvatar.TeleportWithMomentum(pos, null); |
1778 | targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname); | 1783 | targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname); |
1779 | parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected."); | 1784 | parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected."); |
1780 | 1785 | ||
diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index 4284444..b7667b9 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs | |||
@@ -450,7 +450,10 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
450 | { | 450 | { |
451 | bool isMember; | 451 | bool isMember; |
452 | if (m_groupMemberCache.TryGetValue(avatar, out isMember)) | 452 | if (m_groupMemberCache.TryGetValue(avatar, out isMember)) |
453 | { | ||
454 | m_groupMemberCache.Update(avatar, isMember, m_groupMemberCacheTimeout); | ||
453 | return isMember; | 455 | return isMember; |
456 | } | ||
454 | 457 | ||
455 | IGroupsModule groupsModule = m_scene.RequestModuleInterface<IGroupsModule>(); | 458 | IGroupsModule groupsModule = m_scene.RequestModuleInterface<IGroupsModule>(); |
456 | if (groupsModule == null) | 459 | if (groupsModule == null) |
@@ -487,7 +490,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
487 | if (m_scene.Permissions.IsAdministrator(avatar)) | 490 | if (m_scene.Permissions.IsAdministrator(avatar)) |
488 | return false; | 491 | return false; |
489 | 492 | ||
490 | if (m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar)) | 493 | if (m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(avatar)) |
491 | return false; | 494 | return false; |
492 | 495 | ||
493 | if (avatar == LandData.OwnerID) | 496 | if (avatar == LandData.OwnerID) |
@@ -517,7 +520,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
517 | if (m_scene.Permissions.IsAdministrator(avatar)) | 520 | if (m_scene.Permissions.IsAdministrator(avatar)) |
518 | return false; | 521 | return false; |
519 | 522 | ||
520 | if (m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar)) | 523 | if (m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(avatar)) |
521 | return false; | 524 | return false; |
522 | 525 | ||
523 | if (avatar == LandData.OwnerID) | 526 | if (avatar == LandData.OwnerID) |
@@ -1230,7 +1233,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
1230 | if (land.LandData.LocalID == LandData.LocalID) | 1233 | if (land.LandData.LocalID == LandData.LocalID) |
1231 | { | 1234 | { |
1232 | Vector3 pos = m_scene.GetNearestAllowedPosition(presence, land); | 1235 | Vector3 pos = m_scene.GetNearestAllowedPosition(presence, land); |
1233 | presence.TeleportWithMomentum(pos); | 1236 | presence.TeleportWithMomentum(pos, null); |
1234 | presence.ControllingClient.SendAlertMessage("You have been ejected from this land"); | 1237 | presence.ControllingClient.SendAlertMessage("You have been ejected from this land"); |
1235 | } | 1238 | } |
1236 | } | 1239 | } |
diff --git a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs index 5122734..102b4d7 100644 --- a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs | |||
@@ -126,7 +126,6 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
126 | // m_log.DebugFormat( | 126 | // m_log.DebugFormat( |
127 | // "[PRIM COUNT MODULE]: Ignoring OnParcelPrimCountAdd() for {0} on {1} since count is tainted", | 127 | // "[PRIM COUNT MODULE]: Ignoring OnParcelPrimCountAdd() for {0} on {1} since count is tainted", |
128 | // obj.Name, m_Scene.RegionInfo.RegionName); | 128 | // obj.Name, m_Scene.RegionInfo.RegionName); |
129 | |||
130 | } | 129 | } |
131 | } | 130 | } |
132 | 131 | ||
diff --git a/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs b/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs index e553ffa..b5ee4d2 100644 --- a/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs +++ b/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs | |||
@@ -64,7 +64,7 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests | |||
64 | { | 64 | { |
65 | m_pcm = new PrimCountModule(); | 65 | m_pcm = new PrimCountModule(); |
66 | LandManagementModule lmm = new LandManagementModule(); | 66 | LandManagementModule lmm = new LandManagementModule(); |
67 | m_scene = SceneHelpers.SetupScene(); | 67 | m_scene = new SceneHelpers().SetupScene(); |
68 | SceneHelpers.SetupSceneModules(m_scene, lmm, m_pcm); | 68 | SceneHelpers.SetupSceneModules(m_scene, lmm, m_pcm); |
69 | 69 | ||
70 | int xParcelDivider = (int)Constants.RegionSize - 1; | 70 | int xParcelDivider = (int)Constants.RegionSize - 1; |
diff --git a/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs b/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs index f86c790..aa306c7 100644 --- a/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs +++ b/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs | |||
@@ -225,7 +225,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
225 | int tc = 0; | 225 | int tc = 0; |
226 | double[,] hm = whichScene.Heightmap.GetDoubles(); | 226 | double[,] hm = whichScene.Heightmap.GetDoubles(); |
227 | tc = Environment.TickCount; | 227 | tc = Environment.TickCount; |
228 | m_log.Info("[MAPTILE]: Generating Maptile Step 2: Object Volume Profile"); | 228 | m_log.Debug("[MAPTILE]: Generating Maptile Step 2: Object Volume Profile"); |
229 | EntityBase[] objs = whichScene.GetEntities(); | 229 | EntityBase[] objs = whichScene.GetEntities(); |
230 | Dictionary<uint, DrawStruct> z_sort = new Dictionary<uint, DrawStruct>(); | 230 | Dictionary<uint, DrawStruct> z_sort = new Dictionary<uint, DrawStruct>(); |
231 | //SortedList<float, RectangleDrawStruct> z_sort = new SortedList<float, RectangleDrawStruct>(); | 231 | //SortedList<float, RectangleDrawStruct> z_sort = new SortedList<float, RectangleDrawStruct>(); |
@@ -541,7 +541,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
541 | g.Dispose(); | 541 | g.Dispose(); |
542 | } // lock entities objs | 542 | } // lock entities objs |
543 | 543 | ||
544 | m_log.Info("[MAPTILE]: Generating Maptile Step 2: Done in " + (Environment.TickCount - tc) + " ms"); | 544 | m_log.Debug("[MAPTILE]: Generating Maptile Step 2: Done in " + (Environment.TickCount - tc) + " ms"); |
545 | return mapbmp; | 545 | return mapbmp; |
546 | } | 546 | } |
547 | 547 | ||
diff --git a/OpenSim/Region/CoreModules/World/LegacyMap/ShadedMapTileRenderer.cs b/OpenSim/Region/CoreModules/World/LegacyMap/ShadedMapTileRenderer.cs index eb1a27f..992bff3 100644 --- a/OpenSim/Region/CoreModules/World/LegacyMap/ShadedMapTileRenderer.cs +++ b/OpenSim/Region/CoreModules/World/LegacyMap/ShadedMapTileRenderer.cs | |||
@@ -54,7 +54,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
54 | public void TerrainToBitmap(Bitmap mapbmp) | 54 | public void TerrainToBitmap(Bitmap mapbmp) |
55 | { | 55 | { |
56 | int tc = Environment.TickCount; | 56 | int tc = Environment.TickCount; |
57 | m_log.Info("[MAPTILE]: Generating Maptile Step 1: Terrain"); | 57 | m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Terrain"); |
58 | 58 | ||
59 | double[,] hm = m_scene.Heightmap.GetDoubles(); | 59 | double[,] hm = m_scene.Heightmap.GetDoubles(); |
60 | bool ShadowDebugContinue = true; | 60 | bool ShadowDebugContinue = true; |
@@ -238,7 +238,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
238 | } | 238 | } |
239 | } | 239 | } |
240 | } | 240 | } |
241 | m_log.Info("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms"); | 241 | m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms"); |
242 | } | 242 | } |
243 | } | 243 | } |
244 | } | 244 | } |
diff --git a/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs b/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs index 1d2141e..d13c2ef 100644 --- a/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs +++ b/OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs | |||
@@ -278,7 +278,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
278 | public void TerrainToBitmap(Bitmap mapbmp) | 278 | public void TerrainToBitmap(Bitmap mapbmp) |
279 | { | 279 | { |
280 | int tc = Environment.TickCount; | 280 | int tc = Environment.TickCount; |
281 | m_log.Info("[MAPTILE]: Generating Maptile Step 1: Terrain"); | 281 | m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Terrain"); |
282 | 282 | ||
283 | // These textures should be in the AssetCache anyway, as every client conneting to this | 283 | // These textures should be in the AssetCache anyway, as every client conneting to this |
284 | // region needs them. Except on start, when the map is recreated (before anyone connected), | 284 | // region needs them. Except on start, when the map is recreated (before anyone connected), |
@@ -412,7 +412,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
412 | } | 412 | } |
413 | } | 413 | } |
414 | } | 414 | } |
415 | m_log.Info("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms"); | 415 | m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms"); |
416 | } | 416 | } |
417 | } | 417 | } |
418 | } | 418 | } |
diff --git a/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs b/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs index 5239f50..601e81e 100644 --- a/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs +++ b/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs | |||
@@ -145,7 +145,9 @@ namespace OpenSim.Region.CoreModules.World.Media.Moap | |||
145 | 145 | ||
146 | // Even though we're registering for POST we're going to get GETS and UPDATES too | 146 | // Even though we're registering for POST we're going to get GETS and UPDATES too |
147 | caps.RegisterHandler( | 147 | caps.RegisterHandler( |
148 | "ObjectMedia", new RestStreamHandler("POST", omCapUrl, HandleObjectMediaMessage)); | 148 | "ObjectMedia", |
149 | new RestStreamHandler( | ||
150 | "POST", omCapUrl, HandleObjectMediaMessage, "ObjectMedia", agentID.ToString())); | ||
149 | } | 151 | } |
150 | 152 | ||
151 | string omuCapUrl = "/CAPS/" + UUID.Random(); | 153 | string omuCapUrl = "/CAPS/" + UUID.Random(); |
@@ -157,7 +159,9 @@ namespace OpenSim.Region.CoreModules.World.Media.Moap | |||
157 | 159 | ||
158 | // Even though we're registering for POST we're going to get GETS and UPDATES too | 160 | // Even though we're registering for POST we're going to get GETS and UPDATES too |
159 | caps.RegisterHandler( | 161 | caps.RegisterHandler( |
160 | "ObjectMediaNavigate", new RestStreamHandler("POST", omuCapUrl, HandleObjectMediaNavigateMessage)); | 162 | "ObjectMediaNavigate", |
163 | new RestStreamHandler( | ||
164 | "POST", omuCapUrl, HandleObjectMediaNavigateMessage, "ObjectMediaNavigate", agentID.ToString())); | ||
161 | } | 165 | } |
162 | } | 166 | } |
163 | 167 | ||
diff --git a/OpenSim/Region/CoreModules/World/Media/Moap/Tests/MoapTests.cs b/OpenSim/Region/CoreModules/World/Media/Moap/Tests/MoapTests.cs index 4326606..0545250 100644 --- a/OpenSim/Region/CoreModules/World/Media/Moap/Tests/MoapTests.cs +++ b/OpenSim/Region/CoreModules/World/Media/Moap/Tests/MoapTests.cs | |||
@@ -53,7 +53,7 @@ namespace OpenSim.Region.CoreModules.World.Media.Moap.Tests | |||
53 | public void SetUp() | 53 | public void SetUp() |
54 | { | 54 | { |
55 | m_module = new MoapModule(); | 55 | m_module = new MoapModule(); |
56 | m_scene = SceneHelpers.SetupScene(); | 56 | m_scene = new SceneHelpers().SetupScene(); |
57 | SceneHelpers.SetupSceneModules(m_scene, m_module); | 57 | SceneHelpers.SetupSceneModules(m_scene, m_module); |
58 | } | 58 | } |
59 | 59 | ||
diff --git a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs index f5a5c92..830d9cb 100644 --- a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs +++ b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs | |||
@@ -29,8 +29,10 @@ using System; | |||
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Reflection; | 30 | using System.Reflection; |
31 | using System.Text; | 31 | using System.Text; |
32 | using System.Text.RegularExpressions; | ||
32 | using log4net; | 33 | using log4net; |
33 | using Mono.Addins; | 34 | using Mono.Addins; |
35 | using NDesk.Options; | ||
34 | using Nini.Config; | 36 | using Nini.Config; |
35 | using OpenMetaverse; | 37 | using OpenMetaverse; |
36 | using OpenSim.Framework; | 38 | using OpenSim.Framework; |
@@ -78,49 +80,61 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
78 | m_scene = scene; | 80 | m_scene = scene; |
79 | m_console = MainConsole.Instance; | 81 | m_console = MainConsole.Instance; |
80 | 82 | ||
81 | m_console.Commands.AddCommand("Regions", false, "delete object owner", | 83 | m_console.Commands.AddCommand( |
82 | "delete object owner <UUID>", | 84 | "Objects", false, "delete object owner", |
83 | "Delete a scene object by owner", HandleDeleteObject); | 85 | "delete object owner <UUID>", |
84 | m_console.Commands.AddCommand("Regions", false, "delete object creator", | 86 | "Delete a scene object by owner", HandleDeleteObject); |
85 | "delete object creator <UUID>", | 87 | |
86 | "Delete a scene object by creator", HandleDeleteObject); | 88 | m_console.Commands.AddCommand( |
87 | m_console.Commands.AddCommand("Regions", false, "delete object uuid", | 89 | "Objects", false, "delete object creator", |
88 | "delete object uuid <UUID>", | 90 | "delete object creator <UUID>", |
89 | "Delete a scene object by uuid", HandleDeleteObject); | 91 | "Delete a scene object by creator", HandleDeleteObject); |
90 | m_console.Commands.AddCommand("Regions", false, "delete object name", | 92 | |
91 | "delete object name <name>", | 93 | m_console.Commands.AddCommand( |
92 | "Delete a scene object by name", HandleDeleteObject); | 94 | "Objects", false, "delete object uuid", |
93 | m_console.Commands.AddCommand("Regions", false, "delete object outside", | 95 | "delete object uuid <UUID>", |
94 | "delete object outside", | 96 | "Delete a scene object by uuid", HandleDeleteObject); |
95 | "Delete all scene objects outside region boundaries", HandleDeleteObject); | 97 | |
98 | m_console.Commands.AddCommand( | ||
99 | "Objects", false, "delete object name", | ||
100 | "delete object name [--regex] <name>", | ||
101 | "Delete a scene object by name.\nIf --regex is specified then the name is treatead as a regular expression", | ||
102 | HandleDeleteObject); | ||
103 | |||
104 | m_console.Commands.AddCommand( | ||
105 | "Objects", false, "delete object outside", | ||
106 | "delete object outside", | ||
107 | "Delete all scene objects outside region boundaries", HandleDeleteObject); | ||
96 | 108 | ||
97 | m_console.Commands.AddCommand( | 109 | m_console.Commands.AddCommand( |
98 | "Regions", | 110 | "Objects", |
99 | false, | 111 | false, |
100 | "show object uuid", | 112 | "show object uuid", |
101 | "show object uuid <UUID>", | 113 | "show object uuid <UUID>", |
102 | "Show details of a scene object with the given UUID", HandleShowObjectByUuid); | 114 | "Show details of a scene object with the given UUID", HandleShowObjectByUuid); |
103 | 115 | ||
104 | m_console.Commands.AddCommand( | 116 | m_console.Commands.AddCommand( |
105 | "Regions", | 117 | "Objects", |
106 | false, | 118 | false, |
107 | "show object name", | 119 | "show object name", |
108 | "show object name <name>", | 120 | "show object name [--regex] <name>", |
109 | "Show details of scene objects with the given name", HandleShowObjectByName); | 121 | "Show details of scene objects with the given name.\nIf --regex is specified then the name is treatead as a regular expression", |
122 | HandleShowObjectByName); | ||
110 | 123 | ||
111 | m_console.Commands.AddCommand( | 124 | m_console.Commands.AddCommand( |
112 | "Regions", | 125 | "Objects", |
113 | false, | 126 | false, |
114 | "show part uuid", | 127 | "show part uuid", |
115 | "show part uuid <UUID>", | 128 | "show part uuid <UUID>", |
116 | "Show details of a scene object parts with the given UUID", HandleShowPartByUuid); | 129 | "Show details of a scene object parts with the given UUID", HandleShowPartByUuid); |
117 | 130 | ||
118 | m_console.Commands.AddCommand( | 131 | m_console.Commands.AddCommand( |
119 | "Regions", | 132 | "Objects", |
120 | false, | 133 | false, |
121 | "show part name", | 134 | "show part name", |
122 | "show part name <name>", | 135 | "show part name [--regex] <name>", |
123 | "Show details of scene object parts with the given name", HandleShowPartByName); | 136 | "Show details of scene object parts with the given name.\nIf --regex is specified then the name is treatead as a regular expression", |
137 | HandleShowPartByName); | ||
124 | } | 138 | } |
125 | 139 | ||
126 | public void RemoveRegion(Scene scene) | 140 | public void RemoveRegion(Scene scene) |
@@ -165,22 +179,38 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
165 | m_console.OutputFormat(sb.ToString()); | 179 | m_console.OutputFormat(sb.ToString()); |
166 | } | 180 | } |
167 | 181 | ||
168 | private void HandleShowObjectByName(string module, string[] cmd) | 182 | private void HandleShowObjectByName(string module, string[] cmdparams) |
169 | { | 183 | { |
170 | if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) | 184 | if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) |
171 | return; | 185 | return; |
172 | 186 | ||
173 | if (cmd.Length < 4) | 187 | bool useRegex = false; |
188 | OptionSet options = new OptionSet().Add("regex", v=> useRegex = v != null ); | ||
189 | |||
190 | List<string> mainParams = options.Parse(cmdparams); | ||
191 | |||
192 | if (mainParams.Count < 4) | ||
174 | { | 193 | { |
175 | m_console.OutputFormat("Usage: show object name <name>"); | 194 | m_console.OutputFormat("Usage: show object name [--regex] <name>"); |
176 | return; | 195 | return; |
177 | } | 196 | } |
178 | 197 | ||
179 | string name = cmd[3]; | 198 | string name = mainParams[3]; |
180 | 199 | ||
181 | List<SceneObjectGroup> sceneObjects = new List<SceneObjectGroup>(); | 200 | List<SceneObjectGroup> sceneObjects = new List<SceneObjectGroup>(); |
201 | Action<SceneObjectGroup> searchAction; | ||
182 | 202 | ||
183 | m_scene.ForEachSOG(so => { if (so.Name == name) { sceneObjects.Add(so); }}); | 203 | if (useRegex) |
204 | { | ||
205 | Regex nameRegex = new Regex(name); | ||
206 | searchAction = so => { if (nameRegex.IsMatch(so.Name)) { sceneObjects.Add(so); }}; | ||
207 | } | ||
208 | else | ||
209 | { | ||
210 | searchAction = so => { if (so.Name == name) { sceneObjects.Add(so); }}; | ||
211 | } | ||
212 | |||
213 | m_scene.ForEachSOG(searchAction); | ||
184 | 214 | ||
185 | if (sceneObjects.Count == 0) | 215 | if (sceneObjects.Count == 0) |
186 | { | 216 | { |
@@ -231,22 +261,39 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
231 | m_console.OutputFormat(sb.ToString()); | 261 | m_console.OutputFormat(sb.ToString()); |
232 | } | 262 | } |
233 | 263 | ||
234 | private void HandleShowPartByName(string module, string[] cmd) | 264 | private void HandleShowPartByName(string module, string[] cmdparams) |
235 | { | 265 | { |
236 | if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) | 266 | if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) |
237 | return; | 267 | return; |
238 | 268 | ||
239 | if (cmd.Length < 4) | 269 | bool useRegex = false; |
270 | OptionSet options = new OptionSet().Add("regex", v=> useRegex = v != null ); | ||
271 | |||
272 | List<string> mainParams = options.Parse(cmdparams); | ||
273 | |||
274 | if (mainParams.Count < 4) | ||
240 | { | 275 | { |
241 | m_console.OutputFormat("Usage: show part name <name>"); | 276 | m_console.OutputFormat("Usage: show part name [--regex] <name>"); |
242 | return; | 277 | return; |
243 | } | 278 | } |
244 | 279 | ||
245 | string name = cmd[3]; | 280 | string name = mainParams[3]; |
246 | 281 | ||
247 | List<SceneObjectPart> parts = new List<SceneObjectPart>(); | 282 | List<SceneObjectPart> parts = new List<SceneObjectPart>(); |
248 | 283 | ||
249 | m_scene.ForEachSOG(so => so.ForEachPart(sop => { if (sop.Name == name) { parts.Add(sop); } })); | 284 | Action<SceneObjectGroup> searchAction; |
285 | |||
286 | if (useRegex) | ||
287 | { | ||
288 | Regex nameRegex = new Regex(name); | ||
289 | searchAction = so => so.ForEachPart(sop => { if (nameRegex.IsMatch(sop.Name)) { parts.Add(sop); } }); | ||
290 | } | ||
291 | else | ||
292 | { | ||
293 | searchAction = so => so.ForEachPart(sop => { if (sop.Name == name) { parts.Add(sop); } }); | ||
294 | } | ||
295 | |||
296 | m_scene.ForEachSOG(searchAction); | ||
250 | 297 | ||
251 | if (parts.Count == 0) | 298 | if (parts.Count == 0) |
252 | { | 299 | { |
@@ -271,6 +318,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
271 | sb.AppendFormat("Description: {0}\n", so.Description); | 318 | sb.AppendFormat("Description: {0}\n", so.Description); |
272 | sb.AppendFormat("Location: {0} @ {1}\n", so.AbsolutePosition, so.Scene.RegionInfo.RegionName); | 319 | sb.AppendFormat("Location: {0} @ {1}\n", so.AbsolutePosition, so.Scene.RegionInfo.RegionName); |
273 | sb.AppendFormat("Parts: {0}\n", so.PrimCount); | 320 | sb.AppendFormat("Parts: {0}\n", so.PrimCount); |
321 | sb.AppendFormat("Flags: {0}\n", so.RootPart.Flags); | ||
274 | 322 | ||
275 | return sb; | 323 | return sb; |
276 | } | 324 | } |
@@ -282,7 +330,8 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
282 | sb.AppendFormat("Location: {0} @ {1}\n", sop.AbsolutePosition, sop.ParentGroup.Scene.RegionInfo.RegionName); | 330 | sb.AppendFormat("Location: {0} @ {1}\n", sop.AbsolutePosition, sop.ParentGroup.Scene.RegionInfo.RegionName); |
283 | sb.AppendFormat("Parent: {0}", | 331 | sb.AppendFormat("Parent: {0}", |
284 | sop.IsRoot ? "Is Root\n" : string.Format("{0} {1}\n", sop.ParentGroup.Name, sop.ParentGroup.UUID)); | 332 | sop.IsRoot ? "Is Root\n" : string.Format("{0} {1}\n", sop.ParentGroup.Name, sop.ParentGroup.UUID)); |
285 | sb.AppendFormat("Parts: {0}\n", !sop.IsRoot ? "1" : sop.ParentGroup.PrimCount.ToString());; | 333 | sb.AppendFormat("Link number: {0}\n", sop.LinkNum); |
334 | sb.AppendFormat("Flags: {0}\n", sop.Flags); | ||
286 | 335 | ||
287 | return sb; | 336 | return sb; |
288 | } | 337 | } |
@@ -306,105 +355,169 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
306 | o = cmd[3]; | 355 | o = cmd[3]; |
307 | } | 356 | } |
308 | 357 | ||
309 | List<SceneObjectGroup> deletes = new List<SceneObjectGroup>(); | 358 | List<SceneObjectGroup> deletes = null; |
310 | |||
311 | UUID match; | 359 | UUID match; |
360 | bool requireConfirmation = true; | ||
312 | 361 | ||
313 | switch (mode) | 362 | switch (mode) |
314 | { | 363 | { |
315 | case "owner": | 364 | case "owner": |
316 | if (!UUID.TryParse(o, out match)) | 365 | if (!UUID.TryParse(o, out match)) |
317 | return; | 366 | return; |
318 | 367 | ||
319 | m_scene.ForEachSOG(delegate (SceneObjectGroup g) | 368 | deletes = new List<SceneObjectGroup>(); |
320 | { | ||
321 | if (g.OwnerID == match && !g.IsAttachment) | ||
322 | deletes.Add(g); | ||
323 | }); | ||
324 | 369 | ||
325 | // if (deletes.Count == 0) | 370 | m_scene.ForEachSOG(delegate (SceneObjectGroup g) |
326 | // m_console.OutputFormat("No objects were found with owner {0}", match); | 371 | { |
327 | 372 | if (g.OwnerID == match && !g.IsAttachment) | |
328 | break; | 373 | deletes.Add(g); |
374 | }); | ||
375 | |||
376 | // if (deletes.Count == 0) | ||
377 | // m_console.OutputFormat("No objects were found with owner {0}", match); | ||
378 | |||
379 | break; | ||
380 | |||
381 | case "creator": | ||
382 | if (!UUID.TryParse(o, out match)) | ||
383 | return; | ||
329 | 384 | ||
330 | case "creator": | 385 | deletes = new List<SceneObjectGroup>(); |
331 | if (!UUID.TryParse(o, out match)) | ||
332 | return; | ||
333 | 386 | ||
334 | m_scene.ForEachSOG(delegate (SceneObjectGroup g) | 387 | m_scene.ForEachSOG(delegate (SceneObjectGroup g) |
335 | { | 388 | { |
336 | if (g.RootPart.CreatorID == match && !g.IsAttachment) | 389 | if (g.RootPart.CreatorID == match && !g.IsAttachment) |
337 | deletes.Add(g); | 390 | deletes.Add(g); |
338 | }); | 391 | }); |
392 | |||
393 | // if (deletes.Count == 0) | ||
394 | // m_console.OutputFormat("No objects were found with creator {0}", match); | ||
395 | |||
396 | break; | ||
397 | |||
398 | case "uuid": | ||
399 | if (!UUID.TryParse(o, out match)) | ||
400 | return; | ||
339 | 401 | ||
340 | // if (deletes.Count == 0) | 402 | requireConfirmation = false; |
341 | // m_console.OutputFormat("No objects were found with creator {0}", match); | 403 | deletes = new List<SceneObjectGroup>(); |
404 | |||
405 | m_scene.ForEachSOG(delegate (SceneObjectGroup g) | ||
406 | { | ||
407 | if (g.UUID == match && !g.IsAttachment) | ||
408 | deletes.Add(g); | ||
409 | }); | ||
410 | |||
411 | // if (deletes.Count == 0) | ||
412 | // m_console.OutputFormat("No objects were found with uuid {0}", match); | ||
413 | |||
414 | break; | ||
415 | |||
416 | case "name": | ||
417 | deletes = GetDeleteCandidatesByName(module, cmd); | ||
418 | break; | ||
419 | |||
420 | case "outside": | ||
421 | deletes = new List<SceneObjectGroup>(); | ||
342 | 422 | ||
343 | break; | 423 | m_scene.ForEachSOG(delegate (SceneObjectGroup g) |
424 | { | ||
425 | SceneObjectPart rootPart = g.RootPart; | ||
426 | bool delete = false; | ||
427 | |||
428 | if (rootPart.GroupPosition.Z < 0.0 || rootPart.GroupPosition.Z > 10000.0) | ||
429 | { | ||
430 | delete = true; | ||
431 | } | ||
432 | else | ||
433 | { | ||
434 | ILandObject parcel | ||
435 | = m_scene.LandChannel.GetLandObject(rootPart.GroupPosition.X, rootPart.GroupPosition.Y); | ||
436 | |||
437 | if (parcel == null || parcel.LandData.Name == "NO LAND") | ||
438 | delete = true; | ||
439 | } | ||
440 | |||
441 | if (delete && !g.IsAttachment && !deletes.Contains(g)) | ||
442 | deletes.Add(g); | ||
443 | }); | ||
444 | |||
445 | if (deletes.Count == 0) | ||
446 | m_console.OutputFormat("No objects were found outside region bounds"); | ||
447 | |||
448 | break; | ||
344 | 449 | ||
345 | case "uuid": | 450 | default: |
346 | if (!UUID.TryParse(o, out match)) | 451 | m_console.OutputFormat("Unrecognized mode {0}", mode); |
347 | return; | 452 | return; |
453 | } | ||
348 | 454 | ||
349 | m_scene.ForEachSOG(delegate (SceneObjectGroup g) | 455 | if (deletes == null || deletes.Count <= 0) |
350 | { | 456 | return; |
351 | if (g.UUID == match && !g.IsAttachment) | ||
352 | deletes.Add(g); | ||
353 | }); | ||
354 | |||
355 | // if (deletes.Count == 0) | ||
356 | // m_console.OutputFormat("No objects were found with uuid {0}", match); | ||
357 | |||
358 | break; | ||
359 | 457 | ||
360 | case "name": | 458 | if (requireConfirmation) |
361 | m_scene.ForEachSOG(delegate (SceneObjectGroup g) | 459 | { |
460 | string response = MainConsole.Instance.CmdPrompt( | ||
461 | string.Format( | ||
462 | "Are you sure that you want to delete {0} objects from {1}", | ||
463 | deletes.Count, m_scene.RegionInfo.RegionName), | ||
464 | "n"); | ||
465 | |||
466 | if (response.ToLower() != "y") | ||
362 | { | 467 | { |
363 | if (g.RootPart.Name == o && !g.IsAttachment) | 468 | MainConsole.Instance.OutputFormat( |
364 | deletes.Add(g); | 469 | "Aborting delete of {0} objects from {1}", deletes.Count, m_scene.RegionInfo.RegionName); |
365 | }); | ||
366 | 470 | ||
367 | // if (deletes.Count == 0) | 471 | return; |
368 | // m_console.OutputFormat("No objects were found with name {0}", o); | 472 | } |
369 | 473 | } | |
370 | break; | ||
371 | 474 | ||
372 | case "outside": | 475 | m_console.OutputFormat("Deleting {0} objects in {1}", deletes.Count, m_scene.RegionInfo.RegionName); |
373 | m_scene.ForEachSOG(delegate (SceneObjectGroup g) | ||
374 | { | ||
375 | SceneObjectPart rootPart = g.RootPart; | ||
376 | bool delete = false; | ||
377 | 476 | ||
378 | if (rootPart.GroupPosition.Z < 0.0 || rootPart.GroupPosition.Z > 10000.0) | 477 | foreach (SceneObjectGroup g in deletes) |
379 | { | 478 | { |
380 | delete = true; | 479 | m_console.OutputFormat("Deleting object {0} {1}", g.UUID, g.Name); |
381 | } | 480 | m_scene.DeleteSceneObject(g, false); |
382 | else | 481 | } |
383 | { | 482 | } |
384 | ILandObject parcel | ||
385 | = m_scene.LandChannel.GetLandObject(rootPart.GroupPosition.X, rootPart.GroupPosition.Y); | ||
386 | 483 | ||
387 | if (parcel == null || parcel.LandData.Name == "NO LAND") | 484 | private List<SceneObjectGroup> GetDeleteCandidatesByName(string module, string[] cmdparams) |
388 | delete = true; | 485 | { |
389 | } | 486 | if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) |
487 | return null; | ||
390 | 488 | ||
391 | if (delete && !g.IsAttachment && !deletes.Contains(g)) | 489 | bool useRegex = false; |
392 | deletes.Add(g); | 490 | OptionSet options = new OptionSet().Add("regex", v=> useRegex = v != null ); |
393 | }); | ||
394 | 491 | ||
395 | // if (deletes.Count == 0) | 492 | List<string> mainParams = options.Parse(cmdparams); |
396 | // m_console.OutputFormat("No objects were found outside region bounds"); | ||
397 | 493 | ||
398 | break; | 494 | if (mainParams.Count < 4) |
495 | { | ||
496 | m_console.OutputFormat("Usage: delete object name [--regex] <name>"); | ||
497 | return null; | ||
399 | } | 498 | } |
400 | 499 | ||
401 | m_console.OutputFormat("Deleting {0} objects in {1}", deletes.Count, m_scene.RegionInfo.RegionName); | 500 | string name = mainParams[3]; |
402 | 501 | ||
403 | foreach (SceneObjectGroup g in deletes) | 502 | List<SceneObjectGroup> sceneObjects = new List<SceneObjectGroup>(); |
503 | Action<SceneObjectGroup> searchAction; | ||
504 | |||
505 | if (useRegex) | ||
404 | { | 506 | { |
405 | m_console.OutputFormat("Deleting object {0} {1}", g.UUID, g.Name); | 507 | Regex nameRegex = new Regex(name); |
406 | m_scene.DeleteSceneObject(g, false); | 508 | searchAction = so => { if (nameRegex.IsMatch(so.Name)) { sceneObjects.Add(so); }}; |
509 | } | ||
510 | else | ||
511 | { | ||
512 | searchAction = so => { if (so.Name == name) { sceneObjects.Add(so); }}; | ||
407 | } | 513 | } |
514 | |||
515 | m_scene.ForEachSOG(searchAction); | ||
516 | |||
517 | if (sceneObjects.Count == 0) | ||
518 | m_console.OutputFormat("No objects with name {0} found in {1}", name, m_scene.RegionInfo.RegionName); | ||
519 | |||
520 | return sceneObjects; | ||
408 | } | 521 | } |
409 | } | 522 | } |
410 | } \ No newline at end of file | 523 | } \ No newline at end of file |
diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index 82ccaf8..8c97f58 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs | |||
@@ -166,6 +166,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
166 | m_scene.Permissions.OnDeedParcel += CanDeedParcel; | 166 | m_scene.Permissions.OnDeedParcel += CanDeedParcel; |
167 | m_scene.Permissions.OnDeedObject += CanDeedObject; | 167 | m_scene.Permissions.OnDeedObject += CanDeedObject; |
168 | m_scene.Permissions.OnIsGod += IsGod; | 168 | m_scene.Permissions.OnIsGod += IsGod; |
169 | m_scene.Permissions.OnIsGridGod += IsGridGod; | ||
169 | m_scene.Permissions.OnIsAdministrator += IsAdministrator; | 170 | m_scene.Permissions.OnIsAdministrator += IsAdministrator; |
170 | m_scene.Permissions.OnDuplicateObject += CanDuplicateObject; | 171 | m_scene.Permissions.OnDuplicateObject += CanDuplicateObject; |
171 | m_scene.Permissions.OnDeleteObject += CanDeleteObject; //MAYBE FULLY IMPLEMENTED | 172 | m_scene.Permissions.OnDeleteObject += CanDeleteObject; //MAYBE FULLY IMPLEMENTED |
@@ -449,39 +450,49 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
449 | } | 450 | } |
450 | 451 | ||
451 | /// <summary> | 452 | /// <summary> |
452 | /// Is the given user an administrator (in other words, a god)? | 453 | /// Is the user regarded as an administrator? |
453 | /// </summary> | 454 | /// </summary> |
454 | /// <param name="user"></param> | 455 | /// <param name="user"></param> |
455 | /// <returns></returns> | 456 | /// <returns></returns> |
456 | protected bool IsAdministrator(UUID user) | 457 | protected bool IsAdministrator(UUID user) |
457 | { | 458 | { |
458 | if (user == UUID.Zero) return false; | 459 | if (user == UUID.Zero) |
459 | 460 | return false; | |
460 | if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero) | 461 | |
461 | { | 462 | if (m_scene.RegionInfo.EstateSettings.EstateOwner == user && m_RegionOwnerIsGod) |
462 | if (m_scene.RegionInfo.EstateSettings.EstateOwner == user && m_RegionOwnerIsGod) | 463 | return true; |
463 | return true; | ||
464 | } | ||
465 | 464 | ||
466 | if (IsEstateManager(user) && m_RegionManagerIsGod) | 465 | if (IsEstateManager(user) && m_RegionManagerIsGod) |
467 | return true; | 466 | return true; |
468 | 467 | ||
468 | if (IsGridGod(user, null)) | ||
469 | return true; | ||
470 | |||
471 | return false; | ||
472 | } | ||
473 | |||
474 | /// <summary> | ||
475 | /// Is the given user a God throughout the grid (not just in the current scene)? | ||
476 | /// </summary> | ||
477 | /// <param name="user">The user</param> | ||
478 | /// <param name="scene">Unused, can be null</param> | ||
479 | /// <returns></returns> | ||
480 | protected bool IsGridGod(UUID user, Scene scene) | ||
481 | { | ||
482 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
483 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
484 | |||
485 | if (user == UUID.Zero) return false; | ||
486 | |||
469 | if (m_allowGridGods) | 487 | if (m_allowGridGods) |
470 | { | 488 | { |
471 | ScenePresence sp = m_scene.GetScenePresence(user); | 489 | ScenePresence sp = m_scene.GetScenePresence(user); |
472 | if (sp != null) | 490 | if (sp != null) |
473 | { | 491 | return (sp.UserLevel >= 200); |
474 | if (sp.UserLevel >= 200) | ||
475 | return true; | ||
476 | return false; | ||
477 | } | ||
478 | 492 | ||
479 | UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, user); | 493 | UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, user); |
480 | if (account != null) | 494 | if (account != null) |
481 | { | 495 | return (account.UserLevel >= 200); |
482 | if (account.UserLevel >= 200) | ||
483 | return true; | ||
484 | } | ||
485 | } | 496 | } |
486 | 497 | ||
487 | return false; | 498 | return false; |
@@ -503,7 +514,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
503 | { | 514 | { |
504 | if (user == UUID.Zero) return false; | 515 | if (user == UUID.Zero) return false; |
505 | 516 | ||
506 | return m_scene.RegionInfo.EstateSettings.IsEstateManager(user); | 517 | return m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(user); |
507 | } | 518 | } |
508 | 519 | ||
509 | #endregion | 520 | #endregion |
diff --git a/OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs b/OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs new file mode 100644 index 0000000..2838e0c --- /dev/null +++ b/OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs | |||
@@ -0,0 +1,155 @@ | |||
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.Reflection; | ||
31 | using System.Text; | ||
32 | using System.Text.RegularExpressions; | ||
33 | using log4net; | ||
34 | using Mono.Addins; | ||
35 | using NDesk.Options; | ||
36 | using Nini.Config; | ||
37 | using OpenMetaverse; | ||
38 | using OpenSim.Framework; | ||
39 | using OpenSim.Framework.Console; | ||
40 | using OpenSim.Framework.Statistics; | ||
41 | using OpenSim.Region.Framework.Interfaces; | ||
42 | using OpenSim.Region.Framework.Scenes; | ||
43 | |||
44 | namespace OpenSim.Region.CoreModules.World.Objects.Commands | ||
45 | { | ||
46 | /// <summary> | ||
47 | /// A module that holds commands for manipulating objects in the scene. | ||
48 | /// </summary> | ||
49 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "RegionCommandsModule")] | ||
50 | public class RegionCommandsModule : INonSharedRegionModule | ||
51 | { | ||
52 | private Scene m_scene; | ||
53 | private ICommandConsole m_console; | ||
54 | |||
55 | public string Name { get { return "Region Commands Module"; } } | ||
56 | |||
57 | public Type ReplaceableInterface { get { return null; } } | ||
58 | |||
59 | public void Initialise(IConfigSource source) | ||
60 | { | ||
61 | // m_log.DebugFormat("[REGION COMMANDS MODULE]: INITIALIZED MODULE"); | ||
62 | } | ||
63 | |||
64 | public void PostInitialise() | ||
65 | { | ||
66 | // m_log.DebugFormat("[REGION COMMANDS MODULE]: POST INITIALIZED MODULE"); | ||
67 | } | ||
68 | |||
69 | public void Close() | ||
70 | { | ||
71 | // m_log.DebugFormat("[REGION COMMANDS MODULE]: CLOSED MODULE"); | ||
72 | } | ||
73 | |||
74 | public void AddRegion(Scene scene) | ||
75 | { | ||
76 | // m_log.DebugFormat("[REGION COMMANDS MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName); | ||
77 | |||
78 | m_scene = scene; | ||
79 | m_console = MainConsole.Instance; | ||
80 | |||
81 | m_console.Commands.AddCommand( | ||
82 | "Regions", false, "show scene", | ||
83 | "show scene", | ||
84 | "Show live scene information for the currently selected region.", HandleShowScene); | ||
85 | } | ||
86 | |||
87 | public void RemoveRegion(Scene scene) | ||
88 | { | ||
89 | // m_log.DebugFormat("[REGION COMMANDS MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName); | ||
90 | } | ||
91 | |||
92 | public void RegionLoaded(Scene scene) | ||
93 | { | ||
94 | // m_log.DebugFormat("[REGION COMMANDS MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); | ||
95 | } | ||
96 | |||
97 | private void HandleShowScene(string module, string[] cmd) | ||
98 | { | ||
99 | if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_scene)) | ||
100 | return; | ||
101 | |||
102 | SimStatsReporter r = m_scene.StatsReporter; | ||
103 | float[] stats = r.LastReportedSimStats; | ||
104 | |||
105 | float timeDilation = stats[0]; | ||
106 | float simFps = stats[1]; | ||
107 | float physicsFps = stats[2]; | ||
108 | float agentUpdates = stats[3]; | ||
109 | float rootAgents = stats[4]; | ||
110 | float childAgents = stats[5]; | ||
111 | float totalPrims = stats[6]; | ||
112 | float activePrims = stats[7]; | ||
113 | float totalFrameTime = stats[8]; | ||
114 | // float netFrameTime = stats.StatsBlock[9].StatValue; // Ignored - not used by OpenSimulator | ||
115 | float physicsFrameTime = stats[10]; | ||
116 | float otherFrameTime = stats[11]; | ||
117 | // float imageFrameTime = stats.StatsBlock[12].StatValue; // Ignored | ||
118 | float inPacketsPerSecond = stats[13]; | ||
119 | float outPacketsPerSecond = stats[14]; | ||
120 | float unackedBytes = stats[15]; | ||
121 | // float agentFrameTime = stats.StatsBlock[16].StatValue; // Not really used | ||
122 | float pendingDownloads = stats[17]; | ||
123 | float pendingUploads = stats[18]; | ||
124 | float activeScripts = stats[19]; | ||
125 | float scriptLinesPerSecond = stats[20]; | ||
126 | |||
127 | StringBuilder sb = new StringBuilder(); | ||
128 | sb.AppendFormat("Scene statistics for {0}\n", m_scene.RegionInfo.RegionName); | ||
129 | |||
130 | ConsoleDisplayList dispList = new ConsoleDisplayList(); | ||
131 | dispList.AddRow("Time Dilation", timeDilation); | ||
132 | dispList.AddRow("Sim FPS", simFps); | ||
133 | dispList.AddRow("Physics FPS", physicsFps); | ||
134 | dispList.AddRow("Avatars", rootAgents); | ||
135 | dispList.AddRow("Child agents", childAgents); | ||
136 | dispList.AddRow("Total prims", totalPrims); | ||
137 | dispList.AddRow("Scripts", activeScripts); | ||
138 | dispList.AddRow("Script lines processed per second", scriptLinesPerSecond); | ||
139 | dispList.AddRow("Physics enabled prims", activePrims); | ||
140 | dispList.AddRow("Total frame time", totalFrameTime); | ||
141 | dispList.AddRow("Physics frame time", physicsFrameTime); | ||
142 | dispList.AddRow("Other frame time", otherFrameTime); | ||
143 | dispList.AddRow("Agent Updates per second", agentUpdates); | ||
144 | dispList.AddRow("Packets processed from clients per second", inPacketsPerSecond); | ||
145 | dispList.AddRow("Packets sent to clients per second", outPacketsPerSecond); | ||
146 | dispList.AddRow("Bytes unacknowledged by clients", unackedBytes); | ||
147 | dispList.AddRow("Pending asset downloads to clients", pendingDownloads); | ||
148 | dispList.AddRow("Pending asset uploads from clients", pendingUploads); | ||
149 | |||
150 | dispList.AddToStringBuilder(sb); | ||
151 | |||
152 | MainConsole.Instance.Output(sb.ToString()); | ||
153 | } | ||
154 | } | ||
155 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs b/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs index d1d2020..7825e3e 100644 --- a/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs +++ b/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs | |||
@@ -343,7 +343,7 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests | |||
343 | public void Init() | 343 | public void Init() |
344 | { | 344 | { |
345 | m_serialiserModule = new SerialiserModule(); | 345 | m_serialiserModule = new SerialiserModule(); |
346 | m_scene = SceneHelpers.SetupScene(); | 346 | m_scene = new SceneHelpers().SetupScene(); |
347 | SceneHelpers.SetupSceneModules(m_scene, m_serialiserModule); | 347 | SceneHelpers.SetupSceneModules(m_scene, m_serialiserModule); |
348 | } | 348 | } |
349 | 349 | ||
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs index da81dc1..d78ade5 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs | |||
@@ -59,28 +59,32 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
59 | /// <returns>A terrain channel generated from the image.</returns> | 59 | /// <returns>A terrain channel generated from the image.</returns> |
60 | public virtual ITerrainChannel LoadFile(string filename) | 60 | public virtual ITerrainChannel LoadFile(string filename) |
61 | { | 61 | { |
62 | return LoadBitmap(new Bitmap(filename)); | 62 | using (Bitmap b = new Bitmap(filename)) |
63 | return LoadBitmap(b); | ||
63 | } | 64 | } |
64 | 65 | ||
65 | public virtual ITerrainChannel LoadFile(string filename, int offsetX, int offsetY, int fileWidth, int fileHeight, int w, int h) | 66 | public virtual ITerrainChannel LoadFile(string filename, int offsetX, int offsetY, int fileWidth, int fileHeight, int w, int h) |
66 | { | 67 | { |
67 | Bitmap bitmap = new Bitmap(filename); | 68 | using (Bitmap bitmap = new Bitmap(filename)) |
68 | ITerrainChannel retval = new TerrainChannel(true); | ||
69 | |||
70 | for (int x = 0; x < retval.Width; x++) | ||
71 | { | 69 | { |
72 | for (int y = 0; y < retval.Height; y++) | 70 | ITerrainChannel retval = new TerrainChannel(true); |
71 | |||
72 | for (int x = 0; x < retval.Width; x++) | ||
73 | { | 73 | { |
74 | retval[x, y] = bitmap.GetPixel(offsetX * retval.Width + x, (bitmap.Height - (retval.Height * (offsetY + 1))) + retval.Height - y - 1).GetBrightness() * 128; | 74 | for (int y = 0; y < retval.Height; y++) |
75 | { | ||
76 | retval[x, y] = bitmap.GetPixel(offsetX * retval.Width + x, (bitmap.Height - (retval.Height * (offsetY + 1))) + retval.Height - y - 1).GetBrightness() * 128; | ||
77 | } | ||
75 | } | 78 | } |
76 | } | ||
77 | 79 | ||
78 | return retval; | 80 | return retval; |
81 | } | ||
79 | } | 82 | } |
80 | 83 | ||
81 | public virtual ITerrainChannel LoadStream(Stream stream) | 84 | public virtual ITerrainChannel LoadStream(Stream stream) |
82 | { | 85 | { |
83 | return LoadBitmap(new Bitmap(stream)); | 86 | using (Bitmap b = new Bitmap(stream)) |
87 | return LoadBitmap(b); | ||
84 | } | 88 | } |
85 | 89 | ||
86 | protected virtual ITerrainChannel LoadBitmap(Bitmap bitmap) | 90 | protected virtual ITerrainChannel LoadBitmap(Bitmap bitmap) |
@@ -134,35 +138,53 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
134 | // "Saving the image to the same file it was constructed from is not allowed and throws an exception." | 138 | // "Saving the image to the same file it was constructed from is not allowed and throws an exception." |
135 | string tempName = Path.GetTempFileName(); | 139 | string tempName = Path.GetTempFileName(); |
136 | 140 | ||
137 | Bitmap entireBitmap = null; | 141 | Bitmap existingBitmap = null; |
138 | Bitmap thisBitmap = null; | 142 | Bitmap thisBitmap = null; |
139 | if (File.Exists(filename)) | 143 | Bitmap newBitmap = null; |
144 | |||
145 | try | ||
140 | { | 146 | { |
141 | File.Copy(filename, tempName, true); | 147 | if (File.Exists(filename)) |
142 | entireBitmap = new Bitmap(tempName); | 148 | { |
143 | if (entireBitmap.Width != fileWidth * regionSizeX || entireBitmap.Height != fileHeight * regionSizeY) | 149 | File.Copy(filename, tempName, true); |
150 | existingBitmap = new Bitmap(tempName); | ||
151 | if (existingBitmap.Width != fileWidth * regionSizeX || existingBitmap.Height != fileHeight * regionSizeY) | ||
152 | { | ||
153 | // old file, let's overwrite it | ||
154 | newBitmap = new Bitmap(fileWidth * regionSizeX, fileHeight * regionSizeY); | ||
155 | } | ||
156 | else | ||
157 | { | ||
158 | newBitmap = existingBitmap; | ||
159 | } | ||
160 | } | ||
161 | else | ||
144 | { | 162 | { |
145 | // old file, let's overwrite it | 163 | newBitmap = new Bitmap(fileWidth * regionSizeX, fileHeight * regionSizeY); |
146 | entireBitmap = new Bitmap(fileWidth * regionSizeX, fileHeight * regionSizeY); | ||
147 | } | 164 | } |
165 | |||
166 | thisBitmap = CreateGrayscaleBitmapFromMap(m_channel); | ||
167 | // Console.WriteLine("offsetX=" + offsetX + " offsetY=" + offsetY); | ||
168 | for (int x = 0; x < regionSizeX; x++) | ||
169 | for (int y = 0; y < regionSizeY; y++) | ||
170 | newBitmap.SetPixel(x + offsetX * regionSizeX, y + (fileHeight - 1 - offsetY) * regionSizeY, thisBitmap.GetPixel(x, y)); | ||
171 | |||
172 | Save(newBitmap, filename); | ||
148 | } | 173 | } |
149 | else | 174 | finally |
150 | { | 175 | { |
151 | entireBitmap = new Bitmap(fileWidth * regionSizeX, fileHeight * regionSizeY); | 176 | if (existingBitmap != null) |
152 | } | 177 | existingBitmap.Dispose(); |
153 | 178 | ||
154 | thisBitmap = CreateGrayscaleBitmapFromMap(m_channel); | 179 | if (thisBitmap != null) |
155 | // Console.WriteLine("offsetX=" + offsetX + " offsetY=" + offsetY); | 180 | thisBitmap.Dispose(); |
156 | for (int x = 0; x < regionSizeX; x++) | ||
157 | for (int y = 0; y < regionSizeY; y++) | ||
158 | entireBitmap.SetPixel(x + offsetX * regionSizeX, y + (fileHeight - 1 - offsetY) * regionSizeY, thisBitmap.GetPixel(x, y)); | ||
159 | 181 | ||
160 | Save(entireBitmap, filename); | 182 | if (newBitmap != null) |
161 | thisBitmap.Dispose(); | 183 | newBitmap.Dispose(); |
162 | entireBitmap.Dispose(); | ||
163 | 184 | ||
164 | if (File.Exists(tempName)) | 185 | if (File.Exists(tempName)) |
165 | File.Delete(tempName); | 186 | File.Delete(tempName); |
187 | } | ||
166 | } | 188 | } |
167 | 189 | ||
168 | protected virtual void Save(Bitmap bmp, string filename) | 190 | protected virtual void Save(Bitmap bmp, string filename) |
@@ -226,16 +248,21 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
226 | /// <returns>A System.Drawing.Bitmap containing a coloured image</returns> | 248 | /// <returns>A System.Drawing.Bitmap containing a coloured image</returns> |
227 | protected static Bitmap CreateBitmapFromMap(ITerrainChannel map) | 249 | protected static Bitmap CreateBitmapFromMap(ITerrainChannel map) |
228 | { | 250 | { |
229 | Bitmap gradientmapLd = new Bitmap("defaultstripe.png"); | 251 | int pallete; |
230 | 252 | Bitmap bmp; | |
231 | int pallete = gradientmapLd.Height; | 253 | Color[] colours; |
232 | 254 | ||
233 | Bitmap bmp = new Bitmap(map.Width, map.Height); | 255 | using (Bitmap gradientmapLd = new Bitmap("defaultstripe.png")) |
234 | Color[] colours = new Color[pallete]; | ||
235 | |||
236 | for (int i = 0; i < pallete; i++) | ||
237 | { | 256 | { |
238 | colours[i] = gradientmapLd.GetPixel(0, i); | 257 | pallete = gradientmapLd.Height; |
258 | |||
259 | bmp = new Bitmap(map.Width, map.Height); | ||
260 | colours = new Color[pallete]; | ||
261 | |||
262 | for (int i = 0; i < pallete; i++) | ||
263 | { | ||
264 | colours[i] = gradientmapLd.GetPixel(0, i); | ||
265 | } | ||
239 | } | 266 | } |
240 | 267 | ||
241 | for (int y = 0; y < map.Height; y++) | 268 | for (int y = 0; y < map.Height; y++) |
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/JPEG.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/JPEG.cs index 699d67a..9cc767a 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/JPEG.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/JPEG.cs | |||
@@ -99,16 +99,21 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
99 | 99 | ||
100 | private static Bitmap CreateBitmapFromMap(ITerrainChannel map) | 100 | private static Bitmap CreateBitmapFromMap(ITerrainChannel map) |
101 | { | 101 | { |
102 | Bitmap gradientmapLd = new Bitmap("defaultstripe.png"); | 102 | int pallete; |
103 | Bitmap bmp; | ||
104 | Color[] colours; | ||
103 | 105 | ||
104 | int pallete = gradientmapLd.Height; | 106 | using (Bitmap gradientmapLd = new Bitmap("defaultstripe.png")) |
105 | |||
106 | Bitmap bmp = new Bitmap(map.Width, map.Height); | ||
107 | Color[] colours = new Color[pallete]; | ||
108 | |||
109 | for (int i = 0; i < pallete; i++) | ||
110 | { | 107 | { |
111 | colours[i] = gradientmapLd.GetPixel(0, i); | 108 | pallete = gradientmapLd.Height; |
109 | |||
110 | bmp = new Bitmap(map.Width, map.Height); | ||
111 | colours = new Color[pallete]; | ||
112 | |||
113 | for (int i = 0; i < pallete; i++) | ||
114 | { | ||
115 | colours[i] = gradientmapLd.GetPixel(0, i); | ||
116 | } | ||
112 | } | 117 | } |
113 | 118 | ||
114 | for (int y = 0; y < map.Height; y++) | 119 | for (int y = 0; y < map.Height; y++) |
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs index 5d2f893..b416b82 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs | |||
@@ -59,7 +59,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
59 | } | 59 | } |
60 | 60 | ||
61 | //Returns true if this extension is supported for terrain save-tile | 61 | //Returns true if this extension is supported for terrain save-tile |
62 | public bool SupportsTileSave() | 62 | public override bool SupportsTileSave() |
63 | { | 63 | { |
64 | return false; | 64 | return false; |
65 | } | 65 | } |
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs index 1ebf916..7a0db26 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs | |||
@@ -65,7 +65,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
65 | bool eof = false; | 65 | bool eof = false; |
66 | 66 | ||
67 | int fileXPoints = 0; | 67 | int fileXPoints = 0; |
68 | int fileYPoints = 0; | 68 | // int fileYPoints = 0; |
69 | 69 | ||
70 | // Terragen file | 70 | // Terragen file |
71 | while (eof == false) | 71 | while (eof == false) |
@@ -75,7 +75,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
75 | { | 75 | { |
76 | case "SIZE": | 76 | case "SIZE": |
77 | fileXPoints = bs.ReadInt16() + 1; | 77 | fileXPoints = bs.ReadInt16() + 1; |
78 | fileYPoints = fileXPoints; | 78 | // fileYPoints = fileXPoints; |
79 | bs.ReadInt16(); | 79 | bs.ReadInt16(); |
80 | break; | 80 | break; |
81 | case "XPTS": | 81 | case "XPTS": |
@@ -83,7 +83,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
83 | bs.ReadInt16(); | 83 | bs.ReadInt16(); |
84 | break; | 84 | break; |
85 | case "YPTS": | 85 | case "YPTS": |
86 | fileYPoints = bs.ReadInt16(); | 86 | // fileYPoints = bs.ReadInt16(); |
87 | bs.ReadInt16(); | ||
87 | bs.ReadInt16(); | 88 | bs.ReadInt16(); |
88 | break; | 89 | break; |
89 | case "ALTW": | 90 | case "ALTW": |
@@ -164,10 +165,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
164 | bool eof = false; | 165 | bool eof = false; |
165 | if (Encoding.ASCII.GetString(bs.ReadBytes(16)) == "TERRAGENTERRAIN ") | 166 | if (Encoding.ASCII.GetString(bs.ReadBytes(16)) == "TERRAGENTERRAIN ") |
166 | { | 167 | { |
167 | 168 | // int fileWidth = w; | |
168 | int fileWidth = w; | 169 | // int fileHeight = h; |
169 | int fileHeight = h; | ||
170 | |||
171 | 170 | ||
172 | // Terragen file | 171 | // Terragen file |
173 | while (eof == false) | 172 | while (eof == false) |
@@ -176,17 +175,20 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
176 | switch (tmp) | 175 | switch (tmp) |
177 | { | 176 | { |
178 | case "SIZE": | 177 | case "SIZE": |
179 | int sztmp = bs.ReadInt16() + 1; | 178 | // int sztmp = bs.ReadInt16() + 1; |
180 | fileWidth = sztmp; | 179 | // fileWidth = sztmp; |
181 | fileHeight = sztmp; | 180 | // fileHeight = sztmp; |
181 | bs.ReadInt16(); | ||
182 | bs.ReadInt16(); | 182 | bs.ReadInt16(); |
183 | break; | 183 | break; |
184 | case "XPTS": | 184 | case "XPTS": |
185 | fileWidth = bs.ReadInt16(); | 185 | // fileWidth = bs.ReadInt16(); |
186 | bs.ReadInt16(); | ||
186 | bs.ReadInt16(); | 187 | bs.ReadInt16(); |
187 | break; | 188 | break; |
188 | case "YPTS": | 189 | case "YPTS": |
189 | fileHeight = bs.ReadInt16(); | 190 | // fileHeight = bs.ReadInt16(); |
191 | bs.ReadInt16(); | ||
190 | bs.ReadInt16(); | 192 | bs.ReadInt16(); |
191 | break; | 193 | break; |
192 | case "ALTW": | 194 | case "ALTW": |
diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs index e2bd769..5b03ac7 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs | |||
@@ -724,6 +724,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain | |||
724 | } | 724 | } |
725 | if (shouldTaint) | 725 | if (shouldTaint) |
726 | { | 726 | { |
727 | m_scene.EventManager.TriggerTerrainTainted(); | ||
727 | m_tainted = true; | 728 | m_tainted = true; |
728 | } | 729 | } |
729 | } | 730 | } |
diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs index 7bf675d..91252f7 100644 --- a/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs +++ b/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs | |||
@@ -84,218 +84,234 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
84 | Debug.Assert(heightRanges.Length == 4); | 84 | Debug.Assert(heightRanges.Length == 4); |
85 | 85 | ||
86 | Bitmap[] detailTexture = new Bitmap[4]; | 86 | Bitmap[] detailTexture = new Bitmap[4]; |
87 | Bitmap output = null; | ||
88 | BitmapData outputData = null; | ||
87 | 89 | ||
88 | if (textureTerrain) | 90 | try |
89 | { | 91 | { |
90 | // Swap empty terrain textureIDs with default IDs | 92 | if (textureTerrain) |
91 | for (int i = 0; i < textureIDs.Length; i++) | ||
92 | { | 93 | { |
93 | if (textureIDs[i] == UUID.Zero) | 94 | // Swap empty terrain textureIDs with default IDs |
94 | textureIDs[i] = DEFAULT_TERRAIN_DETAIL[i]; | 95 | for (int i = 0; i < textureIDs.Length; i++) |
95 | } | ||
96 | |||
97 | #region Texture Fetching | ||
98 | |||
99 | if (assetService != null) | ||
100 | { | ||
101 | for (int i = 0; i < 4; i++) | ||
102 | { | 96 | { |
103 | AssetBase asset; | 97 | if (textureIDs[i] == UUID.Zero) |
104 | UUID cacheID = UUID.Combine(TERRAIN_CACHE_MAGIC, textureIDs[i]); | 98 | textureIDs[i] = DEFAULT_TERRAIN_DETAIL[i]; |
105 | 99 | } | |
106 | // Try to fetch a cached copy of the decoded/resized version of this texture | 100 | |
107 | asset = assetService.GetCached(cacheID.ToString()); | 101 | #region Texture Fetching |
108 | if (asset != null) | 102 | |
109 | { | 103 | if (assetService != null) |
110 | try | 104 | { |
111 | { | 105 | for (int i = 0; i < 4; i++) |
112 | using (System.IO.MemoryStream stream = new System.IO.MemoryStream(asset.Data)) | ||
113 | detailTexture[i] = (Bitmap)Image.FromStream(stream); | ||
114 | } | ||
115 | catch (Exception ex) | ||
116 | { | ||
117 | m_log.Warn("Failed to decode cached terrain texture " + cacheID + | ||
118 | " (textureID: " + textureIDs[i] + "): " + ex.Message); | ||
119 | } | ||
120 | } | ||
121 | |||
122 | if (detailTexture[i] == null) | ||
123 | { | 106 | { |
124 | // Try to fetch the original JPEG2000 texture, resize if needed, and cache as PNG | 107 | AssetBase asset; |
125 | asset = assetService.Get(textureIDs[i].ToString()); | 108 | UUID cacheID = UUID.Combine(TERRAIN_CACHE_MAGIC, textureIDs[i]); |
109 | |||
110 | // Try to fetch a cached copy of the decoded/resized version of this texture | ||
111 | asset = assetService.GetCached(cacheID.ToString()); | ||
126 | if (asset != null) | 112 | if (asset != null) |
127 | { | 113 | { |
128 | try { detailTexture[i] = (Bitmap)CSJ2K.J2kImage.FromBytes(asset.Data); } | 114 | try |
115 | { | ||
116 | using (System.IO.MemoryStream stream = new System.IO.MemoryStream(asset.Data)) | ||
117 | detailTexture[i] = (Bitmap)Image.FromStream(stream); | ||
118 | } | ||
129 | catch (Exception ex) | 119 | catch (Exception ex) |
130 | { | 120 | { |
131 | m_log.Warn("Failed to decode terrain texture " + asset.ID + ": " + ex.Message); | 121 | m_log.Warn("Failed to decode cached terrain texture " + cacheID + |
122 | " (textureID: " + textureIDs[i] + "): " + ex.Message); | ||
132 | } | 123 | } |
133 | } | 124 | } |
134 | 125 | ||
135 | if (detailTexture[i] != null) | 126 | if (detailTexture[i] == null) |
136 | { | 127 | { |
137 | Bitmap bitmap = detailTexture[i]; | 128 | // Try to fetch the original JPEG2000 texture, resize if needed, and cache as PNG |
138 | 129 | asset = assetService.Get(textureIDs[i].ToString()); | |
139 | // Make sure this texture is the correct size, otherwise resize | 130 | if (asset != null) |
140 | if (bitmap.Width != 256 || bitmap.Height != 256) | ||
141 | bitmap = ImageUtils.ResizeImage(bitmap, 256, 256); | ||
142 | |||
143 | // Save the decoded and resized texture to the cache | ||
144 | byte[] data; | ||
145 | using (System.IO.MemoryStream stream = new System.IO.MemoryStream()) | ||
146 | { | 131 | { |
147 | bitmap.Save(stream, ImageFormat.Png); | 132 | try { detailTexture[i] = (Bitmap)CSJ2K.J2kImage.FromBytes(asset.Data); } |
148 | data = stream.ToArray(); | 133 | catch (Exception ex) |
134 | { | ||
135 | m_log.Warn("Failed to decode terrain texture " + asset.ID + ": " + ex.Message); | ||
136 | } | ||
149 | } | 137 | } |
150 | 138 | ||
151 | // Cache a PNG copy of this terrain texture | 139 | if (detailTexture[i] != null) |
152 | AssetBase newAsset = new AssetBase | ||
153 | { | 140 | { |
154 | Data = data, | 141 | Bitmap bitmap = detailTexture[i]; |
155 | Description = "PNG", | 142 | |
156 | Flags = AssetFlags.Collectable, | 143 | // Make sure this texture is the correct size, otherwise resize |
157 | FullID = cacheID, | 144 | if (bitmap.Width != 256 || bitmap.Height != 256) |
158 | ID = cacheID.ToString(), | 145 | { |
159 | Local = true, | 146 | using (Bitmap origBitmap = bitmap) |
160 | Name = String.Empty, | 147 | { |
161 | Temporary = true, | 148 | bitmap = ImageUtils.ResizeImage(origBitmap, 256, 256); |
162 | Type = (sbyte)AssetType.Unknown | 149 | } |
163 | }; | 150 | } |
164 | newAsset.Metadata.ContentType = "image/png"; | 151 | |
165 | assetService.Store(newAsset); | 152 | // Save the decoded and resized texture to the cache |
153 | byte[] data; | ||
154 | using (System.IO.MemoryStream stream = new System.IO.MemoryStream()) | ||
155 | { | ||
156 | bitmap.Save(stream, ImageFormat.Png); | ||
157 | data = stream.ToArray(); | ||
158 | } | ||
159 | |||
160 | // Cache a PNG copy of this terrain texture | ||
161 | AssetBase newAsset = new AssetBase | ||
162 | { | ||
163 | Data = data, | ||
164 | Description = "PNG", | ||
165 | Flags = AssetFlags.Collectable, | ||
166 | FullID = cacheID, | ||
167 | ID = cacheID.ToString(), | ||
168 | Local = true, | ||
169 | Name = String.Empty, | ||
170 | Temporary = true, | ||
171 | Type = (sbyte)AssetType.Unknown | ||
172 | }; | ||
173 | newAsset.Metadata.ContentType = "image/png"; | ||
174 | assetService.Store(newAsset); | ||
175 | } | ||
166 | } | 176 | } |
167 | } | 177 | } |
168 | } | 178 | } |
179 | |||
180 | #endregion Texture Fetching | ||
169 | } | 181 | } |
170 | 182 | ||
171 | #endregion Texture Fetching | 183 | // Fill in any missing textures with a solid color |
172 | } | 184 | for (int i = 0; i < 4; i++) |
173 | |||
174 | // Fill in any missing textures with a solid color | ||
175 | for (int i = 0; i < 4; i++) | ||
176 | { | ||
177 | if (detailTexture[i] == null) | ||
178 | { | 185 | { |
179 | // Create a solid color texture for this layer | 186 | if (detailTexture[i] == null) |
180 | detailTexture[i] = new Bitmap(256, 256, PixelFormat.Format24bppRgb); | ||
181 | using (Graphics gfx = Graphics.FromImage(detailTexture[i])) | ||
182 | { | 187 | { |
183 | using (SolidBrush brush = new SolidBrush(DEFAULT_TERRAIN_COLOR[i])) | 188 | // Create a solid color texture for this layer |
184 | gfx.FillRectangle(brush, 0, 0, 256, 256); | 189 | detailTexture[i] = new Bitmap(256, 256, PixelFormat.Format24bppRgb); |
190 | using (Graphics gfx = Graphics.FromImage(detailTexture[i])) | ||
191 | { | ||
192 | using (SolidBrush brush = new SolidBrush(DEFAULT_TERRAIN_COLOR[i])) | ||
193 | gfx.FillRectangle(brush, 0, 0, 256, 256); | ||
194 | } | ||
185 | } | 195 | } |
186 | } | 196 | } |
187 | } | 197 | |
188 | 198 | #region Layer Map | |
189 | #region Layer Map | 199 | |
190 | 200 | float[] layermap = new float[256 * 256]; | |
191 | float[] layermap = new float[256 * 256]; | 201 | |
192 | |||
193 | for (int y = 0; y < 256; y++) | ||
194 | { | ||
195 | for (int x = 0; x < 256; x++) | ||
196 | { | ||
197 | float height = heightmap[y * 256 + x]; | ||
198 | |||
199 | float pctX = (float)x / 255f; | ||
200 | float pctY = (float)y / 255f; | ||
201 | |||
202 | // Use bilinear interpolation between the four corners of start height and | ||
203 | // height range to select the current values at this position | ||
204 | float startHeight = ImageUtils.Bilinear( | ||
205 | startHeights[0], | ||
206 | startHeights[2], | ||
207 | startHeights[1], | ||
208 | startHeights[3], | ||
209 | pctX, pctY); | ||
210 | startHeight = Utils.Clamp(startHeight, 0f, 255f); | ||
211 | |||
212 | float heightRange = ImageUtils.Bilinear( | ||
213 | heightRanges[0], | ||
214 | heightRanges[2], | ||
215 | heightRanges[1], | ||
216 | heightRanges[3], | ||
217 | pctX, pctY); | ||
218 | heightRange = Utils.Clamp(heightRange, 0f, 255f); | ||
219 | |||
220 | // Generate two frequencies of perlin noise based on our global position | ||
221 | // The magic values were taken from http://opensimulator.org/wiki/Terrain_Splatting | ||
222 | Vector3 vec = new Vector3 | ||
223 | ( | ||
224 | ((float)regionPosition.X + x) * 0.20319f, | ||
225 | ((float)regionPosition.Y + y) * 0.20319f, | ||
226 | height * 0.25f | ||
227 | ); | ||
228 | |||
229 | float lowFreq = Perlin.noise2(vec.X * 0.222222f, vec.Y * 0.222222f) * 6.5f; | ||
230 | float highFreq = Perlin.turbulence2(vec.X, vec.Y, 2f) * 2.25f; | ||
231 | float noise = (lowFreq + highFreq) * 2f; | ||
232 | |||
233 | // Combine the current height, generated noise, start height, and height range parameters, then scale all of it | ||
234 | float layer = ((height + noise - startHeight) / heightRange) * 4f; | ||
235 | if (Single.IsNaN(layer)) layer = 0f; | ||
236 | layermap[y * 256 + x] = Utils.Clamp(layer, 0f, 3f); | ||
237 | } | ||
238 | } | ||
239 | |||
240 | #endregion Layer Map | ||
241 | |||
242 | #region Texture Compositing | ||
243 | |||
244 | Bitmap output = new Bitmap(256, 256, PixelFormat.Format24bppRgb); | ||
245 | BitmapData outputData = output.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); | ||
246 | |||
247 | unsafe | ||
248 | { | ||
249 | // Get handles to all of the texture data arrays | ||
250 | BitmapData[] datas = new BitmapData[] | ||
251 | { | ||
252 | detailTexture[0].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[0].PixelFormat), | ||
253 | detailTexture[1].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[1].PixelFormat), | ||
254 | detailTexture[2].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[2].PixelFormat), | ||
255 | detailTexture[3].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[3].PixelFormat) | ||
256 | }; | ||
257 | |||
258 | int[] comps = new int[] | ||
259 | { | ||
260 | (datas[0].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3, | ||
261 | (datas[1].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3, | ||
262 | (datas[2].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3, | ||
263 | (datas[3].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3 | ||
264 | }; | ||
265 | |||
266 | for (int y = 0; y < 256; y++) | 202 | for (int y = 0; y < 256; y++) |
267 | { | 203 | { |
268 | for (int x = 0; x < 256; x++) | 204 | for (int x = 0; x < 256; x++) |
269 | { | 205 | { |
270 | float layer = layermap[y * 256 + x]; | 206 | float height = heightmap[y * 256 + x]; |
271 | 207 | ||
272 | // Select two textures | 208 | float pctX = (float)x / 255f; |
273 | int l0 = (int)Math.Floor(layer); | 209 | float pctY = (float)y / 255f; |
274 | int l1 = Math.Min(l0 + 1, 3); | 210 | |
275 | 211 | // Use bilinear interpolation between the four corners of start height and | |
276 | byte* ptrA = (byte*)datas[l0].Scan0 + y * datas[l0].Stride + x * comps[l0]; | 212 | // height range to select the current values at this position |
277 | byte* ptrB = (byte*)datas[l1].Scan0 + y * datas[l1].Stride + x * comps[l1]; | 213 | float startHeight = ImageUtils.Bilinear( |
278 | byte* ptrO = (byte*)outputData.Scan0 + y * outputData.Stride + x * 3; | 214 | startHeights[0], |
279 | 215 | startHeights[2], | |
280 | float aB = *(ptrA + 0); | 216 | startHeights[1], |
281 | float aG = *(ptrA + 1); | 217 | startHeights[3], |
282 | float aR = *(ptrA + 2); | 218 | pctX, pctY); |
283 | 219 | startHeight = Utils.Clamp(startHeight, 0f, 255f); | |
284 | float bB = *(ptrB + 0); | 220 | |
285 | float bG = *(ptrB + 1); | 221 | float heightRange = ImageUtils.Bilinear( |
286 | float bR = *(ptrB + 2); | 222 | heightRanges[0], |
287 | 223 | heightRanges[2], | |
288 | float layerDiff = layer - l0; | 224 | heightRanges[1], |
289 | 225 | heightRanges[3], | |
290 | // Interpolate between the two selected textures | 226 | pctX, pctY); |
291 | *(ptrO + 0) = (byte)Math.Floor(aB + layerDiff * (bB - aB)); | 227 | heightRange = Utils.Clamp(heightRange, 0f, 255f); |
292 | *(ptrO + 1) = (byte)Math.Floor(aG + layerDiff * (bG - aG)); | 228 | |
293 | *(ptrO + 2) = (byte)Math.Floor(aR + layerDiff * (bR - aR)); | 229 | // Generate two frequencies of perlin noise based on our global position |
230 | // The magic values were taken from http://opensimulator.org/wiki/Terrain_Splatting | ||
231 | Vector3 vec = new Vector3 | ||
232 | ( | ||
233 | ((float)regionPosition.X + x) * 0.20319f, | ||
234 | ((float)regionPosition.Y + y) * 0.20319f, | ||
235 | height * 0.25f | ||
236 | ); | ||
237 | |||
238 | float lowFreq = Perlin.noise2(vec.X * 0.222222f, vec.Y * 0.222222f) * 6.5f; | ||
239 | float highFreq = Perlin.turbulence2(vec.X, vec.Y, 2f) * 2.25f; | ||
240 | float noise = (lowFreq + highFreq) * 2f; | ||
241 | |||
242 | // Combine the current height, generated noise, start height, and height range parameters, then scale all of it | ||
243 | float layer = ((height + noise - startHeight) / heightRange) * 4f; | ||
244 | if (Single.IsNaN(layer)) layer = 0f; | ||
245 | layermap[y * 256 + x] = Utils.Clamp(layer, 0f, 3f); | ||
294 | } | 246 | } |
295 | } | 247 | } |
296 | 248 | ||
249 | #endregion Layer Map | ||
250 | |||
251 | #region Texture Compositing | ||
252 | |||
253 | output = new Bitmap(256, 256, PixelFormat.Format24bppRgb); | ||
254 | outputData = output.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); | ||
255 | |||
256 | unsafe | ||
257 | { | ||
258 | // Get handles to all of the texture data arrays | ||
259 | BitmapData[] datas = new BitmapData[] | ||
260 | { | ||
261 | detailTexture[0].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[0].PixelFormat), | ||
262 | detailTexture[1].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[1].PixelFormat), | ||
263 | detailTexture[2].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[2].PixelFormat), | ||
264 | detailTexture[3].LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, detailTexture[3].PixelFormat) | ||
265 | }; | ||
266 | |||
267 | int[] comps = new int[] | ||
268 | { | ||
269 | (datas[0].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3, | ||
270 | (datas[1].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3, | ||
271 | (datas[2].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3, | ||
272 | (datas[3].PixelFormat == PixelFormat.Format32bppArgb) ? 4 : 3 | ||
273 | }; | ||
274 | |||
275 | for (int y = 0; y < 256; y++) | ||
276 | { | ||
277 | for (int x = 0; x < 256; x++) | ||
278 | { | ||
279 | float layer = layermap[y * 256 + x]; | ||
280 | |||
281 | // Select two textures | ||
282 | int l0 = (int)Math.Floor(layer); | ||
283 | int l1 = Math.Min(l0 + 1, 3); | ||
284 | |||
285 | byte* ptrA = (byte*)datas[l0].Scan0 + y * datas[l0].Stride + x * comps[l0]; | ||
286 | byte* ptrB = (byte*)datas[l1].Scan0 + y * datas[l1].Stride + x * comps[l1]; | ||
287 | byte* ptrO = (byte*)outputData.Scan0 + y * outputData.Stride + x * 3; | ||
288 | |||
289 | float aB = *(ptrA + 0); | ||
290 | float aG = *(ptrA + 1); | ||
291 | float aR = *(ptrA + 2); | ||
292 | |||
293 | float bB = *(ptrB + 0); | ||
294 | float bG = *(ptrB + 1); | ||
295 | float bR = *(ptrB + 2); | ||
296 | |||
297 | float layerDiff = layer - l0; | ||
298 | |||
299 | // Interpolate between the two selected textures | ||
300 | *(ptrO + 0) = (byte)Math.Floor(aB + layerDiff * (bB - aB)); | ||
301 | *(ptrO + 1) = (byte)Math.Floor(aG + layerDiff * (bG - aG)); | ||
302 | *(ptrO + 2) = (byte)Math.Floor(aR + layerDiff * (bR - aR)); | ||
303 | } | ||
304 | } | ||
305 | |||
306 | for (int i = 0; i < 4; i++) | ||
307 | detailTexture[i].UnlockBits(datas[i]); | ||
308 | } | ||
309 | } | ||
310 | finally | ||
311 | { | ||
297 | for (int i = 0; i < 4; i++) | 312 | for (int i = 0; i < 4; i++) |
298 | detailTexture[i].UnlockBits(datas[i]); | 313 | if (detailTexture[i] != null) |
314 | detailTexture[i].Dispose(); | ||
299 | } | 315 | } |
300 | 316 | ||
301 | output.UnlockBits(outputData); | 317 | output.UnlockBits(outputData); |
diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs index e6f2855..3c48d07 100644 --- a/OpenSim/Region/CoreModules/World/Warp3DMap/MapImageModule.cs +++ b/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs | |||
@@ -54,8 +54,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
54 | private static readonly UUID TEXTURE_METADATA_MAGIC = new UUID("802dc0e0-f080-4931-8b57-d1be8611c4f3"); | 54 | private static readonly UUID TEXTURE_METADATA_MAGIC = new UUID("802dc0e0-f080-4931-8b57-d1be8611c4f3"); |
55 | private static readonly Color4 WATER_COLOR = new Color4(29, 72, 96, 216); | 55 | private static readonly Color4 WATER_COLOR = new Color4(29, 72, 96, 216); |
56 | 56 | ||
57 | private static readonly ILog m_log = | 57 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
58 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
59 | 58 | ||
60 | private Scene m_scene; | 59 | private Scene m_scene; |
61 | private IRendering m_primMesher; | 60 | private IRendering m_primMesher; |
@@ -164,7 +163,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
164 | } | 163 | } |
165 | catch | 164 | catch |
166 | { | 165 | { |
167 | m_log.Warn("[MAPTILE]: Failed to load StartupConfig"); | 166 | m_log.Warn("[WARP 3D IMAGE MODULE]: Failed to load StartupConfig"); |
168 | } | 167 | } |
169 | 168 | ||
170 | m_colors.Clear(); | 169 | m_colors.Clear(); |
@@ -218,7 +217,10 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
218 | Bitmap bitmap = renderer.Scene.getImage(); | 217 | Bitmap bitmap = renderer.Scene.getImage(); |
219 | 218 | ||
220 | if (m_useAntiAliasing) | 219 | if (m_useAntiAliasing) |
221 | bitmap = ImageUtils.ResizeImage(bitmap, viewport.Width, viewport.Height); | 220 | { |
221 | using (Bitmap origBitmap = bitmap) | ||
222 | bitmap = ImageUtils.ResizeImage(origBitmap, viewport.Width, viewport.Height); | ||
223 | } | ||
222 | 224 | ||
223 | return bitmap; | 225 | return bitmap; |
224 | } | 226 | } |
@@ -233,7 +235,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
233 | catch (Exception e) | 235 | catch (Exception e) |
234 | { | 236 | { |
235 | // JPEG2000 encoder failed | 237 | // JPEG2000 encoder failed |
236 | m_log.Error("[MAPTILE]: Failed generating terrain map: " + e); | 238 | m_log.Error("[WARP 3D IMAGE MODULE]: Failed generating terrain map: ", e); |
237 | } | 239 | } |
238 | 240 | ||
239 | return null; | 241 | return null; |
@@ -332,8 +334,17 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
332 | uint globalX, globalY; | 334 | uint globalX, globalY; |
333 | Utils.LongToUInts(m_scene.RegionInfo.RegionHandle, out globalX, out globalY); | 335 | Utils.LongToUInts(m_scene.RegionInfo.RegionHandle, out globalX, out globalY); |
334 | 336 | ||
335 | Bitmap image = TerrainSplat.Splat(heightmap, textureIDs, startHeights, heightRanges, new Vector3d(globalX, globalY, 0.0), m_scene.AssetService, textureTerrain); | 337 | warp_Texture texture; |
336 | warp_Texture texture = new warp_Texture(image); | 338 | |
339 | using ( | ||
340 | Bitmap image | ||
341 | = TerrainSplat.Splat( | ||
342 | heightmap, textureIDs, startHeights, heightRanges, | ||
343 | new Vector3d(globalX, globalY, 0.0), m_scene.AssetService, textureTerrain)) | ||
344 | { | ||
345 | texture = new warp_Texture(image); | ||
346 | } | ||
347 | |||
337 | warp_Material material = new warp_Material(texture); | 348 | warp_Material material = new warp_Material(texture); |
338 | material.setReflectivity(50); | 349 | material.setReflectivity(50); |
339 | renderer.Scene.addMaterial("TerrainColor", material); | 350 | renderer.Scene.addMaterial("TerrainColor", material); |
@@ -560,42 +571,46 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
560 | { | 571 | { |
561 | try | 572 | try |
562 | { | 573 | { |
563 | Bitmap bitmap = (Bitmap)J2kImage.FromStream(stream); | 574 | int pixelBytes; |
564 | width = bitmap.Width; | ||
565 | height = bitmap.Height; | ||
566 | 575 | ||
567 | BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, bitmap.PixelFormat); | 576 | using (Bitmap bitmap = (Bitmap)J2kImage.FromStream(stream)) |
568 | int pixelBytes = (bitmap.PixelFormat == PixelFormat.Format24bppRgb) ? 3 : 4; | ||
569 | |||
570 | // Sum up the individual channels | ||
571 | unsafe | ||
572 | { | 577 | { |
573 | if (pixelBytes == 4) | 578 | width = bitmap.Width; |
579 | height = bitmap.Height; | ||
580 | |||
581 | BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, bitmap.PixelFormat); | ||
582 | pixelBytes = (bitmap.PixelFormat == PixelFormat.Format24bppRgb) ? 3 : 4; | ||
583 | |||
584 | // Sum up the individual channels | ||
585 | unsafe | ||
574 | { | 586 | { |
575 | for (int y = 0; y < height; y++) | 587 | if (pixelBytes == 4) |
576 | { | 588 | { |
577 | byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride); | 589 | for (int y = 0; y < height; y++) |
578 | |||
579 | for (int x = 0; x < width; x++) | ||
580 | { | 590 | { |
581 | b += row[x * pixelBytes + 0]; | 591 | byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride); |
582 | g += row[x * pixelBytes + 1]; | 592 | |
583 | r += row[x * pixelBytes + 2]; | 593 | for (int x = 0; x < width; x++) |
584 | a += row[x * pixelBytes + 3]; | 594 | { |
595 | b += row[x * pixelBytes + 0]; | ||
596 | g += row[x * pixelBytes + 1]; | ||
597 | r += row[x * pixelBytes + 2]; | ||
598 | a += row[x * pixelBytes + 3]; | ||
599 | } | ||
585 | } | 600 | } |
586 | } | 601 | } |
587 | } | 602 | else |
588 | else | ||
589 | { | ||
590 | for (int y = 0; y < height; y++) | ||
591 | { | 603 | { |
592 | byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride); | 604 | for (int y = 0; y < height; y++) |
593 | |||
594 | for (int x = 0; x < width; x++) | ||
595 | { | 605 | { |
596 | b += row[x * pixelBytes + 0]; | 606 | byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride); |
597 | g += row[x * pixelBytes + 1]; | 607 | |
598 | r += row[x * pixelBytes + 2]; | 608 | for (int x = 0; x < width; x++) |
609 | { | ||
610 | b += row[x * pixelBytes + 0]; | ||
611 | g += row[x * pixelBytes + 1]; | ||
612 | r += row[x * pixelBytes + 2]; | ||
613 | } | ||
599 | } | 614 | } |
600 | } | 615 | } |
601 | } | 616 | } |
@@ -617,7 +632,10 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
617 | } | 632 | } |
618 | catch (Exception ex) | 633 | catch (Exception ex) |
619 | { | 634 | { |
620 | m_log.WarnFormat("[MAPTILE]: Error decoding JPEG2000 texture {0} ({1} bytes): {2}", textureID, j2kData.Length, ex.Message); | 635 | m_log.WarnFormat( |
636 | "[WARP 3D IMAGE MODULE]: Error decoding JPEG2000 texture {0} ({1} bytes): {2}", | ||
637 | textureID, j2kData.Length, ex.Message); | ||
638 | |||
621 | width = 0; | 639 | width = 0; |
622 | height = 0; | 640 | height = 0; |
623 | return new Color4(0.5f, 0.5f, 0.5f, 1.0f); | 641 | return new Color4(0.5f, 0.5f, 0.5f, 1.0f); |
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs index 899e5ea..724bb4c 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs | |||
@@ -190,14 +190,15 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
190 | { | 190 | { |
191 | //m_log.DebugFormat("[WORLD MAP]: OnRegisterCaps: agentID {0} caps {1}", agentID, caps); | 191 | //m_log.DebugFormat("[WORLD MAP]: OnRegisterCaps: agentID {0} caps {1}", agentID, caps); |
192 | string capsBase = "/CAPS/" + caps.CapsObjectPath; | 192 | string capsBase = "/CAPS/" + caps.CapsObjectPath; |
193 | caps.RegisterHandler("MapLayer", | 193 | caps.RegisterHandler( |
194 | new RestStreamHandler("POST", capsBase + m_mapLayerPath, | 194 | "MapLayer", |
195 | delegate(string request, string path, string param, | 195 | new RestStreamHandler( |
196 | IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) | 196 | "POST", |
197 | { | 197 | capsBase + m_mapLayerPath, |
198 | return MapLayerRequest(request, path, param, | 198 | (request, path, param, httpRequest, httpResponse) |
199 | agentID, caps); | 199 | => MapLayerRequest(request, path, param, agentID, caps), |
200 | })); | 200 | "MapLayer", |
201 | agentID.ToString())); | ||
201 | } | 202 | } |
202 | 203 | ||
203 | /// <summary> | 204 | /// <summary> |
@@ -1342,14 +1343,14 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1342 | if (terrain == null) | 1343 | if (terrain == null) |
1343 | return; | 1344 | return; |
1344 | 1345 | ||
1346 | m_log.DebugFormat("[WORLDMAP]: Generating map image for {0}", m_scene.RegionInfo.RegionName); | ||
1347 | |||
1345 | byte[] data = terrain.WriteJpeg2000Image(); | 1348 | byte[] data = terrain.WriteJpeg2000Image(); |
1346 | if (data == null) | 1349 | if (data == null) |
1347 | return; | 1350 | return; |
1348 | 1351 | ||
1349 | byte[] overlay = GenerateOverlay(); | 1352 | byte[] overlay = GenerateOverlay(); |
1350 | 1353 | ||
1351 | m_log.Debug("[WORLDMAP]: STORING MAPTILE IMAGE"); | ||
1352 | |||
1353 | UUID terrainImageID = UUID.Random(); | 1354 | UUID terrainImageID = UUID.Random(); |
1354 | UUID parcelImageID = UUID.Zero; | 1355 | UUID parcelImageID = UUID.Zero; |
1355 | 1356 | ||
@@ -1364,7 +1365,8 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1364 | asset.Flags = AssetFlags.Maptile; | 1365 | asset.Flags = AssetFlags.Maptile; |
1365 | 1366 | ||
1366 | // Store the new one | 1367 | // Store the new one |
1367 | m_log.DebugFormat("[WORLDMAP]: Storing map tile {0}", asset.ID); | 1368 | m_log.DebugFormat("[WORLDMAP]: Storing map tile {0} for {1}", asset.ID, m_scene.RegionInfo.RegionName); |
1369 | |||
1368 | m_scene.AssetService.Store(asset); | 1370 | m_scene.AssetService.Store(asset); |
1369 | 1371 | ||
1370 | if (overlay != null) | 1372 | if (overlay != null) |
diff --git a/OpenSim/Region/DataSnapshot/DataRequestHandler.cs b/OpenSim/Region/DataSnapshot/DataRequestHandler.cs index 2f2b3e6..32e93b4 100644 --- a/OpenSim/Region/DataSnapshot/DataRequestHandler.cs +++ b/OpenSim/Region/DataSnapshot/DataRequestHandler.cs | |||
@@ -42,13 +42,13 @@ namespace OpenSim.Region.DataSnapshot | |||
42 | { | 42 | { |
43 | public class DataRequestHandler | 43 | public class DataRequestHandler |
44 | { | 44 | { |
45 | private Scene m_scene = null; | 45 | // private Scene m_scene = null; |
46 | private DataSnapshotManager m_externalData = null; | 46 | private DataSnapshotManager m_externalData = null; |
47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
48 | 48 | ||
49 | public DataRequestHandler(Scene scene, DataSnapshotManager externalData) | 49 | public DataRequestHandler(Scene scene, DataSnapshotManager externalData) |
50 | { | 50 | { |
51 | m_scene = scene; | 51 | // m_scene = scene; |
52 | m_externalData = externalData; | 52 | m_externalData = externalData; |
53 | 53 | ||
54 | //Register HTTP handler | 54 | //Register HTTP handler |
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs index 32f4eea..c605fc1 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs | |||
@@ -166,6 +166,19 @@ namespace OpenSim.Region.Framework.Interfaces | |||
166 | List<TaskInventoryItem> GetInventoryItems(); | 166 | List<TaskInventoryItem> GetInventoryItems(); |
167 | 167 | ||
168 | /// <summary> | 168 | /// <summary> |
169 | /// Gets an inventory item by name | ||
170 | /// </summary> | ||
171 | /// <remarks> | ||
172 | /// This method returns the first inventory item that matches the given name. In SL this is all you need | ||
173 | /// since each item in a prim inventory must have a unique name. | ||
174 | /// </remarks> | ||
175 | /// <param name='name'></param> | ||
176 | /// <returns> | ||
177 | /// The inventory item. Null if no such item was found. | ||
178 | /// </returns> | ||
179 | TaskInventoryItem GetInventoryItem(string name); | ||
180 | |||
181 | /// <summary> | ||
169 | /// Get inventory items by name. | 182 | /// Get inventory items by name. |
170 | /// </summary> | 183 | /// </summary> |
171 | /// <param name="name"></param> | 184 | /// <param name="name"></param> |
@@ -174,7 +187,17 @@ namespace OpenSim.Region.Framework.Interfaces | |||
174 | /// If no inventory item has that name then an empty list is returned. | 187 | /// If no inventory item has that name then an empty list is returned. |
175 | /// </returns> | 188 | /// </returns> |
176 | List<TaskInventoryItem> GetInventoryItems(string name); | 189 | List<TaskInventoryItem> GetInventoryItems(string name); |
177 | 190 | ||
191 | /// <summary> | ||
192 | /// Get inventory items by type. | ||
193 | /// </summary> | ||
194 | /// <param type="name"></param> | ||
195 | /// <returns> | ||
196 | /// A list of inventory items of that type. | ||
197 | /// If no inventory items of that type then an empty list is returned. | ||
198 | /// </returns> | ||
199 | List<TaskInventoryItem> GetInventoryItems(InventoryType type); | ||
200 | |||
178 | /// <summary> | 201 | /// <summary> |
179 | /// Get the scene object referenced by an inventory item. | 202 | /// Get the scene object referenced by an inventory item. |
180 | /// </summary> | 203 | /// </summary> |
@@ -228,6 +251,16 @@ namespace OpenSim.Region.Framework.Interfaces | |||
228 | bool ContainsScripts(); | 251 | bool ContainsScripts(); |
229 | 252 | ||
230 | /// <summary> | 253 | /// <summary> |
254 | /// Returns the count of scripts contained | ||
255 | /// </summary></returns> | ||
256 | int ScriptCount(); | ||
257 | |||
258 | /// <summary> | ||
259 | /// Returns the count of running scripts contained | ||
260 | /// </summary></returns> | ||
261 | int RunningScriptCount(); | ||
262 | |||
263 | /// <summary> | ||
231 | /// Get the uuids of all items in this inventory | 264 | /// Get the uuids of all items in this inventory |
232 | /// </summary> | 265 | /// </summary> |
233 | /// <returns></returns> | 266 | /// <returns></returns> |
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs index 76f1641..5bc8e51 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs | |||
@@ -39,13 +39,30 @@ namespace OpenSim.Region.Framework.Interfaces | |||
39 | 39 | ||
40 | public interface IEntityTransferModule | 40 | public interface IEntityTransferModule |
41 | { | 41 | { |
42 | void Teleport(ScenePresence agent, ulong regionHandle, Vector3 position, | 42 | /// <summary> |
43 | Vector3 lookAt, uint teleportFlags); | 43 | /// Teleport an agent within the same or to a different region. |
44 | /// </summary> | ||
45 | /// <param name='agent'></param> | ||
46 | /// <param name='regionHandle'> | ||
47 | /// The handle of the destination region. If it's the same as the region currently | ||
48 | /// occupied by the agent then the teleport will be within that region. | ||
49 | /// </param> | ||
50 | /// <param name='position'></param> | ||
51 | /// <param name='lookAt'></param> | ||
52 | /// <param name='teleportFlags'></param> | ||
53 | void Teleport(ScenePresence agent, ulong regionHandle, Vector3 position, Vector3 lookAt, uint teleportFlags); | ||
44 | 54 | ||
45 | bool TeleportHome(UUID id, IClientAPI client); | 55 | bool TeleportHome(UUID id, IClientAPI client); |
46 | 56 | ||
47 | void DoTeleport(ScenePresence sp, GridRegion reg, GridRegion finalDestination, | 57 | void DoTeleport(ScenePresence sp, GridRegion reg, GridRegion finalDestination, |
48 | Vector3 position, Vector3 lookAt, uint teleportFlags, IEventQueue eq); | 58 | Vector3 position, Vector3 lookAt, uint teleportFlags); |
59 | |||
60 | /// <summary> | ||
61 | /// Show whether the given agent is being teleported. | ||
62 | /// </summary> | ||
63 | /// <param name='id'>The agent ID</para></param> | ||
64 | /// <returns>true if the agent is in the process of being teleported, false otherwise.</returns> | ||
65 | bool IsInTransit(UUID id); | ||
49 | 66 | ||
50 | bool Cross(ScenePresence agent, bool isFlying); | 67 | bool Cross(ScenePresence agent, bool isFlying); |
51 | 68 | ||
diff --git a/OpenSim/Region/Framework/Interfaces/IEnvironmentModule.cs b/OpenSim/Region/Framework/Interfaces/IEnvironmentModule.cs new file mode 100644 index 0000000..7a7b782 --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IEnvironmentModule.cs | |||
@@ -0,0 +1,36 @@ | |||
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 OpenMetaverse; | ||
29 | |||
30 | namespace OpenSim.Region.Framework.Interfaces | ||
31 | { | ||
32 | public interface IEnvironmentModule | ||
33 | { | ||
34 | void ResetEnvironmentSettings(UUID regionUUID); | ||
35 | } | ||
36 | } | ||
diff --git a/OpenSim/Region/Framework/Interfaces/IEstateModule.cs b/OpenSim/Region/Framework/Interfaces/IEstateModule.cs index 72e79ed..ca2ad94 100644 --- a/OpenSim/Region/Framework/Interfaces/IEstateModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IEstateModule.cs | |||
@@ -47,5 +47,8 @@ namespace OpenSim.Region.Framework.Interfaces | |||
47 | void sendRegionHandshakeToAll(); | 47 | void sendRegionHandshakeToAll(); |
48 | void TriggerEstateInfoChange(); | 48 | void TriggerEstateInfoChange(); |
49 | void TriggerRegionInfoChange(); | 49 | void TriggerRegionInfoChange(); |
50 | |||
51 | void setEstateTerrainBaseTexture(int level, UUID texture); | ||
52 | void setEstateTerrainTextureHeights(int corner, float lowValue, float highValue); | ||
50 | } | 53 | } |
51 | } | 54 | } |
diff --git a/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs b/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs index 1904011..3576e35 100644 --- a/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs | |||
@@ -49,11 +49,15 @@ namespace OpenSim.Region.Framework.Interfaces | |||
49 | /// <param name="folderID"></param> | 49 | /// <param name="folderID"></param> |
50 | /// <param name="objectGroups"></param> | 50 | /// <param name="objectGroups"></param> |
51 | /// <param name="remoteClient"></param> | 51 | /// <param name="remoteClient"></param> |
52 | /// <param name="asAttachment"> | ||
53 | /// Should be true if the object(s) are begin taken as attachments. False otherwise. | ||
54 | /// </param> | ||
52 | /// <returns> | 55 | /// <returns> |
53 | /// Returns the UUID of the newly created item asset (not the item itself). | 56 | /// A list of the items created. If there was more than one object and objects are not being coaleseced in |
54 | /// FIXME: This is not very useful. It would be far more useful to return a list of items instead. | 57 | /// inventory, then the order of items is in the same order as the input objects. |
55 | /// </returns> | 58 | /// </returns> |
56 | UUID CopyToInventory(DeRezAction action, UUID folderID, List<SceneObjectGroup> objectGroups, IClientAPI remoteClient); | 59 | List<InventoryItemBase> CopyToInventory( |
60 | DeRezAction action, UUID folderID, List<SceneObjectGroup> objectGroups, IClientAPI remoteClient, bool asAttachment); | ||
57 | 61 | ||
58 | /// <summary> | 62 | /// <summary> |
59 | /// Rez an object into the scene from the user's inventory | 63 | /// Rez an object into the scene from the user's inventory |
diff --git a/OpenSim/Region/Framework/Interfaces/IJsonStoreModule.cs b/OpenSim/Region/Framework/Interfaces/IJsonStoreModule.cs new file mode 100644 index 0000000..baac6e8 --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IJsonStoreModule.cs | |||
@@ -0,0 +1,48 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors | ||
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 OpenSim 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.Reflection; | ||
30 | using OpenMetaverse; | ||
31 | |||
32 | namespace OpenSim.Region.Framework.Interfaces | ||
33 | { | ||
34 | public delegate void TakeValueCallback(string s); | ||
35 | |||
36 | public interface IJsonStoreModule | ||
37 | { | ||
38 | bool CreateStore(string value, out UUID result); | ||
39 | bool DestroyStore(UUID storeID); | ||
40 | bool TestPath(UUID storeID, string path, bool useJson); | ||
41 | bool SetValue(UUID storeID, string path, string value, bool useJson); | ||
42 | bool RemoveValue(UUID storeID, string path); | ||
43 | bool GetValue(UUID storeID, string path, bool useJson, out string value); | ||
44 | |||
45 | void TakeValue(UUID storeID, string path, bool useJson, TakeValueCallback cback); | ||
46 | void ReadValue(UUID storeID, string path, bool useJson, TakeValueCallback cback); | ||
47 | } | ||
48 | } | ||
diff --git a/OpenSim/Region/Framework/Interfaces/INPCModule.cs b/OpenSim/Region/Framework/Interfaces/INPCModule.cs index dc3ff89..860483d 100644 --- a/OpenSim/Region/Framework/Interfaces/INPCModule.cs +++ b/OpenSim/Region/Framework/Interfaces/INPCModule.cs | |||
@@ -113,9 +113,11 @@ namespace OpenSim.Region.Framework.Interfaces | |||
113 | /// </param> | 113 | /// </param> |
114 | /// <param name="landAtTarget"> | 114 | /// <param name="landAtTarget"> |
115 | /// If true and the avatar is flying when it reaches the target, land. | 115 | /// If true and the avatar is flying when it reaches the target, land. |
116 | /// </param> | 116 | /// </param> name="running"> |
117 | /// If true, NPC moves with running speed. | ||
117 | /// <returns>True if the operation succeeded, false if there was no such agent or the agent was not an NPC</returns> | 118 | /// <returns>True if the operation succeeded, false if there was no such agent or the agent was not an NPC</returns> |
118 | bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget); | 119 | /// |
120 | bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget, bool running); | ||
119 | 121 | ||
120 | /// <summary> | 122 | /// <summary> |
121 | /// Stop the NPC's current movement. | 123 | /// Stop the NPC's current movement. |
@@ -135,6 +137,36 @@ namespace OpenSim.Region.Framework.Interfaces | |||
135 | bool Say(UUID agentID, Scene scene, string text); | 137 | bool Say(UUID agentID, Scene scene, string text); |
136 | 138 | ||
137 | /// <summary> | 139 | /// <summary> |
140 | /// Get the NPC to say something. | ||
141 | /// </summary> | ||
142 | /// <param name="agentID">The UUID of the NPC</param> | ||
143 | /// <param name="scene"></param> | ||
144 | /// <param name="text"></param> | ||
145 | /// <param name="channel"></param> | ||
146 | /// <returns>True if the operation succeeded, false if there was no such agent or the agent was not an NPC</returns> | ||
147 | bool Say(UUID agentID, Scene scene, string text, int channel); | ||
148 | |||
149 | /// <summary> | ||
150 | /// Get the NPC to shout something. | ||
151 | /// </summary> | ||
152 | /// <param name="agentID">The UUID of the NPC</param> | ||
153 | /// <param name="scene"></param> | ||
154 | /// <param name="text"></param> | ||
155 | /// <param name="channel"></param> | ||
156 | /// <returns>True if the operation succeeded, false if there was no such agent or the agent was not an NPC</returns> | ||
157 | bool Shout(UUID agentID, Scene scene, string text, int channel); | ||
158 | |||
159 | /// <summary> | ||
160 | /// Get the NPC to whisper something. | ||
161 | /// </summary> | ||
162 | /// <param name="agentID">The UUID of the NPC</param> | ||
163 | /// <param name="scene"></param> | ||
164 | /// <param name="text"></param> | ||
165 | /// <param name="channel"></param> | ||
166 | /// <returns>True if the operation succeeded, false if there was no such agent or the agent was not an NPC</returns> | ||
167 | bool Whisper(UUID agentID, Scene scene, string text, int channel); | ||
168 | |||
169 | /// <summary> | ||
138 | /// Sit the NPC. | 170 | /// Sit the NPC. |
139 | /// </summary> | 171 | /// </summary> |
140 | /// <param name="agentID"></param> | 172 | /// <param name="agentID"></param> |
diff --git a/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs new file mode 100644 index 0000000..e03ac5a --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs | |||
@@ -0,0 +1,59 @@ | |||
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.Linq; | ||
31 | using System.Text; | ||
32 | using OpenSim.Region.Framework.Scenes; | ||
33 | using System.IO; | ||
34 | using OpenMetaverse; | ||
35 | |||
36 | namespace OpenSim.Region.Framework.Interfaces | ||
37 | { | ||
38 | public interface IRegionCombinerModule | ||
39 | { | ||
40 | /// <summary> | ||
41 | /// Does the given id belong to the root region of a megaregion? | ||
42 | /// </summary> | ||
43 | bool IsRootForMegaregion(UUID regionId); | ||
44 | |||
45 | /// <summary> | ||
46 | /// Gets the size of megaregion. | ||
47 | /// </summary> | ||
48 | /// <remarks> | ||
49 | /// Returns size in meters. | ||
50 | /// Do not rely on this method remaining the same - this area is actively under development. | ||
51 | /// </remarks> | ||
52 | /// <param name="sceneId"> | ||
53 | /// The id of the root region for a megaregion. | ||
54 | /// This may change in the future to allow any region id that makes up a megaregion. | ||
55 | /// Currently, will throw an exception if this does not match a root region. | ||
56 | /// </param> | ||
57 | Vector2 GetSizeOfMegaregion(UUID regionId); | ||
58 | } | ||
59 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs index ce66100..143af48 100644 --- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs | |||
@@ -71,6 +71,12 @@ namespace OpenSim.Region.Framework.Interfaces | |||
71 | 71 | ||
72 | bool HasScript(UUID itemID, out bool running); | 72 | bool HasScript(UUID itemID, out bool running); |
73 | 73 | ||
74 | /// <summary> | ||
75 | /// Returns true if a script is running. | ||
76 | /// </summary> | ||
77 | /// <param name="itemID">The item ID of the script.</param> | ||
78 | bool GetScriptState(UUID itemID); | ||
79 | |||
74 | void SaveAllState(); | 80 | void SaveAllState(); |
75 | 81 | ||
76 | /// <summary> | 82 | /// <summary> |
@@ -79,6 +85,14 @@ namespace OpenSim.Region.Framework.Interfaces | |||
79 | void StartProcessing(); | 85 | void StartProcessing(); |
80 | 86 | ||
81 | /// <summary> | 87 | /// <summary> |
88 | /// Get the execution times of all scripts in the given array if they are currently running. | ||
89 | /// </summary> | ||
90 | /// <returns> | ||
91 | /// A float the value is a representative execution time in milliseconds of all scripts in that Array. | ||
92 | /// </returns> | ||
93 | float GetScriptExecutionTime(List<UUID> itemIDs); | ||
94 | |||
95 | /// <summary> | ||
82 | /// Get the execution times of all scripts in each object. | 96 | /// Get the execution times of all scripts in each object. |
83 | /// </summary> | 97 | /// </summary> |
84 | /// <returns> | 98 | /// <returns> |
@@ -87,4 +101,4 @@ namespace OpenSim.Region.Framework.Interfaces | |||
87 | /// </returns> | 101 | /// </returns> |
88 | Dictionary<uint, float> GetObjectScriptsExecutionTimes(); | 102 | Dictionary<uint, float> GetObjectScriptsExecutionTimes(); |
89 | } | 103 | } |
90 | } \ No newline at end of file | 104 | } |
diff --git a/OpenSim/Region/Framework/Interfaces/ISimulationDataService.cs b/OpenSim/Region/Framework/Interfaces/ISimulationDataService.cs index 5b69616..ccb583d 100644 --- a/OpenSim/Region/Framework/Interfaces/ISimulationDataService.cs +++ b/OpenSim/Region/Framework/Interfaces/ISimulationDataService.cs | |||
@@ -96,6 +96,26 @@ namespace OpenSim.Region.Framework.Interfaces | |||
96 | void StoreRegionWindlightSettings(RegionLightShareData wl); | 96 | void StoreRegionWindlightSettings(RegionLightShareData wl); |
97 | void RemoveRegionWindlightSettings(UUID regionID); | 97 | void RemoveRegionWindlightSettings(UUID regionID); |
98 | 98 | ||
99 | /// <summary> | ||
100 | /// Load Environment settings from region storage | ||
101 | /// </summary> | ||
102 | /// <param name="regionUUID">the region UUID</param> | ||
103 | /// <returns>LLSD string for viewer</returns> | ||
104 | string LoadRegionEnvironmentSettings(UUID regionUUID); | ||
105 | |||
106 | /// <summary> | ||
107 | /// Store Environment settings into region storage | ||
108 | /// </summary> | ||
109 | /// <param name="regionUUID">the region UUID</param> | ||
110 | /// <param name="settings">LLSD string from viewer</param> | ||
111 | void StoreRegionEnvironmentSettings(UUID regionUUID, string settings); | ||
112 | |||
113 | /// <summary> | ||
114 | /// Delete Environment settings from region storage | ||
115 | /// </summary> | ||
116 | /// <param name="regionUUID">the region UUID</param> | ||
117 | void RemoveRegionEnvironmentSettings(UUID regionUUID); | ||
118 | |||
99 | UUID[] GetObjectIDs(UUID regionID); | 119 | UUID[] GetObjectIDs(UUID regionID); |
100 | } | 120 | } |
101 | } | 121 | } |
diff --git a/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs b/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs index b7d9cfa..d7c80f7 100644 --- a/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs +++ b/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs | |||
@@ -108,6 +108,26 @@ namespace OpenSim.Region.Framework.Interfaces | |||
108 | void RemoveRegionWindlightSettings(UUID regionID); | 108 | void RemoveRegionWindlightSettings(UUID regionID); |
109 | UUID[] GetObjectIDs(UUID regionID); | 109 | UUID[] GetObjectIDs(UUID regionID); |
110 | 110 | ||
111 | /// <summary> | ||
112 | /// Load Environment settings from region storage | ||
113 | /// </summary> | ||
114 | /// <param name="regionUUID">the region UUID</param> | ||
115 | /// <returns>LLSD string for viewer</returns> | ||
116 | string LoadRegionEnvironmentSettings(UUID regionUUID); | ||
117 | |||
118 | /// <summary> | ||
119 | /// Store Environment settings into region storage | ||
120 | /// </summary> | ||
121 | /// <param name="regionUUID">the region UUID</param> | ||
122 | /// <param name="settings">LLSD string from viewer</param> | ||
123 | void StoreRegionEnvironmentSettings(UUID regionUUID, string settings); | ||
124 | |||
125 | /// <summary> | ||
126 | /// Delete Environment settings from region storage | ||
127 | /// </summary> | ||
128 | /// <param name="regionUUID">the region UUID</param> | ||
129 | void RemoveRegionEnvironmentSettings(UUID regionUUID); | ||
130 | |||
111 | void Shutdown(); | 131 | void Shutdown(); |
112 | } | 132 | } |
113 | } | 133 | } |
diff --git a/OpenSim/Region/Framework/Interfaces/IUrlModule.cs b/OpenSim/Region/Framework/Interfaces/IUrlModule.cs index 1b91166..457444c 100644 --- a/OpenSim/Region/Framework/Interfaces/IUrlModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IUrlModule.cs | |||
@@ -34,6 +34,7 @@ namespace OpenSim.Region.Framework.Interfaces | |||
34 | { | 34 | { |
35 | public interface IUrlModule | 35 | public interface IUrlModule |
36 | { | 36 | { |
37 | string ExternalHostNameForLSL { get; } | ||
37 | UUID RequestURL(IScriptModule engine, SceneObjectPart host, UUID itemID); | 38 | UUID RequestURL(IScriptModule engine, SceneObjectPart host, UUID itemID); |
38 | UUID RequestSecureURL(IScriptModule engine, SceneObjectPart host, UUID itemID); | 39 | UUID RequestSecureURL(IScriptModule engine, SceneObjectPart host, UUID itemID); |
39 | void ReleaseURL(string url); | 40 | void ReleaseURL(string url); |
diff --git a/OpenSim/Region/Framework/Interfaces/IWorldComm.cs b/OpenSim/Region/Framework/Interfaces/IWorldComm.cs index e8e375e..4e74781 100644 --- a/OpenSim/Region/Framework/Interfaces/IWorldComm.cs +++ b/OpenSim/Region/Framework/Interfaces/IWorldComm.cs | |||
@@ -103,7 +103,7 @@ namespace OpenSim.Region.Framework.Interfaces | |||
103 | /// <param name='msg'> | 103 | /// <param name='msg'> |
104 | /// Message. | 104 | /// Message. |
105 | /// </param> | 105 | /// </param> |
106 | bool DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg, out string error); | 106 | void DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg); |
107 | 107 | ||
108 | /// <summary> | 108 | /// <summary> |
109 | /// Are there any listen events ready to be dispatched? | 109 | /// Are there any listen events ready to be dispatched? |
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index e577958..9ddac19 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
@@ -294,6 +294,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
294 | return "FALLDOWN"; | 294 | return "FALLDOWN"; |
295 | } | 295 | } |
296 | 296 | ||
297 | // Check if the user has stopped walking just now | ||
298 | if (CurrentMovementAnimation == "WALK" && (move == Vector3.Zero)) | ||
299 | return "STAND"; | ||
300 | |||
297 | return CurrentMovementAnimation; | 301 | return CurrentMovementAnimation; |
298 | } | 302 | } |
299 | 303 | ||
@@ -418,13 +422,16 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
418 | /// </summary> | 422 | /// </summary> |
419 | public void UpdateMovementAnimations() | 423 | public void UpdateMovementAnimations() |
420 | { | 424 | { |
421 | CurrentMovementAnimation = DetermineMovementAnimation(); | 425 | lock (m_animations) |
426 | { | ||
427 | CurrentMovementAnimation = DetermineMovementAnimation(); | ||
422 | 428 | ||
423 | // m_log.DebugFormat( | 429 | // m_log.DebugFormat( |
424 | // "[SCENE PRESENCE ANIMATOR]: Determined animation {0} for {1} in UpdateMovementAnimations()", | 430 | // "[SCENE PRESENCE ANIMATOR]: Determined animation {0} for {1} in UpdateMovementAnimations()", |
425 | // CurrentMovementAnimation, m_scenePresence.Name); | 431 | // CurrentMovementAnimation, m_scenePresence.Name); |
426 | 432 | ||
427 | TrySetMovementAnimation(CurrentMovementAnimation); | 433 | TrySetMovementAnimation(CurrentMovementAnimation); |
434 | } | ||
428 | } | 435 | } |
429 | 436 | ||
430 | public UUID[] GetAnimationArray() | 437 | public UUID[] GetAnimationArray() |
diff --git a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs index f678d07..f555b49 100644 --- a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs +++ b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs | |||
@@ -117,7 +117,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
117 | 117 | ||
118 | private void InventoryRunDeleteTimer(object sender, ElapsedEventArgs e) | 118 | private void InventoryRunDeleteTimer(object sender, ElapsedEventArgs e) |
119 | { | 119 | { |
120 | m_log.Debug("[ASYNC DELETER]: Starting send to inventory loop"); | 120 | // m_log.Debug("[ASYNC DELETER]: Starting send to inventory loop"); |
121 | 121 | ||
122 | // We must set appearance parameters in the en_US culture in order to avoid issues where values are saved | 122 | // We must set appearance parameters in the en_US culture in order to avoid issues where values are saved |
123 | // in a culture where decimal points are commas and then reloaded in a culture which just treats them as | 123 | // in a culture where decimal points are commas and then reloaded in a culture which just treats them as |
@@ -147,15 +147,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
147 | { | 147 | { |
148 | x = m_inventoryDeletes.Dequeue(); | 148 | x = m_inventoryDeletes.Dequeue(); |
149 | 149 | ||
150 | m_log.DebugFormat( | 150 | // m_log.DebugFormat( |
151 | "[ASYNC DELETER]: Sending object to user's inventory, action {1}, count {2}, {0} item(s) remaining.", | 151 | // "[ASYNC DELETER]: Sending object to user's inventory, action {1}, count {2}, {0} item(s) remaining.", |
152 | left, x.action, x.objectGroups.Count); | 152 | // left, x.action, x.objectGroups.Count); |
153 | 153 | ||
154 | try | 154 | try |
155 | { | 155 | { |
156 | IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>(); | 156 | IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>(); |
157 | if (invAccess != null) | 157 | if (invAccess != null) |
158 | invAccess.CopyToInventory(x.action, x.folderID, x.objectGroups, x.remoteClient); | 158 | invAccess.CopyToInventory(x.action, x.folderID, x.objectGroups, x.remoteClient, false); |
159 | 159 | ||
160 | if (x.permissionToDelete) | 160 | if (x.permissionToDelete) |
161 | { | 161 | { |
@@ -185,7 +185,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
185 | e.StackTrace); | 185 | e.StackTrace); |
186 | } | 186 | } |
187 | 187 | ||
188 | m_log.Debug("[ASYNC DELETER]: No objects left in inventory send queue."); | 188 | // m_log.Debug("[ASYNC DELETER]: No objects left in inventory send queue."); |
189 | 189 | ||
190 | return false; | 190 | return false; |
191 | } | 191 | } |
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index 2365cfe..76a952b 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs | |||
@@ -53,6 +53,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
53 | 53 | ||
54 | public event ClientMovement OnClientMovement; | 54 | public event ClientMovement OnClientMovement; |
55 | 55 | ||
56 | public delegate void OnTerrainTaintedDelegate(); | ||
57 | |||
58 | public event OnTerrainTaintedDelegate OnTerrainTainted; | ||
59 | |||
56 | public delegate void OnTerrainTickDelegate(); | 60 | public delegate void OnTerrainTickDelegate(); |
57 | 61 | ||
58 | public delegate void OnTerrainUpdateDelegate(); | 62 | public delegate void OnTerrainUpdateDelegate(); |
@@ -484,6 +488,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
484 | public delegate void SceneObjectPartUpdated(SceneObjectPart sop); | 488 | public delegate void SceneObjectPartUpdated(SceneObjectPart sop); |
485 | public event SceneObjectPartUpdated OnSceneObjectPartUpdated; | 489 | public event SceneObjectPartUpdated OnSceneObjectPartUpdated; |
486 | 490 | ||
491 | public delegate void ScenePresenceUpdated(ScenePresence sp); | ||
492 | public event ScenePresenceUpdated OnScenePresenceUpdated; | ||
493 | |||
487 | public delegate void RegionUp(GridRegion region); | 494 | public delegate void RegionUp(GridRegion region); |
488 | public event RegionUp OnRegionUp; | 495 | public event RegionUp OnRegionUp; |
489 | 496 | ||
@@ -935,6 +942,27 @@ namespace OpenSim.Region.Framework.Scenes | |||
935 | } | 942 | } |
936 | } | 943 | } |
937 | 944 | ||
945 | public void TriggerTerrainTainted() | ||
946 | { | ||
947 | OnTerrainTaintedDelegate handlerTerrainTainted = OnTerrainTainted; | ||
948 | if (handlerTerrainTainted != null) | ||
949 | { | ||
950 | foreach (OnTerrainTaintedDelegate d in handlerTerrainTainted.GetInvocationList()) | ||
951 | { | ||
952 | try | ||
953 | { | ||
954 | d(); | ||
955 | } | ||
956 | catch (Exception e) | ||
957 | { | ||
958 | m_log.ErrorFormat( | ||
959 | "[EVENT MANAGER]: Delegate for TriggerTerrainTainted failed - continuing. {0} {1}", | ||
960 | e.Message, e.StackTrace); | ||
961 | } | ||
962 | } | ||
963 | } | ||
964 | } | ||
965 | |||
938 | public void TriggerParcelPrimCountAdd(SceneObjectGroup obj) | 966 | public void TriggerParcelPrimCountAdd(SceneObjectGroup obj) |
939 | { | 967 | { |
940 | OnParcelPrimCountAddDelegate handlerParcelPrimCountAdd = OnParcelPrimCountAdd; | 968 | OnParcelPrimCountAddDelegate handlerParcelPrimCountAdd = OnParcelPrimCountAdd; |
@@ -2367,6 +2395,27 @@ namespace OpenSim.Region.Framework.Scenes | |||
2367 | } | 2395 | } |
2368 | } | 2396 | } |
2369 | 2397 | ||
2398 | public void TriggerScenePresenceUpdated(ScenePresence sp) | ||
2399 | { | ||
2400 | ScenePresenceUpdated handler = OnScenePresenceUpdated; | ||
2401 | if (handler != null) | ||
2402 | { | ||
2403 | foreach (ScenePresenceUpdated d in handler.GetInvocationList()) | ||
2404 | { | ||
2405 | try | ||
2406 | { | ||
2407 | d(sp); | ||
2408 | } | ||
2409 | catch (Exception e) | ||
2410 | { | ||
2411 | m_log.ErrorFormat( | ||
2412 | "[EVENT MANAGER]: Delegate for TriggerScenePresenceUpdated failed - continuing. {0} {1}", | ||
2413 | e.Message, e.StackTrace); | ||
2414 | } | ||
2415 | } | ||
2416 | } | ||
2417 | } | ||
2418 | |||
2370 | public void TriggerOnParcelPropertiesUpdateRequest(LandUpdateArgs args, | 2419 | public void TriggerOnParcelPropertiesUpdateRequest(LandUpdateArgs args, |
2371 | int local_id, IClientAPI remote_client) | 2420 | int local_id, IClientAPI remote_client) |
2372 | { | 2421 | { |
diff --git a/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs b/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs index 6c5685c..1365831 100644 --- a/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs +++ b/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs | |||
@@ -48,16 +48,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
48 | { | 48 | { |
49 | public class RegionStatsHandler : IStreamedRequestHandler | 49 | public class RegionStatsHandler : IStreamedRequestHandler |
50 | { | 50 | { |
51 | //private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
52 | |||
51 | private string osRXStatsURI = String.Empty; | 53 | private string osRXStatsURI = String.Empty; |
52 | private string osXStatsURI = String.Empty; | 54 | private string osXStatsURI = String.Empty; |
53 | //private string osSecret = String.Empty; | 55 | //private string osSecret = String.Empty; |
54 | private OpenSim.Framework.RegionInfo regionInfo; | 56 | private OpenSim.Framework.RegionInfo regionInfo; |
55 | public string localZone = TimeZone.CurrentTimeZone.StandardName; | 57 | public string localZone = TimeZone.CurrentTimeZone.StandardName; |
56 | public TimeSpan utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now); | 58 | public TimeSpan utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now); |
57 | |||
58 | //private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
59 | 59 | ||
60 | public RegionStatsHandler(OpenSim.Framework.RegionInfo region_info) | 60 | public string Name { get { return "RegionStats"; } } |
61 | public string Description { get { return "Region Statistics"; } } | ||
62 | |||
63 | public RegionStatsHandler(RegionInfo region_info) | ||
61 | { | 64 | { |
62 | regionInfo = region_info; | 65 | regionInfo = region_info; |
63 | osRXStatsURI = Util.SHA1Hash(regionInfo.regionSecret); | 66 | osRXStatsURI = Util.SHA1Hash(regionInfo.regionSecret); |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 29465c0..e1281a6 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -300,6 +300,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
300 | AssetBase asset = CreateAsset(item.Name, item.Description, (sbyte)AssetType.LSLText, data, remoteClient.AgentId); | 300 | AssetBase asset = CreateAsset(item.Name, item.Description, (sbyte)AssetType.LSLText, data, remoteClient.AgentId); |
301 | AssetService.Store(asset); | 301 | AssetService.Store(asset); |
302 | 302 | ||
303 | // m_log.DebugFormat( | ||
304 | // "[PRIM INVENTORY]: Stored asset {0} when updating item {1} in prim {2} for {3}", | ||
305 | // asset.ID, item.Name, part.Name, remoteClient.Name); | ||
306 | |||
303 | if (isScriptRunning) | 307 | if (isScriptRunning) |
304 | { | 308 | { |
305 | part.Inventory.RemoveScriptInstance(item.ItemID, false); | 309 | part.Inventory.RemoveScriptInstance(item.ItemID, false); |
@@ -431,10 +435,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
431 | } | 435 | } |
432 | else | 436 | else |
433 | { | 437 | { |
434 | IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>(); | 438 | if (AgentTransactionsModule != null) |
435 | if (agentTransactions != null) | ||
436 | { | 439 | { |
437 | agentTransactions.HandleItemUpdateFromTransaction(remoteClient, transactionID, item); | 440 | AgentTransactionsModule.HandleItemUpdateFromTransaction(remoteClient, transactionID, item); |
438 | } | 441 | } |
439 | } | 442 | } |
440 | } | 443 | } |
@@ -950,8 +953,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
950 | sbyte invType, sbyte type, UUID olditemID) | 953 | sbyte invType, sbyte type, UUID olditemID) |
951 | { | 954 | { |
952 | // m_log.DebugFormat( | 955 | // m_log.DebugFormat( |
953 | // "[AGENT INVENTORY]: Received request from {0} to create inventory item link {1} in folder {2} pointing to {3}", | 956 | // "[AGENT INVENTORY]: Received request from {0} to create inventory item link {1} in folder {2} pointing to {3}, assetType {4}, inventoryType {5}", |
954 | // remoteClient.Name, name, folderID, olditemID); | 957 | // remoteClient.Name, name, folderID, olditemID, (AssetType)type, (InventoryType)invType); |
955 | 958 | ||
956 | if (!Permissions.CanCreateUserInventory(invType, remoteClient.AgentId)) | 959 | if (!Permissions.CanCreateUserInventory(invType, remoteClient.AgentId)) |
957 | return; | 960 | return; |
@@ -984,10 +987,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
984 | asset.Type = type; | 987 | asset.Type = type; |
985 | asset.Name = name; | 988 | asset.Name = name; |
986 | asset.Description = description; | 989 | asset.Description = description; |
987 | 990 | ||
988 | CreateNewInventoryItem( | 991 | CreateNewInventoryItem( |
989 | remoteClient, remoteClient.AgentId.ToString(), string.Empty, folderID, name, 0, callbackID, asset, invType, | 992 | remoteClient, remoteClient.AgentId.ToString(), string.Empty, folderID, name, 0, callbackID, asset, invType, |
990 | (uint)PermissionMask.All, (uint)PermissionMask.All, (uint)PermissionMask.All, | 993 | (uint)PermissionMask.All, (uint)PermissionMask.All, (uint)PermissionMask.All, |
991 | (uint)PermissionMask.All, (uint)PermissionMask.All, Util.UnixTimeSinceEpoch()); | 994 | (uint)PermissionMask.All, (uint)PermissionMask.All, Util.UnixTimeSinceEpoch()); |
992 | } | 995 | } |
993 | else | 996 | else |
@@ -1562,21 +1565,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
1562 | // Only look for an uploaded updated asset if we are passed a transaction ID. This is only the | 1565 | // Only look for an uploaded updated asset if we are passed a transaction ID. This is only the |
1563 | // case for updates uploded through UDP. Updates uploaded via a capability (e.g. a script update) | 1566 | // case for updates uploded through UDP. Updates uploaded via a capability (e.g. a script update) |
1564 | // will not pass in a transaction ID in the update message. | 1567 | // will not pass in a transaction ID in the update message. |
1565 | if (transactionID != UUID.Zero) | 1568 | if (transactionID != UUID.Zero && AgentTransactionsModule != null) |
1566 | { | 1569 | { |
1567 | IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>(); | 1570 | AgentTransactionsModule.HandleTaskItemUpdateFromTransaction( |
1568 | if (agentTransactions != null) | 1571 | remoteClient, part, transactionID, currentItem); |
1569 | { | 1572 | |
1570 | agentTransactions.HandleTaskItemUpdateFromTransaction( | 1573 | // if ((InventoryType)itemInfo.InvType == InventoryType.Notecard) |
1571 | remoteClient, part, transactionID, currentItem); | 1574 | // remoteClient.SendAgentAlertMessage("Notecard saved", false); |
1572 | 1575 | // else if ((InventoryType)itemInfo.InvType == InventoryType.LSL) | |
1573 | // if ((InventoryType)itemInfo.InvType == InventoryType.Notecard) | 1576 | // remoteClient.SendAgentAlertMessage("Script saved", false); |
1574 | // remoteClient.SendAgentAlertMessage("Notecard saved", false); | 1577 | // else |
1575 | // else if ((InventoryType)itemInfo.InvType == InventoryType.LSL) | 1578 | // remoteClient.SendAgentAlertMessage("Item saved", false); |
1576 | // remoteClient.SendAgentAlertMessage("Script saved", false); | ||
1577 | // else | ||
1578 | // remoteClient.SendAgentAlertMessage("Item saved", false); | ||
1579 | } | ||
1580 | } | 1579 | } |
1581 | 1580 | ||
1582 | // Base ALWAYS has move | 1581 | // Base ALWAYS has move |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index 3ef1e29..cf68ff4 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | |||
@@ -38,8 +38,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
38 | { | 38 | { |
39 | public partial class Scene | 39 | public partial class Scene |
40 | { | 40 | { |
41 | |||
41 | protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName, | 42 | protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName, |
42 | UUID fromID, bool fromAgent, bool broadcast) | 43 | UUID fromID, UUID targetID, bool fromAgent, bool broadcast) |
43 | { | 44 | { |
44 | OSChatMessage args = new OSChatMessage(); | 45 | OSChatMessage args = new OSChatMessage(); |
45 | 46 | ||
@@ -63,14 +64,20 @@ namespace OpenSim.Region.Framework.Scenes | |||
63 | } | 64 | } |
64 | 65 | ||
65 | args.From = fromName; | 66 | args.From = fromName; |
66 | //args. | 67 | args.TargetUUID = targetID; |
67 | 68 | ||
68 | if (broadcast) | 69 | if (broadcast) |
69 | EventManager.TriggerOnChatBroadcast(this, args); | 70 | EventManager.TriggerOnChatBroadcast(this, args); |
70 | else | 71 | else |
71 | EventManager.TriggerOnChatFromWorld(this, args); | 72 | EventManager.TriggerOnChatFromWorld(this, args); |
72 | } | 73 | } |
73 | 74 | ||
75 | protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName, | ||
76 | UUID fromID, bool fromAgent, bool broadcast) | ||
77 | { | ||
78 | SimChat(message, type, channel, fromPos, fromName, fromID, UUID.Zero, fromAgent, broadcast); | ||
79 | } | ||
80 | |||
74 | /// <summary> | 81 | /// <summary> |
75 | /// | 82 | /// |
76 | /// </summary> | 83 | /// </summary> |
@@ -108,6 +115,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
108 | { | 115 | { |
109 | SimChat(message, type, channel, fromPos, fromName, fromID, fromAgent, true); | 116 | SimChat(message, type, channel, fromPos, fromName, fromID, fromAgent, true); |
110 | } | 117 | } |
118 | /// <summary> | ||
119 | /// | ||
120 | /// </summary> | ||
121 | /// <param name="message"></param> | ||
122 | /// <param name="type"></param> | ||
123 | /// <param name="fromPos"></param> | ||
124 | /// <param name="fromName"></param> | ||
125 | /// <param name="fromAgentID"></param> | ||
126 | /// <param name="targetID"></param> | ||
127 | public void SimChatToAgent(UUID targetID, byte[] message, Vector3 fromPos, string fromName, UUID fromID, bool fromAgent) | ||
128 | { | ||
129 | SimChat(message, ChatTypeEnum.Say, 0, fromPos, fromName, fromID, targetID, fromAgent, false); | ||
130 | } | ||
111 | 131 | ||
112 | /// <summary> | 132 | /// <summary> |
113 | /// Invoked when the client requests a prim. | 133 | /// Invoked when the client requests a prim. |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs index e1fedf4..535d87a 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs | |||
@@ -67,6 +67,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
67 | public delegate bool RunConsoleCommandHandler(UUID user, Scene requestFromScene); | 67 | public delegate bool RunConsoleCommandHandler(UUID user, Scene requestFromScene); |
68 | public delegate bool IssueEstateCommandHandler(UUID user, Scene requestFromScene, bool ownerCommand); | 68 | public delegate bool IssueEstateCommandHandler(UUID user, Scene requestFromScene, bool ownerCommand); |
69 | public delegate bool IsGodHandler(UUID user, Scene requestFromScene); | 69 | public delegate bool IsGodHandler(UUID user, Scene requestFromScene); |
70 | public delegate bool IsGridGodHandler(UUID user, Scene requestFromScene); | ||
70 | public delegate bool IsAdministratorHandler(UUID user); | 71 | public delegate bool IsAdministratorHandler(UUID user); |
71 | public delegate bool EditParcelHandler(UUID user, ILandObject parcel, Scene scene); | 72 | public delegate bool EditParcelHandler(UUID user, ILandObject parcel, Scene scene); |
72 | public delegate bool EditParcelPropertiesHandler(UUID user, ILandObject parcel, GroupPowers p, Scene scene); | 73 | public delegate bool EditParcelPropertiesHandler(UUID user, ILandObject parcel, GroupPowers p, Scene scene); |
@@ -134,6 +135,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
134 | public event RunConsoleCommandHandler OnRunConsoleCommand; | 135 | public event RunConsoleCommandHandler OnRunConsoleCommand; |
135 | public event IssueEstateCommandHandler OnIssueEstateCommand; | 136 | public event IssueEstateCommandHandler OnIssueEstateCommand; |
136 | public event IsGodHandler OnIsGod; | 137 | public event IsGodHandler OnIsGod; |
138 | public event IsGridGodHandler OnIsGridGod; | ||
137 | public event IsAdministratorHandler OnIsAdministrator; | 139 | public event IsAdministratorHandler OnIsAdministrator; |
138 | // public event EditParcelHandler OnEditParcel; | 140 | // public event EditParcelHandler OnEditParcel; |
139 | public event EditParcelPropertiesHandler OnEditParcelProperties; | 141 | public event EditParcelPropertiesHandler OnEditParcelProperties; |
@@ -728,6 +730,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
728 | return true; | 730 | return true; |
729 | } | 731 | } |
730 | 732 | ||
733 | public bool IsGridGod(UUID user) | ||
734 | { | ||
735 | IsGridGodHandler handler = OnIsGridGod; | ||
736 | if (handler != null) | ||
737 | { | ||
738 | Delegate[] list = handler.GetInvocationList(); | ||
739 | foreach (IsGridGodHandler h in list) | ||
740 | { | ||
741 | if (h(user, m_scene) == false) | ||
742 | return false; | ||
743 | } | ||
744 | } | ||
745 | return true; | ||
746 | } | ||
747 | |||
731 | public bool IsAdministrator(UUID user) | 748 | public bool IsAdministrator(UUID user) |
732 | { | 749 | { |
733 | IsAdministratorHandler handler = OnIsAdministrator; | 750 | IsAdministratorHandler handler = OnIsAdministrator; |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 6a120c1..3095382 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -77,7 +77,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
77 | public bool DebugUpdates { get; private set; } | 77 | public bool DebugUpdates { get; private set; } |
78 | 78 | ||
79 | public SynchronizeSceneHandler SynchronizeScene; | 79 | public SynchronizeSceneHandler SynchronizeScene; |
80 | public SimStatsReporter StatsReporter; | 80 | |
81 | /// <summary> | ||
82 | /// Statistical information for this scene. | ||
83 | /// </summary> | ||
84 | public SimStatsReporter StatsReporter { get; private set; } | ||
85 | |||
81 | public List<Border> NorthBorders = new List<Border>(); | 86 | public List<Border> NorthBorders = new List<Border>(); |
82 | public List<Border> EastBorders = new List<Border>(); | 87 | public List<Border> EastBorders = new List<Border>(); |
83 | public List<Border> SouthBorders = new List<Border>(); | 88 | public List<Border> SouthBorders = new List<Border>(); |
@@ -103,6 +108,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
103 | public bool m_trustBinaries; | 108 | public bool m_trustBinaries; |
104 | public bool m_allowScriptCrossings; | 109 | public bool m_allowScriptCrossings; |
105 | public bool m_useFlySlow; | 110 | public bool m_useFlySlow; |
111 | public bool m_useTrashOnDelete = true; | ||
106 | 112 | ||
107 | /// <summary> | 113 | /// <summary> |
108 | /// Temporarily setting to trigger appearance resends at 60 second intervals. | 114 | /// Temporarily setting to trigger appearance resends at 60 second intervals. |
@@ -163,7 +169,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
163 | protected IConfigSource m_config; | 169 | protected IConfigSource m_config; |
164 | protected IRegionSerialiserModule m_serialiser; | 170 | protected IRegionSerialiserModule m_serialiser; |
165 | protected IDialogModule m_dialogModule; | 171 | protected IDialogModule m_dialogModule; |
166 | protected IEntityTransferModule m_teleportModule; | ||
167 | protected ICapabilitiesModule m_capsModule; | 172 | protected ICapabilitiesModule m_capsModule; |
168 | protected IGroupsModule m_groupsModule; | 173 | protected IGroupsModule m_groupsModule; |
169 | 174 | ||
@@ -217,6 +222,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
217 | private int backupMS; | 222 | private int backupMS; |
218 | private int terrainMS; | 223 | private int terrainMS; |
219 | private int landMS; | 224 | private int landMS; |
225 | private int spareMS; | ||
220 | 226 | ||
221 | /// <summary> | 227 | /// <summary> |
222 | /// Tick at which the last frame was processed. | 228 | /// Tick at which the last frame was processed. |
@@ -458,6 +464,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
458 | { | 464 | { |
459 | if (m_simulationService == null) | 465 | if (m_simulationService == null) |
460 | m_simulationService = RequestModuleInterface<ISimulationService>(); | 466 | m_simulationService = RequestModuleInterface<ISimulationService>(); |
467 | |||
461 | return m_simulationService; | 468 | return m_simulationService; |
462 | } | 469 | } |
463 | } | 470 | } |
@@ -513,6 +520,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
513 | } | 520 | } |
514 | 521 | ||
515 | public IAttachmentsModule AttachmentsModule { get; set; } | 522 | public IAttachmentsModule AttachmentsModule { get; set; } |
523 | public IEntityTransferModule EntityTransferModule { get; private set; } | ||
524 | public IAgentAssetTransactions AgentTransactionsModule { get; private set; } | ||
516 | 525 | ||
517 | public IAvatarFactoryModule AvatarFactory | 526 | public IAvatarFactoryModule AvatarFactory |
518 | { | 527 | { |
@@ -589,6 +598,20 @@ namespace OpenSim.Region.Framework.Scenes | |||
589 | get { return m_sceneGraph.Entities; } | 598 | get { return m_sceneGraph.Entities; } |
590 | } | 599 | } |
591 | 600 | ||
601 | |||
602 | // used in sequence see: SpawnPoint() | ||
603 | private int m_SpawnPoint; | ||
604 | // can be closest/random/sequence | ||
605 | public string SpawnPointRouting | ||
606 | { | ||
607 | get; private set; | ||
608 | } | ||
609 | // allow landmarks to pass | ||
610 | public bool TelehubAllowLandmarks | ||
611 | { | ||
612 | get; private set; | ||
613 | } | ||
614 | |||
592 | #endregion Properties | 615 | #endregion Properties |
593 | 616 | ||
594 | #region Constructors | 617 | #region Constructors |
@@ -606,7 +629,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
606 | 629 | ||
607 | Random random = new Random(); | 630 | Random random = new Random(); |
608 | 631 | ||
609 | m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue/2))+(uint)(uint.MaxValue/4); | 632 | m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue / 2)) + (uint)(uint.MaxValue / 4); |
610 | m_moduleLoader = moduleLoader; | 633 | m_moduleLoader = moduleLoader; |
611 | m_authenticateHandler = authen; | 634 | m_authenticateHandler = authen; |
612 | m_sceneGridService = sceneGridService; | 635 | m_sceneGridService = sceneGridService; |
@@ -726,6 +749,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
726 | m_maxPhys = RegionInfo.PhysPrimMax; | 749 | m_maxPhys = RegionInfo.PhysPrimMax; |
727 | } | 750 | } |
728 | 751 | ||
752 | SpawnPointRouting = startupConfig.GetString("SpawnPointRouting", "closest"); | ||
753 | TelehubAllowLandmarks = startupConfig.GetBoolean("TelehubAllowLandmark", false); | ||
754 | |||
729 | // Here, if clamping is requested in either global or | 755 | // Here, if clamping is requested in either global or |
730 | // local config, it will be used | 756 | // local config, it will be used |
731 | // | 757 | // |
@@ -735,6 +761,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
735 | m_clampPrimSize = true; | 761 | m_clampPrimSize = true; |
736 | } | 762 | } |
737 | 763 | ||
764 | m_useTrashOnDelete = startupConfig.GetBoolean("UseTrashOnDelete",m_useTrashOnDelete); | ||
738 | m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); | 765 | m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); |
739 | m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings); | 766 | m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings); |
740 | m_dontPersistBefore = | 767 | m_dontPersistBefore = |
@@ -833,13 +860,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
833 | StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats; | 860 | StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats; |
834 | } | 861 | } |
835 | 862 | ||
836 | /// <summary> | ||
837 | /// Mock constructor for scene group persistency unit tests. | ||
838 | /// SceneObjectGroup RegionId property is delegated to Scene. | ||
839 | /// </summary> | ||
840 | /// <param name="regInfo"></param> | ||
841 | public Scene(RegionInfo regInfo) | 863 | public Scene(RegionInfo regInfo) |
842 | { | 864 | { |
865 | PhysicalPrims = true; | ||
866 | CollidablePrims = true; | ||
867 | |||
843 | BordersLocked = true; | 868 | BordersLocked = true; |
844 | Border northBorder = new Border(); | 869 | Border northBorder = new Border(); |
845 | northBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- | 870 | northBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize); //<--- |
@@ -866,8 +891,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
866 | m_eventManager = new EventManager(); | 891 | m_eventManager = new EventManager(); |
867 | 892 | ||
868 | m_permissions = new ScenePermissions(this); | 893 | m_permissions = new ScenePermissions(this); |
869 | |||
870 | // m_lastUpdate = Util.EnvironmentTickCount(); | ||
871 | } | 894 | } |
872 | 895 | ||
873 | #endregion | 896 | #endregion |
@@ -936,8 +959,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
936 | List<ulong> old = new List<ulong>(); | 959 | List<ulong> old = new List<ulong>(); |
937 | old.Add(otherRegion.RegionHandle); | 960 | old.Add(otherRegion.RegionHandle); |
938 | agent.DropOldNeighbours(old); | 961 | agent.DropOldNeighbours(old); |
939 | if (m_teleportModule != null && agent.PresenceType != PresenceType.Npc) | 962 | if (EntityTransferModule != null && agent.PresenceType != PresenceType.Npc) |
940 | m_teleportModule.EnableChildAgent(agent, otherRegion); | 963 | EntityTransferModule.EnableChildAgent(agent, otherRegion); |
941 | }); | 964 | }); |
942 | } | 965 | } |
943 | catch (NullReferenceException) | 966 | catch (NullReferenceException) |
@@ -950,7 +973,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
950 | else | 973 | else |
951 | { | 974 | { |
952 | m_log.InfoFormat( | 975 | m_log.InfoFormat( |
953 | "[INTERGRID]: Got notice about far away Region: {0} at ({1}, {2})", | 976 | "[SCENE]: Got notice about far away Region: {0} at ({1}, {2})", |
954 | otherRegion.RegionName, otherRegion.RegionLocX, otherRegion.RegionLocY); | 977 | otherRegion.RegionName, otherRegion.RegionLocX, otherRegion.RegionLocY); |
955 | } | 978 | } |
956 | } | 979 | } |
@@ -1044,13 +1067,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
1044 | } | 1067 | } |
1045 | } | 1068 | } |
1046 | 1069 | ||
1070 | m_log.Error("[REGION]: Closing"); | ||
1071 | Close(); | ||
1072 | |||
1047 | if (PhysicsScene != null) | 1073 | if (PhysicsScene != null) |
1048 | { | 1074 | { |
1049 | PhysicsScene.Dispose(); | 1075 | PhysicsScene.Dispose(); |
1050 | } | 1076 | } |
1051 | |||
1052 | m_log.Error("[REGION]: Closing"); | ||
1053 | Close(); | ||
1054 | 1077 | ||
1055 | m_log.Error("[REGION]: Firing Region Restart Message"); | 1078 | m_log.Error("[REGION]: Firing Region Restart Message"); |
1056 | 1079 | ||
@@ -1074,8 +1097,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1074 | { | 1097 | { |
1075 | ForEachRootScenePresence(delegate(ScenePresence agent) | 1098 | ForEachRootScenePresence(delegate(ScenePresence agent) |
1076 | { | 1099 | { |
1077 | if (m_teleportModule != null && agent.PresenceType != PresenceType.Npc) | 1100 | if (EntityTransferModule != null && agent.PresenceType != PresenceType.Npc) |
1078 | m_teleportModule.EnableChildAgent(agent, r); | 1101 | EntityTransferModule.EnableChildAgent(agent, r); |
1079 | }); | 1102 | }); |
1080 | } | 1103 | } |
1081 | catch (NullReferenceException) | 1104 | catch (NullReferenceException) |
@@ -1265,8 +1288,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
1265 | m_serialiser = RequestModuleInterface<IRegionSerialiserModule>(); | 1288 | m_serialiser = RequestModuleInterface<IRegionSerialiserModule>(); |
1266 | m_dialogModule = RequestModuleInterface<IDialogModule>(); | 1289 | m_dialogModule = RequestModuleInterface<IDialogModule>(); |
1267 | m_capsModule = RequestModuleInterface<ICapabilitiesModule>(); | 1290 | m_capsModule = RequestModuleInterface<ICapabilitiesModule>(); |
1268 | m_teleportModule = RequestModuleInterface<IEntityTransferModule>(); | 1291 | EntityTransferModule = RequestModuleInterface<IEntityTransferModule>(); |
1269 | m_groupsModule = RequestModuleInterface<IGroupsModule>(); | 1292 | m_groupsModule = RequestModuleInterface<IGroupsModule>(); |
1293 | AgentTransactionsModule = RequestModuleInterface<IAgentAssetTransactions>(); | ||
1270 | } | 1294 | } |
1271 | 1295 | ||
1272 | #endregion | 1296 | #endregion |
@@ -1387,37 +1411,41 @@ namespace OpenSim.Region.Framework.Scenes | |||
1387 | endFrame = Frame + frames; | 1411 | endFrame = Frame + frames; |
1388 | 1412 | ||
1389 | float physicsFPS = 0f; | 1413 | float physicsFPS = 0f; |
1390 | int tmpPhysicsMS, tmpPhysicsMS2, tmpAgentMS, tmpTempOnRezMS, evMS, backMS, terMS; | 1414 | int previousFrameTick, tmpMS; |
1391 | int previousFrameTick; | 1415 | int maintc = Util.EnvironmentTickCount(); |
1392 | int maintc; | ||
1393 | int sleepMS; | ||
1394 | int framestart; | ||
1395 | 1416 | ||
1396 | while (!m_shuttingDown && (endFrame == null || Frame < endFrame)) | 1417 | while (!m_shuttingDown && (endFrame == null || Frame < endFrame)) |
1397 | { | 1418 | { |
1398 | framestart = Util.EnvironmentTickCount(); | ||
1399 | ++Frame; | 1419 | ++Frame; |
1400 | 1420 | ||
1401 | // m_log.DebugFormat("[SCENE]: Processing frame {0} in {1}", Frame, RegionInfo.RegionName); | 1421 | // m_log.DebugFormat("[SCENE]: Processing frame {0} in {1}", Frame, RegionInfo.RegionName); |
1402 | 1422 | ||
1403 | agentMS = tempOnRezMS = eventMS = backupMS = terrainMS = landMS = 0; | 1423 | agentMS = tempOnRezMS = eventMS = backupMS = terrainMS = landMS = spareMS = 0; |
1404 | 1424 | ||
1405 | try | 1425 | try |
1406 | { | 1426 | { |
1407 | tmpPhysicsMS2 = Util.EnvironmentTickCount(); | 1427 | // Apply taints in terrain module to terrain in physics scene |
1428 | if (Frame % m_update_terrain == 0) | ||
1429 | { | ||
1430 | tmpMS = Util.EnvironmentTickCount(); | ||
1431 | UpdateTerrain(); | ||
1432 | terrainMS = Util.EnvironmentTickCountSubtract(tmpMS); | ||
1433 | } | ||
1434 | |||
1435 | tmpMS = Util.EnvironmentTickCount(); | ||
1408 | if ((Frame % m_update_physics == 0) && m_physics_enabled) | 1436 | if ((Frame % m_update_physics == 0) && m_physics_enabled) |
1409 | m_sceneGraph.UpdatePreparePhysics(); | 1437 | m_sceneGraph.UpdatePreparePhysics(); |
1410 | physicsMS2 = Util.EnvironmentTickCountSubtract(tmpPhysicsMS2); | 1438 | physicsMS2 = Util.EnvironmentTickCountSubtract(tmpMS); |
1411 | 1439 | ||
1412 | // Apply any pending avatar force input to the avatar's velocity | 1440 | // Apply any pending avatar force input to the avatar's velocity |
1413 | tmpAgentMS = Util.EnvironmentTickCount(); | 1441 | tmpMS = Util.EnvironmentTickCount(); |
1414 | if (Frame % m_update_entitymovement == 0) | 1442 | if (Frame % m_update_entitymovement == 0) |
1415 | m_sceneGraph.UpdateScenePresenceMovement(); | 1443 | m_sceneGraph.UpdateScenePresenceMovement(); |
1416 | agentMS = Util.EnvironmentTickCountSubtract(tmpAgentMS); | 1444 | agentMS = Util.EnvironmentTickCountSubtract(tmpMS); |
1417 | 1445 | ||
1418 | // Perform the main physics update. This will do the actual work of moving objects and avatars according to their | 1446 | // Perform the main physics update. This will do the actual work of moving objects and avatars according to their |
1419 | // velocity | 1447 | // velocity |
1420 | tmpPhysicsMS = Util.EnvironmentTickCount(); | 1448 | tmpMS = Util.EnvironmentTickCount(); |
1421 | if (Frame % m_update_physics == 0) | 1449 | if (Frame % m_update_physics == 0) |
1422 | { | 1450 | { |
1423 | if (m_physics_enabled) | 1451 | if (m_physics_enabled) |
@@ -1426,9 +1454,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
1426 | if (SynchronizeScene != null) | 1454 | if (SynchronizeScene != null) |
1427 | SynchronizeScene(this); | 1455 | SynchronizeScene(this); |
1428 | } | 1456 | } |
1429 | physicsMS = Util.EnvironmentTickCountSubtract(tmpPhysicsMS); | 1457 | physicsMS = Util.EnvironmentTickCountSubtract(tmpMS); |
1430 | 1458 | ||
1431 | tmpAgentMS = Util.EnvironmentTickCount(); | 1459 | tmpMS = Util.EnvironmentTickCount(); |
1432 | 1460 | ||
1433 | // Check if any objects have reached their targets | 1461 | // Check if any objects have reached their targets |
1434 | CheckAtTargets(); | 1462 | CheckAtTargets(); |
@@ -1443,36 +1471,29 @@ namespace OpenSim.Region.Framework.Scenes | |||
1443 | if (Frame % m_update_presences == 0) | 1471 | if (Frame % m_update_presences == 0) |
1444 | m_sceneGraph.UpdatePresences(); | 1472 | m_sceneGraph.UpdatePresences(); |
1445 | 1473 | ||
1446 | agentMS += Util.EnvironmentTickCountSubtract(tmpAgentMS); | 1474 | agentMS += Util.EnvironmentTickCountSubtract(tmpMS); |
1447 | 1475 | ||
1448 | // Delete temp-on-rez stuff | 1476 | // Delete temp-on-rez stuff |
1449 | if (Frame % m_update_temp_cleaning == 0 && !m_cleaningTemps) | 1477 | if (Frame % m_update_temp_cleaning == 0 && !m_cleaningTemps) |
1450 | { | 1478 | { |
1451 | tmpTempOnRezMS = Util.EnvironmentTickCount(); | 1479 | tmpMS = Util.EnvironmentTickCount(); |
1452 | m_cleaningTemps = true; | 1480 | m_cleaningTemps = true; |
1453 | Util.FireAndForget(delegate { CleanTempObjects(); m_cleaningTemps = false; }); | 1481 | Util.FireAndForget(delegate { CleanTempObjects(); m_cleaningTemps = false; }); |
1454 | tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpTempOnRezMS); | 1482 | tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpMS); |
1455 | } | 1483 | } |
1456 | 1484 | ||
1457 | if (Frame % m_update_events == 0) | 1485 | if (Frame % m_update_events == 0) |
1458 | { | 1486 | { |
1459 | evMS = Util.EnvironmentTickCount(); | 1487 | tmpMS = Util.EnvironmentTickCount(); |
1460 | UpdateEvents(); | 1488 | UpdateEvents(); |
1461 | eventMS = Util.EnvironmentTickCountSubtract(evMS); | 1489 | eventMS = Util.EnvironmentTickCountSubtract(tmpMS); |
1462 | } | 1490 | } |
1463 | 1491 | ||
1464 | if (Frame % m_update_backup == 0) | 1492 | if (Frame % m_update_backup == 0) |
1465 | { | 1493 | { |
1466 | backMS = Util.EnvironmentTickCount(); | 1494 | tmpMS = Util.EnvironmentTickCount(); |
1467 | UpdateStorageBackup(); | 1495 | UpdateStorageBackup(); |
1468 | backupMS = Util.EnvironmentTickCountSubtract(backMS); | 1496 | backupMS = Util.EnvironmentTickCountSubtract(tmpMS); |
1469 | } | ||
1470 | |||
1471 | if (Frame % m_update_terrain == 0) | ||
1472 | { | ||
1473 | terMS = Util.EnvironmentTickCount(); | ||
1474 | UpdateTerrain(); | ||
1475 | terrainMS = Util.EnvironmentTickCountSubtract(terMS); | ||
1476 | } | 1497 | } |
1477 | 1498 | ||
1478 | //if (Frame % m_update_land == 0) | 1499 | //if (Frame % m_update_land == 0) |
@@ -1481,29 +1502,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1481 | // UpdateLand(); | 1502 | // UpdateLand(); |
1482 | // landMS = Util.EnvironmentTickCountSubtract(ldMS); | 1503 | // landMS = Util.EnvironmentTickCountSubtract(ldMS); |
1483 | //} | 1504 | //} |
1484 | |||
1485 | // frameMS = Util.EnvironmentTickCountSubtract(maintc); | ||
1486 | otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS; | ||
1487 | |||
1488 | // if (Frame%m_update_avatars == 0) | ||
1489 | // UpdateInWorldTime(); | ||
1490 | StatsReporter.AddPhysicsFPS(physicsFPS); | ||
1491 | StatsReporter.AddTimeDilation(TimeDilation); | ||
1492 | StatsReporter.AddFPS(1); | ||
1493 | StatsReporter.SetRootAgents(m_sceneGraph.GetRootAgentCount()); | ||
1494 | StatsReporter.SetChildAgents(m_sceneGraph.GetChildAgentCount()); | ||
1495 | StatsReporter.SetObjects(m_sceneGraph.GetTotalObjectsCount()); | ||
1496 | StatsReporter.SetActiveObjects(m_sceneGraph.GetActiveObjectsCount()); | ||
1497 | |||
1498 | // frameMS currently records work frame times, not total frame times (work + any required sleep to | ||
1499 | // reach min frame time. | ||
1500 | // StatsReporter.addFrameMS(frameMS); | ||
1501 | |||
1502 | StatsReporter.addAgentMS(agentMS); | ||
1503 | StatsReporter.addPhysicsMS(physicsMS + physicsMS2); | ||
1504 | StatsReporter.addOtherMS(otherMS); | ||
1505 | StatsReporter.SetActiveScripts(m_sceneGraph.GetActiveScriptsCount()); | ||
1506 | StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS()); | ||
1507 | 1505 | ||
1508 | if (LoginsDisabled && Frame == 20) | 1506 | if (LoginsDisabled && Frame == 20) |
1509 | { | 1507 | { |
@@ -1554,23 +1552,36 @@ namespace OpenSim.Region.Framework.Scenes | |||
1554 | 1552 | ||
1555 | previousFrameTick = m_lastFrameTick; | 1553 | previousFrameTick = m_lastFrameTick; |
1556 | m_lastFrameTick = Util.EnvironmentTickCount(); | 1554 | m_lastFrameTick = Util.EnvironmentTickCount(); |
1557 | maintc = Util.EnvironmentTickCountSubtract(m_lastFrameTick, framestart); | 1555 | tmpMS = Util.EnvironmentTickCountSubtract(m_lastFrameTick, maintc); |
1558 | maintc = (int)(MinFrameTime * 1000) - maintc; | 1556 | tmpMS = (int)(MinFrameTime * 1000) - tmpMS; |
1559 | 1557 | ||
1560 | m_firstHeartbeat = false; | 1558 | m_firstHeartbeat = false; |
1561 | 1559 | ||
1560 | if (tmpMS > 0) | ||
1561 | { | ||
1562 | Thread.Sleep(tmpMS); | ||
1563 | spareMS += tmpMS; | ||
1564 | } | ||
1565 | |||
1566 | frameMS = Util.EnvironmentTickCountSubtract(maintc); | ||
1567 | maintc = Util.EnvironmentTickCount(); | ||
1562 | 1568 | ||
1563 | sleepMS = Util.EnvironmentTickCount(); | 1569 | otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS; |
1564 | 1570 | ||
1565 | if (maintc > 0) | 1571 | // if (Frame%m_update_avatars == 0) |
1566 | Thread.Sleep(maintc); | 1572 | // UpdateInWorldTime(); |
1573 | StatsReporter.AddPhysicsFPS(physicsFPS); | ||
1574 | StatsReporter.AddTimeDilation(TimeDilation); | ||
1575 | StatsReporter.AddFPS(1); | ||
1567 | 1576 | ||
1568 | sleepMS = Util.EnvironmentTickCountSubtract(sleepMS); | ||
1569 | frameMS = Util.EnvironmentTickCountSubtract(framestart); | ||
1570 | StatsReporter.addSleepMS(sleepMS); | ||
1571 | StatsReporter.addFrameMS(frameMS); | 1577 | StatsReporter.addFrameMS(frameMS); |
1572 | 1578 | StatsReporter.addAgentMS(agentMS); | |
1573 | // Optionally warn if a frame takes double the amount of time that it should. | 1579 | StatsReporter.addPhysicsMS(physicsMS + physicsMS2); |
1580 | StatsReporter.addOtherMS(otherMS); | ||
1581 | StatsReporter.AddSpareMS(spareMS); | ||
1582 | StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS()); | ||
1583 | |||
1584 | // Optionally warn if a frame takes double the amount of time that it should. | ||
1574 | if (DebugUpdates | 1585 | if (DebugUpdates |
1575 | && Util.EnvironmentTickCountSubtract( | 1586 | && Util.EnvironmentTickCountSubtract( |
1576 | m_lastFrameTick, previousFrameTick) > (int)(MinFrameTime * 1000 * 2)) | 1587 | m_lastFrameTick, previousFrameTick) > (int)(MinFrameTime * 1000 * 2)) |
@@ -2363,8 +2374,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2363 | return; | 2374 | return; |
2364 | } | 2375 | } |
2365 | 2376 | ||
2366 | if (m_teleportModule != null) | 2377 | if (EntityTransferModule != null) |
2367 | m_teleportModule.Cross(grp, attemptedPosition, silent); | 2378 | EntityTransferModule.Cross(grp, attemptedPosition, silent); |
2368 | } | 2379 | } |
2369 | 2380 | ||
2370 | public Border GetCrossedBorder(Vector3 position, Cardinals gridline) | 2381 | public Border GetCrossedBorder(Vector3 position, Cardinals gridline) |
@@ -2684,10 +2695,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2684 | { | 2695 | { |
2685 | SceneObjectGroup grp = sceneObject; | 2696 | SceneObjectGroup grp = sceneObject; |
2686 | 2697 | ||
2687 | m_log.DebugFormat( | 2698 | // m_log.DebugFormat( |
2688 | "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.FromItemID, grp.UUID); | 2699 | // "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.FromItemID, grp.UUID); |
2689 | m_log.DebugFormat( | 2700 | // m_log.DebugFormat( |
2690 | "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); | 2701 | // "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); |
2691 | 2702 | ||
2692 | RootPrim.RemFlag(PrimFlags.TemporaryOnRez); | 2703 | RootPrim.RemFlag(PrimFlags.TemporaryOnRez); |
2693 | 2704 | ||
@@ -2783,7 +2794,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2783 | if (sp == null) | 2794 | if (sp == null) |
2784 | { | 2795 | { |
2785 | m_log.DebugFormat( | 2796 | m_log.DebugFormat( |
2786 | "[SCENE]: Adding new child scene presence {0} to scene {1} at pos {2}", client.Name, RegionInfo.RegionName, client.StartPos); | 2797 | "[SCENE]: Adding new child scene presence {0} {1} to scene {2} at pos {3}", |
2798 | client.Name, client.AgentId, RegionInfo.RegionName, client.StartPos); | ||
2787 | 2799 | ||
2788 | m_clientManager.Add(client); | 2800 | m_clientManager.Add(client); |
2789 | SubscribeToClientEvents(client); | 2801 | SubscribeToClientEvents(client); |
@@ -3207,8 +3219,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
3207 | /// <param name="client">The IClientAPI for the client</param> | 3219 | /// <param name="client">The IClientAPI for the client</param> |
3208 | public virtual bool TeleportClientHome(UUID agentId, IClientAPI client) | 3220 | public virtual bool TeleportClientHome(UUID agentId, IClientAPI client) |
3209 | { | 3221 | { |
3210 | if (m_teleportModule != null) | 3222 | if (EntityTransferModule != null) |
3211 | return m_teleportModule.TeleportHome(agentId, client); | 3223 | { |
3224 | EntityTransferModule.TeleportHome(agentId, client); | ||
3225 | } | ||
3212 | else | 3226 | else |
3213 | { | 3227 | { |
3214 | m_log.DebugFormat("[SCENE]: Unable to teleport user home: no AgentTransferModule is active"); | 3228 | m_log.DebugFormat("[SCENE]: Unable to teleport user home: no AgentTransferModule is active"); |
@@ -3370,55 +3384,70 @@ namespace OpenSim.Region.Framework.Scenes | |||
3370 | // CheckHeartbeat(); | 3384 | // CheckHeartbeat(); |
3371 | bool isChildAgent = false; | 3385 | bool isChildAgent = false; |
3372 | ScenePresence avatar = GetScenePresence(agentID); | 3386 | ScenePresence avatar = GetScenePresence(agentID); |
3373 | if (avatar != null) | 3387 | |
3388 | if (avatar == null) | ||
3389 | { | ||
3390 | m_log.WarnFormat( | ||
3391 | "[SCENE]: Called RemoveClient() with agent ID {0} but no such presence is in the scene.", agentID); | ||
3392 | |||
3393 | return; | ||
3394 | } | ||
3395 | |||
3396 | try | ||
3374 | { | 3397 | { |
3375 | isChildAgent = avatar.IsChildAgent; | 3398 | isChildAgent = avatar.IsChildAgent; |
3376 | 3399 | ||
3377 | if (avatar.ParentID != 0) | 3400 | m_log.DebugFormat( |
3401 | "[SCENE]: Removing {0} agent {1} {2} from {3}", | ||
3402 | (isChildAgent ? "child" : "root"), avatar.Name, agentID, RegionInfo.RegionName); | ||
3403 | |||
3404 | // Don't do this to root agents, it's not nice for the viewer | ||
3405 | if (closeChildAgents && isChildAgent) | ||
3378 | { | 3406 | { |
3379 | avatar.StandUp(); | 3407 | // Tell a single agent to disconnect from the region. |
3408 | IEventQueue eq = RequestModuleInterface<IEventQueue>(); | ||
3409 | if (eq != null) | ||
3410 | { | ||
3411 | eq.DisableSimulator(RegionInfo.RegionHandle, avatar.UUID); | ||
3412 | } | ||
3413 | else | ||
3414 | { | ||
3415 | avatar.ControllingClient.SendShutdownConnectionNotice(); | ||
3416 | } | ||
3380 | } | 3417 | } |
3381 | 3418 | ||
3382 | try | 3419 | // Only applies to root agents. |
3420 | if (avatar.ParentID != 0) | ||
3383 | { | 3421 | { |
3384 | m_log.DebugFormat( | 3422 | avatar.StandUp(); |
3385 | "[SCENE]: Removing {0} agent {1} from region {2}", | 3423 | } |
3386 | (isChildAgent ? "child" : "root"), agentID, RegionInfo.RegionName); | ||
3387 | 3424 | ||
3388 | m_sceneGraph.removeUserCount(!isChildAgent); | 3425 | m_sceneGraph.removeUserCount(!isChildAgent); |
3389 | 3426 | ||
3390 | // TODO: We shouldn't use closeChildAgents here - it's being used by the NPC module to stop | 3427 | // TODO: We shouldn't use closeChildAgents here - it's being used by the NPC module to stop |
3391 | // unnecessary operations. This should go away once NPCs have no accompanying IClientAPI | 3428 | // unnecessary operations. This should go away once NPCs have no accompanying IClientAPI |
3392 | if (closeChildAgents && CapsModule != null) | 3429 | if (closeChildAgents && CapsModule != null) |
3393 | CapsModule.RemoveCaps(agentID); | 3430 | CapsModule.RemoveCaps(agentID); |
3394 | 3431 | ||
3395 | // REFACTORING PROBLEM -- well not really a problem, but just to point out that whatever | 3432 | // REFACTORING PROBLEM -- well not really a problem, but just to point out that whatever |
3396 | // this method is doing is HORRIBLE!!! | 3433 | // this method is doing is HORRIBLE!!! |
3397 | avatar.Scene.NeedSceneCacheClear(avatar.UUID); | 3434 | avatar.Scene.NeedSceneCacheClear(avatar.UUID); |
3398 | 3435 | ||
3399 | if (closeChildAgents && !avatar.IsChildAgent) | 3436 | if (closeChildAgents && !isChildAgent) |
3400 | { | ||
3401 | List<ulong> regions = avatar.KnownRegionHandles; | ||
3402 | regions.Remove(RegionInfo.RegionHandle); | ||
3403 | m_sceneGridService.SendCloseChildAgentConnections(agentID, regions); | ||
3404 | } | ||
3405 | m_log.Debug("[Scene] Beginning ClientClosed"); | ||
3406 | m_eventManager.TriggerClientClosed(agentID, this); | ||
3407 | m_log.Debug("[Scene] Finished ClientClosed"); | ||
3408 | } | ||
3409 | catch (NullReferenceException) | ||
3410 | { | 3437 | { |
3411 | // We don't know which count to remove it from | 3438 | List<ulong> regions = avatar.KnownRegionHandles; |
3412 | // Avatar is already disposed :/ | 3439 | regions.Remove(RegionInfo.RegionHandle); |
3440 | m_sceneGridService.SendCloseChildAgentConnections(agentID, regions); | ||
3413 | } | 3441 | } |
3414 | 3442 | ||
3415 | try | 3443 | m_eventManager.TriggerClientClosed(agentID, this); |
3444 | m_eventManager.TriggerOnRemovePresence(agentID); | ||
3445 | |||
3446 | if (!isChildAgent) | ||
3416 | { | 3447 | { |
3417 | m_eventManager.TriggerOnRemovePresence(agentID); | 3448 | if (AttachmentsModule != null && avatar.PresenceType != PresenceType.Npc) |
3418 | |||
3419 | if (AttachmentsModule != null && !isChildAgent && avatar.PresenceType != PresenceType.Npc) | ||
3420 | { | 3449 | { |
3421 | IUserManagement uMan = RequestModuleInterface<IUserManagement>(); | 3450 | IUserManagement uMan = RequestModuleInterface<IUserManagement>(); |
3422 | // Don't save attachments for HG visitors, it | 3451 | // Don't save attachments for HG visitors, it |
3423 | // messes up their inventory. When a HG visitor logs | 3452 | // messes up their inventory. When a HG visitor logs |
3424 | // out on a foreign grid, their attachments will be | 3453 | // out on a foreign grid, their attachments will be |
@@ -3428,7 +3457,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3428 | if (uMan == null || uMan.IsLocalGridUser(avatar.UUID)) | 3457 | if (uMan == null || uMan.IsLocalGridUser(avatar.UUID)) |
3429 | AttachmentsModule.SaveChangedAttachments(avatar, false); | 3458 | AttachmentsModule.SaveChangedAttachments(avatar, false); |
3430 | } | 3459 | } |
3431 | 3460 | ||
3432 | ForEachClient( | 3461 | ForEachClient( |
3433 | delegate(IClientAPI client) | 3462 | delegate(IClientAPI client) |
3434 | { | 3463 | { |
@@ -3436,43 +3465,35 @@ namespace OpenSim.Region.Framework.Scenes | |||
3436 | try { client.SendKillObject(avatar.RegionHandle, new List<uint> { avatar.LocalId }); } | 3465 | try { client.SendKillObject(avatar.RegionHandle, new List<uint> { avatar.LocalId }); } |
3437 | catch (NullReferenceException) { } | 3466 | catch (NullReferenceException) { } |
3438 | }); | 3467 | }); |
3439 | |||
3440 | IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>(); | ||
3441 | if (agentTransactions != null) | ||
3442 | { | ||
3443 | agentTransactions.RemoveAgentAssetTransactions(agentID); | ||
3444 | } | ||
3445 | } | ||
3446 | finally | ||
3447 | { | ||
3448 | // Always clean these structures up so that any failure above doesn't cause them to remain in the | ||
3449 | // scene with possibly bad effects (e.g. continually timing out on unacked packets and triggering | ||
3450 | // the same cleanup exception continually. | ||
3451 | // TODO: This should probably extend to the whole method, but we don't want to also catch the NRE | ||
3452 | // since this would hide the underlying failure and other associated problems. | ||
3453 | m_sceneGraph.RemoveScenePresence(agentID); | ||
3454 | m_clientManager.Remove(agentID); | ||
3455 | } | 3468 | } |
3456 | 3469 | ||
3457 | try | 3470 | // It's possible for child agents to have transactions if changes are being made cross-border. |
3458 | { | 3471 | if (AgentTransactionsModule != null) |
3459 | avatar.Close(); | 3472 | AgentTransactionsModule.RemoveAgentAssetTransactions(agentID); |
3460 | } | 3473 | |
3461 | catch (NullReferenceException) | 3474 | avatar.Close(); |
3462 | { | 3475 | |
3463 | //We can safely ignore null reference exceptions. It means the avatar are dead and cleaned up anyway. | ||
3464 | } | ||
3465 | catch (Exception e) | ||
3466 | { | ||
3467 | m_log.ErrorFormat("[SCENE] Scene.cs:RemoveClient exception {0}{1}", e.Message, e.StackTrace); | ||
3468 | } | ||
3469 | m_log.Debug("[Scene] Done. Firing RemoveCircuit"); | ||
3470 | m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); | 3476 | m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); |
3471 | // CleanDroppedAttachments(); | ||
3472 | m_log.Debug("[Scene] The avatar has left the building"); | 3477 | m_log.Debug("[Scene] The avatar has left the building"); |
3473 | //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); | ||
3474 | //m_log.InfoFormat("[SCENE] Memory post GC {0}", System.GC.GetTotalMemory(true)); | ||
3475 | } | 3478 | } |
3479 | catch (Exception e) | ||
3480 | { | ||
3481 | m_log.Error( | ||
3482 | string.Format("[SCENE]: Exception removing {0} from {1}, ", avatar.Name, RegionInfo.RegionName), e); | ||
3483 | } | ||
3484 | finally | ||
3485 | { | ||
3486 | // Always clean these structures up so that any failure above doesn't cause them to remain in the | ||
3487 | // scene with possibly bad effects (e.g. continually timing out on unacked packets and triggering | ||
3488 | // the same cleanup exception continually. | ||
3489 | // TODO: This should probably extend to the whole method, but we don't want to also catch the NRE | ||
3490 | // since this would hide the underlying failure and other associated problems. | ||
3491 | m_sceneGraph.RemoveScenePresence(agentID); | ||
3492 | m_clientManager.Remove(agentID); | ||
3493 | } | ||
3494 | |||
3495 | //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); | ||
3496 | //m_log.InfoFormat("[SCENE] Memory post GC {0}", System.GC.GetTotalMemory(true)); | ||
3476 | } | 3497 | } |
3477 | 3498 | ||
3478 | /// <summary> | 3499 | /// <summary> |
@@ -3554,7 +3575,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3554 | public bool NewUserConnection(AgentCircuitData agent, uint teleportFlags, out string reason, bool requirePresenceLookup) | 3575 | public bool NewUserConnection(AgentCircuitData agent, uint teleportFlags, out string reason, bool requirePresenceLookup) |
3555 | { | 3576 | { |
3556 | bool vialogin = ((teleportFlags & (uint)TPFlags.ViaLogin) != 0 || | 3577 | bool vialogin = ((teleportFlags & (uint)TPFlags.ViaLogin) != 0 || |
3557 | (teleportFlags & (uint)TPFlags.ViaHGLogin) != 0); | 3578 | (teleportFlags & (uint)TPFlags.ViaHGLogin) != 0); |
3558 | bool viahome = ((teleportFlags & (uint)TPFlags.ViaHome) != 0); | 3579 | bool viahome = ((teleportFlags & (uint)TPFlags.ViaHome) != 0); |
3559 | bool godlike = ((teleportFlags & (uint)TPFlags.Godlike) != 0); | 3580 | bool godlike = ((teleportFlags & (uint)TPFlags.Godlike) != 0); |
3560 | 3581 | ||
@@ -3570,8 +3591,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
3570 | // Don't disable this log message - it's too helpful | 3591 | // Don't disable this log message - it's too helpful |
3571 | m_log.DebugFormat( | 3592 | m_log.DebugFormat( |
3572 | "[SCENE]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, IP {6}, viewer {7}, teleportflags ({8}), position {9})", | 3593 | "[SCENE]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, IP {6}, viewer {7}, teleportflags ({8}), position {9})", |
3573 | RegionInfo.RegionName, (agent.child ? "child" : "root"),agent.firstname, agent.lastname, | 3594 | RegionInfo.RegionName, |
3574 | agent.AgentID, agent.circuitcode, agent.IPAddress, agent.Viewer, ((TPFlags)teleportFlags).ToString(), agent.startpos); | 3595 | (agent.child ? "child" : "root"), |
3596 | agent.firstname, | ||
3597 | agent.lastname, | ||
3598 | agent.AgentID, | ||
3599 | agent.circuitcode, | ||
3600 | agent.IPAddress, | ||
3601 | agent.Viewer, | ||
3602 | ((TPFlags)teleportFlags).ToString(), | ||
3603 | agent.startpos | ||
3604 | ); | ||
3575 | 3605 | ||
3576 | if (LoginsDisabled) | 3606 | if (LoginsDisabled) |
3577 | { | 3607 | { |
@@ -3586,7 +3616,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
3586 | // We have a zombie from a crashed session. | 3616 | // We have a zombie from a crashed session. |
3587 | // Or the same user is trying to be root twice here, won't work. | 3617 | // Or the same user is trying to be root twice here, won't work. |
3588 | // Kill it. | 3618 | // Kill it. |
3589 | m_log.DebugFormat("[SCENE]: Zombie scene presence detected for {0} in {1}", agent.AgentID, RegionInfo.RegionName); | 3619 | m_log.DebugFormat( |
3620 | "[SCENE]: Zombie scene presence detected for {0} in {1}", | ||
3621 | agent.AgentID, | ||
3622 | RegionInfo.RegionName | ||
3623 | ); | ||
3590 | sp.ControllingClient.Close(); | 3624 | sp.ControllingClient.Close(); |
3591 | sp = null; | 3625 | sp = null; |
3592 | } | 3626 | } |
@@ -3613,8 +3647,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3613 | { | 3647 | { |
3614 | if (!VerifyUserPresence(agent, out reason)) | 3648 | if (!VerifyUserPresence(agent, out reason)) |
3615 | return false; | 3649 | return false; |
3616 | } | 3650 | } catch (Exception e) |
3617 | catch (Exception e) | ||
3618 | { | 3651 | { |
3619 | m_log.ErrorFormat( | 3652 | m_log.ErrorFormat( |
3620 | "[SCENE]: Exception verifying presence {0}{1}", e.Message, e.StackTrace); | 3653 | "[SCENE]: Exception verifying presence {0}{1}", e.Message, e.StackTrace); |
@@ -3649,8 +3682,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3649 | CapsModule.SetAgentCapsSeeds(agent); | 3682 | CapsModule.SetAgentCapsSeeds(agent); |
3650 | CapsModule.CreateCaps(agent.AgentID); | 3683 | CapsModule.CreateCaps(agent.AgentID); |
3651 | } | 3684 | } |
3652 | } | 3685 | } else |
3653 | else | ||
3654 | { | 3686 | { |
3655 | // Let the SP know how we got here. This has a lot of interesting | 3687 | // Let the SP know how we got here. This has a lot of interesting |
3656 | // uses down the line. | 3688 | // uses down the line. |
@@ -3673,7 +3705,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3673 | agent.teleportFlags = teleportFlags; | 3705 | agent.teleportFlags = teleportFlags; |
3674 | m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent); | 3706 | m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent); |
3675 | 3707 | ||
3676 | if (vialogin) | 3708 | if (vialogin) |
3677 | { | 3709 | { |
3678 | // CleanDroppedAttachments(); | 3710 | // CleanDroppedAttachments(); |
3679 | 3711 | ||
@@ -3714,8 +3746,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3714 | agent.startpos.Z = 720; | 3746 | agent.startpos.Z = 720; |
3715 | } | 3747 | } |
3716 | } | 3748 | } |
3717 | } | 3749 | } else |
3718 | else | ||
3719 | { | 3750 | { |
3720 | if (agent.startpos.X > EastBorders[0].BorderLine.Z) | 3751 | if (agent.startpos.X > EastBorders[0].BorderLine.Z) |
3721 | { | 3752 | { |
@@ -3741,10 +3772,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
3741 | SceneObjectGroup telehub = GetSceneObjectGroup(RegionInfo.RegionSettings.TelehubObject); | 3772 | SceneObjectGroup telehub = GetSceneObjectGroup(RegionInfo.RegionSettings.TelehubObject); |
3742 | // Can have multiple SpawnPoints | 3773 | // Can have multiple SpawnPoints |
3743 | List<SpawnPoint> spawnpoints = RegionInfo.RegionSettings.SpawnPoints(); | 3774 | List<SpawnPoint> spawnpoints = RegionInfo.RegionSettings.SpawnPoints(); |
3744 | if ( spawnpoints.Count > 1) | 3775 | if (spawnpoints.Count > 1) |
3745 | { | 3776 | { |
3746 | // We have multiple SpawnPoints, Route the agent to a random one | 3777 | // We have multiple SpawnPoints, Route the agent to a random or sequential one |
3747 | agent.startpos = spawnpoints[Util.RandomClass.Next(spawnpoints.Count)].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); | 3778 | if (SpawnPointRouting == "random") |
3779 | agent.startpos = spawnpoints[Util.RandomClass.Next(spawnpoints.Count) - 1].GetLocation( | ||
3780 | telehub.AbsolutePosition, | ||
3781 | telehub.GroupRotation | ||
3782 | ); | ||
3783 | else | ||
3784 | agent.startpos = spawnpoints[SpawnPoint()].GetLocation( | ||
3785 | telehub.AbsolutePosition, | ||
3786 | telehub.GroupRotation | ||
3787 | ); | ||
3748 | } | 3788 | } |
3749 | else | 3789 | else |
3750 | { | 3790 | { |
@@ -3981,41 +4021,41 @@ namespace OpenSim.Region.Framework.Scenes | |||
3981 | return m_authenticateHandler.TryChangeCiruitCode(oldcc, newcc); | 4021 | return m_authenticateHandler.TryChangeCiruitCode(oldcc, newcc); |
3982 | } | 4022 | } |
3983 | 4023 | ||
3984 | /// <summary> | 4024 | // /// <summary> |
3985 | /// The Grid has requested that we log-off a user. Log them off. | 4025 | // /// The Grid has requested that we log-off a user. Log them off. |
3986 | /// </summary> | 4026 | // /// </summary> |
3987 | /// <param name="AvatarID">Unique ID of the avatar to log-off</param> | 4027 | // /// <param name="AvatarID">Unique ID of the avatar to log-off</param> |
3988 | /// <param name="RegionSecret">SecureSessionID of the user, or the RegionSecret text when logging on to the grid</param> | 4028 | // /// <param name="RegionSecret">SecureSessionID of the user, or the RegionSecret text when logging on to the grid</param> |
3989 | /// <param name="message">message to display to the user. Reason for being logged off</param> | 4029 | // /// <param name="message">message to display to the user. Reason for being logged off</param> |
3990 | public void HandleLogOffUserFromGrid(UUID AvatarID, UUID RegionSecret, string message) | 4030 | // public void HandleLogOffUserFromGrid(UUID AvatarID, UUID RegionSecret, string message) |
3991 | { | 4031 | // { |
3992 | ScenePresence loggingOffUser = GetScenePresence(AvatarID); | 4032 | // ScenePresence loggingOffUser = GetScenePresence(AvatarID); |
3993 | if (loggingOffUser != null) | 4033 | // if (loggingOffUser != null) |
3994 | { | 4034 | // { |
3995 | UUID localRegionSecret = UUID.Zero; | 4035 | // UUID localRegionSecret = UUID.Zero; |
3996 | bool parsedsecret = UUID.TryParse(m_regInfo.regionSecret, out localRegionSecret); | 4036 | // bool parsedsecret = UUID.TryParse(m_regInfo.regionSecret, out localRegionSecret); |
3997 | 4037 | // | |
3998 | // Region Secret is used here in case a new sessionid overwrites an old one on the user server. | 4038 | // // Region Secret is used here in case a new sessionid overwrites an old one on the user server. |
3999 | // Will update the user server in a few revisions to use it. | 4039 | // // Will update the user server in a few revisions to use it. |
4000 | 4040 | // | |
4001 | if (RegionSecret == loggingOffUser.ControllingClient.SecureSessionId || (parsedsecret && RegionSecret == localRegionSecret)) | 4041 | // if (RegionSecret == loggingOffUser.ControllingClient.SecureSessionId || (parsedsecret && RegionSecret == localRegionSecret)) |
4002 | { | 4042 | // { |
4003 | m_sceneGridService.SendCloseChildAgentConnections(loggingOffUser.UUID, loggingOffUser.KnownRegionHandles); | 4043 | // m_sceneGridService.SendCloseChildAgentConnections(loggingOffUser.UUID, loggingOffUser.KnownRegionHandles); |
4004 | loggingOffUser.ControllingClient.Kick(message); | 4044 | // loggingOffUser.ControllingClient.Kick(message); |
4005 | // Give them a second to receive the message! | 4045 | // // Give them a second to receive the message! |
4006 | Thread.Sleep(1000); | 4046 | // Thread.Sleep(1000); |
4007 | loggingOffUser.ControllingClient.Close(); | 4047 | // loggingOffUser.ControllingClient.Close(); |
4008 | } | 4048 | // } |
4009 | else | 4049 | // else |
4010 | { | 4050 | // { |
4011 | m_log.Info("[USERLOGOFF]: System sending the LogOff user message failed to sucessfully authenticate"); | 4051 | // m_log.Info("[USERLOGOFF]: System sending the LogOff user message failed to sucessfully authenticate"); |
4012 | } | 4052 | // } |
4013 | } | 4053 | // } |
4014 | else | 4054 | // else |
4015 | { | 4055 | // { |
4016 | m_log.InfoFormat("[USERLOGOFF]: Got a logoff request for {0} but the user isn't here. The user might already have been logged out", AvatarID.ToString()); | 4056 | // m_log.InfoFormat("[USERLOGOFF]: Got a logoff request for {0} but the user isn't here. The user might already have been logged out", AvatarID.ToString()); |
4017 | } | 4057 | // } |
4018 | } | 4058 | // } |
4019 | 4059 | ||
4020 | /// <summary> | 4060 | /// <summary> |
4021 | /// Triggered when an agent crosses into this sim. Also happens on initial login. | 4061 | /// Triggered when an agent crosses into this sim. Also happens on initial login. |
@@ -4068,21 +4108,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
4068 | return false; | 4108 | return false; |
4069 | } | 4109 | } |
4070 | 4110 | ||
4111 | // TODO: This check should probably be in QueryAccess(). | ||
4071 | ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, Constants.RegionSize / 2, Constants.RegionSize / 2); | 4112 | ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, Constants.RegionSize / 2, Constants.RegionSize / 2); |
4072 | if (nearestParcel == null) | 4113 | if (nearestParcel == null) |
4073 | { | 4114 | { |
4074 | m_log.DebugFormat("[SCENE]: Denying root agent entry to {0}: no allowed parcel", cAgentData.AgentID); | 4115 | m_log.DebugFormat( |
4075 | return false; | 4116 | "[SCENE]: Denying root agent entry to {0} in {1}: no allowed parcel", |
4076 | } | 4117 | cAgentData.AgentID, RegionInfo.RegionName); |
4077 | |||
4078 | int num = m_sceneGraph.GetNumberOfScenePresences(); | ||
4079 | 4118 | ||
4080 | if (num >= RegionInfo.RegionSettings.AgentLimit) | 4119 | return false; |
4081 | { | ||
4082 | if (!Permissions.IsAdministrator(cAgentData.AgentID)) | ||
4083 | return false; | ||
4084 | } | 4120 | } |
4085 | 4121 | ||
4122 | // We have to wait until the viewer contacts this region after receiving EAC. | ||
4123 | // That calls AddNewClient, which finally creates the ScenePresence | ||
4086 | ScenePresence childAgentUpdate = WaitGetScenePresence(cAgentData.AgentID); | 4124 | ScenePresence childAgentUpdate = WaitGetScenePresence(cAgentData.AgentID); |
4087 | 4125 | ||
4088 | if (childAgentUpdate != null) | 4126 | if (childAgentUpdate != null) |
@@ -4126,14 +4164,28 @@ namespace OpenSim.Region.Framework.Scenes | |||
4126 | return false; | 4164 | return false; |
4127 | } | 4165 | } |
4128 | 4166 | ||
4167 | /// <summary> | ||
4168 | /// Poll until the requested ScenePresence appears or we timeout. | ||
4169 | /// </summary> | ||
4170 | /// <returns>The scene presence is found, else null.</returns> | ||
4171 | /// <param name='agentID'></param> | ||
4129 | protected virtual ScenePresence WaitGetScenePresence(UUID agentID) | 4172 | protected virtual ScenePresence WaitGetScenePresence(UUID agentID) |
4130 | { | 4173 | { |
4131 | int ntimes = 10; | 4174 | int ntimes = 10; |
4132 | ScenePresence childAgentUpdate = null; | 4175 | ScenePresence sp = null; |
4133 | while ((childAgentUpdate = GetScenePresence(agentID)) == null && (ntimes-- > 0)) | 4176 | while ((sp = GetScenePresence(agentID)) == null && (ntimes-- > 0)) |
4134 | Thread.Sleep(1000); | 4177 | Thread.Sleep(1000); |
4135 | return childAgentUpdate; | ||
4136 | 4178 | ||
4179 | if (sp == null) | ||
4180 | m_log.WarnFormat( | ||
4181 | "[SCENE PRESENCE]: Did not find presence with id {0} in {1} before timeout", | ||
4182 | agentID, RegionInfo.RegionName); | ||
4183 | // else | ||
4184 | // m_log.DebugFormat( | ||
4185 | // "[SCENE PRESENCE]: Found presence {0} {1} {2} in {3} after {4} waits", | ||
4186 | // sp.Name, sp.UUID, sp.IsChildAgent ? "child" : "root", RegionInfo.RegionName, 10 - ntimes); | ||
4187 | |||
4188 | return sp; | ||
4137 | } | 4189 | } |
4138 | 4190 | ||
4139 | public virtual bool IncomingRetrieveRootAgent(UUID id, out IAgentData agent) | 4191 | public virtual bool IncomingRetrieveRootAgent(UUID id, out IAgentData agent) |
@@ -4171,33 +4223,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4171 | ScenePresence presence = m_sceneGraph.GetScenePresence(agentID); | 4223 | ScenePresence presence = m_sceneGraph.GetScenePresence(agentID); |
4172 | if (presence != null) | 4224 | if (presence != null) |
4173 | { | 4225 | { |
4174 | // Nothing is removed here, so down count it as such | 4226 | presence.ControllingClient.Close(); |
4175 | if (presence.IsChildAgent) | ||
4176 | { | ||
4177 | m_sceneGraph.removeUserCount(false); | ||
4178 | } | ||
4179 | else if (!childOnly) | ||
4180 | { | ||
4181 | m_sceneGraph.removeUserCount(true); | ||
4182 | } | ||
4183 | |||
4184 | // Don't do this to root agents on logout, it's not nice for the viewer | ||
4185 | if (presence.IsChildAgent) | ||
4186 | { | ||
4187 | // Tell a single agent to disconnect from the region. | ||
4188 | IEventQueue eq = RequestModuleInterface<IEventQueue>(); | ||
4189 | if (eq != null) | ||
4190 | { | ||
4191 | eq.DisableSimulator(RegionInfo.RegionHandle, agentID); | ||
4192 | } | ||
4193 | else | ||
4194 | presence.ControllingClient.SendShutdownConnectionNotice(); | ||
4195 | presence.ControllingClient.Close(false); | ||
4196 | } | ||
4197 | else if (!childOnly) | ||
4198 | { | ||
4199 | presence.ControllingClient.Close(true); | ||
4200 | } | ||
4201 | return true; | 4227 | return true; |
4202 | } | 4228 | } |
4203 | 4229 | ||
@@ -4283,8 +4309,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
4283 | position.Y -= shifty; | 4309 | position.Y -= shifty; |
4284 | } | 4310 | } |
4285 | 4311 | ||
4286 | if (m_teleportModule != null) | 4312 | if (EntityTransferModule != null) |
4287 | m_teleportModule.Teleport(sp, regionHandle, position, lookAt, teleportFlags); | 4313 | { |
4314 | EntityTransferModule.Teleport(sp, regionHandle, position, lookAt, teleportFlags); | ||
4315 | } | ||
4288 | else | 4316 | else |
4289 | { | 4317 | { |
4290 | m_log.DebugFormat("[SCENE]: Unable to perform teleports: no AgentTransferModule is active"); | 4318 | m_log.DebugFormat("[SCENE]: Unable to perform teleports: no AgentTransferModule is active"); |
@@ -4295,8 +4323,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
4295 | 4323 | ||
4296 | public bool CrossAgentToNewRegion(ScenePresence agent, bool isFlying) | 4324 | public bool CrossAgentToNewRegion(ScenePresence agent, bool isFlying) |
4297 | { | 4325 | { |
4298 | if (m_teleportModule != null) | 4326 | if (EntityTransferModule != null) |
4299 | return m_teleportModule.Cross(agent, isFlying); | 4327 | { |
4328 | return EntityTransferModule.Cross(agent, isFlying); | ||
4329 | } | ||
4300 | else | 4330 | else |
4301 | { | 4331 | { |
4302 | m_log.DebugFormat("[SCENE]: Unable to cross agent to neighbouring region, because there is no AgentTransferModule"); | 4332 | m_log.DebugFormat("[SCENE]: Unable to cross agent to neighbouring region, because there is no AgentTransferModule"); |
@@ -5444,29 +5474,58 @@ Environment.Exit(1); | |||
5444 | throw new Exception(error); | 5474 | throw new Exception(error); |
5445 | } | 5475 | } |
5446 | 5476 | ||
5447 | // This method is called across the simulation connector to | 5477 | /// <summary> |
5448 | // determine if a given agent is allowed in this region | 5478 | /// This method is called across the simulation connector to |
5449 | // AS A ROOT AGENT. Returning false here will prevent them | 5479 | /// determine if a given agent is allowed in this region |
5450 | // from logging into the region, teleporting into the region | 5480 | /// AS A ROOT AGENT |
5451 | // or corssing the broder walking, but will NOT prevent | 5481 | /// </summary> |
5452 | // child agent creation, thereby emulating the SL behavior. | 5482 | /// <remarks> |
5483 | /// Returning false here will prevent them | ||
5484 | /// from logging into the region, teleporting into the region | ||
5485 | /// or corssing the broder walking, but will NOT prevent | ||
5486 | /// child agent creation, thereby emulating the SL behavior. | ||
5487 | /// </remarks> | ||
5488 | /// <param name='agentID'></param> | ||
5489 | /// <param name='position'></param> | ||
5490 | /// <param name='reason'></param> | ||
5491 | /// <returns></returns> | ||
5453 | public bool QueryAccess(UUID agentID, Vector3 position, out string reason) | 5492 | public bool QueryAccess(UUID agentID, Vector3 position, out string reason) |
5454 | { | 5493 | { |
5455 | reason = "You are banned from the region"; | 5494 | reason = "You are banned from the region"; |
5456 | 5495 | ||
5496 | if (EntityTransferModule.IsInTransit(agentID)) | ||
5497 | { | ||
5498 | reason = "Agent is still in transit from this region"; | ||
5499 | |||
5500 | m_log.WarnFormat( | ||
5501 | "[SCENE]: Denying agent {0} entry into {1} since region still has them registered as in transit", | ||
5502 | agentID, RegionInfo.RegionName); | ||
5503 | |||
5504 | return false; | ||
5505 | } | ||
5506 | |||
5457 | if (Permissions.IsGod(agentID)) | 5507 | if (Permissions.IsGod(agentID)) |
5458 | { | 5508 | { |
5459 | reason = String.Empty; | 5509 | reason = String.Empty; |
5460 | return true; | 5510 | return true; |
5461 | } | 5511 | } |
5462 | 5512 | ||
5463 | int num = m_sceneGraph.GetNumberOfScenePresences(); | 5513 | // FIXME: Root agent count is currently known to be inaccurate. This forces a recount before we check. |
5514 | // However, the long term fix is to make sure root agent count is always accurate. | ||
5515 | m_sceneGraph.RecalculateStats(); | ||
5516 | |||
5517 | int num = m_sceneGraph.GetRootAgentCount(); | ||
5464 | 5518 | ||
5465 | if (num >= RegionInfo.RegionSettings.AgentLimit) | 5519 | if (num >= RegionInfo.RegionSettings.AgentLimit) |
5466 | { | 5520 | { |
5467 | if (!Permissions.IsAdministrator(agentID)) | 5521 | if (!Permissions.IsAdministrator(agentID)) |
5468 | { | 5522 | { |
5469 | reason = "The region is full"; | 5523 | reason = "The region is full"; |
5524 | |||
5525 | m_log.DebugFormat( | ||
5526 | "[SCENE]: Denying presence with id {0} entry into {1} since region is at agent limit of {2}", | ||
5527 | agentID, RegionInfo.RegionName, RegionInfo.RegionSettings.AgentLimit); | ||
5528 | |||
5470 | return false; | 5529 | return false; |
5471 | } | 5530 | } |
5472 | } | 5531 | } |
@@ -5637,5 +5696,19 @@ Environment.Exit(1); | |||
5637 | } | 5696 | } |
5638 | } | 5697 | } |
5639 | } | 5698 | } |
5699 | |||
5700 | // manage and select spawn points in sequence | ||
5701 | public int SpawnPoint() | ||
5702 | { | ||
5703 | int spawnpoints = RegionInfo.RegionSettings.SpawnPoints().Count; | ||
5704 | |||
5705 | if (spawnpoints == 0) | ||
5706 | return 0; | ||
5707 | |||
5708 | m_SpawnPoint++; | ||
5709 | if (m_SpawnPoint > spawnpoints) | ||
5710 | m_SpawnPoint = 1; | ||
5711 | return m_SpawnPoint - 1; | ||
5712 | } | ||
5640 | } | 5713 | } |
5641 | } | 5714 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index b806d91..c1414ee 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | |||
@@ -84,16 +84,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
84 | if (neighbourService != null) | 84 | if (neighbourService != null) |
85 | neighbour = neighbourService.HelloNeighbour(regionhandle, region); | 85 | neighbour = neighbourService.HelloNeighbour(regionhandle, region); |
86 | else | 86 | else |
87 | m_log.DebugFormat("[SCS]: No neighbour service provided for informing neigbhours of this region"); | 87 | m_log.DebugFormat("[SCENE COMMUNICATION SERVICE]: No neighbour service provided for informing neigbhours of this region"); |
88 | 88 | ||
89 | if (neighbour != null) | 89 | if (neighbour != null) |
90 | { | 90 | { |
91 | // m_log.DebugFormat("[INTERGRID]: Successfully informed neighbour {0}-{1} that I'm here", x / Constants.RegionSize, y / Constants.RegionSize); | 91 | m_log.DebugFormat("[SCENE COMMUNICATION SERVICE]: Successfully informed neighbour {0}-{1} that I'm here", x / Constants.RegionSize, y / Constants.RegionSize); |
92 | m_scene.EventManager.TriggerOnRegionUp(neighbour); | 92 | m_scene.EventManager.TriggerOnRegionUp(neighbour); |
93 | } | 93 | } |
94 | else | 94 | else |
95 | { | 95 | { |
96 | m_log.InfoFormat("[INTERGRID]: Failed to inform neighbour {0}-{1} that I'm here.", x / Constants.RegionSize, y / Constants.RegionSize); | 96 | m_log.InfoFormat("[SCENE COMMUNICATION SERVICE]: Failed to inform neighbour {0}-{1} that I'm here.", x / Constants.RegionSize, y / Constants.RegionSize); |
97 | } | 97 | } |
98 | } | 98 | } |
99 | 99 | ||
@@ -102,7 +102,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
102 | //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName); | 102 | //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName); |
103 | 103 | ||
104 | List<GridRegion> neighbours = m_scene.GridService.GetNeighbours(m_scene.RegionInfo.ScopeID, m_scene.RegionInfo.RegionID); | 104 | List<GridRegion> neighbours = m_scene.GridService.GetNeighbours(m_scene.RegionInfo.ScopeID, m_scene.RegionInfo.RegionID); |
105 | //m_log.DebugFormat("[INTERGRID]: Informing {0} neighbours that this region is up", neighbours.Count); | 105 | m_log.DebugFormat("[SCENE COMMUNICATION SERVICE]: Informing {0} neighbours that this region is up", neighbours.Count); |
106 | foreach (GridRegion n in neighbours) | 106 | foreach (GridRegion n in neighbours) |
107 | { | 107 | { |
108 | InformNeighbourThatRegionUpDelegate d = InformNeighboursThatRegionIsUpAsync; | 108 | InformNeighbourThatRegionUpDelegate d = InformNeighboursThatRegionIsUpAsync; |
@@ -156,7 +156,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
156 | // that the region position is cached or performance will degrade | 156 | // that the region position is cached or performance will degrade |
157 | Utils.LongToUInts(regionHandle, out x, out y); | 157 | Utils.LongToUInts(regionHandle, out x, out y); |
158 | GridRegion dest = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); | 158 | GridRegion dest = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); |
159 | // bool v = true; | 159 | if (dest == null) |
160 | continue; | ||
161 | |||
160 | if (!simulatorList.Contains(dest.ServerURI)) | 162 | if (!simulatorList.Contains(dest.ServerURI)) |
161 | { | 163 | { |
162 | // we havent seen this simulator before, add it to the list | 164 | // we havent seen this simulator before, add it to the list |
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index b7466be..4c12496 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -101,6 +101,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
101 | /// </summary> | 101 | /// </summary> |
102 | protected internal Dictionary<uint, SceneObjectGroup> SceneObjectGroupsByLocalPartID = new Dictionary<uint, SceneObjectGroup>(); | 102 | protected internal Dictionary<uint, SceneObjectGroup> SceneObjectGroupsByLocalPartID = new Dictionary<uint, SceneObjectGroup>(); |
103 | 103 | ||
104 | /// <summary> | ||
105 | /// Lock to prevent object group update, linking, delinking and duplication operations from running concurrently. | ||
106 | /// </summary> | ||
107 | /// <remarks> | ||
108 | /// These operations rely on the parts composition of the object. If allowed to run concurrently then race | ||
109 | /// conditions can occur. | ||
110 | /// </remarks> | ||
104 | private Object m_updateLock = new Object(); | 111 | private Object m_updateLock = new Object(); |
105 | 112 | ||
106 | #endregion | 113 | #endregion |
@@ -775,12 +782,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
775 | 782 | ||
776 | public int GetChildAgentCount() | 783 | public int GetChildAgentCount() |
777 | { | 784 | { |
778 | // some network situations come in where child agents get closed twice. | ||
779 | if (m_numChildAgents < 0) | ||
780 | { | ||
781 | m_numChildAgents = 0; | ||
782 | } | ||
783 | |||
784 | return m_numChildAgents; | 785 | return m_numChildAgents; |
785 | } | 786 | } |
786 | 787 | ||
@@ -852,11 +853,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
852 | return m_scenePresenceArray; | 853 | return m_scenePresenceArray; |
853 | } | 854 | } |
854 | 855 | ||
855 | public int GetNumberOfScenePresences() | ||
856 | { | ||
857 | return m_scenePresenceArray.Count; | ||
858 | } | ||
859 | |||
860 | /// <summary> | 856 | /// <summary> |
861 | /// Request a scene presence by UUID. Fast, indexed lookup. | 857 | /// Request a scene presence by UUID. Fast, indexed lookup. |
862 | /// </summary> | 858 | /// </summary> |
@@ -2063,12 +2059,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
2063 | /// <param name="AgentID"></param> | 2059 | /// <param name="AgentID"></param> |
2064 | /// <param name="GroupID"></param> | 2060 | /// <param name="GroupID"></param> |
2065 | /// <param name="rot"></param> | 2061 | /// <param name="rot"></param> |
2062 | /// <returns>null if duplication fails, otherwise the duplicated object</returns> | ||
2063 | /// <summary> | ||
2066 | public SceneObjectGroup DuplicateObject(uint originalPrimID, Vector3 offset, uint flags, UUID AgentID, UUID GroupID, Quaternion rot) | 2064 | public SceneObjectGroup DuplicateObject(uint originalPrimID, Vector3 offset, uint flags, UUID AgentID, UUID GroupID, Quaternion rot) |
2067 | { | 2065 | { |
2068 | // m_log.DebugFormat( | 2066 | // m_log.DebugFormat( |
2069 | // "[SCENE]: Duplication of object {0} at offset {1} requested by agent {2}", | 2067 | // "[SCENE]: Duplication of object {0} at offset {1} requested by agent {2}", |
2070 | // originalPrimID, offset, AgentID); | 2068 | // originalPrimID, offset, AgentID); |
2071 | 2069 | ||
2072 | SceneObjectGroup original = GetGroupByPrim(originalPrimID); | 2070 | SceneObjectGroup original = GetGroupByPrim(originalPrimID); |
2073 | if (original != null) | 2071 | if (original != null) |
2074 | { | 2072 | { |
@@ -2098,25 +2096,25 @@ namespace OpenSim.Region.Framework.Scenes | |||
2098 | 2096 | ||
2099 | // FIXME: This section needs to be refactored so that it just calls AddSceneObject() | 2097 | // FIXME: This section needs to be refactored so that it just calls AddSceneObject() |
2100 | Entities.Add(copy); | 2098 | Entities.Add(copy); |
2101 | 2099 | ||
2102 | lock (SceneObjectGroupsByFullID) | 2100 | lock (SceneObjectGroupsByFullID) |
2103 | SceneObjectGroupsByFullID[copy.UUID] = copy; | 2101 | SceneObjectGroupsByFullID[copy.UUID] = copy; |
2104 | 2102 | ||
2105 | SceneObjectPart[] children = copy.Parts; | 2103 | SceneObjectPart[] children = copy.Parts; |
2106 | 2104 | ||
2107 | lock (SceneObjectGroupsByFullPartID) | 2105 | lock (SceneObjectGroupsByFullPartID) |
2108 | { | 2106 | { |
2109 | SceneObjectGroupsByFullPartID[copy.UUID] = copy; | 2107 | SceneObjectGroupsByFullPartID[copy.UUID] = copy; |
2110 | foreach (SceneObjectPart part in children) | 2108 | foreach (SceneObjectPart part in children) |
2111 | SceneObjectGroupsByFullPartID[part.UUID] = copy; | 2109 | SceneObjectGroupsByFullPartID[part.UUID] = copy; |
2112 | } | 2110 | } |
2113 | 2111 | ||
2114 | lock (SceneObjectGroupsByLocalPartID) | 2112 | lock (SceneObjectGroupsByLocalPartID) |
2115 | { | 2113 | { |
2116 | SceneObjectGroupsByLocalPartID[copy.LocalId] = copy; | 2114 | SceneObjectGroupsByLocalPartID[copy.LocalId] = copy; |
2117 | foreach (SceneObjectPart part in children) | 2115 | foreach (SceneObjectPart part in children) |
2118 | SceneObjectGroupsByLocalPartID[part.LocalId] = copy; | 2116 | SceneObjectGroupsByLocalPartID[part.LocalId] = copy; |
2119 | } | 2117 | } |
2120 | // PROBABLE END OF FIXME | 2118 | // PROBABLE END OF FIXME |
2121 | 2119 | ||
2122 | // Since we copy from a source group that is in selected | 2120 | // Since we copy from a source group that is in selected |
@@ -2148,11 +2146,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2148 | { | 2146 | { |
2149 | m_log.WarnFormat("[SCENE]: Attempted to duplicate nonexistant prim id {0}", GroupID); | 2147 | m_log.WarnFormat("[SCENE]: Attempted to duplicate nonexistant prim id {0}", GroupID); |
2150 | } | 2148 | } |
2151 | 2149 | ||
2152 | return null; | 2150 | return null; |
2153 | } | 2151 | } |
2154 | 2152 | ||
2155 | /// <summary> | ||
2156 | /// Calculates the distance between two Vector3s | 2153 | /// Calculates the distance between two Vector3s |
2157 | /// </summary> | 2154 | /// </summary> |
2158 | /// <param name="v1"></param> | 2155 | /// <param name="v1"></param> |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 8fa7880..904c896 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -2670,6 +2670,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2670 | /// <summary> | 2670 | /// <summary> |
2671 | /// Link the prims in a given group to this group | 2671 | /// Link the prims in a given group to this group |
2672 | /// </summary> | 2672 | /// </summary> |
2673 | /// <remarks> | ||
2674 | /// Do not call this method directly - use Scene.LinkObjects() instead to avoid races between threads. | ||
2675 | /// FIXME: There are places where scripts call these methods directly without locking. This is a potential race condition. | ||
2676 | /// </remarks> | ||
2673 | /// <param name="objectGroup">The group of prims which should be linked to this group</param> | 2677 | /// <param name="objectGroup">The group of prims which should be linked to this group</param> |
2674 | public void LinkToGroup(SceneObjectGroup objectGroup) | 2678 | public void LinkToGroup(SceneObjectGroup objectGroup) |
2675 | { | 2679 | { |
@@ -2751,6 +2755,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2751 | } | 2755 | } |
2752 | 2756 | ||
2753 | linkPart.LinkNum = linkNum++; | 2757 | linkPart.LinkNum = linkNum++; |
2758 | linkPart.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect, false); | ||
2754 | 2759 | ||
2755 | SceneObjectPart[] ogParts = objectGroup.Parts; | 2760 | SceneObjectPart[] ogParts = objectGroup.Parts; |
2756 | Array.Sort(ogParts, delegate(SceneObjectPart a, SceneObjectPart b) | 2761 | Array.Sort(ogParts, delegate(SceneObjectPart a, SceneObjectPart b) |
@@ -2802,6 +2807,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
2802 | /// Delink the given prim from this group. The delinked prim is established as | 2807 | /// Delink the given prim from this group. The delinked prim is established as |
2803 | /// an independent SceneObjectGroup. | 2808 | /// an independent SceneObjectGroup. |
2804 | /// </summary> | 2809 | /// </summary> |
2810 | /// <remarks> | ||
2811 | /// FIXME: This method should not be called directly since it bypasses update locking, allowing a potential race | ||
2812 | /// condition. But currently there is no | ||
2813 | /// alternative method that does take a lonk to delink a single prim. | ||
2814 | /// </remarks> | ||
2805 | /// <param name="partID"></param> | 2815 | /// <param name="partID"></param> |
2806 | /// <returns>The object group of the newly delinked prim. Null if part could not be found</returns> | 2816 | /// <returns>The object group of the newly delinked prim. Null if part could not be found</returns> |
2807 | public SceneObjectGroup DelinkFromGroup(uint partID) | 2817 | public SceneObjectGroup DelinkFromGroup(uint partID) |
@@ -2813,6 +2823,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
2813 | /// Delink the given prim from this group. The delinked prim is established as | 2823 | /// Delink the given prim from this group. The delinked prim is established as |
2814 | /// an independent SceneObjectGroup. | 2824 | /// an independent SceneObjectGroup. |
2815 | /// </summary> | 2825 | /// </summary> |
2826 | /// <remarks> | ||
2827 | /// FIXME: This method should not be called directly since it bypasses update locking, allowing a potential race | ||
2828 | /// condition. But currently there is no | ||
2829 | /// alternative method that does take a lonk to delink a single prim. | ||
2830 | /// </remarks> | ||
2816 | /// <param name="partID"></param> | 2831 | /// <param name="partID"></param> |
2817 | /// <param name="sendEvents"></param> | 2832 | /// <param name="sendEvents"></param> |
2818 | /// <returns>The object group of the newly delinked prim. Null if part could not be found</returns> | 2833 | /// <returns>The object group of the newly delinked prim. Null if part could not be found</returns> |
@@ -2838,6 +2853,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
2838 | /// Delink the given prim from this group. The delinked prim is established as | 2853 | /// Delink the given prim from this group. The delinked prim is established as |
2839 | /// an independent SceneObjectGroup. | 2854 | /// an independent SceneObjectGroup. |
2840 | /// </summary> | 2855 | /// </summary> |
2856 | /// <remarks> | ||
2857 | /// FIXME: This method should not be called directly since it bypasses update locking, allowing a potential race | ||
2858 | /// condition. But currently there is no | ||
2859 | /// alternative method that does take a lonk to delink a single prim. | ||
2860 | /// </remarks> | ||
2841 | /// <param name="partID"></param> | 2861 | /// <param name="partID"></param> |
2842 | /// <param name="sendEvents"></param> | 2862 | /// <param name="sendEvents"></param> |
2843 | /// <returns>The object group of the newly delinked prim.</returns> | 2863 | /// <returns>The object group of the newly delinked prim.</returns> |
@@ -2971,6 +2991,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2971 | oldRot = part.RotationOffset; | 2991 | oldRot = part.RotationOffset; |
2972 | Quaternion newRot = Quaternion.Conjugate(parentRot) * worldRot; | 2992 | Quaternion newRot = Quaternion.Conjugate(parentRot) * worldRot; |
2973 | part.RotationOffset = newRot; | 2993 | part.RotationOffset = newRot; |
2994 | |||
2995 | part.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect, false); | ||
2974 | } | 2996 | } |
2975 | 2997 | ||
2976 | /// <summary> | 2998 | /// <summary> |
@@ -3482,7 +3504,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3482 | 3504 | ||
3483 | //we need to do a terse update even if the move wasn't allowed | 3505 | //we need to do a terse update even if the move wasn't allowed |
3484 | // so that the position is reset in the client (the object snaps back) | 3506 | // so that the position is reset in the client (the object snaps back) |
3485 | ScheduleGroupForTerseUpdate(); | 3507 | RootPart.ScheduleTerseUpdate(); |
3486 | } | 3508 | } |
3487 | 3509 | ||
3488 | /// <summary> | 3510 | /// <summary> |
@@ -4183,7 +4205,72 @@ namespace OpenSim.Region.Framework.Scenes | |||
4183 | for (int i = 0; i < parts.Length; i++) | 4205 | for (int i = 0; i < parts.Length; i++) |
4184 | parts[i].TriggerScriptChangedEvent(val); | 4206 | parts[i].TriggerScriptChangedEvent(val); |
4185 | } | 4207 | } |
4186 | 4208 | ||
4209 | /// <summary> | ||
4210 | /// Returns a count of the number of scripts in this groups parts. | ||
4211 | /// </summary> | ||
4212 | public int ScriptCount() | ||
4213 | { | ||
4214 | int count = 0; | ||
4215 | SceneObjectPart[] parts = m_parts.GetArray(); | ||
4216 | for (int i = 0; i < parts.Length; i++) | ||
4217 | count += parts[i].Inventory.ScriptCount(); | ||
4218 | |||
4219 | return count; | ||
4220 | } | ||
4221 | |||
4222 | /// <summary> | ||
4223 | /// A float the value is a representative execution time in milliseconds of all scripts in the link set. | ||
4224 | /// </summary> | ||
4225 | public float ScriptExecutionTime() | ||
4226 | { | ||
4227 | IScriptModule[] engines = Scene.RequestModuleInterfaces<IScriptModule>(); | ||
4228 | |||
4229 | if (engines.Length == 0) // No engine at all | ||
4230 | return 0.0f; | ||
4231 | |||
4232 | float time = 0.0f; | ||
4233 | |||
4234 | // get all the scripts in all parts | ||
4235 | SceneObjectPart[] parts = m_parts.GetArray(); | ||
4236 | List<TaskInventoryItem> scripts = new List<TaskInventoryItem>(); | ||
4237 | for (int i = 0; i < parts.Length; i++) | ||
4238 | { | ||
4239 | scripts.AddRange(parts[i].Inventory.GetInventoryItems(InventoryType.LSL)); | ||
4240 | } | ||
4241 | // extract the UUIDs | ||
4242 | List<UUID> ids = new List<UUID>(scripts.Count); | ||
4243 | foreach (TaskInventoryItem script in scripts) | ||
4244 | { | ||
4245 | if (!ids.Contains(script.ItemID)) | ||
4246 | { | ||
4247 | ids.Add(script.ItemID); | ||
4248 | } | ||
4249 | } | ||
4250 | // Offer the list of script UUIDs to each engine found and accumulate the time | ||
4251 | foreach (IScriptModule e in engines) | ||
4252 | { | ||
4253 | if (e != null) | ||
4254 | { | ||
4255 | time += e.GetScriptExecutionTime(ids); | ||
4256 | } | ||
4257 | } | ||
4258 | return time; | ||
4259 | } | ||
4260 | |||
4261 | /// <summary> | ||
4262 | /// Returns a count of the number of running scripts in this groups parts. | ||
4263 | /// </summary> | ||
4264 | public int RunningScriptCount() | ||
4265 | { | ||
4266 | int count = 0; | ||
4267 | SceneObjectPart[] parts = m_parts.GetArray(); | ||
4268 | for (int i = 0; i < parts.Length; i++) | ||
4269 | count += parts[i].Inventory.RunningScriptCount(); | ||
4270 | |||
4271 | return count; | ||
4272 | } | ||
4273 | |||
4187 | public override string ToString() | 4274 | public override string ToString() |
4188 | { | 4275 | { |
4189 | return String.Format("{0} {1} ({2})", Name, UUID, AbsolutePosition); | 4276 | return String.Format("{0} {1} ({2})", Name, UUID, AbsolutePosition); |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 8e74dc8..61ef827 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -1016,7 +1016,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
1016 | public int LinkNum | 1016 | public int LinkNum |
1017 | { | 1017 | { |
1018 | get { return m_linkNum; } | 1018 | get { return m_linkNum; } |
1019 | set { m_linkNum = value; } | 1019 | set |
1020 | { | ||
1021 | // if (ParentGroup != null) | ||
1022 | // { | ||
1023 | // m_log.DebugFormat( | ||
1024 | // "[SCENE OBJECT PART]: Setting linknum of {0}@{1} to {2} from {3}", | ||
1025 | // Name, AbsolutePosition, value, m_linkNum); | ||
1026 | // Util.PrintCallStack(); | ||
1027 | // } | ||
1028 | |||
1029 | m_linkNum = value; | ||
1030 | } | ||
1020 | } | 1031 | } |
1021 | 1032 | ||
1022 | public byte ClickAction | 1033 | public byte ClickAction |
@@ -2153,6 +2164,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2153 | /// <param name="isNew"></param> | 2164 | /// <param name="isNew"></param> |
2154 | public void DoPhysicsPropertyUpdate(bool UsePhysics, bool isNew) | 2165 | public void DoPhysicsPropertyUpdate(bool UsePhysics, bool isNew) |
2155 | { | 2166 | { |
2167 | if (ParentGroup.Scene == null) | ||
2168 | return; | ||
2169 | |||
2156 | if (!ParentGroup.Scene.PhysicalPrims && UsePhysics) | 2170 | if (!ParentGroup.Scene.PhysicalPrims && UsePhysics) |
2157 | return; | 2171 | return; |
2158 | 2172 | ||
@@ -3631,7 +3645,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3631 | hasProfileCut = hasDimple; // is it the same thing? | 3645 | hasProfileCut = hasDimple; // is it the same thing? |
3632 | } | 3646 | } |
3633 | 3647 | ||
3634 | |||
3635 | public void SetGroup(UUID groupID, IClientAPI client) | 3648 | public void SetGroup(UUID groupID, IClientAPI client) |
3636 | { | 3649 | { |
3637 | // Scene.AddNewPrims() calls with client == null so can't use this. | 3650 | // Scene.AddNewPrims() calls with client == null so can't use this. |
@@ -3661,10 +3674,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
3661 | 3674 | ||
3662 | public void SetPhysicsAxisRotation() | 3675 | public void SetPhysicsAxisRotation() |
3663 | { | 3676 | { |
3664 | if (PhysActor != null) | 3677 | PhysicsActor pa = PhysActor; |
3678 | |||
3679 | if (pa != null) | ||
3665 | { | 3680 | { |
3666 | PhysActor.LockAngularMotion(RotationAxis); | 3681 | pa.LockAngularMotion(RotationAxis); |
3667 | ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 3682 | ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
3668 | } | 3683 | } |
3669 | } | 3684 | } |
3670 | 3685 | ||
@@ -4381,7 +4396,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4381 | // For now, we use the NINJA naming scheme for identifying joints. | 4396 | // For now, we use the NINJA naming scheme for identifying joints. |
4382 | // In the future, we can support other joint specification schemes such as a | 4397 | // In the future, we can support other joint specification schemes such as a |
4383 | // custom checkbox in the viewer GUI. | 4398 | // custom checkbox in the viewer GUI. |
4384 | if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints) | 4399 | if (ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints) |
4385 | { | 4400 | { |
4386 | string hingeString = "hingejoint"; | 4401 | string hingeString = "hingejoint"; |
4387 | return (Name.Length >= hingeString.Length && Name.Substring(0, hingeString.Length) == hingeString); | 4402 | return (Name.Length >= hingeString.Length && Name.Substring(0, hingeString.Length) == hingeString); |
@@ -4397,7 +4412,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4397 | // For now, we use the NINJA naming scheme for identifying joints. | 4412 | // For now, we use the NINJA naming scheme for identifying joints. |
4398 | // In the future, we can support other joint specification schemes such as a | 4413 | // In the future, we can support other joint specification schemes such as a |
4399 | // custom checkbox in the viewer GUI. | 4414 | // custom checkbox in the viewer GUI. |
4400 | if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints) | 4415 | if (ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints) |
4401 | { | 4416 | { |
4402 | string ballString = "balljoint"; | 4417 | string ballString = "balljoint"; |
4403 | return (Name.Length >= ballString.Length && Name.Substring(0, ballString.Length) == ballString); | 4418 | return (Name.Length >= ballString.Length && Name.Substring(0, ballString.Length) == ballString); |
@@ -4413,7 +4428,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4413 | // For now, we use the NINJA naming scheme for identifying joints. | 4428 | // For now, we use the NINJA naming scheme for identifying joints. |
4414 | // In the future, we can support other joint specification schemes such as a | 4429 | // In the future, we can support other joint specification schemes such as a |
4415 | // custom checkbox in the viewer GUI. | 4430 | // custom checkbox in the viewer GUI. |
4416 | if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints) | 4431 | if (ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints) |
4417 | { | 4432 | { |
4418 | return IsHingeJoint() || IsBallJoint(); | 4433 | return IsHingeJoint() || IsBallJoint(); |
4419 | } | 4434 | } |
@@ -4534,7 +4549,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
4534 | } | 4549 | } |
4535 | */ | 4550 | */ |
4536 | } | 4551 | } |
4537 | |||
4538 | else // it already has a physical representation | 4552 | else // it already has a physical representation |
4539 | { | 4553 | { |
4540 | DoPhysicsPropertyUpdate(UsePhysics, false); // Update physical status. | 4554 | DoPhysicsPropertyUpdate(UsePhysics, false); // Update physical status. |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 959046a..81477e7 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | |||
@@ -176,16 +176,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
176 | /// <param name="ownerId"></param> | 176 | /// <param name="ownerId"></param> |
177 | public void ChangeInventoryOwner(UUID ownerId) | 177 | public void ChangeInventoryOwner(UUID ownerId) |
178 | { | 178 | { |
179 | m_items.LockItemsForWrite(true); | 179 | List<TaskInventoryItem> items = GetInventoryItems(); |
180 | if (0 == Items.Count) | 180 | |
181 | { | 181 | if (items.Count == 0) |
182 | m_items.LockItemsForWrite(false); | ||
183 | return; | 182 | return; |
184 | } | ||
185 | 183 | ||
184 | m_items.LockItemsForWrite(true); | ||
186 | HasInventoryChanged = true; | 185 | HasInventoryChanged = true; |
187 | m_part.ParentGroup.HasGroupChanged = true; | 186 | m_part.ParentGroup.HasGroupChanged = true; |
188 | List<TaskInventoryItem> items = GetInventoryItems(); | ||
189 | foreach (TaskInventoryItem item in items) | 187 | foreach (TaskInventoryItem item in items) |
190 | { | 188 | { |
191 | if (ownerId != item.OwnerID) | 189 | if (ownerId != item.OwnerID) |
@@ -267,14 +265,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
267 | /// </summary> | 265 | /// </summary> |
268 | public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) | 266 | public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) |
269 | { | 267 | { |
270 | Items.LockItemsForRead(true); | 268 | List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL); |
271 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); | 269 | foreach (TaskInventoryItem item in scripts) |
272 | Items.LockItemsForRead(false); | 270 | CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); |
273 | foreach (TaskInventoryItem item in items) | ||
274 | { | ||
275 | if ((int)InventoryType.LSL == item.InvType) | ||
276 | CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); | ||
277 | } | ||
278 | } | 271 | } |
279 | 272 | ||
280 | public ArrayList GetScriptErrors(UUID itemID) | 273 | public ArrayList GetScriptErrors(UUID itemID) |
@@ -305,17 +298,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
305 | /// </param> | 298 | /// </param> |
306 | public void RemoveScriptInstances(bool sceneObjectBeingDeleted) | 299 | public void RemoveScriptInstances(bool sceneObjectBeingDeleted) |
307 | { | 300 | { |
308 | Items.LockItemsForRead(true); | 301 | List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL); |
309 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); | 302 | foreach (TaskInventoryItem item in scripts) |
310 | Items.LockItemsForRead(false); | ||
311 | |||
312 | foreach (TaskInventoryItem item in items) | ||
313 | { | 303 | { |
314 | if ((int)InventoryType.LSL == item.InvType) | 304 | RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted); |
315 | { | 305 | m_part.RemoveScriptEvents(item.ItemID); |
316 | RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted); | ||
317 | m_part.RemoveScriptEvents(item.ItemID); | ||
318 | } | ||
319 | } | 306 | } |
320 | } | 307 | } |
321 | 308 | ||
@@ -770,14 +757,22 @@ namespace OpenSim.Region.Framework.Scenes | |||
770 | return item; | 757 | return item; |
771 | } | 758 | } |
772 | 759 | ||
773 | /// <summary> | 760 | public TaskInventoryItem GetInventoryItem(string name) |
774 | /// Get inventory items by name. | 761 | { |
775 | /// </summary> | 762 | m_items.LockItemsForRead(true); |
776 | /// <param name="name"></param> | 763 | foreach (TaskInventoryItem item in m_items.Values) |
777 | /// <returns> | 764 | { |
778 | /// A list of inventory items with that name. | 765 | if (item.Name == name) |
779 | /// If no inventory item has that name then an empty list is returned. | 766 | { |
780 | /// </returns> | 767 | m_items.LockItemsForRead(false); |
768 | return item; | ||
769 | } | ||
770 | } | ||
771 | m_items.LockItemsForRead(false); | ||
772 | |||
773 | return null; | ||
774 | } | ||
775 | |||
781 | public List<TaskInventoryItem> GetInventoryItems(string name) | 776 | public List<TaskInventoryItem> GetInventoryItems(string name) |
782 | { | 777 | { |
783 | List<TaskInventoryItem> items = new List<TaskInventoryItem>(); | 778 | List<TaskInventoryItem> items = new List<TaskInventoryItem>(); |
@@ -1247,10 +1242,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1247 | if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0) | 1242 | if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0) |
1248 | item.CurrentPermissions &= ~(uint)PermissionMask.Modify; | 1243 | item.CurrentPermissions &= ~(uint)PermissionMask.Modify; |
1249 | } | 1244 | } |
1250 | item.OwnerChanged = true; | ||
1251 | item.CurrentPermissions &= item.NextPermissions; | 1245 | item.CurrentPermissions &= item.NextPermissions; |
1252 | item.BasePermissions &= item.NextPermissions; | 1246 | item.BasePermissions &= item.NextPermissions; |
1253 | item.EveryonePermissions &= item.NextPermissions; | 1247 | item.EveryonePermissions &= item.NextPermissions; |
1248 | item.OwnerChanged = true; | ||
1254 | item.PermsMask = 0; | 1249 | item.PermsMask = 0; |
1255 | item.PermsGranter = UUID.Zero; | 1250 | item.PermsGranter = UUID.Zero; |
1256 | } | 1251 | } |
@@ -1281,9 +1276,57 @@ namespace OpenSim.Region.Framework.Scenes | |||
1281 | return true; | 1276 | return true; |
1282 | } | 1277 | } |
1283 | } | 1278 | } |
1279 | |||
1284 | return false; | 1280 | return false; |
1285 | } | 1281 | } |
1286 | 1282 | ||
1283 | /// <summary> | ||
1284 | /// Returns the count of scripts in this parts inventory. | ||
1285 | /// </summary> | ||
1286 | /// <returns></returns> | ||
1287 | public int ScriptCount() | ||
1288 | { | ||
1289 | int count = 0; | ||
1290 | Items.LockItemsForRead(true); | ||
1291 | foreach (TaskInventoryItem item in m_items.Values) | ||
1292 | { | ||
1293 | if (item.InvType == (int)InventoryType.LSL) | ||
1294 | { | ||
1295 | count++; | ||
1296 | } | ||
1297 | } | ||
1298 | Items.LockItemsForRead(false); | ||
1299 | return count; | ||
1300 | } | ||
1301 | /// <summary> | ||
1302 | /// Returns the count of running scripts in this parts inventory. | ||
1303 | /// </summary> | ||
1304 | /// <returns></returns> | ||
1305 | public int RunningScriptCount() | ||
1306 | { | ||
1307 | IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces<IScriptModule>(); | ||
1308 | if (engines.Length == 0) | ||
1309 | return 0; | ||
1310 | |||
1311 | int count = 0; | ||
1312 | List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL); | ||
1313 | |||
1314 | foreach (TaskInventoryItem item in scripts) | ||
1315 | { | ||
1316 | foreach (IScriptModule engine in engines) | ||
1317 | { | ||
1318 | if (engine != null) | ||
1319 | { | ||
1320 | if (engine.GetScriptState(item.ItemID)) | ||
1321 | { | ||
1322 | count++; | ||
1323 | } | ||
1324 | } | ||
1325 | } | ||
1326 | } | ||
1327 | return count; | ||
1328 | } | ||
1329 | |||
1287 | public List<UUID> GetInventoryList() | 1330 | public List<UUID> GetInventoryList() |
1288 | { | 1331 | { |
1289 | List<UUID> ret = new List<UUID>(); | 1332 | List<UUID> ret = new List<UUID>(); |
@@ -1298,22 +1341,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
1298 | { | 1341 | { |
1299 | List<TaskInventoryItem> ret = new List<TaskInventoryItem>(); | 1342 | List<TaskInventoryItem> ret = new List<TaskInventoryItem>(); |
1300 | 1343 | ||
1301 | lock (m_items) | 1344 | Items.LockItemsForRead(true); |
1302 | ret = new List<TaskInventoryItem>(m_items.Values); | 1345 | ret = new List<TaskInventoryItem>(m_items.Values); |
1346 | Items.LockItemsForRead(false); | ||
1303 | 1347 | ||
1304 | return ret; | 1348 | return ret; |
1305 | } | 1349 | } |
1306 | 1350 | ||
1307 | public List<TaskInventoryItem> GetInventoryScripts() | 1351 | public List<TaskInventoryItem> GetInventoryItems(InventoryType type) |
1308 | { | 1352 | { |
1309 | List<TaskInventoryItem> ret = new List<TaskInventoryItem>(); | 1353 | List<TaskInventoryItem> ret = new List<TaskInventoryItem>(); |
1310 | 1354 | ||
1311 | lock (m_items) | 1355 | Items.LockItemsForRead(true); |
1312 | { | 1356 | |
1313 | foreach (TaskInventoryItem item in m_items.Values) | 1357 | foreach (TaskInventoryItem item in m_items.Values) |
1314 | if (item.InvType == (int)InventoryType.LSL) | 1358 | if (item.InvType == (int)type) |
1315 | ret.Add(item); | 1359 | ret.Add(item); |
1316 | } | 1360 | |
1361 | Items.LockItemsForRead(false); | ||
1317 | 1362 | ||
1318 | return ret; | 1363 | return ret; |
1319 | } | 1364 | } |
@@ -1335,35 +1380,32 @@ namespace OpenSim.Region.Framework.Scenes | |||
1335 | if (engines.Length == 0) // No engine at all | 1380 | if (engines.Length == 0) // No engine at all |
1336 | return ret; | 1381 | return ret; |
1337 | 1382 | ||
1338 | Items.LockItemsForRead(true); | 1383 | List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL); |
1339 | foreach (TaskInventoryItem item in m_items.Values) | 1384 | |
1385 | foreach (TaskInventoryItem item in scripts) | ||
1340 | { | 1386 | { |
1341 | if (item.InvType == (int)InventoryType.LSL) | 1387 | foreach (IScriptModule e in engines) |
1342 | { | 1388 | { |
1343 | foreach (IScriptModule e in engines) | 1389 | if (e != null) |
1344 | { | 1390 | { |
1345 | if (e != null) | 1391 | string n = e.GetXMLState(item.ItemID); |
1392 | if (n != String.Empty) | ||
1346 | { | 1393 | { |
1347 | string n = e.GetXMLState(item.ItemID); | 1394 | if (oldIDs) |
1348 | if (n != String.Empty) | 1395 | { |
1396 | if (!ret.ContainsKey(item.OldItemID)) | ||
1397 | ret[item.OldItemID] = n; | ||
1398 | } | ||
1399 | else | ||
1349 | { | 1400 | { |
1350 | if (oldIDs) | 1401 | if (!ret.ContainsKey(item.ItemID)) |
1351 | { | 1402 | ret[item.ItemID] = n; |
1352 | if (!ret.ContainsKey(item.OldItemID)) | ||
1353 | ret[item.OldItemID] = n; | ||
1354 | } | ||
1355 | else | ||
1356 | { | ||
1357 | if (!ret.ContainsKey(item.ItemID)) | ||
1358 | ret[item.ItemID] = n; | ||
1359 | } | ||
1360 | break; | ||
1361 | } | 1403 | } |
1404 | break; | ||
1362 | } | 1405 | } |
1363 | } | 1406 | } |
1364 | } | 1407 | } |
1365 | } | 1408 | } |
1366 | Items.LockItemsForRead(false); | ||
1367 | return ret; | 1409 | return ret; |
1368 | } | 1410 | } |
1369 | 1411 | ||
@@ -1373,27 +1415,27 @@ namespace OpenSim.Region.Framework.Scenes | |||
1373 | if (engines.Length == 0) | 1415 | if (engines.Length == 0) |
1374 | return; | 1416 | return; |
1375 | 1417 | ||
1418 | List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL); | ||
1376 | 1419 | ||
1377 | Items.LockItemsForRead(true); | 1420 | foreach (TaskInventoryItem item in scripts) |
1378 | |||
1379 | foreach (TaskInventoryItem item in m_items.Values) | ||
1380 | { | 1421 | { |
1381 | if (item.InvType == (int)InventoryType.LSL) | 1422 | foreach (IScriptModule engine in engines) |
1382 | { | 1423 | { |
1383 | foreach (IScriptModule engine in engines) | 1424 | if (engine != null) |
1384 | { | 1425 | { |
1385 | if (engine != null) | 1426 | // m_log.DebugFormat( |
1386 | { | 1427 | // "[PRIM INVENTORY]: Resuming script {0} {1} for {2}, OwnerChanged {3}", |
1387 | if (item.OwnerChanged) | 1428 | // item.Name, item.ItemID, item.OwnerID, item.OwnerChanged); |
1388 | engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER }); | 1429 | |
1389 | item.OwnerChanged = false; | 1430 | engine.ResumeScript(item.ItemID); |
1390 | engine.ResumeScript(item.ItemID); | 1431 | |
1391 | } | 1432 | if (item.OwnerChanged) |
1433 | engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER }); | ||
1434 | |||
1435 | item.OwnerChanged = false; | ||
1392 | } | 1436 | } |
1393 | } | 1437 | } |
1394 | } | 1438 | } |
1395 | |||
1396 | Items.LockItemsForRead(false); | ||
1397 | } | 1439 | } |
1398 | } | 1440 | } |
1399 | } | 1441 | } |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index a810de2..6feb883 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
@@ -45,6 +45,7 @@ using TeleportFlags = OpenSim.Framework.Constants.TeleportFlags; | |||
45 | 45 | ||
46 | namespace OpenSim.Region.Framework.Scenes | 46 | namespace OpenSim.Region.Framework.Scenes |
47 | { | 47 | { |
48 | [Flags] | ||
48 | enum ScriptControlled : uint | 49 | enum ScriptControlled : uint |
49 | { | 50 | { |
50 | CONTROL_ZERO = 0, | 51 | CONTROL_ZERO = 0, |
@@ -76,6 +77,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
76 | // { | 77 | // { |
77 | // m_log.Debug("[SCENE PRESENCE] Destructor called"); | 78 | // m_log.Debug("[SCENE PRESENCE] Destructor called"); |
78 | // } | 79 | // } |
80 | private void TriggerScenePresenceUpdated() | ||
81 | { | ||
82 | if (m_scene != null) | ||
83 | m_scene.EventManager.TriggerScenePresenceUpdated(this); | ||
84 | } | ||
79 | 85 | ||
80 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 86 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
81 | 87 | ||
@@ -497,6 +503,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
497 | //m_log.DebugFormat( | 503 | //m_log.DebugFormat( |
498 | // "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}", | 504 | // "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}", |
499 | // Scene.RegionInfo.RegionName, Name, m_pos); | 505 | // Scene.RegionInfo.RegionName, Name, m_pos); |
506 | TriggerScenePresenceUpdated(); | ||
500 | } | 507 | } |
501 | } | 508 | } |
502 | 509 | ||
@@ -516,6 +523,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
516 | return; | 523 | return; |
517 | 524 | ||
518 | m_pos = value; | 525 | m_pos = value; |
526 | TriggerScenePresenceUpdated(); | ||
519 | } | 527 | } |
520 | } | 528 | } |
521 | 529 | ||
@@ -1086,23 +1094,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
1086 | /// <param name="pos"></param> | 1094 | /// <param name="pos"></param> |
1087 | public void Teleport(Vector3 pos) | 1095 | public void Teleport(Vector3 pos) |
1088 | { | 1096 | { |
1089 | bool isFlying = Flying; | 1097 | TeleportWithMomentum(pos, Vector3.Zero); |
1090 | RemoveFromPhysicalScene(); | ||
1091 | Velocity = Vector3.Zero; | ||
1092 | CheckLandingPoint(ref pos); | ||
1093 | AbsolutePosition = pos; | ||
1094 | AddToPhysicalScene(isFlying); | ||
1095 | |||
1096 | SendTerseUpdateToAllClients(); | ||
1097 | } | ||
1098 | |||
1099 | public void TeleportWithMomentum(Vector3 pos) | ||
1100 | { | ||
1101 | TeleportWithMomentum(pos, null); | ||
1102 | } | 1098 | } |
1103 | 1099 | ||
1104 | public void TeleportWithMomentum(Vector3 pos, Vector3? v) | 1100 | public void TeleportWithMomentum(Vector3 pos, Vector3? v) |
1105 | { | 1101 | { |
1102 | if (ParentID != (uint)0) | ||
1103 | StandUp(); | ||
1106 | bool isFlying = Flying; | 1104 | bool isFlying = Flying; |
1107 | Vector3 vel = Velocity; | 1105 | Vector3 vel = Velocity; |
1108 | RemoveFromPhysicalScene(); | 1106 | RemoveFromPhysicalScene(); |
@@ -1282,17 +1280,33 @@ namespace OpenSim.Region.Framework.Scenes | |||
1282 | 1280 | ||
1283 | bool flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); | 1281 | bool flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); |
1284 | MakeRootAgent(AbsolutePosition, flying); | 1282 | MakeRootAgent(AbsolutePosition, flying); |
1283 | ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); | ||
1284 | |||
1285 | // m_log.DebugFormat("[SCENE PRESENCE] Completed movement"); | ||
1285 | 1286 | ||
1286 | if ((m_callbackURI != null) && !m_callbackURI.Equals("")) | 1287 | if ((m_callbackURI != null) && !m_callbackURI.Equals("")) |
1287 | { | 1288 | { |
1288 | m_log.DebugFormat("[SCENE PRESENCE]: Releasing agent in URI {0}", m_callbackURI); | 1289 | // We cannot sleep here since this would hold up the inbound packet processing thread, as |
1290 | // CompleteMovement() is executed synchronously. However, it might be better to delay the release | ||
1291 | // here until we know for sure that the agent is active in this region. Sending AgentMovementComplete | ||
1292 | // is not enough for Imprudence clients - there appears to be a small delay (<200ms, <500ms) until they regard this | ||
1293 | // region as the current region, meaning that a close sent before then will fail the teleport. | ||
1294 | // System.Threading.Thread.Sleep(2000); | ||
1295 | |||
1296 | m_log.DebugFormat( | ||
1297 | "[SCENE PRESENCE]: Releasing {0} {1} with callback to {2}", | ||
1298 | client.Name, client.AgentId, m_callbackURI); | ||
1299 | |||
1289 | Scene.SimulationService.ReleaseAgent(m_originRegionID, UUID, m_callbackURI); | 1300 | Scene.SimulationService.ReleaseAgent(m_originRegionID, UUID, m_callbackURI); |
1290 | m_callbackURI = null; | 1301 | m_callbackURI = null; |
1291 | } | 1302 | } |
1303 | // else | ||
1304 | // { | ||
1305 | // m_log.DebugFormat( | ||
1306 | // "[SCENE PRESENCE]: No callback provided on CompleteMovement of {0} {1} to {2}", | ||
1307 | // client.Name, client.AgentId, m_scene.RegionInfo.RegionName); | ||
1308 | // } | ||
1292 | 1309 | ||
1293 | // m_log.DebugFormat("[SCENE PRESENCE] Completed movement"); | ||
1294 | |||
1295 | ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); | ||
1296 | ValidateAndSendAppearanceAndAgentData(); | 1310 | ValidateAndSendAppearanceAndAgentData(); |
1297 | 1311 | ||
1298 | // Create child agents in neighbouring regions | 1312 | // Create child agents in neighbouring regions |
@@ -1307,7 +1321,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1307 | friendsModule.SendFriendsOnlineIfNeeded(ControllingClient); | 1321 | friendsModule.SendFriendsOnlineIfNeeded(ControllingClient); |
1308 | } | 1322 | } |
1309 | 1323 | ||
1310 | |||
1311 | // m_log.DebugFormat( | 1324 | // m_log.DebugFormat( |
1312 | // "[SCENE PRESENCE]: Completing movement of {0} into region {1} took {2}ms", | 1325 | // "[SCENE PRESENCE]: Completing movement of {0} into region {1} took {2}ms", |
1313 | // client.Name, Scene.RegionInfo.RegionName, (DateTime.Now - startTime).Milliseconds); | 1326 | // client.Name, Scene.RegionInfo.RegionName, (DateTime.Now - startTime).Milliseconds); |
@@ -1360,7 +1373,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1360 | { | 1373 | { |
1361 | // m_log.DebugFormat( | 1374 | // m_log.DebugFormat( |
1362 | // "[SCENE PRESENCE]: In {0} received agent update from {1}, flags {2}", | 1375 | // "[SCENE PRESENCE]: In {0} received agent update from {1}, flags {2}", |
1363 | // Scene.RegionInfo.RegionName, remoteClient.Name, agentData.ControlFlags); | 1376 | // Scene.RegionInfo.RegionName, remoteClient.Name, (AgentManager.ControlFlags)agentData.ControlFlags); |
1364 | 1377 | ||
1365 | if (IsChildAgent) | 1378 | if (IsChildAgent) |
1366 | { | 1379 | { |
@@ -1470,14 +1483,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1470 | } | 1483 | } |
1471 | } | 1484 | } |
1472 | 1485 | ||
1473 | lock (scriptedcontrols) | 1486 | uint flagsForScripts = (uint)flags; |
1474 | { | 1487 | flags = RemoveIgnoredControls(flags, IgnoredControls); |
1475 | if (scriptedcontrols.Count > 0) | ||
1476 | { | ||
1477 | SendControlToScripts((uint)flags); | ||
1478 | flags = RemoveIgnoredControls(flags, IgnoredControls); | ||
1479 | } | ||
1480 | } | ||
1481 | 1488 | ||
1482 | if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0) | 1489 | if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0) |
1483 | HandleAgentSitOnGround(); | 1490 | HandleAgentSitOnGround(); |
@@ -1491,6 +1498,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1491 | PhysicsActor actor = PhysicsActor; | 1498 | PhysicsActor actor = PhysicsActor; |
1492 | if (actor == null) | 1499 | if (actor == null) |
1493 | { | 1500 | { |
1501 | SendControlsToScripts(flagsForScripts); | ||
1494 | return; | 1502 | return; |
1495 | } | 1503 | } |
1496 | 1504 | ||
@@ -1570,7 +1578,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1570 | MovementFlag |= (byte)nudgehack; | 1578 | MovementFlag |= (byte)nudgehack; |
1571 | } | 1579 | } |
1572 | 1580 | ||
1573 | // m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with {1}", Name, DCF); | 1581 | //m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with {1}", Name, DCF); |
1574 | MovementFlag += (byte)(uint)DCF; | 1582 | MovementFlag += (byte)(uint)DCF; |
1575 | update_movementflag = true; | 1583 | update_movementflag = true; |
1576 | } | 1584 | } |
@@ -1583,7 +1591,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1583 | && ((MovementFlag & (byte)nudgehack) == nudgehack)) | 1591 | && ((MovementFlag & (byte)nudgehack) == nudgehack)) |
1584 | ) // This or is for Nudge forward | 1592 | ) // This or is for Nudge forward |
1585 | { | 1593 | { |
1586 | // m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with lack of {1}", Name, DCF); | 1594 | //m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with lack of {1}", Name, DCF); |
1587 | MovementFlag -= ((byte)(uint)DCF); | 1595 | MovementFlag -= ((byte)(uint)DCF); |
1588 | update_movementflag = true; | 1596 | update_movementflag = true; |
1589 | 1597 | ||
@@ -1664,11 +1672,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
1664 | // } | 1672 | // } |
1665 | // } | 1673 | // } |
1666 | 1674 | ||
1667 | // if (update_movementflag && ParentID == 0) | 1675 | if (update_movementflag && ParentID == 0) |
1668 | // Animator.UpdateMovementAnimations(); | 1676 | Animator.UpdateMovementAnimations(); |
1677 | |||
1678 | SendControlsToScripts(flagsForScripts); | ||
1669 | } | 1679 | } |
1670 | 1680 | ||
1671 | m_scene.EventManager.TriggerOnClientMovement(this); | 1681 | m_scene.EventManager.TriggerOnClientMovement(this); |
1682 | TriggerScenePresenceUpdated(); | ||
1672 | } | 1683 | } |
1673 | 1684 | ||
1674 | /// <summary> | 1685 | /// <summary> |
@@ -2611,6 +2622,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2611 | 2622 | ||
2612 | m_scene.ForEachClient(SendTerseUpdateToClient); | 2623 | m_scene.ForEachClient(SendTerseUpdateToClient); |
2613 | } | 2624 | } |
2625 | TriggerScenePresenceUpdated(); | ||
2614 | } | 2626 | } |
2615 | 2627 | ||
2616 | public void SendCoarseLocations(List<Vector3> coarseLocations, List<UUID> avatarUUIDs) | 2628 | public void SendCoarseLocations(List<Vector3> coarseLocations, List<UUID> avatarUUIDs) |
@@ -2689,7 +2701,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2689 | // If we are using the the cached appearance then send it out to everyone | 2701 | // If we are using the the cached appearance then send it out to everyone |
2690 | if (cachedappearance) | 2702 | if (cachedappearance) |
2691 | { | 2703 | { |
2692 | m_log.DebugFormat("[SCENEPRESENCE]: baked textures are in the cache for {0}", Name); | 2704 | m_log.DebugFormat("[SCENE PRESENCE]: baked textures are in the cache for {0}", Name); |
2693 | 2705 | ||
2694 | // If the avatars baked textures are all in the cache, then we have a | 2706 | // If the avatars baked textures are all in the cache, then we have a |
2695 | // complete appearance... send it out, if not, then we'll send it when | 2707 | // complete appearance... send it out, if not, then we'll send it when |
@@ -3094,8 +3106,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3094 | x = x / Constants.RegionSize; | 3106 | x = x / Constants.RegionSize; |
3095 | y = y / Constants.RegionSize; | 3107 | y = y / Constants.RegionSize; |
3096 | 3108 | ||
3097 | //m_log.Debug("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX))); | 3109 | // m_log.Debug("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX))); |
3098 | //m_log.Debug("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY))); | 3110 | // m_log.Debug("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY))); |
3099 | if (Util.IsOutsideView(DrawDistance, x, newRegionX, y, newRegionY)) | 3111 | if (Util.IsOutsideView(DrawDistance, x, newRegionX, y, newRegionY)) |
3100 | { | 3112 | { |
3101 | byebyeRegions.Add(handle); | 3113 | byebyeRegions.Add(handle); |
@@ -3152,7 +3164,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3152 | 3164 | ||
3153 | public void ChildAgentDataUpdate(AgentData cAgentData) | 3165 | public void ChildAgentDataUpdate(AgentData cAgentData) |
3154 | { | 3166 | { |
3155 | //m_log.Debug(" >>> ChildAgentDataUpdate <<< " + Scene.RegionInfo.RegionName); | 3167 | // m_log.Debug(" >>> ChildAgentDataUpdate <<< " + Scene.RegionInfo.RegionName); |
3156 | if (!IsChildAgent) | 3168 | if (!IsChildAgent) |
3157 | return; | 3169 | return; |
3158 | 3170 | ||
@@ -3296,6 +3308,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
3296 | m_originRegionID = cAgent.RegionID; | 3308 | m_originRegionID = cAgent.RegionID; |
3297 | 3309 | ||
3298 | m_callbackURI = cAgent.CallbackURI; | 3310 | m_callbackURI = cAgent.CallbackURI; |
3311 | // m_log.DebugFormat( | ||
3312 | // "[SCENE PRESENCE]: Set callback for {0} in {1} to {2} in CopyFrom()", | ||
3313 | // Name, m_scene.RegionInfo.RegionName, m_callbackURI); | ||
3299 | 3314 | ||
3300 | m_pos = cAgent.Position; | 3315 | m_pos = cAgent.Position; |
3301 | m_velocity = cAgent.Velocity; | 3316 | m_velocity = cAgent.Velocity; |
@@ -3397,6 +3412,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3397 | Velocity = force; | 3412 | Velocity = force; |
3398 | 3413 | ||
3399 | m_forceToApply = null; | 3414 | m_forceToApply = null; |
3415 | TriggerScenePresenceUpdated(); | ||
3400 | } | 3416 | } |
3401 | } | 3417 | } |
3402 | 3418 | ||
@@ -3504,23 +3520,53 @@ namespace OpenSim.Region.Framework.Scenes | |||
3504 | 3520 | ||
3505 | RaiseCollisionScriptEvents(coldata); | 3521 | RaiseCollisionScriptEvents(coldata); |
3506 | 3522 | ||
3507 | if (Invulnerable || GodLevel >= 200) | 3523 | // Gods do not take damage and Invulnerable is set depending on parcel/region flags |
3524 | if (Invulnerable || GodLevel > 0) | ||
3508 | return; | 3525 | return; |
3509 | 3526 | ||
3527 | // The following may be better in the ICombatModule | ||
3528 | // probably tweaking of the values for ground and normal prim collisions will be needed | ||
3510 | float starthealth = Health; | 3529 | float starthealth = Health; |
3511 | uint killerObj = 0; | 3530 | uint killerObj = 0; |
3531 | SceneObjectPart part = null; | ||
3512 | foreach (uint localid in coldata.Keys) | 3532 | foreach (uint localid in coldata.Keys) |
3513 | { | 3533 | { |
3514 | SceneObjectPart part = Scene.GetSceneObjectPart(localid); | 3534 | if (localid == 0) |
3515 | 3535 | { | |
3516 | if (part != null && part.ParentGroup.Damage != -1.0f) | 3536 | part = null; |
3517 | Health -= part.ParentGroup.Damage; | 3537 | } |
3518 | else | 3538 | else |
3519 | { | 3539 | { |
3520 | if (coldata[localid].PenetrationDepth >= 0.10f) | 3540 | part = Scene.GetSceneObjectPart(localid); |
3541 | } | ||
3542 | if (part != null) | ||
3543 | { | ||
3544 | // Ignore if it has been deleted or volume detect | ||
3545 | if (!part.ParentGroup.IsDeleted && !part.ParentGroup.IsVolumeDetect) | ||
3546 | { | ||
3547 | if (part.ParentGroup.Damage > 0.0f) | ||
3548 | { | ||
3549 | // Something with damage... | ||
3550 | Health -= part.ParentGroup.Damage; | ||
3551 | part.ParentGroup.Scene.DeleteSceneObject(part.ParentGroup, false); | ||
3552 | } | ||
3553 | else | ||
3554 | { | ||
3555 | // An ordinary prim | ||
3556 | if (coldata[localid].PenetrationDepth >= 0.10f) | ||
3557 | Health -= coldata[localid].PenetrationDepth * 5.0f; | ||
3558 | } | ||
3559 | } | ||
3560 | } | ||
3561 | else | ||
3562 | { | ||
3563 | // 0 is the ground | ||
3564 | // what about collisions with other avatars? | ||
3565 | if (localid == 0 && coldata[localid].PenetrationDepth >= 0.10f) | ||
3521 | Health -= coldata[localid].PenetrationDepth * 5.0f; | 3566 | Health -= coldata[localid].PenetrationDepth * 5.0f; |
3522 | } | 3567 | } |
3523 | 3568 | ||
3569 | |||
3524 | if (Health <= 0.0f) | 3570 | if (Health <= 0.0f) |
3525 | { | 3571 | { |
3526 | if (localid != 0) | 3572 | if (localid != 0) |
@@ -3536,7 +3582,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
3536 | ControllingClient.SendHealth(Health); | 3582 | ControllingClient.SendHealth(Health); |
3537 | } | 3583 | } |
3538 | if (Health <= 0) | 3584 | if (Health <= 0) |
3585 | { | ||
3539 | m_scene.EventManager.TriggerAvatarKill(killerObj, this); | 3586 | m_scene.EventManager.TriggerAvatarKill(killerObj, this); |
3587 | } | ||
3588 | if (starthealth == Health && Health < 100.0f) | ||
3589 | { | ||
3590 | Health += 0.03f; | ||
3591 | if (Health > 100.0f) | ||
3592 | Health = 100.0f; | ||
3593 | ControllingClient.SendHealth(Health); | ||
3594 | } | ||
3540 | } | 3595 | } |
3541 | } | 3596 | } |
3542 | 3597 | ||
@@ -3548,7 +3603,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3548 | 3603 | ||
3549 | public void Close() | 3604 | public void Close() |
3550 | { | 3605 | { |
3551 | if (!IsChildAgent) | 3606 | if (!IsChildAgent && m_scene.AttachmentsModule != null) |
3552 | m_scene.AttachmentsModule.DeleteAttachmentsFromScene(this, false); | 3607 | m_scene.AttachmentsModule.DeleteAttachmentsFromScene(this, false); |
3553 | 3608 | ||
3554 | // Clear known regions | 3609 | // Clear known regions |
@@ -3618,6 +3673,63 @@ namespace OpenSim.Region.Framework.Scenes | |||
3618 | return m_attachments.Count > 0; | 3673 | return m_attachments.Count > 0; |
3619 | } | 3674 | } |
3620 | 3675 | ||
3676 | /// <summary> | ||
3677 | /// Returns the total count of scripts in all parts inventories. | ||
3678 | /// </summary> | ||
3679 | public int ScriptCount() | ||
3680 | { | ||
3681 | int count = 0; | ||
3682 | lock (m_attachments) | ||
3683 | { | ||
3684 | foreach (SceneObjectGroup gobj in m_attachments) | ||
3685 | { | ||
3686 | if (gobj != null) | ||
3687 | { | ||
3688 | count += gobj.ScriptCount(); | ||
3689 | } | ||
3690 | } | ||
3691 | } | ||
3692 | return count; | ||
3693 | } | ||
3694 | |||
3695 | /// <summary> | ||
3696 | /// A float the value is a representative execution time in milliseconds of all scripts in all attachments. | ||
3697 | /// </summary> | ||
3698 | public float ScriptExecutionTime() | ||
3699 | { | ||
3700 | float time = 0.0f; | ||
3701 | lock (m_attachments) | ||
3702 | { | ||
3703 | foreach (SceneObjectGroup gobj in m_attachments) | ||
3704 | { | ||
3705 | if (gobj != null) | ||
3706 | { | ||
3707 | time += gobj.ScriptExecutionTime(); | ||
3708 | } | ||
3709 | } | ||
3710 | } | ||
3711 | return time; | ||
3712 | } | ||
3713 | |||
3714 | /// <summary> | ||
3715 | /// Returns the total count of running scripts in all parts. | ||
3716 | /// </summary> | ||
3717 | public int RunningScriptCount() | ||
3718 | { | ||
3719 | int count = 0; | ||
3720 | lock (m_attachments) | ||
3721 | { | ||
3722 | foreach (SceneObjectGroup gobj in m_attachments) | ||
3723 | { | ||
3724 | if (gobj != null) | ||
3725 | { | ||
3726 | count += gobj.RunningScriptCount(); | ||
3727 | } | ||
3728 | } | ||
3729 | } | ||
3730 | return count; | ||
3731 | } | ||
3732 | |||
3621 | public bool HasScriptedAttachments() | 3733 | public bool HasScriptedAttachments() |
3622 | { | 3734 | { |
3623 | lock (m_attachments) | 3735 | lock (m_attachments) |
@@ -3835,77 +3947,92 @@ namespace OpenSim.Region.Framework.Scenes | |||
3835 | } | 3947 | } |
3836 | } | 3948 | } |
3837 | 3949 | ||
3838 | internal void SendControlToScripts(uint flags) | 3950 | private void SendControlsToScripts(uint flags) |
3839 | { | 3951 | { |
3840 | ScriptControlled allflags = ScriptControlled.CONTROL_ZERO; | 3952 | // Notify the scripts only after calling UpdateMovementAnimations(), so that if a script |
3841 | 3953 | // (e.g., a walking script) checks which animation is active it will be the correct animation. | |
3842 | if (MouseDown) | 3954 | lock (scriptedcontrols) |
3843 | { | 3955 | { |
3844 | allflags = LastCommands & (ScriptControlled.CONTROL_ML_LBUTTON | ScriptControlled.CONTROL_LBUTTON); | 3956 | if (scriptedcontrols.Count <= 0) |
3845 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP) != 0 || (flags & unchecked((uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP)) != 0) | 3957 | return; |
3958 | |||
3959 | ScriptControlled allflags = ScriptControlled.CONTROL_ZERO; | ||
3960 | |||
3961 | if (MouseDown) | ||
3962 | { | ||
3963 | allflags = LastCommands & (ScriptControlled.CONTROL_ML_LBUTTON | ScriptControlled.CONTROL_LBUTTON); | ||
3964 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP) != 0 || (flags & unchecked((uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP)) != 0) | ||
3965 | { | ||
3966 | allflags = ScriptControlled.CONTROL_ZERO; | ||
3967 | MouseDown = true; | ||
3968 | } | ||
3969 | } | ||
3970 | |||
3971 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN) != 0) | ||
3846 | { | 3972 | { |
3847 | allflags = ScriptControlled.CONTROL_ZERO; | 3973 | allflags |= ScriptControlled.CONTROL_ML_LBUTTON; |
3848 | MouseDown = true; | 3974 | MouseDown = true; |
3849 | } | 3975 | } |
3850 | } | 3976 | |
3977 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0) | ||
3978 | { | ||
3979 | allflags |= ScriptControlled.CONTROL_LBUTTON; | ||
3980 | MouseDown = true; | ||
3981 | } | ||
3982 | |||
3983 | // find all activated controls, whether the scripts are interested in them or not | ||
3984 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) != 0) | ||
3985 | { | ||
3986 | allflags |= ScriptControlled.CONTROL_FWD; | ||
3987 | } | ||
3988 | |||
3989 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) != 0) | ||
3990 | { | ||
3991 | allflags |= ScriptControlled.CONTROL_BACK; | ||
3992 | } | ||
3993 | |||
3994 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS) != 0) | ||
3995 | { | ||
3996 | allflags |= ScriptControlled.CONTROL_UP; | ||
3997 | } | ||
3998 | |||
3999 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0) | ||
4000 | { | ||
4001 | allflags |= ScriptControlled.CONTROL_DOWN; | ||
4002 | } | ||
3851 | 4003 | ||
3852 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN) != 0) | 4004 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) != 0) |
3853 | { | 4005 | { |
3854 | allflags |= ScriptControlled.CONTROL_ML_LBUTTON; | 4006 | allflags |= ScriptControlled.CONTROL_LEFT; |
3855 | MouseDown = true; | 4007 | } |
3856 | } | 4008 | |
3857 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0) | 4009 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) != 0) |
3858 | { | 4010 | { |
3859 | allflags |= ScriptControlled.CONTROL_LBUTTON; | 4011 | allflags |= ScriptControlled.CONTROL_RIGHT; |
3860 | MouseDown = true; | 4012 | } |
3861 | } | 4013 | |
4014 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0) | ||
4015 | { | ||
4016 | allflags |= ScriptControlled.CONTROL_ROT_RIGHT; | ||
4017 | } | ||
4018 | |||
4019 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0) | ||
4020 | { | ||
4021 | allflags |= ScriptControlled.CONTROL_ROT_LEFT; | ||
4022 | } | ||
3862 | 4023 | ||
3863 | // find all activated controls, whether the scripts are interested in them or not | 4024 | // optimization; we have to check per script, but if nothing is pressed and nothing changed, we can skip that |
3864 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) != 0) | 4025 | if (allflags != ScriptControlled.CONTROL_ZERO || allflags != LastCommands) |
3865 | { | ||
3866 | allflags |= ScriptControlled.CONTROL_FWD; | ||
3867 | } | ||
3868 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) != 0) | ||
3869 | { | ||
3870 | allflags |= ScriptControlled.CONTROL_BACK; | ||
3871 | } | ||
3872 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS) != 0) | ||
3873 | { | ||
3874 | allflags |= ScriptControlled.CONTROL_UP; | ||
3875 | } | ||
3876 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0) | ||
3877 | { | ||
3878 | allflags |= ScriptControlled.CONTROL_DOWN; | ||
3879 | } | ||
3880 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) != 0) | ||
3881 | { | ||
3882 | allflags |= ScriptControlled.CONTROL_LEFT; | ||
3883 | } | ||
3884 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) != 0) | ||
3885 | { | ||
3886 | allflags |= ScriptControlled.CONTROL_RIGHT; | ||
3887 | } | ||
3888 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0) | ||
3889 | { | ||
3890 | allflags |= ScriptControlled.CONTROL_ROT_RIGHT; | ||
3891 | } | ||
3892 | if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0) | ||
3893 | { | ||
3894 | allflags |= ScriptControlled.CONTROL_ROT_LEFT; | ||
3895 | } | ||
3896 | // optimization; we have to check per script, but if nothing is pressed and nothing changed, we can skip that | ||
3897 | if (allflags != ScriptControlled.CONTROL_ZERO || allflags != LastCommands) | ||
3898 | { | ||
3899 | lock (scriptedcontrols) | ||
3900 | { | 4026 | { |
3901 | foreach (KeyValuePair<UUID, ScriptControllers> kvp in scriptedcontrols) | 4027 | foreach (KeyValuePair<UUID, ScriptControllers> kvp in scriptedcontrols) |
3902 | { | 4028 | { |
3903 | UUID scriptUUID = kvp.Key; | 4029 | UUID scriptUUID = kvp.Key; |
3904 | ScriptControllers scriptControlData = kvp.Value; | 4030 | ScriptControllers scriptControlData = kvp.Value; |
3905 | 4031 | ||
3906 | ScriptControlled localHeld = allflags & scriptControlData.eventControls; // the flags interesting for us | 4032 | ScriptControlled localHeld = allflags & scriptControlData.eventControls; // the flags interesting for us |
3907 | ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle | 4033 | ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle |
3908 | ScriptControlled localChange = localHeld ^ localLast; // the changed bits | 4034 | ScriptControlled localChange = localHeld ^ localLast; // the changed bits |
4035 | |||
3909 | if (localHeld != ScriptControlled.CONTROL_ZERO || localChange != ScriptControlled.CONTROL_ZERO) | 4036 | if (localHeld != ScriptControlled.CONTROL_ZERO || localChange != ScriptControlled.CONTROL_ZERO) |
3910 | { | 4037 | { |
3911 | // only send if still pressed or just changed | 4038 | // only send if still pressed or just changed |
@@ -3913,9 +4040,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
3913 | } | 4040 | } |
3914 | } | 4041 | } |
3915 | } | 4042 | } |
4043 | |||
4044 | LastCommands = allflags; | ||
3916 | } | 4045 | } |
3917 | |||
3918 | LastCommands = allflags; | ||
3919 | } | 4046 | } |
3920 | 4047 | ||
3921 | internal static AgentManager.ControlFlags RemoveIgnoredControls(AgentManager.ControlFlags flags, ScriptControlled ignored) | 4048 | internal static AgentManager.ControlFlags RemoveIgnoredControls(AgentManager.ControlFlags flags, ScriptControlled ignored) |
@@ -3995,7 +4122,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3995 | land.LandData.UserLocation != Vector3.Zero && | 4122 | land.LandData.UserLocation != Vector3.Zero && |
3996 | land.LandData.OwnerID != m_uuid && | 4123 | land.LandData.OwnerID != m_uuid && |
3997 | (!m_scene.Permissions.IsGod(m_uuid)) && | 4124 | (!m_scene.Permissions.IsGod(m_uuid)) && |
3998 | (!m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid))) | 4125 | (!m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_uuid))) |
3999 | { | 4126 | { |
4000 | float curr = Vector3.Distance(AbsolutePosition, pos); | 4127 | float curr = Vector3.Distance(AbsolutePosition, pos); |
4001 | if (Vector3.Distance(land.LandData.UserLocation, pos) < curr) | 4128 | if (Vector3.Distance(land.LandData.UserLocation, pos) < curr) |
@@ -4009,13 +4136,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
4009 | { | 4136 | { |
4010 | if ((m_teleportFlags & (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID)) == | 4137 | if ((m_teleportFlags & (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID)) == |
4011 | (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID) || | 4138 | (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID) || |
4012 | (m_teleportFlags & TeleportFlags.ViaLandmark) != 0 || | 4139 | (m_scene.TelehubAllowLandmarks == true ? false : ((m_teleportFlags & TeleportFlags.ViaLandmark) != 0 )) || |
4013 | (m_teleportFlags & TeleportFlags.ViaLocation) != 0 || | 4140 | (m_teleportFlags & TeleportFlags.ViaLocation) != 0 || |
4014 | (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0) | 4141 | (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0) |
4015 | { | 4142 | { |
4016 | if (GodLevel < 200 && | 4143 | if (GodLevel < 200 && |
4017 | ((!m_scene.Permissions.IsGod(m_uuid) && | 4144 | ((!m_scene.Permissions.IsGod(m_uuid) && |
4018 | !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid)) || | 4145 | !m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_uuid)) || |
4019 | (m_teleportFlags & TeleportFlags.ViaLocation) != 0 || | 4146 | (m_teleportFlags & TeleportFlags.ViaLocation) != 0 || |
4020 | (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0)) | 4147 | (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0)) |
4021 | { | 4148 | { |
@@ -4023,28 +4150,92 @@ namespace OpenSim.Region.Framework.Scenes | |||
4023 | if (spawnPoints.Length == 0) | 4150 | if (spawnPoints.Length == 0) |
4024 | return; | 4151 | return; |
4025 | 4152 | ||
4026 | float distance = 9999; | 4153 | int index; |
4027 | int closest = -1; | 4154 | bool selected = false; |
4028 | 4155 | ||
4029 | for (int i = 0 ; i < spawnPoints.Length ; i++) | 4156 | switch (m_scene.SpawnPointRouting) |
4030 | { | 4157 | { |
4031 | Vector3 spawnPosition = spawnPoints[i].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); | 4158 | case "random": |
4032 | Vector3 offset = spawnPosition - pos; | ||
4033 | float d = Vector3.Mag(offset); | ||
4034 | if (d >= distance) | ||
4035 | continue; | ||
4036 | ILandObject land = m_scene.LandChannel.GetLandObject(spawnPosition.X, spawnPosition.Y); | ||
4037 | if (land == null) | ||
4038 | continue; | ||
4039 | if (land.IsEitherBannedOrRestricted(UUID)) | ||
4040 | continue; | ||
4041 | distance = d; | ||
4042 | closest = i; | ||
4043 | } | ||
4044 | if (closest == -1) | ||
4045 | return; | ||
4046 | 4159 | ||
4047 | pos = spawnPoints[closest].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); | 4160 | do |
4161 | { | ||
4162 | index = Util.RandomClass.Next(spawnPoints.Length - 1); | ||
4163 | |||
4164 | Vector3 spawnPosition = spawnPoints[index].GetLocation( | ||
4165 | telehub.AbsolutePosition, | ||
4166 | telehub.GroupRotation | ||
4167 | ); | ||
4168 | // SpawnPoint sp = spawnPoints[index]; | ||
4169 | |||
4170 | ILandObject land = m_scene.LandChannel.GetLandObject(spawnPosition.X, spawnPosition.Y); | ||
4171 | if (land == null || land.IsEitherBannedOrRestricted(UUID)) | ||
4172 | selected = false; | ||
4173 | else | ||
4174 | selected = true; | ||
4175 | |||
4176 | } while ( selected == false); | ||
4177 | |||
4178 | pos = spawnPoints[index].GetLocation( | ||
4179 | telehub.AbsolutePosition, | ||
4180 | telehub.GroupRotation | ||
4181 | ); | ||
4182 | return; | ||
4183 | |||
4184 | case "sequence": | ||
4185 | |||
4186 | do | ||
4187 | { | ||
4188 | index = m_scene.SpawnPoint(); | ||
4189 | |||
4190 | Vector3 spawnPosition = spawnPoints[index].GetLocation( | ||
4191 | telehub.AbsolutePosition, | ||
4192 | telehub.GroupRotation | ||
4193 | ); | ||
4194 | // SpawnPoint sp = spawnPoints[index]; | ||
4195 | |||
4196 | ILandObject land = m_scene.LandChannel.GetLandObject(spawnPosition.X, spawnPosition.Y); | ||
4197 | if (land == null || land.IsEitherBannedOrRestricted(UUID)) | ||
4198 | selected = false; | ||
4199 | else | ||
4200 | selected = true; | ||
4201 | |||
4202 | } while (selected == false); | ||
4203 | |||
4204 | pos = spawnPoints[index].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); | ||
4205 | ; | ||
4206 | return; | ||
4207 | |||
4208 | default: | ||
4209 | case "closest": | ||
4210 | |||
4211 | float distance = 9999; | ||
4212 | int closest = -1; | ||
4213 | |||
4214 | for (int i = 0; i < spawnPoints.Length; i++) | ||
4215 | { | ||
4216 | Vector3 spawnPosition = spawnPoints[i].GetLocation( | ||
4217 | telehub.AbsolutePosition, | ||
4218 | telehub.GroupRotation | ||
4219 | ); | ||
4220 | Vector3 offset = spawnPosition - pos; | ||
4221 | float d = Vector3.Mag(offset); | ||
4222 | if (d >= distance) | ||
4223 | continue; | ||
4224 | ILandObject land = m_scene.LandChannel.GetLandObject(spawnPosition.X, spawnPosition.Y); | ||
4225 | if (land == null) | ||
4226 | continue; | ||
4227 | if (land.IsEitherBannedOrRestricted(UUID)) | ||
4228 | continue; | ||
4229 | distance = d; | ||
4230 | closest = i; | ||
4231 | } | ||
4232 | if (closest == -1) | ||
4233 | return; | ||
4234 | |||
4235 | pos = spawnPoints[closest].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); | ||
4236 | return; | ||
4237 | |||
4238 | } | ||
4048 | } | 4239 | } |
4049 | } | 4240 | } |
4050 | } | 4241 | } |
@@ -4089,7 +4280,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4089 | GodLevel < 200 && | 4280 | GodLevel < 200 && |
4090 | ((land.LandData.OwnerID != m_uuid && | 4281 | ((land.LandData.OwnerID != m_uuid && |
4091 | !m_scene.Permissions.IsGod(m_uuid) && | 4282 | !m_scene.Permissions.IsGod(m_uuid) && |
4092 | !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid)) || | 4283 | !m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_uuid)) || |
4093 | (m_teleportFlags & TeleportFlags.ViaLocation) != 0 || | 4284 | (m_teleportFlags & TeleportFlags.ViaLocation) != 0 || |
4094 | (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0)) | 4285 | (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0)) |
4095 | { | 4286 | { |
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs index 55455cc..a4f730d 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs | |||
@@ -47,14 +47,30 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
47 | /// </remarks> | 47 | /// </remarks> |
48 | public class CoalescedSceneObjectsSerializer | 48 | public class CoalescedSceneObjectsSerializer |
49 | { | 49 | { |
50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
51 | 51 | ||
52 | /// <summary> | 52 | /// <summary> |
53 | /// Serialize coalesced objects to Xml | 53 | /// Serialize coalesced objects to Xml |
54 | /// </summary> | 54 | /// </summary> |
55 | /// <param name="coa"></param> | 55 | /// <param name="coa"></param> |
56 | /// <param name="doScriptStates"> | ||
57 | /// If true then serialize script states. This will halt any running scripts | ||
58 | /// </param> | ||
56 | /// <returns></returns> | 59 | /// <returns></returns> |
57 | public static string ToXml(CoalescedSceneObjects coa) | 60 | public static string ToXml(CoalescedSceneObjects coa) |
61 | { | ||
62 | return ToXml(coa, true); | ||
63 | } | ||
64 | |||
65 | /// <summary> | ||
66 | /// Serialize coalesced objects to Xml | ||
67 | /// </summary> | ||
68 | /// <param name="coa"></param> | ||
69 | /// <param name="doScriptStates"> | ||
70 | /// If true then serialize script states. This will halt any running scripts | ||
71 | /// </param> | ||
72 | /// <returns></returns> | ||
73 | public static string ToXml(CoalescedSceneObjects coa, bool doScriptStates) | ||
58 | { | 74 | { |
59 | using (StringWriter sw = new StringWriter()) | 75 | using (StringWriter sw = new StringWriter()) |
60 | { | 76 | { |
@@ -91,7 +107,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
91 | writer.WriteAttributeString("offsety", offsets[i].Y.ToString()); | 107 | writer.WriteAttributeString("offsety", offsets[i].Y.ToString()); |
92 | writer.WriteAttributeString("offsetz", offsets[i].Z.ToString()); | 108 | writer.WriteAttributeString("offsetz", offsets[i].Z.ToString()); |
93 | 109 | ||
94 | SceneObjectSerializer.ToOriginalXmlFormat(obj, writer, true); | 110 | SceneObjectSerializer.ToOriginalXmlFormat(obj, writer, doScriptStates); |
95 | 111 | ||
96 | writer.WriteEndElement(); // SceneObjectGroup | 112 | writer.WriteEndElement(); // SceneObjectGroup |
97 | } | 113 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index 151eba2..e223f47 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs | |||
@@ -1538,51 +1538,6 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
1538 | } | 1538 | } |
1539 | } | 1539 | } |
1540 | 1540 | ||
1541 | //////// Read ///////// | ||
1542 | public static bool Xml2ToSOG(XmlTextReader reader, SceneObjectGroup sog) | ||
1543 | { | ||
1544 | reader.Read(); | ||
1545 | reader.ReadStartElement("SceneObjectGroup"); | ||
1546 | SceneObjectPart root = Xml2ToSOP(reader); | ||
1547 | if (root != null) | ||
1548 | sog.SetRootPart(root); | ||
1549 | else | ||
1550 | { | ||
1551 | return false; | ||
1552 | } | ||
1553 | |||
1554 | if (sog.UUID == UUID.Zero) | ||
1555 | sog.UUID = sog.RootPart.UUID; | ||
1556 | |||
1557 | reader.Read(); // OtherParts | ||
1558 | |||
1559 | while (!reader.EOF) | ||
1560 | { | ||
1561 | switch (reader.NodeType) | ||
1562 | { | ||
1563 | case XmlNodeType.Element: | ||
1564 | if (reader.Name == "SceneObjectPart") | ||
1565 | { | ||
1566 | SceneObjectPart child = Xml2ToSOP(reader); | ||
1567 | if (child != null) | ||
1568 | sog.AddPart(child); | ||
1569 | } | ||
1570 | else | ||
1571 | { | ||
1572 | //Logger.Log("Found unexpected prim XML element " + reader.Name, Helpers.LogLevel.Debug); | ||
1573 | reader.Read(); | ||
1574 | } | ||
1575 | break; | ||
1576 | case XmlNodeType.EndElement: | ||
1577 | default: | ||
1578 | reader.Read(); | ||
1579 | break; | ||
1580 | } | ||
1581 | |||
1582 | } | ||
1583 | return true; | ||
1584 | } | ||
1585 | |||
1586 | public static SceneObjectPart Xml2ToSOP(XmlTextReader reader) | 1541 | public static SceneObjectPart Xml2ToSOP(XmlTextReader reader) |
1587 | { | 1542 | { |
1588 | SceneObjectPart obj = new SceneObjectPart(); | 1543 | SceneObjectPart obj = new SceneObjectPart(); |
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs index d214eba..a3485d2 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs | |||
@@ -223,50 +223,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
223 | 223 | ||
224 | public static SceneObjectGroup DeserializeGroupFromXml2(string xmlString) | 224 | public static SceneObjectGroup DeserializeGroupFromXml2(string xmlString) |
225 | { | 225 | { |
226 | XmlDocument doc = new XmlDocument(); | 226 | return SceneObjectSerializer.FromXml2Format(xmlString); |
227 | XmlNode rootNode; | ||
228 | |||
229 | XmlTextReader reader = new XmlTextReader(new StringReader(xmlString)); | ||
230 | reader.WhitespaceHandling = WhitespaceHandling.None; | ||
231 | doc.Load(reader); | ||
232 | reader.Close(); | ||
233 | rootNode = doc.FirstChild; | ||
234 | |||
235 | // This is to deal with neighbouring regions that are still surrounding the group xml with the <scene> | ||
236 | // tag. It should be possible to remove the first part of this if statement once we go past 0.5.9 (or | ||
237 | // when some other changes forces all regions to upgrade). | ||
238 | // This might seem rather pointless since prim crossing from this revision to an earlier revision remains | ||
239 | // broken. But it isn't much work to accomodate the old format here. | ||
240 | if (rootNode.LocalName.Equals("scene")) | ||
241 | { | ||
242 | foreach (XmlNode aPrimNode in rootNode.ChildNodes) | ||
243 | { | ||
244 | // There is only ever one prim. This oddity should be removeable post 0.5.9 | ||
245 | //return SceneObjectSerializer.FromXml2Format(aPrimNode.OuterXml); | ||
246 | using (reader = new XmlTextReader(new StringReader(aPrimNode.OuterXml))) | ||
247 | { | ||
248 | SceneObjectGroup obj = new SceneObjectGroup(); | ||
249 | if (SceneObjectSerializer.Xml2ToSOG(reader, obj)) | ||
250 | return obj; | ||
251 | |||
252 | return null; | ||
253 | } | ||
254 | } | ||
255 | |||
256 | return null; | ||
257 | } | ||
258 | else | ||
259 | { | ||
260 | //return SceneObjectSerializer.FromXml2Format(rootNode.OuterXml); | ||
261 | using (reader = new XmlTextReader(new StringReader(rootNode.OuterXml))) | ||
262 | { | ||
263 | SceneObjectGroup obj = new SceneObjectGroup(); | ||
264 | if (SceneObjectSerializer.Xml2ToSOG(reader, obj)) | ||
265 | return obj; | ||
266 | |||
267 | return null; | ||
268 | } | ||
269 | } | ||
270 | } | 227 | } |
271 | 228 | ||
272 | /// <summary> | 229 | /// <summary> |
@@ -307,8 +264,8 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
307 | ICollection<SceneObjectGroup> sceneObjects = new List<SceneObjectGroup>(); | 264 | ICollection<SceneObjectGroup> sceneObjects = new List<SceneObjectGroup>(); |
308 | foreach (XmlNode aPrimNode in rootNode.ChildNodes) | 265 | foreach (XmlNode aPrimNode in rootNode.ChildNodes) |
309 | { | 266 | { |
310 | SceneObjectGroup obj = CreatePrimFromXml2(scene, aPrimNode.OuterXml); | 267 | SceneObjectGroup obj = DeserializeGroupFromXml2(aPrimNode.OuterXml); |
311 | if (obj != null && startScripts) | 268 | if (startScripts) |
312 | sceneObjects.Add(obj); | 269 | sceneObjects.Add(obj); |
313 | } | 270 | } |
314 | 271 | ||
@@ -319,27 +276,6 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
319 | } | 276 | } |
320 | } | 277 | } |
321 | 278 | ||
322 | /// <summary> | ||
323 | /// Create a prim from the xml2 representation. | ||
324 | /// </summary> | ||
325 | /// <param name="scene"></param> | ||
326 | /// <param name="xmlData"></param> | ||
327 | /// <returns>The scene object created. null if the scene object already existed</returns> | ||
328 | protected static SceneObjectGroup CreatePrimFromXml2(Scene scene, string xmlData) | ||
329 | { | ||
330 | //SceneObjectGroup obj = SceneObjectSerializer.FromXml2Format(xmlData); | ||
331 | using (XmlTextReader reader = new XmlTextReader(new StringReader(xmlData))) | ||
332 | { | ||
333 | SceneObjectGroup obj = new SceneObjectGroup(); | ||
334 | SceneObjectSerializer.Xml2ToSOG(reader, obj); | ||
335 | |||
336 | if (scene.AddRestoredSceneObject(obj, true, false)) | ||
337 | return obj; | ||
338 | else | ||
339 | return null; | ||
340 | } | ||
341 | } | ||
342 | |||
343 | #endregion | 279 | #endregion |
344 | } | 280 | } |
345 | } | 281 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs index a4afd47..18e6ece 100644 --- a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs +++ b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs | |||
@@ -26,7 +26,7 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | //using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Timers; | 30 | using System.Timers; |
31 | using OpenMetaverse.Packets; | 31 | using OpenMetaverse.Packets; |
32 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
@@ -35,10 +35,18 @@ using OpenSim.Region.Framework.Interfaces; | |||
35 | 35 | ||
36 | namespace OpenSim.Region.Framework.Scenes | 36 | namespace OpenSim.Region.Framework.Scenes |
37 | { | 37 | { |
38 | /// <summary> | ||
39 | /// Collect statistics from the scene to send to the client and for access by other monitoring tools. | ||
40 | /// </summary> | ||
41 | /// <remarks> | ||
42 | /// FIXME: This should be a monitoring region module | ||
43 | /// </remarks> | ||
38 | public class SimStatsReporter | 44 | public class SimStatsReporter |
39 | { | 45 | { |
40 | // private static readonly log4net.ILog m_log | 46 | private static readonly log4net.ILog m_log |
41 | // = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | 47 | = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); |
48 | |||
49 | public const string LastReportedObjectUpdateStatName = "LastReportedObjectUpdates"; | ||
42 | 50 | ||
43 | public delegate void SendStatResult(SimStats stats); | 51 | public delegate void SendStatResult(SimStats stats); |
44 | 52 | ||
@@ -48,10 +56,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
48 | 56 | ||
49 | public event YourStatsAreWrong OnStatsIncorrect; | 57 | public event YourStatsAreWrong OnStatsIncorrect; |
50 | 58 | ||
51 | private SendStatResult handlerSendStatResult = null; | 59 | private SendStatResult handlerSendStatResult; |
52 | 60 | ||
53 | private YourStatsAreWrong handlerStatsIncorrect = null; | 61 | private YourStatsAreWrong handlerStatsIncorrect; |
54 | 62 | ||
63 | /// <summary> | ||
64 | /// These are the IDs of stats sent in the StatsPacket to the viewer. | ||
65 | /// </summary> | ||
66 | /// <remarks> | ||
67 | /// Some of these are not relevant to OpenSimulator since it is architected differently to other simulators | ||
68 | /// (e.g. script instructions aren't executed as part of the frame loop so 'script time' is tricky). | ||
69 | /// </remarks> | ||
55 | public enum Stats : uint | 70 | public enum Stats : uint |
56 | { | 71 | { |
57 | TimeDilation = 0, | 72 | TimeDilation = 0, |
@@ -75,20 +90,20 @@ namespace OpenSim.Region.Framework.Scenes | |||
75 | OutPacketsPerSecond = 18, | 90 | OutPacketsPerSecond = 18, |
76 | PendingDownloads = 19, | 91 | PendingDownloads = 19, |
77 | PendingUploads = 20, | 92 | PendingUploads = 20, |
78 | VirtualSizeKB = 21, | 93 | VirtualSizeKb = 21, |
79 | ResidentSizeKB = 22, | 94 | ResidentSizeKb = 22, |
80 | PendingLocalUploads = 23, | 95 | PendingLocalUploads = 23, |
81 | UnAckedBytes = 24, | 96 | UnAckedBytes = 24, |
82 | PhysicsPinnedTasks = 25, | 97 | PhysicsPinnedTasks = 25, |
83 | PhysicsLODTasks = 26, | 98 | PhysicsLodTasks = 26, |
84 | PhysicsStepMS = 27, | 99 | SimPhysicsStepMs = 27, |
85 | PhysicsShapeMS = 28, | 100 | SimPhysicsShapeMs = 28, |
86 | PhysicsOtherMS = 29, | 101 | SimPhysicsOtherMs = 29, |
87 | PhysicsMemory = 30, | 102 | SimPhysicsMemory = 30, |
88 | ScriptEPS = 31, | 103 | ScriptEps = 31, |
89 | SimSpareTime = 32, | 104 | SimSpareMs = 32, |
90 | SimSleepTime = 33, | 105 | SimSleepMs = 33, |
91 | IOPumpTime = 34 | 106 | SimIoPumpTime = 34 |
92 | } | 107 | } |
93 | 108 | ||
94 | /// <summary> | 109 | /// <summary> |
@@ -113,11 +128,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
113 | get { return lastReportedSimStats; } | 128 | get { return lastReportedSimStats; } |
114 | } | 129 | } |
115 | 130 | ||
131 | /// <summary> | ||
132 | /// Extra sim statistics that are used by monitors but not sent to the client. | ||
133 | /// </summary> | ||
134 | /// <value> | ||
135 | /// The keys are the stat names. | ||
136 | /// </value> | ||
137 | private Dictionary<string, float> m_lastReportedExtraSimStats = new Dictionary<string, float>(); | ||
138 | |||
116 | // Sending a stats update every 3 seconds- | 139 | // Sending a stats update every 3 seconds- |
117 | private int statsUpdatesEveryMS = 3000; | 140 | private int m_statsUpdatesEveryMS = 3000; |
118 | private float statsUpdateFactor = 0; | 141 | private float m_statsUpdateFactor; |
119 | private float m_timeDilation = 0; | 142 | private float m_timeDilation; |
120 | private int m_fps = 0; | 143 | private int m_fps; |
144 | |||
145 | /// <summary> | ||
146 | /// Number of the last frame on which we processed a stats udpate. | ||
147 | /// </summary> | ||
148 | private uint m_lastUpdateFrame; | ||
121 | 149 | ||
122 | /// <summary> | 150 | /// <summary> |
123 | /// Our nominal fps target, as expected in fps stats when a sim is running normally. | 151 | /// Our nominal fps target, as expected in fps stats when a sim is running normally. |
@@ -135,43 +163,42 @@ namespace OpenSim.Region.Framework.Scenes | |||
135 | private float m_reportedFpsCorrectionFactor = 5; | 163 | private float m_reportedFpsCorrectionFactor = 5; |
136 | 164 | ||
137 | // saved last reported value so there is something available for llGetRegionFPS | 165 | // saved last reported value so there is something available for llGetRegionFPS |
138 | private float lastReportedSimFPS = 0; | 166 | private float lastReportedSimFPS; |
139 | private float[] lastReportedSimStats = new float[23]; | 167 | private float[] lastReportedSimStats = new float[22]; |
140 | private float m_pfps = 0; | 168 | private float m_pfps; |
141 | 169 | ||
142 | /// <summary> | 170 | /// <summary> |
143 | /// Number of agent updates requested in this stats cycle | 171 | /// Number of agent updates requested in this stats cycle |
144 | /// </summary> | 172 | /// </summary> |
145 | private int m_agentUpdates = 0; | 173 | private int m_agentUpdates; |
146 | 174 | ||
147 | /// <summary> | 175 | /// <summary> |
148 | /// Number of object updates requested in this stats cycle | 176 | /// Number of object updates requested in this stats cycle |
149 | /// </summary> | 177 | /// </summary> |
150 | private int m_objectUpdates; | 178 | private int m_objectUpdates; |
151 | 179 | ||
152 | private int m_frameMS = 0; | 180 | private int m_frameMS; |
153 | private int m_netMS = 0; | 181 | private int m_spareMS; |
154 | private int m_agentMS = 0; | 182 | private int m_netMS; |
155 | private int m_physicsMS = 0; | 183 | private int m_agentMS; |
156 | private int m_imageMS = 0; | 184 | private int m_physicsMS; |
157 | private int m_otherMS = 0; | 185 | private int m_imageMS; |
158 | private int m_sleeptimeMS = 0; | 186 | private int m_otherMS; |
159 | |||
160 | 187 | ||
161 | //Ckrinke: (3-21-08) Comment out to remove a compiler warning. Bring back into play when needed. | 188 | //Ckrinke: (3-21-08) Comment out to remove a compiler warning. Bring back into play when needed. |
162 | //Ckrinke private int m_scriptMS = 0; | 189 | //Ckrinke private int m_scriptMS = 0; |
163 | 190 | ||
164 | private int m_rootAgents = 0; | 191 | private int m_rootAgents; |
165 | private int m_childAgents = 0; | 192 | private int m_childAgents; |
166 | private int m_numPrim = 0; | 193 | private int m_numPrim; |
167 | private int m_inPacketsPerSecond = 0; | 194 | private int m_inPacketsPerSecond; |
168 | private int m_outPacketsPerSecond = 0; | 195 | private int m_outPacketsPerSecond; |
169 | private int m_activePrim = 0; | 196 | private int m_activePrim; |
170 | private int m_unAckedBytes = 0; | 197 | private int m_unAckedBytes; |
171 | private int m_pendingDownloads = 0; | 198 | private int m_pendingDownloads; |
172 | private int m_pendingUploads = 0; | 199 | private int m_pendingUploads = 0; // FIXME: Not currently filled in |
173 | private int m_activeScripts = 0; | 200 | private int m_activeScripts; |
174 | private int m_scriptLinesPerSecond = 0; | 201 | private int m_scriptLinesPerSecond; |
175 | 202 | ||
176 | private int m_objectCapacity = 45000; | 203 | private int m_objectCapacity = 45000; |
177 | 204 | ||
@@ -187,13 +214,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
187 | { | 214 | { |
188 | m_scene = scene; | 215 | m_scene = scene; |
189 | m_reportedFpsCorrectionFactor = scene.MinFrameTime * m_nominalReportedFps; | 216 | m_reportedFpsCorrectionFactor = scene.MinFrameTime * m_nominalReportedFps; |
190 | statsUpdateFactor = (float)(statsUpdatesEveryMS / 1000); | 217 | m_statsUpdateFactor = (float)(m_statsUpdatesEveryMS / 1000); |
191 | ReportingRegion = scene.RegionInfo; | 218 | ReportingRegion = scene.RegionInfo; |
192 | 219 | ||
193 | m_objectCapacity = scene.RegionInfo.ObjectCapacity; | 220 | m_objectCapacity = scene.RegionInfo.ObjectCapacity; |
194 | m_report.AutoReset = true; | 221 | m_report.AutoReset = true; |
195 | m_report.Interval = statsUpdatesEveryMS; | 222 | m_report.Interval = m_statsUpdatesEveryMS; |
196 | m_report.Elapsed += statsHeartBeat; | 223 | m_report.Elapsed += TriggerStatsHeartbeat; |
197 | m_report.Enabled = true; | 224 | m_report.Enabled = true; |
198 | 225 | ||
199 | if (StatsManager.SimExtraStats != null) | 226 | if (StatsManager.SimExtraStats != null) |
@@ -202,20 +229,38 @@ namespace OpenSim.Region.Framework.Scenes | |||
202 | 229 | ||
203 | public void Close() | 230 | public void Close() |
204 | { | 231 | { |
205 | m_report.Elapsed -= statsHeartBeat; | 232 | m_report.Elapsed -= TriggerStatsHeartbeat; |
206 | m_report.Close(); | 233 | m_report.Close(); |
207 | } | 234 | } |
208 | 235 | ||
236 | /// <summary> | ||
237 | /// Sets the number of milliseconds between stat updates. | ||
238 | /// </summary> | ||
239 | /// <param name='ms'></param> | ||
209 | public void SetUpdateMS(int ms) | 240 | public void SetUpdateMS(int ms) |
210 | { | 241 | { |
211 | statsUpdatesEveryMS = ms; | 242 | m_statsUpdatesEveryMS = ms; |
212 | statsUpdateFactor = (float)(statsUpdatesEveryMS / 1000); | 243 | m_statsUpdateFactor = (float)(m_statsUpdatesEveryMS / 1000); |
213 | m_report.Interval = statsUpdatesEveryMS; | 244 | m_report.Interval = m_statsUpdatesEveryMS; |
245 | } | ||
246 | |||
247 | private void TriggerStatsHeartbeat(object sender, EventArgs args) | ||
248 | { | ||
249 | try | ||
250 | { | ||
251 | statsHeartBeat(sender, args); | ||
252 | } | ||
253 | catch (Exception e) | ||
254 | { | ||
255 | m_log.Warn(string.Format( | ||
256 | "[SIM STATS REPORTER] Update for {0} failed with exception ", | ||
257 | m_scene.RegionInfo.RegionName), e); | ||
258 | } | ||
214 | } | 259 | } |
215 | 260 | ||
216 | private void statsHeartBeat(object sender, EventArgs e) | 261 | private void statsHeartBeat(object sender, EventArgs e) |
217 | { | 262 | { |
218 | SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[23]; | 263 | SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[22]; |
219 | SimStatsPacket.RegionBlock rb = new SimStatsPacket.RegionBlock(); | 264 | SimStatsPacket.RegionBlock rb = new SimStatsPacket.RegionBlock(); |
220 | 265 | ||
221 | // Know what's not thread safe in Mono... modifying timers. | 266 | // Know what's not thread safe in Mono... modifying timers. |
@@ -242,7 +287,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
242 | int reportedFPS = (int)(m_fps * m_reportedFpsCorrectionFactor); | 287 | int reportedFPS = (int)(m_fps * m_reportedFpsCorrectionFactor); |
243 | 288 | ||
244 | // save the reported value so there is something available for llGetRegionFPS | 289 | // save the reported value so there is something available for llGetRegionFPS |
245 | lastReportedSimFPS = reportedFPS / statsUpdateFactor; | 290 | lastReportedSimFPS = reportedFPS / m_statsUpdateFactor; |
246 | 291 | ||
247 | float physfps = ((m_pfps / 1000)); | 292 | float physfps = ((m_pfps / 1000)); |
248 | 293 | ||
@@ -253,7 +298,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
253 | physfps = 0; | 298 | physfps = 0; |
254 | 299 | ||
255 | #endregion | 300 | #endregion |
256 | float factor = 1 / statsUpdateFactor; | ||
257 | if (reportedFPS <= 0) | 301 | if (reportedFPS <= 0) |
258 | reportedFPS = 1; | 302 | reportedFPS = 1; |
259 | 303 | ||
@@ -264,32 +308,38 @@ namespace OpenSim.Region.Framework.Scenes | |||
264 | float targetframetime = 1100.0f / (float)m_nominalReportedFps; | 308 | float targetframetime = 1100.0f / (float)m_nominalReportedFps; |
265 | 309 | ||
266 | float sparetime; | 310 | float sparetime; |
267 | float sleeptime; | ||
268 | if (TotalFrameTime > targetframetime) | 311 | if (TotalFrameTime > targetframetime) |
269 | { | 312 | { |
270 | sparetime = 0; | 313 | sparetime = 0; |
271 | sleeptime = 0; | ||
272 | } | ||
273 | else | ||
274 | { | ||
275 | sparetime = m_frameMS - m_physicsMS - m_agentMS; | ||
276 | sparetime *= perframe; | ||
277 | if (sparetime < 0) | ||
278 | sparetime = 0; | ||
279 | else if (sparetime > TotalFrameTime) | ||
280 | sparetime = TotalFrameTime; | ||
281 | sleeptime = m_sleeptimeMS * perframe; | ||
282 | } | 314 | } |
315 | |||
316 | m_rootAgents = m_scene.SceneGraph.GetRootAgentCount(); | ||
317 | m_childAgents = m_scene.SceneGraph.GetChildAgentCount(); | ||
318 | m_numPrim = m_scene.SceneGraph.GetTotalObjectsCount(); | ||
319 | m_activePrim = m_scene.SceneGraph.GetActiveObjectsCount(); | ||
320 | m_activeScripts = m_scene.SceneGraph.GetActiveScriptsCount(); | ||
321 | |||
322 | // FIXME: Checking for stat sanity is a complex approach. What we really need to do is fix the code | ||
323 | // so that stat numbers are always consistent. | ||
324 | CheckStatSanity(); | ||
283 | 325 | ||
284 | // other MS is actually simulation time | 326 | // other MS is actually simulation time |
285 | // m_otherMS = m_frameMS - m_physicsMS - m_imageMS - m_netMS - m_agentMS; | 327 | // m_otherMS = m_frameMS - m_physicsMS - m_imageMS - m_netMS - m_agentMS; |
286 | // m_imageMS m_netMS are not included in m_frameMS | 328 | // m_imageMS m_netMS are not included in m_frameMS |
287 | 329 | ||
288 | m_otherMS = m_frameMS - m_physicsMS - m_agentMS - m_sleeptimeMS; | 330 | m_otherMS = m_frameMS - m_physicsMS - m_agentMS; |
289 | if (m_otherMS < 0) | 331 | if (m_otherMS < 0) |
290 | m_otherMS = 0; | 332 | m_otherMS = 0; |
291 | 333 | ||
292 | for (int i = 0; i < 23; i++) | 334 | uint thisFrame = m_scene.Frame; |
335 | float framesUpdated = (float)(thisFrame - m_lastUpdateFrame) * m_reportedFpsCorrectionFactor; | ||
336 | m_lastUpdateFrame = thisFrame; | ||
337 | |||
338 | // Avoid div-by-zero if somehow we've not updated any frames. | ||
339 | if (framesUpdated == 0) | ||
340 | framesUpdated = 1; | ||
341 | |||
342 | for (int i = 0; i < 22; i++) | ||
293 | { | 343 | { |
294 | sb[i] = new SimStatsPacket.StatBlock(); | 344 | sb[i] = new SimStatsPacket.StatBlock(); |
295 | } | 345 | } |
@@ -298,13 +348,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
298 | sb[0].StatValue = (Single.IsNaN(m_timeDilation)) ? 0.1f : m_timeDilation ; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor)); | 348 | sb[0].StatValue = (Single.IsNaN(m_timeDilation)) ? 0.1f : m_timeDilation ; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor)); |
299 | 349 | ||
300 | sb[1].StatID = (uint) Stats.SimFPS; | 350 | sb[1].StatID = (uint) Stats.SimFPS; |
301 | sb[1].StatValue = reportedFPS / statsUpdateFactor; | 351 | sb[1].StatValue = reportedFPS / m_statsUpdateFactor; |
302 | 352 | ||
303 | sb[2].StatID = (uint) Stats.PhysicsFPS; | 353 | sb[2].StatID = (uint) Stats.PhysicsFPS; |
304 | sb[2].StatValue = physfps / statsUpdateFactor; | 354 | sb[2].StatValue = physfps / m_statsUpdateFactor; |
305 | 355 | ||
306 | sb[3].StatID = (uint) Stats.AgentUpdates; | 356 | sb[3].StatID = (uint) Stats.AgentUpdates; |
307 | sb[3].StatValue = (m_agentUpdates / statsUpdateFactor); | 357 | sb[3].StatValue = (m_agentUpdates / m_statsUpdateFactor); |
308 | 358 | ||
309 | sb[4].StatID = (uint) Stats.Agents; | 359 | sb[4].StatID = (uint) Stats.Agents; |
310 | sb[4].StatValue = m_rootAgents; | 360 | sb[4].StatValue = m_rootAgents; |
@@ -319,38 +369,31 @@ namespace OpenSim.Region.Framework.Scenes | |||
319 | sb[7].StatValue = m_activePrim; | 369 | sb[7].StatValue = m_activePrim; |
320 | 370 | ||
321 | sb[8].StatID = (uint)Stats.FrameMS; | 371 | sb[8].StatID = (uint)Stats.FrameMS; |
322 | // sb[8].StatValue = m_frameMS / statsUpdateFactor; | 372 | sb[8].StatValue = m_frameMS / framesUpdated; |
323 | sb[8].StatValue = TotalFrameTime; | ||
324 | 373 | ||
325 | sb[9].StatID = (uint)Stats.NetMS; | 374 | sb[9].StatID = (uint)Stats.NetMS; |
326 | // sb[9].StatValue = m_netMS / statsUpdateFactor; | 375 | sb[9].StatValue = m_netMS / framesUpdated; |
327 | sb[9].StatValue = m_netMS * perframe; | ||
328 | 376 | ||
329 | sb[10].StatID = (uint)Stats.PhysicsMS; | 377 | sb[10].StatID = (uint)Stats.PhysicsMS; |
330 | // sb[10].StatValue = m_physicsMS / statsUpdateFactor; | 378 | sb[10].StatValue = m_physicsMS / framesUpdated; |
331 | sb[10].StatValue = m_physicsMS * perframe; | ||
332 | 379 | ||
333 | sb[11].StatID = (uint)Stats.ImageMS ; | 380 | sb[11].StatID = (uint)Stats.ImageMS ; |
334 | // sb[11].StatValue = m_imageMS / statsUpdateFactor; | 381 | sb[11].StatValue = m_imageMS / framesUpdated; |
335 | sb[11].StatValue = m_imageMS * perframe; | ||
336 | 382 | ||
337 | sb[12].StatID = (uint)Stats.OtherMS; | 383 | sb[12].StatID = (uint)Stats.OtherMS; |
338 | // sb[12].StatValue = m_otherMS / statsUpdateFactor; | 384 | sb[12].StatValue = m_otherMS / framesUpdated; |
339 | sb[12].StatValue = m_otherMS * perframe; | ||
340 | |||
341 | 385 | ||
342 | sb[13].StatID = (uint)Stats.InPacketsPerSecond; | 386 | sb[13].StatID = (uint)Stats.InPacketsPerSecond; |
343 | sb[13].StatValue = (m_inPacketsPerSecond / statsUpdateFactor); | 387 | sb[13].StatValue = (m_inPacketsPerSecond / m_statsUpdateFactor); |
344 | 388 | ||
345 | sb[14].StatID = (uint)Stats.OutPacketsPerSecond; | 389 | sb[14].StatID = (uint)Stats.OutPacketsPerSecond; |
346 | sb[14].StatValue = (m_outPacketsPerSecond / statsUpdateFactor); | 390 | sb[14].StatValue = (m_outPacketsPerSecond / m_statsUpdateFactor); |
347 | 391 | ||
348 | sb[15].StatID = (uint)Stats.UnAckedBytes; | 392 | sb[15].StatID = (uint)Stats.UnAckedBytes; |
349 | sb[15].StatValue = m_unAckedBytes; | 393 | sb[15].StatValue = m_unAckedBytes; |
350 | 394 | ||
351 | sb[16].StatID = (uint)Stats.AgentMS; | 395 | sb[16].StatID = (uint)Stats.AgentMS; |
352 | // sb[16].StatValue = m_agentMS / statsUpdateFactor; | 396 | sb[16].StatValue = m_agentMS / framesUpdated; |
353 | sb[16].StatValue = m_agentMS * perframe; | ||
354 | 397 | ||
355 | sb[17].StatID = (uint)Stats.PendingDownloads; | 398 | sb[17].StatID = (uint)Stats.PendingDownloads; |
356 | sb[17].StatValue = m_pendingDownloads; | 399 | sb[17].StatValue = m_pendingDownloads; |
@@ -362,15 +405,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
362 | sb[19].StatValue = m_activeScripts; | 405 | sb[19].StatValue = m_activeScripts; |
363 | 406 | ||
364 | sb[20].StatID = (uint)Stats.ScriptLinesPerSecond; | 407 | sb[20].StatID = (uint)Stats.ScriptLinesPerSecond; |
365 | sb[20].StatValue = m_scriptLinesPerSecond / statsUpdateFactor; | 408 | sb[20].StatValue = m_scriptLinesPerSecond / m_statsUpdateFactor; |
366 | 409 | ||
367 | sb[21].StatID = (uint)Stats.SimSpareTime; | 410 | sb[21].StatID = (uint)Stats.SimSpareMs; |
368 | sb[21].StatValue = sparetime; | 411 | sb[21].StatValue = m_spareMS / framesUpdated; |
369 | 412 | ||
370 | sb[22].StatID = (uint)Stats.SimSleepTime; | 413 | for (int i = 0; i < 22; i++) |
371 | sb[22].StatValue = sleeptime; | ||
372 | |||
373 | for (int i = 0; i < 23; i++) | ||
374 | { | 414 | { |
375 | lastReportedSimStats[i] = sb[i].StatValue; | 415 | lastReportedSimStats[i] = sb[i].StatValue; |
376 | } | 416 | } |
@@ -387,13 +427,32 @@ namespace OpenSim.Region.Framework.Scenes | |||
387 | } | 427 | } |
388 | 428 | ||
389 | // Extra statistics that aren't currently sent to clients | 429 | // Extra statistics that aren't currently sent to clients |
390 | LastReportedObjectUpdates = m_objectUpdates / statsUpdateFactor; | 430 | lock (m_lastReportedExtraSimStats) |
431 | { | ||
432 | m_lastReportedExtraSimStats[LastReportedObjectUpdateStatName] = m_objectUpdates / m_statsUpdateFactor; | ||
433 | |||
434 | Dictionary<string, float> physicsStats = m_scene.PhysicsScene.GetStats(); | ||
435 | |||
436 | if (physicsStats != null) | ||
437 | { | ||
438 | foreach (KeyValuePair<string, float> tuple in physicsStats) | ||
439 | { | ||
440 | // FIXME: An extremely dirty hack to divide MS stats per frame rather than per second | ||
441 | // Need to change things so that stats source can indicate whether they are per second or | ||
442 | // per frame. | ||
443 | if (tuple.Key.EndsWith("MS")) | ||
444 | m_lastReportedExtraSimStats[tuple.Key] = tuple.Value / framesUpdated; | ||
445 | else | ||
446 | m_lastReportedExtraSimStats[tuple.Key] = tuple.Value / m_statsUpdateFactor; | ||
447 | } | ||
448 | } | ||
449 | } | ||
391 | 450 | ||
392 | resetvalues(); | 451 | ResetValues(); |
393 | } | 452 | } |
394 | } | 453 | } |
395 | 454 | ||
396 | private void resetvalues() | 455 | private void ResetValues() |
397 | { | 456 | { |
398 | m_timeDilation = 0; | 457 | m_timeDilation = 0; |
399 | m_fps = 0; | 458 | m_fps = 0; |
@@ -411,7 +470,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
411 | m_physicsMS = 0; | 470 | m_physicsMS = 0; |
412 | m_imageMS = 0; | 471 | m_imageMS = 0; |
413 | m_otherMS = 0; | 472 | m_otherMS = 0; |
414 | m_sleeptimeMS = 0; | 473 | m_spareMS = 0; |
415 | 474 | ||
416 | //Ckrinke This variable is not used, so comment to remove compiler warning until it is used. | 475 | //Ckrinke This variable is not used, so comment to remove compiler warning until it is used. |
417 | //Ckrinke m_scriptMS = 0; | 476 | //Ckrinke m_scriptMS = 0; |
@@ -433,13 +492,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
433 | m_timeDilation = td; | 492 | m_timeDilation = td; |
434 | } | 493 | } |
435 | 494 | ||
436 | public void SetRootAgents(int rootAgents) | ||
437 | { | ||
438 | m_rootAgents = rootAgents; | ||
439 | CheckStatSanity(); | ||
440 | |||
441 | } | ||
442 | |||
443 | internal void CheckStatSanity() | 495 | internal void CheckStatSanity() |
444 | { | 496 | { |
445 | if (m_rootAgents < 0 || m_childAgents < 0) | 497 | if (m_rootAgents < 0 || m_childAgents < 0) |
@@ -456,22 +508,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
456 | } | 508 | } |
457 | } | 509 | } |
458 | 510 | ||
459 | public void SetChildAgents(int childAgents) | ||
460 | { | ||
461 | m_childAgents = childAgents; | ||
462 | CheckStatSanity(); | ||
463 | } | ||
464 | |||
465 | public void SetObjects(int objects) | ||
466 | { | ||
467 | m_numPrim = objects; | ||
468 | } | ||
469 | |||
470 | public void SetActiveObjects(int objects) | ||
471 | { | ||
472 | m_activePrim = objects; | ||
473 | } | ||
474 | |||
475 | public void AddFPS(int frames) | 511 | public void AddFPS(int frames) |
476 | { | 512 | { |
477 | m_fps += frames; | 513 | m_fps += frames; |
@@ -513,6 +549,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
513 | m_frameMS += ms; | 549 | m_frameMS += ms; |
514 | } | 550 | } |
515 | 551 | ||
552 | public void AddSpareMS(int ms) | ||
553 | { | ||
554 | m_spareMS += ms; | ||
555 | } | ||
556 | |||
516 | public void addNetMS(int ms) | 557 | public void addNetMS(int ms) |
517 | { | 558 | { |
518 | m_netMS += ms; | 559 | m_netMS += ms; |
@@ -538,15 +579,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
538 | m_otherMS += ms; | 579 | m_otherMS += ms; |
539 | } | 580 | } |
540 | 581 | ||
541 | public void addSleepMS(int ms) | ||
542 | { | ||
543 | m_sleeptimeMS += ms; | ||
544 | } | ||
545 | |||
546 | public void AddPendingDownloads(int count) | 582 | public void AddPendingDownloads(int count) |
547 | { | 583 | { |
548 | m_pendingDownloads += count; | 584 | m_pendingDownloads += count; |
549 | if (m_pendingDownloads < 0) m_pendingDownloads = 0; | 585 | |
586 | if (m_pendingDownloads < 0) | ||
587 | m_pendingDownloads = 0; | ||
588 | |||
550 | //m_log.InfoFormat("[stats]: Adding {0} to pending downloads to make {1}", count, m_pendingDownloads); | 589 | //m_log.InfoFormat("[stats]: Adding {0} to pending downloads to make {1}", count, m_pendingDownloads); |
551 | } | 590 | } |
552 | 591 | ||
@@ -555,11 +594,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
555 | m_scriptLinesPerSecond += count; | 594 | m_scriptLinesPerSecond += count; |
556 | } | 595 | } |
557 | 596 | ||
558 | public void SetActiveScripts(int count) | ||
559 | { | ||
560 | m_activeScripts = count; | ||
561 | } | ||
562 | |||
563 | public void AddPacketsStats(int inPackets, int outPackets, int unAckedBytes) | 597 | public void AddPacketsStats(int inPackets, int outPackets, int unAckedBytes) |
564 | { | 598 | { |
565 | AddInPackets(inPackets); | 599 | AddInPackets(inPackets); |
@@ -568,5 +602,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
568 | } | 602 | } |
569 | 603 | ||
570 | #endregion | 604 | #endregion |
605 | |||
606 | public Dictionary<string, float> GetExtraSimStats() | ||
607 | { | ||
608 | lock (m_lastReportedExtraSimStats) | ||
609 | return new Dictionary<string, float>(m_lastReportedExtraSimStats); | ||
610 | } | ||
571 | } | 611 | } |
572 | } | 612 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/BorderTests.cs b/OpenSim/Region/Framework/Scenes/Tests/BorderTests.cs index ab6311b..4a21dc9 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/BorderTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/BorderTests.cs | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.IO; | ||
30 | using System.Text; | 31 | using System.Text; |
31 | using NUnit.Framework; | 32 | using NUnit.Framework; |
32 | using OpenMetaverse; | 33 | using OpenMetaverse; |
@@ -68,11 +69,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
68 | Vector3 position = new Vector3(200,200,21); | 69 | Vector3 position = new Vector3(200,200,21); |
69 | 70 | ||
70 | foreach (Border b in testborders) | 71 | foreach (Border b in testborders) |
71 | { | ||
72 | Assert.That(!b.TestCross(position)); | 72 | Assert.That(!b.TestCross(position)); |
73 | 73 | ||
74 | } | ||
75 | |||
76 | position = new Vector3(200,280,21); | 74 | position = new Vector3(200,280,21); |
77 | Assert.That(NorthBorder.TestCross(position)); | 75 | Assert.That(NorthBorder.TestCross(position)); |
78 | 76 | ||
diff --git a/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs b/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs index a5d2b23..ea9fc93 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs | |||
@@ -45,7 +45,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
45 | { | 45 | { |
46 | static public Random random; | 46 | static public Random random; |
47 | SceneObjectGroup found; | 47 | SceneObjectGroup found; |
48 | Scene scene = SceneHelpers.SetupScene(); | 48 | Scene scene = new SceneHelpers().SetupScene(); |
49 | 49 | ||
50 | [Test] | 50 | [Test] |
51 | public void T010_AddObjects() | 51 | public void T010_AddObjects() |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs index 9a60e50..d23c965 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs | |||
@@ -26,7 +26,9 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.IO; | ||
29 | using System.Reflection; | 30 | using System.Reflection; |
31 | using System.Text; | ||
30 | using NUnit.Framework; | 32 | using NUnit.Framework; |
31 | using OpenMetaverse; | 33 | using OpenMetaverse; |
32 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
@@ -44,7 +46,9 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
44 | public void TestDuplicateObject() | 46 | public void TestDuplicateObject() |
45 | { | 47 | { |
46 | TestHelpers.InMethod(); | 48 | TestHelpers.InMethod(); |
47 | Scene scene = SceneHelpers.SetupScene(); | 49 | // TestHelpers.EnableLogging(); |
50 | |||
51 | Scene scene = new SceneHelpers().SetupScene(); | ||
48 | 52 | ||
49 | UUID ownerId = new UUID("00000000-0000-0000-0000-000000000010"); | 53 | UUID ownerId = new UUID("00000000-0000-0000-0000-000000000010"); |
50 | string part1Name = "part1"; | 54 | string part1Name = "part1"; |
@@ -82,6 +86,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
82 | Assert.That(dupePart1.PhysActor, Is.Not.Null); | 86 | Assert.That(dupePart1.PhysActor, Is.Not.Null); |
83 | Assert.That(dupePart2.PhysActor, Is.Not.Null); | 87 | Assert.That(dupePart2.PhysActor, Is.Not.Null); |
84 | */ | 88 | */ |
89 | |||
90 | // TestHelpers.DisableLogging(); | ||
85 | } | 91 | } |
86 | } | 92 | } |
87 | } \ No newline at end of file | 93 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs index 7737d8e..453e077 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs | |||
@@ -88,7 +88,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
88 | { | 88 | { |
89 | TestHelpers.InMethod(); | 89 | TestHelpers.InMethod(); |
90 | 90 | ||
91 | Scene scene = SceneHelpers.SetupScene(); | 91 | Scene scene = new SceneHelpers().SetupScene(); |
92 | int partsToTestCount = 3; | 92 | int partsToTestCount = 3; |
93 | 93 | ||
94 | SceneObjectGroup so | 94 | SceneObjectGroup so |
@@ -118,7 +118,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
118 | { | 118 | { |
119 | TestHelpers.InMethod(); | 119 | TestHelpers.InMethod(); |
120 | 120 | ||
121 | Scene scene = SceneHelpers.SetupScene(); | 121 | Scene scene = new SceneHelpers().SetupScene(); |
122 | 122 | ||
123 | string obj1Name = "Alfred"; | 123 | string obj1Name = "Alfred"; |
124 | string obj2Name = "Betty"; | 124 | string obj2Name = "Betty"; |
@@ -152,7 +152,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
152 | { | 152 | { |
153 | TestHelpers.InMethod(); | 153 | TestHelpers.InMethod(); |
154 | 154 | ||
155 | Scene scene = SceneHelpers.SetupScene(); | 155 | Scene scene = new SceneHelpers().SetupScene(); |
156 | int partsToTestCount = 3; | 156 | int partsToTestCount = 3; |
157 | 157 | ||
158 | SceneObjectGroup so | 158 | SceneObjectGroup so |
@@ -185,7 +185,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
185 | { | 185 | { |
186 | TestHelpers.InMethod(); | 186 | TestHelpers.InMethod(); |
187 | 187 | ||
188 | TestScene scene = SceneHelpers.SetupScene(); | 188 | TestScene scene = new SceneHelpers().SetupScene(); |
189 | SceneObjectPart part = SceneHelpers.AddSceneObject(scene); | 189 | SceneObjectPart part = SceneHelpers.AddSceneObject(scene); |
190 | scene.DeleteSceneObject(part.ParentGroup, false); | 190 | scene.DeleteSceneObject(part.ParentGroup, false); |
191 | 191 | ||
@@ -204,7 +204,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
204 | 204 | ||
205 | UUID agentId = UUID.Parse("00000000-0000-0000-0000-000000000001"); | 205 | UUID agentId = UUID.Parse("00000000-0000-0000-0000-000000000001"); |
206 | 206 | ||
207 | TestScene scene = SceneHelpers.SetupScene(); | 207 | TestScene scene = new SceneHelpers().SetupScene(); |
208 | 208 | ||
209 | // Turn off the timer on the async sog deleter - we'll crank it by hand for this test. | 209 | // Turn off the timer on the async sog deleter - we'll crank it by hand for this test. |
210 | AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter; | 210 | AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter; |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs index 654b1a2..0076f41 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs | |||
@@ -61,7 +61,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
61 | 61 | ||
62 | UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001"); | 62 | UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001"); |
63 | 63 | ||
64 | TestScene scene = SceneHelpers.SetupScene(); | 64 | TestScene scene = new SceneHelpers().SetupScene(); |
65 | IConfigSource configSource = new IniConfigSource(); | 65 | IConfigSource configSource = new IniConfigSource(); |
66 | IConfig config = configSource.AddConfig("Startup"); | 66 | IConfig config = configSource.AddConfig("Startup"); |
67 | config.Set("serverside_object_permissions", true); | 67 | config.Set("serverside_object_permissions", true); |
@@ -100,7 +100,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
100 | UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001"); | 100 | UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001"); |
101 | UUID objectOwnerId = UUID.Parse("20000000-0000-0000-0000-000000000001"); | 101 | UUID objectOwnerId = UUID.Parse("20000000-0000-0000-0000-000000000001"); |
102 | 102 | ||
103 | TestScene scene = SceneHelpers.SetupScene(); | 103 | TestScene scene = new SceneHelpers().SetupScene(); |
104 | IConfigSource configSource = new IniConfigSource(); | 104 | IConfigSource configSource = new IniConfigSource(); |
105 | IConfig config = configSource.AddConfig("Startup"); | 105 | IConfig config = configSource.AddConfig("Startup"); |
106 | config.Set("serverside_object_permissions", true); | 106 | config.Set("serverside_object_permissions", true); |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs index be5b4a8..1add3dd 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs | |||
@@ -55,7 +55,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
55 | UUID ownerId = TestHelpers.ParseTail(0x1); | 55 | UUID ownerId = TestHelpers.ParseTail(0x1); |
56 | int nParts = 3; | 56 | int nParts = 3; |
57 | 57 | ||
58 | TestScene scene = SceneHelpers.SetupScene(); | 58 | TestScene scene = new SceneHelpers().SetupScene(); |
59 | SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(nParts, ownerId, "TestLinkToSelf_", 0x10); | 59 | SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(nParts, ownerId, "TestLinkToSelf_", 0x10); |
60 | scene.AddSceneObject(sog1); | 60 | scene.AddSceneObject(sog1); |
61 | scene.LinkObjects(ownerId, sog1.LocalId, new List<uint>() { sog1.Parts[1].LocalId }); | 61 | scene.LinkObjects(ownerId, sog1.LocalId, new List<uint>() { sog1.Parts[1].LocalId }); |
@@ -71,7 +71,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
71 | 71 | ||
72 | bool debugtest = false; | 72 | bool debugtest = false; |
73 | 73 | ||
74 | Scene scene = SceneHelpers.SetupScene(); | 74 | Scene scene = new SceneHelpers().SetupScene(); |
75 | SceneObjectPart part1 = SceneHelpers.AddSceneObject(scene); | 75 | SceneObjectPart part1 = SceneHelpers.AddSceneObject(scene); |
76 | SceneObjectGroup grp1 = part1.ParentGroup; | 76 | SceneObjectGroup grp1 = part1.ParentGroup; |
77 | SceneObjectPart part2 = SceneHelpers.AddSceneObject(scene); | 77 | SceneObjectPart part2 = SceneHelpers.AddSceneObject(scene); |
@@ -153,7 +153,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
153 | 153 | ||
154 | bool debugtest = false; | 154 | bool debugtest = false; |
155 | 155 | ||
156 | Scene scene = SceneHelpers.SetupScene(); | 156 | Scene scene = new SceneHelpers().SetupScene(); |
157 | SceneObjectPart part1 = SceneHelpers.AddSceneObject(scene); | 157 | SceneObjectPart part1 = SceneHelpers.AddSceneObject(scene); |
158 | SceneObjectGroup grp1 = part1.ParentGroup; | 158 | SceneObjectGroup grp1 = part1.ParentGroup; |
159 | SceneObjectPart part2 = SceneHelpers.AddSceneObject(scene); | 159 | SceneObjectPart part2 = SceneHelpers.AddSceneObject(scene); |
@@ -286,7 +286,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
286 | TestHelpers.InMethod(); | 286 | TestHelpers.InMethod(); |
287 | //log4net.Config.XmlConfigurator.Configure(); | 287 | //log4net.Config.XmlConfigurator.Configure(); |
288 | 288 | ||
289 | TestScene scene = SceneHelpers.SetupScene(); | 289 | TestScene scene = new SceneHelpers().SetupScene(); |
290 | 290 | ||
291 | string rootPartName = "rootpart"; | 291 | string rootPartName = "rootpart"; |
292 | UUID rootPartUuid = new UUID("00000000-0000-0000-0000-000000000001"); | 292 | UUID rootPartUuid = new UUID("00000000-0000-0000-0000-000000000001"); |
@@ -325,7 +325,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
325 | TestHelpers.InMethod(); | 325 | TestHelpers.InMethod(); |
326 | //log4net.Config.XmlConfigurator.Configure(); | 326 | //log4net.Config.XmlConfigurator.Configure(); |
327 | 327 | ||
328 | TestScene scene = SceneHelpers.SetupScene(); | 328 | TestScene scene = new SceneHelpers().SetupScene(); |
329 | 329 | ||
330 | string rootPartName = "rootpart"; | 330 | string rootPartName = "rootpart"; |
331 | UUID rootPartUuid = new UUID("00000000-0000-0000-0000-000000000001"); | 331 | UUID rootPartUuid = new UUID("00000000-0000-0000-0000-000000000001"); |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectResizeTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectResizeTests.cs index b49c6e7..0a94c19 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectResizeTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectResizeTests.cs | |||
@@ -52,7 +52,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
52 | TestHelpers.InMethod(); | 52 | TestHelpers.InMethod(); |
53 | // log4net.Config.XmlConfigurator.Configure(); | 53 | // log4net.Config.XmlConfigurator.Configure(); |
54 | 54 | ||
55 | Scene scene = SceneHelpers.SetupScene(); | 55 | Scene scene = new SceneHelpers().SetupScene(); |
56 | SceneObjectGroup g1 = SceneHelpers.AddSceneObject(scene).ParentGroup; | 56 | SceneObjectGroup g1 = SceneHelpers.AddSceneObject(scene).ParentGroup; |
57 | 57 | ||
58 | g1.GroupResize(new Vector3(2, 3, 4)); | 58 | g1.GroupResize(new Vector3(2, 3, 4)); |
@@ -75,7 +75,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
75 | TestHelpers.InMethod(); | 75 | TestHelpers.InMethod(); |
76 | //log4net.Config.XmlConfigurator.Configure(); | 76 | //log4net.Config.XmlConfigurator.Configure(); |
77 | 77 | ||
78 | Scene scene = SceneHelpers.SetupScene(); | 78 | Scene scene = new SceneHelpers().SetupScene(); |
79 | 79 | ||
80 | SceneObjectGroup g1 = SceneHelpers.CreateSceneObject(2, UUID.Zero); | 80 | SceneObjectGroup g1 = SceneHelpers.CreateSceneObject(2, UUID.Zero); |
81 | g1.RootPart.Scale = new Vector3(2, 3, 4); | 81 | g1.RootPart.Scale = new Vector3(2, 3, 4); |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectScriptTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectScriptTests.cs index c582cf6..d2361f8 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectScriptTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectScriptTests.cs | |||
@@ -52,7 +52,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
52 | // UUID itemId = TestHelpers.ParseTail(0x2); | 52 | // UUID itemId = TestHelpers.ParseTail(0x2); |
53 | string itemName = "Test Script Item"; | 53 | string itemName = "Test Script Item"; |
54 | 54 | ||
55 | Scene scene = SceneHelpers.SetupScene(); | 55 | Scene scene = new SceneHelpers().SetupScene(); |
56 | SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId); | 56 | SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId); |
57 | scene.AddNewSceneObject(so, true); | 57 | scene.AddNewSceneObject(so, true); |
58 | 58 | ||
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs new file mode 100644 index 0000000..6d255aa --- /dev/null +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectSpatialTests.cs | |||
@@ -0,0 +1,154 @@ | |||
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.Reflection; | ||
30 | using System.Threading; | ||
31 | using NUnit.Framework; | ||
32 | using OpenMetaverse; | ||
33 | using OpenSim.Framework; | ||
34 | using OpenSim.Framework.Communications; | ||
35 | using OpenSim.Region.Framework.Scenes; | ||
36 | using OpenSim.Tests.Common; | ||
37 | using OpenSim.Tests.Common.Mock; | ||
38 | |||
39 | namespace OpenSim.Region.Framework.Scenes.Tests | ||
40 | { | ||
41 | /// <summary> | ||
42 | /// Spatial scene object tests (will eventually cover root and child part position, rotation properties, etc.) | ||
43 | /// </summary> | ||
44 | [TestFixture] | ||
45 | public class SceneObjectSpatialTests | ||
46 | { | ||
47 | TestScene m_scene; | ||
48 | UUID m_ownerId = TestHelpers.ParseTail(0x1); | ||
49 | |||
50 | [SetUp] | ||
51 | public void SetUp() | ||
52 | { | ||
53 | m_scene = new SceneHelpers().SetupScene(); | ||
54 | } | ||
55 | |||
56 | [Test] | ||
57 | public void TestGetSceneObjectGroupPosition() | ||
58 | { | ||
59 | TestHelpers.InMethod(); | ||
60 | |||
61 | Vector3 position = new Vector3(10, 20, 30); | ||
62 | |||
63 | SceneObjectGroup so | ||
64 | = SceneHelpers.CreateSceneObject(1, m_ownerId, "obj1", 0x10); | ||
65 | so.AbsolutePosition = position; | ||
66 | m_scene.AddNewSceneObject(so, false); | ||
67 | |||
68 | Assert.That(so.AbsolutePosition, Is.EqualTo(position)); | ||
69 | } | ||
70 | |||
71 | [Test] | ||
72 | public void TestGetRootPartPosition() | ||
73 | { | ||
74 | TestHelpers.InMethod(); | ||
75 | |||
76 | Vector3 partPosition = new Vector3(10, 20, 30); | ||
77 | |||
78 | SceneObjectGroup so | ||
79 | = SceneHelpers.CreateSceneObject(1, m_ownerId, "obj1", 0x10); | ||
80 | so.AbsolutePosition = partPosition; | ||
81 | m_scene.AddNewSceneObject(so, false); | ||
82 | |||
83 | Assert.That(so.RootPart.AbsolutePosition, Is.EqualTo(partPosition)); | ||
84 | Assert.That(so.RootPart.GroupPosition, Is.EqualTo(partPosition)); | ||
85 | Assert.That(so.RootPart.GetWorldPosition(), Is.EqualTo(partPosition)); | ||
86 | Assert.That(so.RootPart.RelativePosition, Is.EqualTo(partPosition)); | ||
87 | Assert.That(so.RootPart.OffsetPosition, Is.EqualTo(Vector3.Zero)); | ||
88 | } | ||
89 | |||
90 | [Test] | ||
91 | public void TestGetChildPartPosition() | ||
92 | { | ||
93 | TestHelpers.InMethod(); | ||
94 | |||
95 | Vector3 rootPartPosition = new Vector3(10, 20, 30); | ||
96 | Vector3 childOffsetPosition = new Vector3(2, 3, 4); | ||
97 | |||
98 | SceneObjectGroup so | ||
99 | = SceneHelpers.CreateSceneObject(2, m_ownerId, "obj1", 0x10); | ||
100 | so.AbsolutePosition = rootPartPosition; | ||
101 | so.Parts[1].OffsetPosition = childOffsetPosition; | ||
102 | |||
103 | m_scene.AddNewSceneObject(so, false); | ||
104 | |||
105 | // Calculate child absolute position. | ||
106 | Vector3 childPosition = new Vector3(rootPartPosition + childOffsetPosition); | ||
107 | |||
108 | SceneObjectPart childPart = so.Parts[1]; | ||
109 | Assert.That(childPart.AbsolutePosition, Is.EqualTo(childPosition)); | ||
110 | Assert.That(childPart.GroupPosition, Is.EqualTo(rootPartPosition)); | ||
111 | Assert.That(childPart.GetWorldPosition(), Is.EqualTo(childPosition)); | ||
112 | Assert.That(childPart.RelativePosition, Is.EqualTo(childOffsetPosition)); | ||
113 | Assert.That(childPart.OffsetPosition, Is.EqualTo(childOffsetPosition)); | ||
114 | } | ||
115 | |||
116 | [Test] | ||
117 | public void TestGetChildPartPositionAfterObjectRotation() | ||
118 | { | ||
119 | TestHelpers.InMethod(); | ||
120 | |||
121 | Vector3 rootPartPosition = new Vector3(10, 20, 30); | ||
122 | Vector3 childOffsetPosition = new Vector3(2, 3, 4); | ||
123 | |||
124 | SceneObjectGroup so | ||
125 | = SceneHelpers.CreateSceneObject(2, m_ownerId, "obj1", 0x10); | ||
126 | so.AbsolutePosition = rootPartPosition; | ||
127 | so.Parts[1].OffsetPosition = childOffsetPosition; | ||
128 | |||
129 | m_scene.AddNewSceneObject(so, false); | ||
130 | |||
131 | so.UpdateGroupRotationR(Quaternion.CreateFromEulers(0, 0, -90 * Utils.DEG_TO_RAD)); | ||
132 | |||
133 | // Calculate child absolute position. | ||
134 | Vector3 rotatedChildOffsetPosition | ||
135 | = new Vector3(childOffsetPosition.Y, -childOffsetPosition.X, childOffsetPosition.Z); | ||
136 | |||
137 | Vector3 childPosition = new Vector3(rootPartPosition + rotatedChildOffsetPosition); | ||
138 | |||
139 | SceneObjectPart childPart = so.Parts[1]; | ||
140 | |||
141 | // FIXME: Should be childPosition after rotation? | ||
142 | Assert.That(childPart.AbsolutePosition, Is.EqualTo(rootPartPosition + childOffsetPosition)); | ||
143 | |||
144 | Assert.That(childPart.GroupPosition, Is.EqualTo(rootPartPosition)); | ||
145 | Assert.That(childPart.GetWorldPosition(), Is.EqualTo(childPosition)); | ||
146 | |||
147 | // Relative to root part as (0, 0, 0) | ||
148 | Assert.That(childPart.RelativePosition, Is.EqualTo(childOffsetPosition)); | ||
149 | |||
150 | // Relative to root part as (0, 0, 0) | ||
151 | Assert.That(childPart.OffsetPosition, Is.EqualTo(childOffsetPosition)); | ||
152 | } | ||
153 | } | ||
154 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs index 2a342d5..742c769 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectStatusTests.cs | |||
@@ -26,6 +26,7 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | ||
29 | using System.Reflection; | 30 | using System.Reflection; |
30 | using NUnit.Framework; | 31 | using NUnit.Framework; |
31 | using OpenMetaverse; | 32 | using OpenMetaverse; |
@@ -43,24 +44,141 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
43 | [TestFixture] | 44 | [TestFixture] |
44 | public class SceneObjectStatusTests | 45 | public class SceneObjectStatusTests |
45 | { | 46 | { |
47 | private TestScene m_scene; | ||
48 | private UUID m_ownerId = TestHelpers.ParseTail(0x1); | ||
49 | private SceneObjectGroup m_so1; | ||
50 | private SceneObjectGroup m_so2; | ||
51 | |||
52 | [SetUp] | ||
53 | public void Init() | ||
54 | { | ||
55 | m_scene = new SceneHelpers().SetupScene(); | ||
56 | m_so1 = SceneHelpers.CreateSceneObject(1, m_ownerId, "so1", 0x10); | ||
57 | m_so2 = SceneHelpers.CreateSceneObject(1, m_ownerId, "so2", 0x20); | ||
58 | } | ||
59 | |||
46 | [Test] | 60 | [Test] |
47 | public void TestSetPhantom() | 61 | public void TestSetPhantomSinglePrim() |
48 | { | 62 | { |
49 | TestHelpers.InMethod(); | 63 | TestHelpers.InMethod(); |
50 | 64 | ||
51 | // Scene scene = SceneSetupHelpers.SetupScene(); | 65 | m_scene.AddSceneObject(m_so1); |
52 | SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, UUID.Zero); | 66 | |
53 | SceneObjectPart rootPart = so.RootPart; | 67 | SceneObjectPart rootPart = m_so1.RootPart; |
54 | Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); | 68 | Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); |
55 | 69 | ||
56 | so.ScriptSetPhantomStatus(true); | 70 | m_so1.ScriptSetPhantomStatus(true); |
57 | 71 | ||
58 | // Console.WriteLine("so.RootPart.Flags [{0}]", so.RootPart.Flags); | 72 | // Console.WriteLine("so.RootPart.Flags [{0}]", so.RootPart.Flags); |
59 | Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.Phantom)); | 73 | Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.Phantom)); |
60 | 74 | ||
61 | so.ScriptSetPhantomStatus(false); | 75 | m_so1.ScriptSetPhantomStatus(false); |
62 | 76 | ||
63 | Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); | 77 | Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); |
64 | } | 78 | } |
79 | |||
80 | [Test] | ||
81 | public void TestSetPhysicsSinglePrim() | ||
82 | { | ||
83 | TestHelpers.InMethod(); | ||
84 | |||
85 | m_scene.AddSceneObject(m_so1); | ||
86 | |||
87 | SceneObjectPart rootPart = m_so1.RootPart; | ||
88 | Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); | ||
89 | |||
90 | m_so1.ScriptSetPhysicsStatus(true); | ||
91 | |||
92 | // Console.WriteLine("so.RootPart.Flags [{0}]", so.RootPart.Flags); | ||
93 | Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.Physics)); | ||
94 | |||
95 | m_so1.ScriptSetPhysicsStatus(false); | ||
96 | |||
97 | Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None)); | ||
98 | } | ||
99 | |||
100 | [Test] | ||
101 | public void TestSetPhysicsLinkset() | ||
102 | { | ||
103 | TestHelpers.InMethod(); | ||
104 | |||
105 | m_scene.AddSceneObject(m_so1); | ||
106 | m_scene.AddSceneObject(m_so2); | ||
107 | |||
108 | m_scene.LinkObjects(m_ownerId, m_so1.LocalId, new List<uint>() { m_so2.LocalId }); | ||
109 | |||
110 | m_so1.ScriptSetPhysicsStatus(true); | ||
111 | |||
112 | Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics)); | ||
113 | Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics)); | ||
114 | |||
115 | m_so1.ScriptSetPhysicsStatus(false); | ||
116 | |||
117 | Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.None)); | ||
118 | Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.None)); | ||
119 | |||
120 | m_so1.ScriptSetPhysicsStatus(true); | ||
121 | |||
122 | Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics)); | ||
123 | Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics)); | ||
124 | } | ||
125 | |||
126 | /// <summary> | ||
127 | /// Test that linking results in the correct physical status for all linkees. | ||
128 | /// </summary> | ||
129 | [Test] | ||
130 | public void TestLinkPhysicsBothPhysical() | ||
131 | { | ||
132 | TestHelpers.InMethod(); | ||
133 | |||
134 | m_scene.AddSceneObject(m_so1); | ||
135 | m_scene.AddSceneObject(m_so2); | ||
136 | |||
137 | m_so1.ScriptSetPhysicsStatus(true); | ||
138 | m_so2.ScriptSetPhysicsStatus(true); | ||
139 | |||
140 | m_scene.LinkObjects(m_ownerId, m_so1.LocalId, new List<uint>() { m_so2.LocalId }); | ||
141 | |||
142 | Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics)); | ||
143 | Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics)); | ||
144 | } | ||
145 | |||
146 | /// <summary> | ||
147 | /// Test that linking results in the correct physical status for all linkees. | ||
148 | /// </summary> | ||
149 | [Test] | ||
150 | public void TestLinkPhysicsRootPhysicalOnly() | ||
151 | { | ||
152 | TestHelpers.InMethod(); | ||
153 | |||
154 | m_scene.AddSceneObject(m_so1); | ||
155 | m_scene.AddSceneObject(m_so2); | ||
156 | |||
157 | m_so1.ScriptSetPhysicsStatus(true); | ||
158 | |||
159 | m_scene.LinkObjects(m_ownerId, m_so1.LocalId, new List<uint>() { m_so2.LocalId }); | ||
160 | |||
161 | Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics)); | ||
162 | Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics)); | ||
163 | } | ||
164 | |||
165 | /// <summary> | ||
166 | /// Test that linking results in the correct physical status for all linkees. | ||
167 | /// </summary> | ||
168 | [Test] | ||
169 | public void TestLinkPhysicsChildPhysicalOnly() | ||
170 | { | ||
171 | TestHelpers.InMethod(); | ||
172 | |||
173 | m_scene.AddSceneObject(m_so1); | ||
174 | m_scene.AddSceneObject(m_so2); | ||
175 | |||
176 | m_so2.ScriptSetPhysicsStatus(true); | ||
177 | |||
178 | m_scene.LinkObjects(m_ownerId, m_so1.LocalId, new List<uint>() { m_so2.LocalId }); | ||
179 | |||
180 | Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.None)); | ||
181 | Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.None)); | ||
182 | } | ||
65 | } | 183 | } |
66 | } \ No newline at end of file | 184 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectUserGroupTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectUserGroupTests.cs index c13d82e..c7eaff9 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectUserGroupTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectUserGroupTests.cs | |||
@@ -58,7 +58,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
58 | 58 | ||
59 | UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001"); | 59 | UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001"); |
60 | 60 | ||
61 | TestScene scene = SceneHelpers.SetupScene(); | 61 | TestScene scene = new SceneHelpers().SetupScene(); |
62 | IConfigSource configSource = new IniConfigSource(); | 62 | IConfigSource configSource = new IniConfigSource(); |
63 | 63 | ||
64 | IConfig startupConfig = configSource.AddConfig("Startup"); | 64 | IConfig startupConfig = configSource.AddConfig("Startup"); |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs index ed9b179..02c45ef 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs | |||
@@ -67,10 +67,12 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
67 | public void Init() | 67 | public void Init() |
68 | { | 68 | { |
69 | TestHelpers.InMethod(); | 69 | TestHelpers.InMethod(); |
70 | 70 | ||
71 | scene = SceneHelpers.SetupScene("Neighbour x", UUID.Random(), 1000, 1000); | 71 | SceneHelpers sh = new SceneHelpers(); |
72 | scene2 = SceneHelpers.SetupScene("Neighbour x+1", UUID.Random(), 1001, 1000); | 72 | |
73 | scene3 = SceneHelpers.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000); | 73 | scene = sh.SetupScene("Neighbour x", UUID.Random(), 1000, 1000); |
74 | scene2 = sh.SetupScene("Neighbour x+1", UUID.Random(), 1001, 1000); | ||
75 | scene3 = sh.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000); | ||
74 | 76 | ||
75 | ISharedRegionModule interregionComms = new LocalSimulationConnectorModule(); | 77 | ISharedRegionModule interregionComms = new LocalSimulationConnectorModule(); |
76 | interregionComms.Initialise(new IniConfigSource()); | 78 | interregionComms.Initialise(new IniConfigSource()); |
@@ -99,9 +101,9 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
99 | public void TestCloseAgent() | 101 | public void TestCloseAgent() |
100 | { | 102 | { |
101 | TestHelpers.InMethod(); | 103 | TestHelpers.InMethod(); |
102 | // log4net.Config.XmlConfigurator.Configure(); | 104 | // TestHelpers.EnableLogging(); |
103 | 105 | ||
104 | TestScene scene = SceneHelpers.SetupScene(); | 106 | TestScene scene = new SceneHelpers().SetupScene(); |
105 | ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); | 107 | ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); |
106 | 108 | ||
107 | Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(sp.UUID), Is.Not.Null); | 109 | Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(sp.UUID), Is.Not.Null); |
@@ -112,6 +114,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
112 | Assert.That(scene.GetScenePresence(sp.UUID), Is.Null); | 114 | Assert.That(scene.GetScenePresence(sp.UUID), Is.Null); |
113 | Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(sp.UUID), Is.Null); | 115 | Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(sp.UUID), Is.Null); |
114 | Assert.That(scene.AuthenticateHandler.GetAgentCircuits().Count, Is.EqualTo(0)); | 116 | Assert.That(scene.AuthenticateHandler.GetAgentCircuits().Count, Is.EqualTo(0)); |
117 | |||
118 | // TestHelpers.DisableLogging(); | ||
115 | } | 119 | } |
116 | 120 | ||
117 | [Test] | 121 | [Test] |
@@ -126,7 +130,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
126 | IConfig config = configSource.AddConfig("Modules"); | 130 | IConfig config = configSource.AddConfig("Modules"); |
127 | config.Set("SimulationServices", "LocalSimulationConnectorModule"); | 131 | config.Set("SimulationServices", "LocalSimulationConnectorModule"); |
128 | 132 | ||
129 | TestScene scene = SceneHelpers.SetupScene(); | 133 | SceneHelpers sceneHelpers = new SceneHelpers(); |
134 | TestScene scene = sceneHelpers.SetupScene(); | ||
130 | SceneHelpers.SetupSceneModules(scene, configSource, lsc); | 135 | SceneHelpers.SetupSceneModules(scene, configSource, lsc); |
131 | 136 | ||
132 | UUID agentId = TestHelpers.ParseTail(0x01); | 137 | UUID agentId = TestHelpers.ParseTail(0x01); |
@@ -176,8 +181,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
176 | 181 | ||
177 | // UUID agent1Id = UUID.Parse("00000000-0000-0000-0000-000000000001"); | 182 | // UUID agent1Id = UUID.Parse("00000000-0000-0000-0000-000000000001"); |
178 | 183 | ||
179 | TestScene myScene1 = SceneHelpers.SetupScene("Neighbour y", UUID.Random(), 1000, 1000); | 184 | TestScene myScene1 = new SceneHelpers().SetupScene("Neighbour y", UUID.Random(), 1000, 1000); |
180 | TestScene myScene2 = SceneHelpers.SetupScene("Neighbour y + 1", UUID.Random(), 1001, 1000); | 185 | TestScene myScene2 = new SceneHelpers().SetupScene("Neighbour y + 1", UUID.Random(), 1001, 1000); |
181 | 186 | ||
182 | IConfigSource configSource = new IniConfigSource(); | 187 | IConfigSource configSource = new IniConfigSource(); |
183 | IConfig config = configSource.AddConfig("Startup"); | 188 | IConfig config = configSource.AddConfig("Startup"); |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAnimationTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAnimationTests.cs index 89f8007..646e5fa 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAnimationTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAnimationTests.cs | |||
@@ -59,7 +59,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
59 | TestHelpers.InMethod(); | 59 | TestHelpers.InMethod(); |
60 | // log4net.Config.XmlConfigurator.Configure(); | 60 | // log4net.Config.XmlConfigurator.Configure(); |
61 | 61 | ||
62 | TestScene scene = SceneHelpers.SetupScene(); | 62 | TestScene scene = new SceneHelpers().SetupScene(); |
63 | ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); | 63 | ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); |
64 | sp.Flying = true; | 64 | sp.Flying = true; |
65 | sp.PhysicsCollisionUpdate(new CollisionEventUpdate()); | 65 | sp.PhysicsCollisionUpdate(new CollisionEventUpdate()); |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs index cfea10d..1d1ff88 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs | |||
@@ -64,7 +64,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
64 | [SetUp] | 64 | [SetUp] |
65 | public void Init() | 65 | public void Init() |
66 | { | 66 | { |
67 | m_scene = SceneHelpers.SetupScene(); | 67 | m_scene = new SceneHelpers().SetupScene(); |
68 | } | 68 | } |
69 | 69 | ||
70 | [Test] | 70 | [Test] |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs index b7b8db4..313e350 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs | |||
@@ -50,7 +50,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
50 | [SetUp] | 50 | [SetUp] |
51 | public void Init() | 51 | public void Init() |
52 | { | 52 | { |
53 | m_scene = SceneHelpers.SetupScene(); | 53 | m_scene = new SceneHelpers().SetupScene(); |
54 | m_sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1)); | 54 | m_sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1)); |
55 | } | 55 | } |
56 | 56 | ||
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs index bebc10c..a407f01 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs | |||
@@ -34,10 +34,14 @@ using OpenSim.Framework; | |||
34 | using OpenSim.Framework.Communications; | 34 | using OpenSim.Framework.Communications; |
35 | using OpenSim.Framework.Servers; | 35 | using OpenSim.Framework.Servers; |
36 | using OpenSim.Region.Framework.Interfaces; | 36 | using OpenSim.Region.Framework.Interfaces; |
37 | using OpenSim.Region.CoreModules.Framework; | ||
38 | using OpenSim.Region.CoreModules.Framework.EntityTransfer; | ||
37 | using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; | 39 | using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; |
40 | using OpenSim.Region.CoreModules.World.Permissions; | ||
38 | using OpenSim.Tests.Common; | 41 | using OpenSim.Tests.Common; |
39 | using OpenSim.Tests.Common.Mock; | 42 | using OpenSim.Tests.Common.Mock; |
40 | using System.Threading; | 43 | using System.IO; |
44 | using System.Text; | ||
41 | 45 | ||
42 | namespace OpenSim.Region.Framework.Scenes.Tests | 46 | namespace OpenSim.Region.Framework.Scenes.Tests |
43 | { | 47 | { |
@@ -47,145 +51,367 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
47 | [TestFixture] | 51 | [TestFixture] |
48 | public class ScenePresenceTeleportTests | 52 | public class ScenePresenceTeleportTests |
49 | { | 53 | { |
50 | /// <summary> | 54 | [TestFixtureSetUp] |
51 | /// Test a teleport between two regions that are not neighbours and do not share any neighbours in common. | 55 | public void FixtureInit() |
52 | /// </summary> | 56 | { |
53 | /// Does not yet do what is says on the tin. | 57 | // Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread. |
54 | /// Commenting for now | 58 | Util.FireAndForgetMethod = FireAndForgetMethod.RegressionTest; |
55 | //[Test, LongRunning] | 59 | } |
56 | public void TestSimpleNotNeighboursTeleport() | 60 | |
61 | [TestFixtureTearDown] | ||
62 | public void TearDown() | ||
63 | { | ||
64 | // We must set this back afterwards, otherwise later tests will fail since they're expecting multiple | ||
65 | // threads. Possibly, later tests should be rewritten so none of them require async stuff (which regression | ||
66 | // tests really shouldn't). | ||
67 | Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod; | ||
68 | } | ||
69 | |||
70 | [Test] | ||
71 | public void TestSameRegionTeleport() | ||
57 | { | 72 | { |
58 | TestHelpers.InMethod(); | 73 | TestHelpers.InMethod(); |
59 | ThreadRunResults results = new ThreadRunResults(); | 74 | // log4net.Config.XmlConfigurator.Configure(); |
60 | results.Result = false; | 75 | |
61 | results.Message = "Test did not run"; | 76 | EntityTransferModule etm = new EntityTransferModule(); |
62 | TestRunning testClass = new TestRunning(results); | 77 | |
78 | IConfigSource config = new IniConfigSource(); | ||
79 | config.AddConfig("Modules"); | ||
80 | // Not strictly necessary since FriendsModule assumes it is the default (!) | ||
81 | config.Configs["Modules"].Set("EntityTransferModule", etm.Name); | ||
82 | |||
83 | TestScene scene = new SceneHelpers().SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); | ||
84 | SceneHelpers.SetupSceneModules(scene, config, etm); | ||
85 | |||
86 | Vector3 teleportPosition = new Vector3(10, 11, 12); | ||
87 | Vector3 teleportLookAt = new Vector3(20, 21, 22); | ||
88 | |||
89 | ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); | ||
90 | sp.AbsolutePosition = new Vector3(30, 31, 32); | ||
91 | scene.RequestTeleportLocation( | ||
92 | sp.ControllingClient, | ||
93 | scene.RegionInfo.RegionHandle, | ||
94 | teleportPosition, | ||
95 | teleportLookAt, | ||
96 | (uint)TeleportFlags.ViaLocation); | ||
63 | 97 | ||
64 | Thread testThread = new Thread(testClass.run); | 98 | Assert.That(sp.AbsolutePosition, Is.EqualTo(teleportPosition)); |
65 | 99 | ||
66 | // Seems kind of redundant to start a thread and then join it, however.. We need to protect against | 100 | Assert.That(scene.GetRootAgentCount(), Is.EqualTo(1)); |
67 | // A thread abort exception in the simulator code. | 101 | Assert.That(scene.GetChildAgentCount(), Is.EqualTo(0)); |
68 | testThread.Start(); | ||
69 | testThread.Join(); | ||
70 | 102 | ||
71 | Assert.That(testClass.results.Result, Is.EqualTo(true), testClass.results.Message); | 103 | // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera |
72 | // Console.WriteLine("Beginning test {0}", MethodBase.GetCurrentMethod()); | 104 | // position instead). |
105 | // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); | ||
73 | } | 106 | } |
74 | 107 | ||
75 | [TearDown] | 108 | [Test] |
76 | public void TearDown() | 109 | public void TestSameSimulatorSeparatedRegionsTeleport() |
77 | { | 110 | { |
78 | try | 111 | TestHelpers.InMethod(); |
79 | { | 112 | // log4net.Config.XmlConfigurator.Configure(); |
80 | if (MainServer.Instance != null) MainServer.Instance.Stop(); | 113 | |
81 | } | 114 | UUID userId = TestHelpers.ParseTail(0x1); |
82 | catch (NullReferenceException) | 115 | |
83 | { } | 116 | EntityTransferModule etmA = new EntityTransferModule(); |
117 | EntityTransferModule etmB = new EntityTransferModule(); | ||
118 | LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); | ||
119 | |||
120 | IConfigSource config = new IniConfigSource(); | ||
121 | IConfig modulesConfig = config.AddConfig("Modules"); | ||
122 | modulesConfig.Set("EntityTransferModule", etmA.Name); | ||
123 | modulesConfig.Set("SimulationServices", lscm.Name); | ||
124 | IConfig entityTransferConfig = config.AddConfig("EntityTransfer"); | ||
125 | |||
126 | // In order to run a single threaded regression test we do not want the entity transfer module waiting | ||
127 | // for a callback from the destination scene before removing its avatar data. | ||
128 | entityTransferConfig.Set("wait_for_callback", false); | ||
129 | |||
130 | SceneHelpers sh = new SceneHelpers(); | ||
131 | TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); | ||
132 | TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000); | ||
133 | |||
134 | SceneHelpers.SetupSceneModules(sceneA, config, etmA); | ||
135 | SceneHelpers.SetupSceneModules(sceneB, config, etmB); | ||
136 | SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm); | ||
137 | |||
138 | Vector3 teleportPosition = new Vector3(10, 11, 12); | ||
139 | Vector3 teleportLookAt = new Vector3(20, 21, 22); | ||
140 | |||
141 | ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager); | ||
142 | sp.AbsolutePosition = new Vector3(30, 31, 32); | ||
143 | |||
144 | // XXX: A very nasty hack to tell the client about the destination scene without having to crank the whole | ||
145 | // UDP stack (?) | ||
146 | // ((TestClient)sp.ControllingClient).TeleportTargetScene = sceneB; | ||
147 | |||
148 | sceneA.RequestTeleportLocation( | ||
149 | sp.ControllingClient, | ||
150 | sceneB.RegionInfo.RegionHandle, | ||
151 | teleportPosition, | ||
152 | teleportLookAt, | ||
153 | (uint)TeleportFlags.ViaLocation); | ||
154 | |||
155 | ((TestClient)sp.ControllingClient).CompleteTeleportClientSide(); | ||
156 | |||
157 | Assert.That(sceneA.GetScenePresence(userId), Is.Null); | ||
158 | |||
159 | ScenePresence sceneBSp = sceneB.GetScenePresence(userId); | ||
160 | Assert.That(sceneBSp, Is.Not.Null); | ||
161 | Assert.That(sceneBSp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneB.RegionInfo.RegionName)); | ||
162 | Assert.That(sceneBSp.AbsolutePosition, Is.EqualTo(teleportPosition)); | ||
163 | |||
164 | Assert.That(sceneA.GetRootAgentCount(), Is.EqualTo(0)); | ||
165 | Assert.That(sceneA.GetChildAgentCount(), Is.EqualTo(0)); | ||
166 | Assert.That(sceneB.GetRootAgentCount(), Is.EqualTo(1)); | ||
167 | Assert.That(sceneB.GetChildAgentCount(), Is.EqualTo(0)); | ||
168 | |||
169 | // TODO: Add assertions to check correct circuit details in both scenes. | ||
170 | |||
171 | // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera | ||
172 | // position instead). | ||
173 | // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); | ||
84 | } | 174 | } |
85 | 175 | ||
86 | } | 176 | /// <summary> |
177 | /// Test teleport procedures when the target simulator returns false when queried about access. | ||
178 | /// </summary> | ||
179 | [Test] | ||
180 | public void TestSameSimulatorSeparatedRegionsQueryAccessFails() | ||
181 | { | ||
182 | TestHelpers.InMethod(); | ||
183 | // TestHelpers.EnableLogging(); | ||
87 | 184 | ||
88 | public class ThreadRunResults | 185 | UUID userId = TestHelpers.ParseTail(0x1); |
89 | { | 186 | Vector3 preTeleportPosition = new Vector3(30, 31, 32); |
90 | public bool Result = false; | ||
91 | public string Message = string.Empty; | ||
92 | } | ||
93 | 187 | ||
94 | public class TestRunning | 188 | EntityTransferModule etmA = new EntityTransferModule(); |
95 | { | 189 | EntityTransferModule etmB = new EntityTransferModule(); |
96 | public ThreadRunResults results; | 190 | |
97 | public TestRunning(ThreadRunResults t) | 191 | LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); |
192 | |||
193 | IConfigSource config = new IniConfigSource(); | ||
194 | config.AddConfig("Modules"); | ||
195 | config.Configs["Modules"].Set("EntityTransferModule", etmA.Name); | ||
196 | config.Configs["Modules"].Set("SimulationServices", lscm.Name); | ||
197 | |||
198 | config.AddConfig("EntityTransfer"); | ||
199 | |||
200 | // In order to run a single threaded regression test we do not want the entity transfer module waiting | ||
201 | // for a callback from the destination scene before removing its avatar data. | ||
202 | config.Configs["EntityTransfer"].Set("wait_for_callback", false); | ||
203 | |||
204 | config.AddConfig("Startup"); | ||
205 | config.Configs["Startup"].Set("serverside_object_permissions", true); | ||
206 | |||
207 | SceneHelpers sh = new SceneHelpers(); | ||
208 | TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); | ||
209 | TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000); | ||
210 | |||
211 | SceneHelpers.SetupSceneModules(sceneA, config, etmA ); | ||
212 | |||
213 | // We need to set up the permisions module on scene B so that our later use of agent limit to deny | ||
214 | // QueryAccess won't succeed anyway because administrators are always allowed in and the default | ||
215 | // IsAdministrator if no permissions module is present is true. | ||
216 | SceneHelpers.SetupSceneModules(sceneB, config, new object[] { new PermissionsModule(), etmB }); | ||
217 | |||
218 | // Shared scene modules | ||
219 | SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm); | ||
220 | |||
221 | Vector3 teleportPosition = new Vector3(10, 11, 12); | ||
222 | Vector3 teleportLookAt = new Vector3(20, 21, 22); | ||
223 | |||
224 | ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager); | ||
225 | sp.AbsolutePosition = preTeleportPosition; | ||
226 | |||
227 | // Make sceneB return false on query access | ||
228 | sceneB.RegionInfo.RegionSettings.AgentLimit = 0; | ||
229 | |||
230 | sceneA.RequestTeleportLocation( | ||
231 | sp.ControllingClient, | ||
232 | sceneB.RegionInfo.RegionHandle, | ||
233 | teleportPosition, | ||
234 | teleportLookAt, | ||
235 | (uint)TeleportFlags.ViaLocation); | ||
236 | |||
237 | // ((TestClient)sp.ControllingClient).CompleteTeleportClientSide(); | ||
238 | |||
239 | Assert.That(sceneB.GetScenePresence(userId), Is.Null); | ||
240 | |||
241 | ScenePresence sceneASp = sceneA.GetScenePresence(userId); | ||
242 | Assert.That(sceneASp, Is.Not.Null); | ||
243 | Assert.That(sceneASp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneA.RegionInfo.RegionName)); | ||
244 | Assert.That(sceneASp.AbsolutePosition, Is.EqualTo(preTeleportPosition)); | ||
245 | |||
246 | Assert.That(sceneA.GetRootAgentCount(), Is.EqualTo(1)); | ||
247 | Assert.That(sceneA.GetChildAgentCount(), Is.EqualTo(0)); | ||
248 | Assert.That(sceneB.GetRootAgentCount(), Is.EqualTo(0)); | ||
249 | Assert.That(sceneB.GetChildAgentCount(), Is.EqualTo(0)); | ||
250 | |||
251 | // TODO: Add assertions to check correct circuit details in both scenes. | ||
252 | |||
253 | // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera | ||
254 | // position instead). | ||
255 | // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); | ||
256 | |||
257 | // TestHelpers.DisableLogging(); | ||
258 | } | ||
259 | |||
260 | /// <summary> | ||
261 | /// Test teleport procedures when the target simulator create agent step is refused. | ||
262 | /// </summary> | ||
263 | [Test] | ||
264 | public void TestSameSimulatorSeparatedRegionsCreateAgentFails() | ||
98 | { | 265 | { |
99 | results = t; | 266 | TestHelpers.InMethod(); |
267 | // TestHelpers.EnableLogging(); | ||
268 | |||
269 | UUID userId = TestHelpers.ParseTail(0x1); | ||
270 | Vector3 preTeleportPosition = new Vector3(30, 31, 32); | ||
271 | |||
272 | EntityTransferModule etmA = new EntityTransferModule(); | ||
273 | EntityTransferModule etmB = new EntityTransferModule(); | ||
274 | LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); | ||
275 | |||
276 | IConfigSource config = new IniConfigSource(); | ||
277 | config.AddConfig("Modules"); | ||
278 | config.Configs["Modules"].Set("EntityTransferModule", etmA.Name); | ||
279 | config.Configs["Modules"].Set("SimulationServices", lscm.Name); | ||
280 | |||
281 | config.AddConfig("EntityTransfer"); | ||
282 | |||
283 | // In order to run a single threaded regression test we do not want the entity transfer module waiting | ||
284 | // for a callback from the destination scene before removing its avatar data. | ||
285 | config.Configs["EntityTransfer"].Set("wait_for_callback", false); | ||
286 | |||
287 | SceneHelpers sh = new SceneHelpers(); | ||
288 | TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); | ||
289 | TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000); | ||
290 | |||
291 | SceneHelpers.SetupSceneModules(sceneA, config, etmA); | ||
292 | SceneHelpers.SetupSceneModules(sceneB, config, etmB); | ||
293 | |||
294 | // Shared scene modules | ||
295 | SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm); | ||
296 | |||
297 | Vector3 teleportPosition = new Vector3(10, 11, 12); | ||
298 | Vector3 teleportLookAt = new Vector3(20, 21, 22); | ||
299 | |||
300 | ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager); | ||
301 | sp.AbsolutePosition = preTeleportPosition; | ||
302 | |||
303 | // Make sceneB refuse CreateAgent | ||
304 | sceneB.LoginsDisabled = true; | ||
305 | |||
306 | sceneA.RequestTeleportLocation( | ||
307 | sp.ControllingClient, | ||
308 | sceneB.RegionInfo.RegionHandle, | ||
309 | teleportPosition, | ||
310 | teleportLookAt, | ||
311 | (uint)TeleportFlags.ViaLocation); | ||
312 | |||
313 | // ((TestClient)sp.ControllingClient).CompleteTeleportClientSide(); | ||
314 | |||
315 | Assert.That(sceneB.GetScenePresence(userId), Is.Null); | ||
316 | |||
317 | ScenePresence sceneASp = sceneA.GetScenePresence(userId); | ||
318 | Assert.That(sceneASp, Is.Not.Null); | ||
319 | Assert.That(sceneASp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneA.RegionInfo.RegionName)); | ||
320 | Assert.That(sceneASp.AbsolutePosition, Is.EqualTo(preTeleportPosition)); | ||
321 | |||
322 | Assert.That(sceneA.GetRootAgentCount(), Is.EqualTo(1)); | ||
323 | Assert.That(sceneA.GetChildAgentCount(), Is.EqualTo(0)); | ||
324 | Assert.That(sceneB.GetRootAgentCount(), Is.EqualTo(0)); | ||
325 | Assert.That(sceneB.GetChildAgentCount(), Is.EqualTo(0)); | ||
326 | |||
327 | // TODO: Add assertions to check correct circuit details in both scenes. | ||
328 | |||
329 | // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera | ||
330 | // position instead). | ||
331 | // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); | ||
332 | |||
333 | // TestHelpers.DisableLogging(); | ||
100 | } | 334 | } |
101 | public void run(object o) | 335 | |
336 | [Test] | ||
337 | public void TestSameSimulatorNeighbouringRegionsTeleport() | ||
102 | { | 338 | { |
103 | 339 | TestHelpers.InMethod(); | |
104 | //results.Result = true; | 340 | // TestHelpers.EnableLogging(); |
105 | log4net.Config.XmlConfigurator.Configure(); | 341 | |
106 | 342 | UUID userId = TestHelpers.ParseTail(0x1); | |
107 | UUID sceneAId = UUID.Parse("00000000-0000-0000-0000-000000000100"); | 343 | |
108 | UUID sceneBId = UUID.Parse("00000000-0000-0000-0000-000000000200"); | 344 | EntityTransferModule etmA = new EntityTransferModule(); |
109 | 345 | EntityTransferModule etmB = new EntityTransferModule(); | |
110 | // shared module | 346 | LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); |
111 | ISharedRegionModule interregionComms = new LocalSimulationConnectorModule(); | 347 | |
112 | 348 | IConfigSource config = new IniConfigSource(); | |
113 | 349 | IConfig modulesConfig = config.AddConfig("Modules"); | |
114 | Scene sceneB = SceneHelpers.SetupScene("sceneB", sceneBId, 1010, 1010); | 350 | modulesConfig.Set("EntityTransferModule", etmA.Name); |
115 | SceneHelpers.SetupSceneModules(sceneB, new IniConfigSource(), interregionComms); | 351 | modulesConfig.Set("SimulationServices", lscm.Name); |
116 | sceneB.RegisterRegionWithGrid(); | 352 | IConfig entityTransferConfig = config.AddConfig("EntityTransfer"); |
117 | 353 | ||
118 | Scene sceneA = SceneHelpers.SetupScene("sceneA", sceneAId, 1000, 1000); | 354 | // In order to run a single threaded regression test we do not want the entity transfer module waiting |
119 | SceneHelpers.SetupSceneModules(sceneA, new IniConfigSource(), interregionComms); | 355 | // for a callback from the destination scene before removing its avatar data. |
120 | sceneA.RegisterRegionWithGrid(); | 356 | entityTransferConfig.Set("wait_for_callback", false); |
121 | 357 | ||
122 | UUID agentId = UUID.Parse("00000000-0000-0000-0000-000000000041"); | 358 | SceneHelpers sh = new SceneHelpers(); |
123 | TestClient client = (TestClient)SceneHelpers.AddScenePresence(sceneA, agentId).ControllingClient; | 359 | TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); |
124 | 360 | TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1001, 1000); | |
125 | ICapabilitiesModule sceneACapsModule = sceneA.RequestModuleInterface<ICapabilitiesModule>(); | 361 | |
126 | 362 | SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm); | |
127 | results.Result = (sceneACapsModule.GetCapsPath(agentId) == client.CapsSeedUrl); | 363 | SceneHelpers.SetupSceneModules(sceneA, config, new CapabilitiesModule(), etmA); |
128 | 364 | SceneHelpers.SetupSceneModules(sceneB, config, new CapabilitiesModule(), etmB); | |
129 | if (!results.Result) | 365 | |
130 | { | 366 | Vector3 teleportPosition = new Vector3(10, 11, 12); |
131 | results.Message = "Incorrect caps object path set up in sceneA"; | 367 | Vector3 teleportLookAt = new Vector3(20, 21, 22); |
132 | return; | 368 | |
133 | } | 369 | ScenePresence originalSp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager); |
134 | 370 | originalSp.AbsolutePosition = new Vector3(30, 31, 32); | |
135 | /* | 371 | |
136 | Assert.That( | 372 | ScenePresence beforeSceneASp = sceneA.GetScenePresence(userId); |
137 | sceneACapsModule.GetCapsPath(agentId), | 373 | Assert.That(beforeSceneASp, Is.Not.Null); |
138 | Is.EqualTo(client.CapsSeedUrl), | 374 | Assert.That(beforeSceneASp.IsChildAgent, Is.False); |
139 | "Incorrect caps object path set up in sceneA"); | 375 | |
140 | */ | 376 | ScenePresence beforeSceneBSp = sceneB.GetScenePresence(userId); |
141 | // FIXME: This is a hack to get the test working - really the normal OpenSim mechanisms should be used. | 377 | Assert.That(beforeSceneBSp, Is.Not.Null); |
142 | 378 | Assert.That(beforeSceneBSp.IsChildAgent, Is.True); | |
143 | 379 | ||
144 | client.TeleportTargetScene = sceneB; | 380 | // XXX: A very nasty hack to tell the client about the destination scene without having to crank the whole |
145 | client.Teleport(sceneB.RegionInfo.RegionHandle, new Vector3(100, 100, 100), new Vector3(40, 40, 40)); | 381 | // UDP stack (?) |
146 | 382 | // ((TestClient)beforeSceneASp.ControllingClient).TeleportTargetScene = sceneB; | |
147 | results.Result = (sceneB.GetScenePresence(agentId) != null); | 383 | |
148 | if (!results.Result) | 384 | sceneA.RequestTeleportLocation( |
149 | { | 385 | beforeSceneASp.ControllingClient, |
150 | results.Message = "Client does not have an agent in sceneB"; | 386 | sceneB.RegionInfo.RegionHandle, |
151 | return; | 387 | teleportPosition, |
152 | } | 388 | teleportLookAt, |
153 | 389 | (uint)TeleportFlags.ViaLocation); | |
154 | //Assert.That(sceneB.GetScenePresence(agentId), Is.Not.Null, "Client does not have an agent in sceneB"); | 390 | |
155 | 391 | ((TestClient)beforeSceneASp.ControllingClient).CompleteTeleportClientSide(); | |
156 | //Assert.That(sceneA.GetScenePresence(agentId), Is.Null, "Client still had an agent in sceneA"); | 392 | |
157 | 393 | ScenePresence afterSceneASp = sceneA.GetScenePresence(userId); | |
158 | results.Result = (sceneA.GetScenePresence(agentId) == null); | 394 | Assert.That(afterSceneASp, Is.Not.Null); |
159 | if (!results.Result) | 395 | Assert.That(afterSceneASp.IsChildAgent, Is.True); |
160 | { | 396 | |
161 | results.Message = "Client still had an agent in sceneA"; | 397 | ScenePresence afterSceneBSp = sceneB.GetScenePresence(userId); |
162 | return; | 398 | Assert.That(afterSceneBSp, Is.Not.Null); |
163 | } | 399 | Assert.That(afterSceneBSp.IsChildAgent, Is.False); |
164 | 400 | Assert.That(afterSceneBSp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneB.RegionInfo.RegionName)); | |
165 | ICapabilitiesModule sceneBCapsModule = sceneB.RequestModuleInterface<ICapabilitiesModule>(); | 401 | Assert.That(afterSceneBSp.AbsolutePosition, Is.EqualTo(teleportPosition)); |
166 | 402 | ||
167 | 403 | Assert.That(sceneA.GetRootAgentCount(), Is.EqualTo(0)); | |
168 | results.Result = ("http://" + sceneB.RegionInfo.ExternalHostName + ":" + sceneB.RegionInfo.HttpPort + | 404 | Assert.That(sceneA.GetChildAgentCount(), Is.EqualTo(1)); |
169 | "/CAPS/" + sceneBCapsModule.GetCapsPath(agentId) + "0000/" == client.CapsSeedUrl); | 405 | Assert.That(sceneB.GetRootAgentCount(), Is.EqualTo(1)); |
170 | if (!results.Result) | 406 | Assert.That(sceneB.GetChildAgentCount(), Is.EqualTo(0)); |
171 | { | 407 | |
172 | results.Message = "Incorrect caps object path set up in sceneB"; | 408 | // TODO: Add assertions to check correct circuit details in both scenes. |
173 | return; | 409 | |
174 | } | 410 | // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera |
175 | 411 | // position instead). | |
176 | // Temporary assertion - caps url construction should at least be doable through a method. | 412 | // Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); |
177 | /* | 413 | |
178 | Assert.That( | 414 | // TestHelpers.DisableLogging(); |
179 | "http://" + sceneB.RegionInfo.ExternalHostName + ":" + sceneB.RegionInfo.HttpPort + "/CAPS/" + sceneBCapsModule.GetCapsPath(agentId) + "0000/", | ||
180 | Is.EqualTo(client.CapsSeedUrl), | ||
181 | "Incorrect caps object path set up in sceneB"); | ||
182 | */ | ||
183 | // This assertion will currently fail since we don't remove the caps paths when no longer needed | ||
184 | //Assert.That(sceneACapsModule.GetCapsPath(agentId), Is.Null, "sceneA still had a caps object path"); | ||
185 | |||
186 | // TODO: Check that more of everything is as it should be | ||
187 | |||
188 | // TODO: test what happens if we try to teleport to a region that doesn't exist | ||
189 | } | 415 | } |
190 | } | 416 | } |
191 | } | 417 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs index 5c9a77d..d722a09 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs | |||
@@ -60,7 +60,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
60 | { | 60 | { |
61 | TestHelpers.InMethod(); | 61 | TestHelpers.InMethod(); |
62 | 62 | ||
63 | Scene scene = SceneHelpers.SetupScene(); | 63 | Scene scene = new SceneHelpers().SetupScene(); |
64 | scene.Update(1); | 64 | scene.Update(1); |
65 | 65 | ||
66 | Assert.That(scene.Frame, Is.EqualTo(1)); | 66 | Assert.That(scene.Frame, Is.EqualTo(1)); |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs index 55c80f5..d15141b 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs | |||
@@ -58,7 +58,7 @@ namespace OpenSim.Region.Framework.Tests | |||
58 | TestHelpers.InMethod(); | 58 | TestHelpers.InMethod(); |
59 | // log4net.Config.XmlConfigurator.Configure(); | 59 | // log4net.Config.XmlConfigurator.Configure(); |
60 | 60 | ||
61 | Scene scene = SceneHelpers.SetupScene(); | 61 | Scene scene = new SceneHelpers().SetupScene(); |
62 | UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); | 62 | UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); |
63 | SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); | 63 | SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); |
64 | SceneObjectPart sop1 = sog1.RootPart; | 64 | SceneObjectPart sop1 = sog1.RootPart; |
@@ -81,7 +81,7 @@ namespace OpenSim.Region.Framework.Tests | |||
81 | TestHelpers.InMethod(); | 81 | TestHelpers.InMethod(); |
82 | // log4net.Config.XmlConfigurator.Configure(); | 82 | // log4net.Config.XmlConfigurator.Configure(); |
83 | 83 | ||
84 | Scene scene = SceneHelpers.SetupScene(); | 84 | Scene scene = new SceneHelpers().SetupScene(); |
85 | UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); | 85 | UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); |
86 | SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); | 86 | SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); |
87 | SceneObjectPart sop1 = sog1.RootPart; | 87 | SceneObjectPart sop1 = sog1.RootPart; |
@@ -124,7 +124,7 @@ namespace OpenSim.Region.Framework.Tests | |||
124 | TestHelpers.InMethod(); | 124 | TestHelpers.InMethod(); |
125 | // log4net.Config.XmlConfigurator.Configure(); | 125 | // log4net.Config.XmlConfigurator.Configure(); |
126 | 126 | ||
127 | Scene scene = SceneHelpers.SetupScene(); | 127 | Scene scene = new SceneHelpers().SetupScene(); |
128 | UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); | 128 | UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); |
129 | SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); | 129 | SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); |
130 | SceneObjectPart sop1 = sog1.RootPart; | 130 | SceneObjectPart sop1 = sog1.RootPart; |
@@ -153,7 +153,7 @@ namespace OpenSim.Region.Framework.Tests | |||
153 | TestHelpers.InMethod(); | 153 | TestHelpers.InMethod(); |
154 | // log4net.Config.XmlConfigurator.Configure(); | 154 | // log4net.Config.XmlConfigurator.Configure(); |
155 | 155 | ||
156 | Scene scene = SceneHelpers.SetupScene(); | 156 | Scene scene = new SceneHelpers().SetupScene(); |
157 | UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); | 157 | UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene); |
158 | SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); | 158 | SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, user1.PrincipalID); |
159 | SceneObjectPart sop1 = sog1.RootPart; | 159 | SceneObjectPart sop1 = sog1.RootPart; |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/UserInventoryTests.cs b/OpenSim/Region/Framework/Scenes/Tests/UserInventoryTests.cs index 55fc1e7..44d2d45 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/UserInventoryTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/UserInventoryTests.cs | |||
@@ -58,7 +58,7 @@ namespace OpenSim.Region.Framework.Tests | |||
58 | TestHelpers.InMethod(); | 58 | TestHelpers.InMethod(); |
59 | // log4net.Config.XmlConfigurator.Configure(); | 59 | // log4net.Config.XmlConfigurator.Configure(); |
60 | 60 | ||
61 | Scene scene = SceneHelpers.SetupScene(); | 61 | Scene scene = new SceneHelpers().SetupScene(); |
62 | UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1001)); | 62 | UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1001)); |
63 | UserAccount user2 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1002)); | 63 | UserAccount user2 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1002)); |
64 | InventoryItemBase item1 = UserInventoryHelpers.CreateInventoryItem(scene, "item1", user1.PrincipalID); | 64 | InventoryItemBase item1 = UserInventoryHelpers.CreateInventoryItem(scene, "item1", user1.PrincipalID); |
@@ -85,7 +85,7 @@ namespace OpenSim.Region.Framework.Tests | |||
85 | TestHelpers.InMethod(); | 85 | TestHelpers.InMethod(); |
86 | // log4net.Config.XmlConfigurator.Configure(); | 86 | // log4net.Config.XmlConfigurator.Configure(); |
87 | 87 | ||
88 | Scene scene = SceneHelpers.SetupScene(); | 88 | Scene scene = new SceneHelpers().SetupScene(); |
89 | UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1001)); | 89 | UserAccount user1 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1001)); |
90 | UserAccount user2 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1002)); | 90 | UserAccount user2 = UserAccountHelpers.CreateUserWithInventory(scene, TestHelpers.ParseTail(1002)); |
91 | InventoryFolderBase folder1 | 91 | InventoryFolderBase folder1 |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs b/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs index d9fe87c..198e487 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs | |||
@@ -47,7 +47,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
47 | public void Init() | 47 | public void Init() |
48 | { | 48 | { |
49 | // FIXME: We don't need a full scene here - it would be enough to set up the asset service. | 49 | // FIXME: We don't need a full scene here - it would be enough to set up the asset service. |
50 | Scene scene = SceneHelpers.SetupScene(); | 50 | Scene scene = new SceneHelpers().SetupScene(); |
51 | m_assetService = scene.AssetService; | 51 | m_assetService = scene.AssetService; |
52 | m_uuidGatherer = new UuidGatherer(m_assetService); | 52 | m_uuidGatherer = new UuidGatherer(m_assetService); |
53 | } | 53 | } |
diff --git a/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs b/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs new file mode 100644 index 0000000..1b9e3ac --- /dev/null +++ b/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs | |||
@@ -0,0 +1,195 @@ | |||
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.Linq; | ||
31 | using System.Reflection; | ||
32 | using System.Text; | ||
33 | using log4net; | ||
34 | using Mono.Addins; | ||
35 | using Nini.Config; | ||
36 | using OpenMetaverse; | ||
37 | using OpenSim.Framework; | ||
38 | using OpenSim.Framework.Console; | ||
39 | using OpenSim.Framework.Statistics; | ||
40 | using OpenSim.Region.ClientStack.LindenUDP; | ||
41 | using OpenSim.Region.Framework.Interfaces; | ||
42 | using OpenSim.Region.Framework.Scenes; | ||
43 | |||
44 | namespace OpenSim.Region.OptionalModules.Avatar.Attachments | ||
45 | { | ||
46 | /// <summary> | ||
47 | /// A module that just holds commands for inspecting avatar appearance. | ||
48 | /// </summary> | ||
49 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "AttachmentsCommandModule")] | ||
50 | public class AttachmentsCommandModule : ISharedRegionModule | ||
51 | { | ||
52 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
53 | |||
54 | private List<Scene> m_scenes = new List<Scene>(); | ||
55 | // private IAvatarFactoryModule m_avatarFactory; | ||
56 | |||
57 | public string Name { get { return "Attachments Command Module"; } } | ||
58 | |||
59 | public Type ReplaceableInterface { get { return null; } } | ||
60 | |||
61 | public void Initialise(IConfigSource source) | ||
62 | { | ||
63 | // m_log.DebugFormat("[ATTACHMENTS COMMAND MODULE]: INITIALIZED MODULE"); | ||
64 | } | ||
65 | |||
66 | public void PostInitialise() | ||
67 | { | ||
68 | // m_log.DebugFormat("[ATTACHMENTS COMMAND MODULE]: POST INITIALIZED MODULE"); | ||
69 | } | ||
70 | |||
71 | public void Close() | ||
72 | { | ||
73 | // m_log.DebugFormat("[ATTACHMENTS COMMAND MODULE]: CLOSED MODULE"); | ||
74 | } | ||
75 | |||
76 | public void AddRegion(Scene scene) | ||
77 | { | ||
78 | // m_log.DebugFormat("[ATTACHMENTS COMMAND MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName); | ||
79 | } | ||
80 | |||
81 | public void RemoveRegion(Scene scene) | ||
82 | { | ||
83 | // m_log.DebugFormat("[ATTACHMENTS COMMAND MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName); | ||
84 | |||
85 | lock (m_scenes) | ||
86 | m_scenes.Remove(scene); | ||
87 | } | ||
88 | |||
89 | public void RegionLoaded(Scene scene) | ||
90 | { | ||
91 | // m_log.DebugFormat("[ATTACHMENTS COMMAND MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); | ||
92 | |||
93 | lock (m_scenes) | ||
94 | m_scenes.Add(scene); | ||
95 | |||
96 | scene.AddCommand( | ||
97 | "Users", this, "attachments show", | ||
98 | "attachments show [<first-name> <last-name>]", | ||
99 | "Show attachment information for avatars in this simulator.", | ||
100 | HandleShowAttachmentsCommand); | ||
101 | } | ||
102 | |||
103 | protected void HandleShowAttachmentsCommand(string module, string[] cmd) | ||
104 | { | ||
105 | if (cmd.Length != 2 && cmd.Length < 4) | ||
106 | { | ||
107 | MainConsole.Instance.OutputFormat("Usage: attachments show [<first-name> <last-name>]"); | ||
108 | return; | ||
109 | } | ||
110 | |||
111 | bool targetNameSupplied = false; | ||
112 | string optionalTargetFirstName = null; | ||
113 | string optionalTargetLastName = null; | ||
114 | |||
115 | if (cmd.Length >= 4) | ||
116 | { | ||
117 | targetNameSupplied = true; | ||
118 | optionalTargetFirstName = cmd[2]; | ||
119 | optionalTargetLastName = cmd[3]; | ||
120 | } | ||
121 | |||
122 | StringBuilder sb = new StringBuilder(); | ||
123 | |||
124 | lock (m_scenes) | ||
125 | { | ||
126 | foreach (Scene scene in m_scenes) | ||
127 | { | ||
128 | if (targetNameSupplied) | ||
129 | { | ||
130 | ScenePresence sp = scene.GetScenePresence(optionalTargetFirstName, optionalTargetLastName); | ||
131 | if (sp != null && !sp.IsChildAgent) | ||
132 | GetAttachmentsReport(sp, sb); | ||
133 | } | ||
134 | else | ||
135 | { | ||
136 | scene.ForEachRootScenePresence(sp => GetAttachmentsReport(sp, sb)); | ||
137 | } | ||
138 | } | ||
139 | } | ||
140 | |||
141 | MainConsole.Instance.Output(sb.ToString()); | ||
142 | } | ||
143 | |||
144 | private void GetAttachmentsReport(ScenePresence sp, StringBuilder sb) | ||
145 | { | ||
146 | sb.AppendFormat("Attachments for {0}\n", sp.Name); | ||
147 | |||
148 | ConsoleDisplayTable ct = new ConsoleDisplayTable() { Indent = 2 }; | ||
149 | ct.Columns.Add(new ConsoleDisplayTableColumn("Attachment Name", 36)); | ||
150 | ct.Columns.Add(new ConsoleDisplayTableColumn("Local ID", 10)); | ||
151 | ct.Columns.Add(new ConsoleDisplayTableColumn("Item ID", 36)); | ||
152 | ct.Columns.Add(new ConsoleDisplayTableColumn("Attach Point", 14)); | ||
153 | ct.Columns.Add(new ConsoleDisplayTableColumn("Position", 15)); | ||
154 | |||
155 | // sb.AppendFormat( | ||
156 | // " {0,-36} {1,-10} {2,-36} {3,-14} {4,-15}\n", | ||
157 | // "Attachment Name", "Local ID", "Item ID", "Attach Point", "Position"); | ||
158 | |||
159 | List<SceneObjectGroup> attachmentObjects = sp.GetAttachments(); | ||
160 | foreach (SceneObjectGroup attachmentObject in attachmentObjects) | ||
161 | { | ||
162 | // InventoryItemBase attachmentItem | ||
163 | // = m_scenes[0].InventoryService.GetItem(new InventoryItemBase(attachmentObject.FromItemID)); | ||
164 | |||
165 | // if (attachmentItem == null) | ||
166 | // { | ||
167 | // sb.AppendFormat( | ||
168 | // "WARNING: Couldn't find attachment for item {0} at point {1}\n", | ||
169 | // attachmentData.ItemID, (AttachmentPoint)attachmentData.AttachPoint); | ||
170 | // continue; | ||
171 | // } | ||
172 | // else | ||
173 | // { | ||
174 | // sb.AppendFormat( | ||
175 | // " {0,-36} {1,-10} {2,-36} {3,-14} {4,-15}\n", | ||
176 | // attachmentObject.Name, attachmentObject.LocalId, attachmentObject.FromItemID, | ||
177 | // (AttachmentPoint)attachmentObject.AttachmentPoint, attachmentObject.RootPart.AttachedPos); | ||
178 | ct.Rows.Add( | ||
179 | new ConsoleDisplayTableRow( | ||
180 | new List<string>() | ||
181 | { | ||
182 | attachmentObject.Name, | ||
183 | attachmentObject.LocalId.ToString(), | ||
184 | attachmentObject.FromItemID.ToString(), | ||
185 | ((AttachmentPoint)attachmentObject.AttachmentPoint).ToString(), | ||
186 | attachmentObject.RootPart.AttachedPos.ToString() | ||
187 | })); | ||
188 | // } | ||
189 | } | ||
190 | |||
191 | ct.AddToStringBuilder(sb); | ||
192 | sb.Append("\n"); | ||
193 | } | ||
194 | } | ||
195 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/OptionalModules/Avatar/Friends/FriendsCommandsModule.cs b/OpenSim/Region/OptionalModules/Avatar/Friends/FriendsCommandsModule.cs index e68f9d0..2602050 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Friends/FriendsCommandsModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Friends/FriendsCommandsModule.cs | |||
@@ -58,6 +58,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Friends | |||
58 | private Scene m_scene; | 58 | private Scene m_scene; |
59 | private IFriendsModule m_friendsModule; | 59 | private IFriendsModule m_friendsModule; |
60 | private IUserManagement m_userManagementModule; | 60 | private IUserManagement m_userManagementModule; |
61 | private IPresenceService m_presenceService; | ||
61 | 62 | ||
62 | // private IAvatarFactoryModule m_avatarFactory; | 63 | // private IAvatarFactoryModule m_avatarFactory; |
63 | 64 | ||
@@ -99,8 +100,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.Friends | |||
99 | 100 | ||
100 | m_friendsModule = m_scene.RequestModuleInterface<IFriendsModule>(); | 101 | m_friendsModule = m_scene.RequestModuleInterface<IFriendsModule>(); |
101 | m_userManagementModule = m_scene.RequestModuleInterface<IUserManagement>(); | 102 | m_userManagementModule = m_scene.RequestModuleInterface<IUserManagement>(); |
103 | m_presenceService = m_scene.RequestModuleInterface<IPresenceService>(); | ||
102 | 104 | ||
103 | if (m_friendsModule != null && m_userManagementModule != null) | 105 | if (m_friendsModule != null && m_userManagementModule != null && m_presenceService != null) |
104 | { | 106 | { |
105 | m_scene.AddCommand( | 107 | m_scene.AddCommand( |
106 | "Friends", this, "friends show", | 108 | "Friends", this, "friends show", |
@@ -162,7 +164,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Friends | |||
162 | 164 | ||
163 | MainConsole.Instance.OutputFormat("Friends for {0} {1} {2}:", firstName, lastName, userId); | 165 | MainConsole.Instance.OutputFormat("Friends for {0} {1} {2}:", firstName, lastName, userId); |
164 | 166 | ||
165 | MainConsole.Instance.OutputFormat("UUID, Name, MyFlags, TheirFlags"); | 167 | MainConsole.Instance.OutputFormat( |
168 | "{0,-36} {1,-36} {2,-7} {3,7} {4,10}", "UUID", "Name", "Status", "MyFlags", "TheirFlags"); | ||
166 | 169 | ||
167 | foreach (FriendInfo friend in friends) | 170 | foreach (FriendInfo friend in friends) |
168 | { | 171 | { |
@@ -175,14 +178,22 @@ namespace OpenSim.Region.OptionalModules.Avatar.Friends | |||
175 | 178 | ||
176 | UUID friendId; | 179 | UUID friendId; |
177 | string friendName; | 180 | string friendName; |
181 | string onlineText; | ||
178 | 182 | ||
179 | if (UUID.TryParse(friend.Friend, out friendId)) | 183 | if (UUID.TryParse(friend.Friend, out friendId)) |
180 | friendName = m_userManagementModule.GetUserName(friendId); | 184 | friendName = m_userManagementModule.GetUserName(friendId); |
181 | else | 185 | else |
182 | friendName = friend.Friend; | 186 | friendName = friend.Friend; |
183 | 187 | ||
188 | OpenSim.Services.Interfaces.PresenceInfo[] pi = m_presenceService.GetAgents(new string[] { friend.Friend }); | ||
189 | if (pi.Length > 0) | ||
190 | onlineText = "online"; | ||
191 | else | ||
192 | onlineText = "offline"; | ||
193 | |||
184 | MainConsole.Instance.OutputFormat( | 194 | MainConsole.Instance.OutputFormat( |
185 | "{0} {1} {2} {3}", friend.Friend, friendName, friend.MyFlags, friend.TheirFlags); | 195 | "{0,-36} {1,-36} {2,-7} {3,-7} {4,-10}", |
196 | friend.Friend, friendName, onlineText, friend.MyFlags, friend.TheirFlags); | ||
186 | } | 197 | } |
187 | } | 198 | } |
188 | } | 199 | } |
diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs index 8af3652..6c53d95 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs | |||
@@ -306,30 +306,35 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice | |||
306 | agentID, caps, scene.RegionInfo.RegionName); | 306 | agentID, caps, scene.RegionInfo.RegionName); |
307 | 307 | ||
308 | string capsBase = "/CAPS/" + caps.CapsObjectPath; | 308 | string capsBase = "/CAPS/" + caps.CapsObjectPath; |
309 | caps.RegisterHandler("ProvisionVoiceAccountRequest", | 309 | caps.RegisterHandler( |
310 | new RestStreamHandler("POST", capsBase + m_provisionVoiceAccountRequestPath, | 310 | "ProvisionVoiceAccountRequest", |
311 | delegate(string request, string path, string param, | 311 | new RestStreamHandler( |
312 | IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) | 312 | "POST", |
313 | { | 313 | capsBase + m_provisionVoiceAccountRequestPath, |
314 | return ProvisionVoiceAccountRequest(scene, request, path, param, | 314 | (request, path, param, httpRequest, httpResponse) |
315 | agentID, caps); | 315 | => ProvisionVoiceAccountRequest(scene, request, path, param, agentID, caps), |
316 | })); | 316 | "ProvisionVoiceAccountRequest", |
317 | caps.RegisterHandler("ParcelVoiceInfoRequest", | 317 | agentID.ToString())); |
318 | new RestStreamHandler("POST", capsBase + m_parcelVoiceInfoRequestPath, | 318 | |
319 | delegate(string request, string path, string param, | 319 | caps.RegisterHandler( |
320 | IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) | 320 | "ParcelVoiceInfoRequest", |
321 | { | 321 | new RestStreamHandler( |
322 | return ParcelVoiceInfoRequest(scene, request, path, param, | 322 | "POST", |
323 | agentID, caps); | 323 | capsBase + m_parcelVoiceInfoRequestPath, |
324 | })); | 324 | (request, path, param, httpRequest, httpResponse) |
325 | caps.RegisterHandler("ChatSessionRequest", | 325 | => ParcelVoiceInfoRequest(scene, request, path, param, agentID, caps), |
326 | new RestStreamHandler("POST", capsBase + m_chatSessionRequestPath, | 326 | "ParcelVoiceInfoRequest", |
327 | delegate(string request, string path, string param, | 327 | agentID.ToString())); |
328 | IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) | 328 | |
329 | { | 329 | caps.RegisterHandler( |
330 | return ChatSessionRequest(scene, request, path, param, | 330 | "ChatSessionRequest", |
331 | agentID, caps); | 331 | new RestStreamHandler( |
332 | })); | 332 | "POST", |
333 | capsBase + m_chatSessionRequestPath, | ||
334 | (request, path, param, httpRequest, httpResponse) | ||
335 | => ChatSessionRequest(scene, request, path, param, agentID, caps), | ||
336 | "ChatSessionRequest", | ||
337 | agentID.ToString())); | ||
333 | } | 338 | } |
334 | 339 | ||
335 | /// <summary> | 340 | /// <summary> |
diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs index 4dbac1d..396d4c5 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs | |||
@@ -406,30 +406,36 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice | |||
406 | m_log.DebugFormat("[VivoxVoice] OnRegisterCaps: agentID {0} caps {1}", agentID, caps); | 406 | m_log.DebugFormat("[VivoxVoice] OnRegisterCaps: agentID {0} caps {1}", agentID, caps); |
407 | 407 | ||
408 | string capsBase = "/CAPS/" + caps.CapsObjectPath; | 408 | string capsBase = "/CAPS/" + caps.CapsObjectPath; |
409 | caps.RegisterHandler("ProvisionVoiceAccountRequest", | 409 | |
410 | new RestStreamHandler("POST", capsBase + m_provisionVoiceAccountRequestPath, | 410 | caps.RegisterHandler( |
411 | delegate(string request, string path, string param, | 411 | "ProvisionVoiceAccountRequest", |
412 | IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) | 412 | new RestStreamHandler( |
413 | { | 413 | "POST", |
414 | return ProvisionVoiceAccountRequest(scene, request, path, param, | 414 | capsBase + m_provisionVoiceAccountRequestPath, |
415 | agentID, caps); | 415 | (request, path, param, httpRequest, httpResponse) |
416 | })); | 416 | => ProvisionVoiceAccountRequest(scene, request, path, param, agentID, caps), |
417 | caps.RegisterHandler("ParcelVoiceInfoRequest", | 417 | "ProvisionVoiceAccountRequest", |
418 | new RestStreamHandler("POST", capsBase + m_parcelVoiceInfoRequestPath, | 418 | agentID.ToString())); |
419 | delegate(string request, string path, string param, | 419 | |
420 | IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) | 420 | caps.RegisterHandler( |
421 | { | 421 | "ParcelVoiceInfoRequest", |
422 | return ParcelVoiceInfoRequest(scene, request, path, param, | 422 | new RestStreamHandler( |
423 | agentID, caps); | 423 | "POST", |
424 | })); | 424 | capsBase + m_parcelVoiceInfoRequestPath, |
425 | caps.RegisterHandler("ChatSessionRequest", | 425 | (request, path, param, httpRequest, httpResponse) |
426 | new RestStreamHandler("POST", capsBase + m_chatSessionRequestPath, | 426 | => ParcelVoiceInfoRequest(scene, request, path, param, agentID, caps), |
427 | delegate(string request, string path, string param, | 427 | "ParcelVoiceInfoRequest", |
428 | IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) | 428 | agentID.ToString())); |
429 | { | 429 | |
430 | return ChatSessionRequest(scene, request, path, param, | 430 | caps.RegisterHandler( |
431 | agentID, caps); | 431 | "ChatSessionRequest", |
432 | })); | 432 | new RestStreamHandler( |
433 | "POST", | ||
434 | capsBase + m_chatSessionRequestPath, | ||
435 | (request, path, param, httpRequest, httpResponse) | ||
436 | => ChatSessionRequest(scene, request, path, param, agentID, caps), | ||
437 | "ChatSessionRequest", | ||
438 | agentID.ToString())); | ||
433 | } | 439 | } |
434 | 440 | ||
435 | /// <summary> | 441 | /// <summary> |
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs index 130513d..5d57f70 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs | |||
@@ -1401,9 +1401,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
1401 | { | 1401 | { |
1402 | response = WebUtil.PostToService(m_groupsServerURI, requestArgs); | 1402 | response = WebUtil.PostToService(m_groupsServerURI, requestArgs); |
1403 | } | 1403 | } |
1404 | catch (Exception e) | 1404 | catch (Exception) |
1405 | { | 1405 | { |
1406 | m_log.InfoFormat("[SIMIAN GROUPS CONNECTOR] request failed {0}",CacheKey); | 1406 | m_log.ErrorFormat("[SIMIAN GROUPS CONNECTOR]: request failed {0}", CacheKey); |
1407 | } | 1407 | } |
1408 | 1408 | ||
1409 | // and cache the response | 1409 | // and cache the response |
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/Tests/GroupsModuleTests.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/Tests/GroupsModuleTests.cs index d2f6327..ac638f1 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/Tests/GroupsModuleTests.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/Tests/GroupsModuleTests.cs | |||
@@ -50,7 +50,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups.Tests | |||
50 | TestHelpers.InMethod(); | 50 | TestHelpers.InMethod(); |
51 | // log4net.Config.XmlConfigurator.Configure(); | 51 | // log4net.Config.XmlConfigurator.Configure(); |
52 | 52 | ||
53 | TestScene scene = SceneHelpers.SetupScene(); | 53 | TestScene scene = new SceneHelpers().SetupScene(); |
54 | IConfigSource configSource = new IniConfigSource(); | 54 | IConfigSource configSource = new IniConfigSource(); |
55 | IConfig config = configSource.AddConfig("Groups"); | 55 | IConfig config = configSource.AddConfig("Groups"); |
56 | config.Set("Enabled", true); | 56 | config.Set("Enabled", true); |
diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs new file mode 100644 index 0000000..34894ba --- /dev/null +++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs | |||
@@ -0,0 +1,500 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors | ||
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 OpenSim 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 | using Mono.Addins; | ||
28 | |||
29 | using System; | ||
30 | using System.Reflection; | ||
31 | using System.Threading; | ||
32 | using System.Text; | ||
33 | using System.Net; | ||
34 | using System.Net.Sockets; | ||
35 | using log4net; | ||
36 | using Nini.Config; | ||
37 | using OpenMetaverse; | ||
38 | using OpenMetaverse.StructuredData; | ||
39 | using OpenSim.Framework; | ||
40 | using OpenSim.Region.Framework.Interfaces; | ||
41 | using OpenSim.Region.Framework.Scenes; | ||
42 | using System.Collections.Generic; | ||
43 | using System.Text.RegularExpressions; | ||
44 | |||
45 | namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | ||
46 | { | ||
47 | public class JsonStore | ||
48 | { | ||
49 | private static readonly ILog m_log = | ||
50 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
51 | |||
52 | private OSD m_ValueStore; | ||
53 | |||
54 | protected class TakeValueCallbackClass | ||
55 | { | ||
56 | public string Path { get; set; } | ||
57 | public bool UseJson { get; set; } | ||
58 | public TakeValueCallback Callback { get; set; } | ||
59 | |||
60 | public TakeValueCallbackClass(string spath, bool usejson, TakeValueCallback cback) | ||
61 | { | ||
62 | Path = spath; | ||
63 | UseJson = usejson; | ||
64 | Callback = cback; | ||
65 | } | ||
66 | } | ||
67 | |||
68 | protected List<TakeValueCallbackClass> m_TakeStore; | ||
69 | protected List<TakeValueCallbackClass> m_ReadStore; | ||
70 | |||
71 | |||
72 | // ----------------------------------------------------------------- | ||
73 | /// <summary> | ||
74 | /// | ||
75 | /// </summary> | ||
76 | // ----------------------------------------------------------------- | ||
77 | public JsonStore() : this("") {} | ||
78 | |||
79 | public JsonStore(string value) | ||
80 | { | ||
81 | m_TakeStore = new List<TakeValueCallbackClass>(); | ||
82 | m_ReadStore = new List<TakeValueCallbackClass>(); | ||
83 | |||
84 | if (String.IsNullOrEmpty(value)) | ||
85 | m_ValueStore = new OSDMap(); | ||
86 | else | ||
87 | m_ValueStore = OSDParser.DeserializeJson(value); | ||
88 | } | ||
89 | |||
90 | // ----------------------------------------------------------------- | ||
91 | /// <summary> | ||
92 | /// | ||
93 | /// </summary> | ||
94 | // ----------------------------------------------------------------- | ||
95 | public bool TestPath(string expr, bool useJson) | ||
96 | { | ||
97 | Stack<string> path = ParsePathExpression(expr); | ||
98 | OSD result = ProcessPathExpression(m_ValueStore,path); | ||
99 | |||
100 | if (result == null) | ||
101 | return false; | ||
102 | |||
103 | if (useJson || result.Type == OSDType.String) | ||
104 | return true; | ||
105 | |||
106 | return false; | ||
107 | } | ||
108 | |||
109 | // ----------------------------------------------------------------- | ||
110 | /// <summary> | ||
111 | /// | ||
112 | /// </summary> | ||
113 | // ----------------------------------------------------------------- | ||
114 | public bool GetValue(string expr, out string value, bool useJson) | ||
115 | { | ||
116 | Stack<string> path = ParsePathExpression(expr); | ||
117 | OSD result = ProcessPathExpression(m_ValueStore,path); | ||
118 | return ConvertOutputValue(result,out value,useJson); | ||
119 | } | ||
120 | |||
121 | |||
122 | // ----------------------------------------------------------------- | ||
123 | /// <summary> | ||
124 | /// | ||
125 | /// </summary> | ||
126 | // ----------------------------------------------------------------- | ||
127 | public bool RemoveValue(string expr) | ||
128 | { | ||
129 | return SetValueFromExpression(expr,null); | ||
130 | } | ||
131 | |||
132 | // ----------------------------------------------------------------- | ||
133 | /// <summary> | ||
134 | /// | ||
135 | /// </summary> | ||
136 | // ----------------------------------------------------------------- | ||
137 | public bool SetValue(string expr, string value, bool useJson) | ||
138 | { | ||
139 | OSD ovalue = useJson ? OSDParser.DeserializeJson(value) : new OSDString(value); | ||
140 | return SetValueFromExpression(expr,ovalue); | ||
141 | } | ||
142 | |||
143 | // ----------------------------------------------------------------- | ||
144 | /// <summary> | ||
145 | /// | ||
146 | /// </summary> | ||
147 | // ----------------------------------------------------------------- | ||
148 | public bool TakeValue(string expr, bool useJson, TakeValueCallback cback) | ||
149 | { | ||
150 | Stack<string> path = ParsePathExpression(expr); | ||
151 | string pexpr = PathExpressionToKey(path); | ||
152 | |||
153 | OSD result = ProcessPathExpression(m_ValueStore,path); | ||
154 | if (result == null) | ||
155 | { | ||
156 | m_TakeStore.Add(new TakeValueCallbackClass(pexpr,useJson,cback)); | ||
157 | return false; | ||
158 | } | ||
159 | |||
160 | string value = String.Empty; | ||
161 | if (! ConvertOutputValue(result,out value,useJson)) | ||
162 | { | ||
163 | // the structure does not match the request so i guess we'll wait | ||
164 | m_TakeStore.Add(new TakeValueCallbackClass(pexpr,useJson,cback)); | ||
165 | return false; | ||
166 | } | ||
167 | |||
168 | SetValueFromExpression(expr,null); | ||
169 | cback(value); | ||
170 | |||
171 | return true; | ||
172 | } | ||
173 | |||
174 | // ----------------------------------------------------------------- | ||
175 | /// <summary> | ||
176 | /// | ||
177 | /// </summary> | ||
178 | // ----------------------------------------------------------------- | ||
179 | public bool ReadValue(string expr, bool useJson, TakeValueCallback cback) | ||
180 | { | ||
181 | Stack<string> path = ParsePathExpression(expr); | ||
182 | string pexpr = PathExpressionToKey(path); | ||
183 | |||
184 | OSD result = ProcessPathExpression(m_ValueStore,path); | ||
185 | if (result == null) | ||
186 | { | ||
187 | m_ReadStore.Add(new TakeValueCallbackClass(pexpr,useJson,cback)); | ||
188 | return false; | ||
189 | } | ||
190 | |||
191 | string value = String.Empty; | ||
192 | if (! ConvertOutputValue(result,out value,useJson)) | ||
193 | { | ||
194 | // the structure does not match the request so i guess we'll wait | ||
195 | m_ReadStore.Add(new TakeValueCallbackClass(pexpr,useJson,cback)); | ||
196 | return false; | ||
197 | } | ||
198 | |||
199 | cback(value); | ||
200 | |||
201 | return true; | ||
202 | } | ||
203 | |||
204 | // ----------------------------------------------------------------- | ||
205 | /// <summary> | ||
206 | /// | ||
207 | /// </summary> | ||
208 | // ----------------------------------------------------------------- | ||
209 | protected bool SetValueFromExpression(string expr, OSD ovalue) | ||
210 | { | ||
211 | Stack<string> path = ParsePathExpression(expr); | ||
212 | if (path.Count == 0) | ||
213 | { | ||
214 | m_ValueStore = ovalue; | ||
215 | return true; | ||
216 | } | ||
217 | |||
218 | string pkey = path.Pop(); | ||
219 | string pexpr = PathExpressionToKey(path); | ||
220 | if (pexpr != "") | ||
221 | pexpr += "."; | ||
222 | |||
223 | OSD result = ProcessPathExpression(m_ValueStore,path); | ||
224 | if (result == null) | ||
225 | return false; | ||
226 | |||
227 | Regex aPattern = new Regex("\\[([0-9]+|\\+)\\]"); | ||
228 | MatchCollection amatches = aPattern.Matches(pkey,0); | ||
229 | |||
230 | if (amatches.Count > 0) | ||
231 | { | ||
232 | if (result.Type != OSDType.Array) | ||
233 | return false; | ||
234 | |||
235 | OSDArray amap = result as OSDArray; | ||
236 | |||
237 | Match match = amatches[0]; | ||
238 | GroupCollection groups = match.Groups; | ||
239 | string akey = groups[1].Value; | ||
240 | |||
241 | if (akey == "+") | ||
242 | { | ||
243 | string npkey = String.Format("[{0}]",amap.Count); | ||
244 | |||
245 | amap.Add(ovalue); | ||
246 | InvokeNextCallback(pexpr + npkey); | ||
247 | return true; | ||
248 | } | ||
249 | |||
250 | int aval = Convert.ToInt32(akey); | ||
251 | if (0 <= aval && aval < amap.Count) | ||
252 | { | ||
253 | if (ovalue == null) | ||
254 | amap.RemoveAt(aval); | ||
255 | else | ||
256 | { | ||
257 | amap[aval] = ovalue; | ||
258 | InvokeNextCallback(pexpr + pkey); | ||
259 | } | ||
260 | return true; | ||
261 | } | ||
262 | |||
263 | return false; | ||
264 | } | ||
265 | |||
266 | Regex hPattern = new Regex("{([^}]+)}"); | ||
267 | MatchCollection hmatches = hPattern.Matches(pkey,0); | ||
268 | |||
269 | if (hmatches.Count > 0) | ||
270 | { | ||
271 | Match match = hmatches[0]; | ||
272 | GroupCollection groups = match.Groups; | ||
273 | string hkey = groups[1].Value; | ||
274 | |||
275 | if (result is OSDMap) | ||
276 | { | ||
277 | OSDMap hmap = result as OSDMap; | ||
278 | if (ovalue != null) | ||
279 | { | ||
280 | hmap[hkey] = ovalue; | ||
281 | InvokeNextCallback(pexpr + pkey); | ||
282 | } | ||
283 | else if (hmap.ContainsKey(hkey)) | ||
284 | hmap.Remove(hkey); | ||
285 | |||
286 | return true; | ||
287 | } | ||
288 | |||
289 | return false; | ||
290 | } | ||
291 | |||
292 | // Shouldn't get here if the path was checked correctly | ||
293 | m_log.WarnFormat("[JsonStore] invalid path expression"); | ||
294 | return false; | ||
295 | } | ||
296 | |||
297 | // ----------------------------------------------------------------- | ||
298 | /// <summary> | ||
299 | /// | ||
300 | /// </summary> | ||
301 | // ----------------------------------------------------------------- | ||
302 | protected bool InvokeNextCallback(string pexpr) | ||
303 | { | ||
304 | // Process all of the reads that match the expression first | ||
305 | List<TakeValueCallbackClass> reads = | ||
306 | m_ReadStore.FindAll(delegate(TakeValueCallbackClass tb) { return pexpr.StartsWith(tb.Path); }); | ||
307 | |||
308 | foreach (TakeValueCallbackClass readcb in reads) | ||
309 | { | ||
310 | m_ReadStore.Remove(readcb); | ||
311 | ReadValue(readcb.Path,readcb.UseJson,readcb.Callback); | ||
312 | } | ||
313 | |||
314 | // Process one take next | ||
315 | TakeValueCallbackClass takecb = | ||
316 | m_TakeStore.Find(delegate(TakeValueCallbackClass tb) { return pexpr.StartsWith(tb.Path); }); | ||
317 | |||
318 | if (takecb != null) | ||
319 | { | ||
320 | m_TakeStore.Remove(takecb); | ||
321 | TakeValue(takecb.Path,takecb.UseJson,takecb.Callback); | ||
322 | |||
323 | return true; | ||
324 | } | ||
325 | |||
326 | return false; | ||
327 | } | ||
328 | |||
329 | // ----------------------------------------------------------------- | ||
330 | /// <summary> | ||
331 | /// Parse the path expression and put the components into a stack. We | ||
332 | /// use a stack because we process the path in inverse order later | ||
333 | /// </summary> | ||
334 | // ----------------------------------------------------------------- | ||
335 | protected static Stack<string> ParsePathExpression(string path) | ||
336 | { | ||
337 | Stack<string> m_path = new Stack<string>(); | ||
338 | |||
339 | // add front and rear separators | ||
340 | path = "." + path + "."; | ||
341 | |||
342 | // add separators for quoted paths | ||
343 | Regex pass1 = new Regex("{[^}]+}"); | ||
344 | path = pass1.Replace(path,".$0.",-1,0); | ||
345 | |||
346 | // add separators for array references | ||
347 | Regex pass2 = new Regex("(\\[[0-9]+\\]|\\[\\+\\])"); | ||
348 | path = pass2.Replace(path,".$0.",-1,0); | ||
349 | |||
350 | // add quotes to bare identifier | ||
351 | Regex pass3 = new Regex("\\.([a-zA-Z]+)"); | ||
352 | path = pass3.Replace(path,".{$1}",-1,0); | ||
353 | |||
354 | // remove extra separators | ||
355 | Regex pass4 = new Regex("\\.+"); | ||
356 | path = pass4.Replace(path,".",-1,0); | ||
357 | |||
358 | Regex validate = new Regex("^\\.(({[^}]+}|\\[[0-9]+\\]|\\[\\+\\])\\.)+$"); | ||
359 | if (validate.IsMatch(path)) | ||
360 | { | ||
361 | Regex parser = new Regex("\\.({[^}]+}|\\[[0-9]+\\]|\\[\\+\\]+)"); | ||
362 | MatchCollection matches = parser.Matches(path,0); | ||
363 | foreach (Match match in matches) | ||
364 | m_path.Push(match.Groups[1].Value); | ||
365 | } | ||
366 | |||
367 | return m_path; | ||
368 | } | ||
369 | |||
370 | // ----------------------------------------------------------------- | ||
371 | /// <summary> | ||
372 | /// | ||
373 | /// </summary> | ||
374 | /// <param>path is a stack where the top level of the path is at the bottom of the stack</param> | ||
375 | // ----------------------------------------------------------------- | ||
376 | protected static OSD ProcessPathExpression(OSD map, Stack<string> path) | ||
377 | { | ||
378 | if (path.Count == 0) | ||
379 | return map; | ||
380 | |||
381 | string pkey = path.Pop(); | ||
382 | |||
383 | OSD rmap = ProcessPathExpression(map,path); | ||
384 | if (rmap == null) | ||
385 | return null; | ||
386 | |||
387 | // ---------- Check for an array index ---------- | ||
388 | Regex aPattern = new Regex("\\[([0-9]+)\\]"); | ||
389 | MatchCollection amatches = aPattern.Matches(pkey,0); | ||
390 | |||
391 | if (amatches.Count > 0) | ||
392 | { | ||
393 | if (rmap.Type != OSDType.Array) | ||
394 | { | ||
395 | m_log.WarnFormat("[JsonStore] wrong type for key {2}, expecting {0}, got {1}",OSDType.Array,rmap.Type,pkey); | ||
396 | return null; | ||
397 | } | ||
398 | |||
399 | OSDArray amap = rmap as OSDArray; | ||
400 | |||
401 | Match match = amatches[0]; | ||
402 | GroupCollection groups = match.Groups; | ||
403 | string akey = groups[1].Value; | ||
404 | int aval = Convert.ToInt32(akey); | ||
405 | |||
406 | if (aval < amap.Count) | ||
407 | return (OSD) amap[aval]; | ||
408 | |||
409 | return null; | ||
410 | } | ||
411 | |||
412 | // ---------- Check for a hash index ---------- | ||
413 | Regex hPattern = new Regex("{([^}]+)}"); | ||
414 | MatchCollection hmatches = hPattern.Matches(pkey,0); | ||
415 | |||
416 | if (hmatches.Count > 0) | ||
417 | { | ||
418 | if (rmap.Type != OSDType.Map) | ||
419 | { | ||
420 | m_log.WarnFormat("[JsonStore] wrong type for key {2}, expecting {0}, got {1}",OSDType.Map,rmap.Type,pkey); | ||
421 | return null; | ||
422 | } | ||
423 | |||
424 | OSDMap hmap = rmap as OSDMap; | ||
425 | |||
426 | Match match = hmatches[0]; | ||
427 | GroupCollection groups = match.Groups; | ||
428 | string hkey = groups[1].Value; | ||
429 | |||
430 | if (hmap.ContainsKey(hkey)) | ||
431 | return (OSD) hmap[hkey]; | ||
432 | |||
433 | return null; | ||
434 | } | ||
435 | |||
436 | // Shouldn't get here if the path was checked correctly | ||
437 | m_log.WarnFormat("[JsonStore] Path type (unknown) does not match the structure"); | ||
438 | return null; | ||
439 | } | ||
440 | |||
441 | // ----------------------------------------------------------------- | ||
442 | /// <summary> | ||
443 | /// | ||
444 | /// </summary> | ||
445 | // ----------------------------------------------------------------- | ||
446 | protected static bool ConvertOutputValue(OSD result, out string value, bool useJson) | ||
447 | { | ||
448 | value = String.Empty; | ||
449 | |||
450 | // If we couldn't process the path | ||
451 | if (result == null) | ||
452 | return false; | ||
453 | |||
454 | if (useJson) | ||
455 | { | ||
456 | // The path pointed to an intermediate hash structure | ||
457 | if (result.Type == OSDType.Map) | ||
458 | { | ||
459 | value = OSDParser.SerializeJsonString(result as OSDMap); | ||
460 | return true; | ||
461 | } | ||
462 | |||
463 | // The path pointed to an intermediate hash structure | ||
464 | if (result.Type == OSDType.Array) | ||
465 | { | ||
466 | value = OSDParser.SerializeJsonString(result as OSDArray); | ||
467 | return true; | ||
468 | } | ||
469 | |||
470 | value = "'" + result.AsString() + "'"; | ||
471 | return true; | ||
472 | } | ||
473 | |||
474 | if (result.Type == OSDType.String) | ||
475 | { | ||
476 | value = result.AsString(); | ||
477 | return true; | ||
478 | } | ||
479 | |||
480 | return false; | ||
481 | } | ||
482 | |||
483 | // ----------------------------------------------------------------- | ||
484 | /// <summary> | ||
485 | /// | ||
486 | /// </summary> | ||
487 | // ----------------------------------------------------------------- | ||
488 | protected static string PathExpressionToKey(Stack<string> path) | ||
489 | { | ||
490 | if (path.Count == 0) | ||
491 | return ""; | ||
492 | |||
493 | string pkey = ""; | ||
494 | foreach (string k in path) | ||
495 | pkey = (pkey == "") ? k : (k + "." + pkey); | ||
496 | |||
497 | return pkey; | ||
498 | } | ||
499 | } | ||
500 | } | ||
diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs new file mode 100644 index 0000000..311531c --- /dev/null +++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs | |||
@@ -0,0 +1,430 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors | ||
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 OpenSim 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 | using Mono.Addins; | ||
28 | |||
29 | using System; | ||
30 | using System.Reflection; | ||
31 | using System.Threading; | ||
32 | using System.Text; | ||
33 | using System.Net; | ||
34 | using System.Net.Sockets; | ||
35 | using log4net; | ||
36 | using Nini.Config; | ||
37 | using OpenMetaverse; | ||
38 | using OpenMetaverse.StructuredData; | ||
39 | using OpenSim.Framework; | ||
40 | using OpenSim.Region.Framework.Interfaces; | ||
41 | using OpenSim.Region.Framework.Scenes; | ||
42 | using System.Collections.Generic; | ||
43 | using System.Text.RegularExpressions; | ||
44 | |||
45 | |||
46 | namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | ||
47 | { | ||
48 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "JsonStoreModule")] | ||
49 | |||
50 | public class JsonStoreModule : INonSharedRegionModule, IJsonStoreModule | ||
51 | { | ||
52 | private static readonly ILog m_log = | ||
53 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
54 | |||
55 | private IConfig m_config = null; | ||
56 | private bool m_enabled = false; | ||
57 | private Scene m_scene = null; | ||
58 | |||
59 | private Dictionary<UUID,JsonStore> m_JsonValueStore; | ||
60 | private UUID m_sharedStore; | ||
61 | |||
62 | #region IRegionModule Members | ||
63 | |||
64 | // ----------------------------------------------------------------- | ||
65 | /// <summary> | ||
66 | /// Name of this shared module is it's class name | ||
67 | /// </summary> | ||
68 | // ----------------------------------------------------------------- | ||
69 | public string Name | ||
70 | { | ||
71 | get { return this.GetType().Name; } | ||
72 | } | ||
73 | |||
74 | // ----------------------------------------------------------------- | ||
75 | /// <summary> | ||
76 | /// Initialise this shared module | ||
77 | /// </summary> | ||
78 | /// <param name="scene">this region is getting initialised</param> | ||
79 | /// <param name="source">nini config, we are not using this</param> | ||
80 | // ----------------------------------------------------------------- | ||
81 | public void Initialise(IConfigSource config) | ||
82 | { | ||
83 | try | ||
84 | { | ||
85 | if ((m_config = config.Configs["JsonStore"]) == null) | ||
86 | { | ||
87 | // There is no configuration, the module is disabled | ||
88 | // m_log.InfoFormat("[JsonStore] no configuration info"); | ||
89 | return; | ||
90 | } | ||
91 | |||
92 | m_enabled = m_config.GetBoolean("Enabled", m_enabled); | ||
93 | } | ||
94 | catch (Exception e) | ||
95 | { | ||
96 | m_log.ErrorFormat("[JsonStore] initialization error: {0}",e.Message); | ||
97 | return; | ||
98 | } | ||
99 | |||
100 | if (m_enabled) | ||
101 | m_log.DebugFormat("[JsonStore] module is enabled"); | ||
102 | } | ||
103 | |||
104 | // ----------------------------------------------------------------- | ||
105 | /// <summary> | ||
106 | /// everything is loaded, perform post load configuration | ||
107 | /// </summary> | ||
108 | // ----------------------------------------------------------------- | ||
109 | public void PostInitialise() | ||
110 | { | ||
111 | } | ||
112 | |||
113 | // ----------------------------------------------------------------- | ||
114 | /// <summary> | ||
115 | /// Nothing to do on close | ||
116 | /// </summary> | ||
117 | // ----------------------------------------------------------------- | ||
118 | public void Close() | ||
119 | { | ||
120 | } | ||
121 | |||
122 | // ----------------------------------------------------------------- | ||
123 | /// <summary> | ||
124 | /// </summary> | ||
125 | // ----------------------------------------------------------------- | ||
126 | public void AddRegion(Scene scene) | ||
127 | { | ||
128 | if (m_enabled) | ||
129 | { | ||
130 | m_scene = scene; | ||
131 | m_scene.RegisterModuleInterface<IJsonStoreModule>(this); | ||
132 | |||
133 | m_sharedStore = UUID.Zero; | ||
134 | m_JsonValueStore = new Dictionary<UUID,JsonStore>(); | ||
135 | m_JsonValueStore.Add(m_sharedStore,new JsonStore("")); | ||
136 | } | ||
137 | } | ||
138 | |||
139 | // ----------------------------------------------------------------- | ||
140 | /// <summary> | ||
141 | /// </summary> | ||
142 | // ----------------------------------------------------------------- | ||
143 | public void RemoveRegion(Scene scene) | ||
144 | { | ||
145 | // need to remove all references to the scene in the subscription | ||
146 | // list to enable full garbage collection of the scene object | ||
147 | } | ||
148 | |||
149 | // ----------------------------------------------------------------- | ||
150 | /// <summary> | ||
151 | /// Called when all modules have been added for a region. This is | ||
152 | /// where we hook up events | ||
153 | /// </summary> | ||
154 | // ----------------------------------------------------------------- | ||
155 | public void RegionLoaded(Scene scene) | ||
156 | { | ||
157 | if (m_enabled) {} | ||
158 | } | ||
159 | |||
160 | /// ----------------------------------------------------------------- | ||
161 | /// <summary> | ||
162 | /// </summary> | ||
163 | // ----------------------------------------------------------------- | ||
164 | public Type ReplaceableInterface | ||
165 | { | ||
166 | get { return null; } | ||
167 | } | ||
168 | |||
169 | #endregion | ||
170 | |||
171 | #region ScriptInvocationInteface | ||
172 | |||
173 | // ----------------------------------------------------------------- | ||
174 | /// <summary> | ||
175 | /// | ||
176 | /// </summary> | ||
177 | // ----------------------------------------------------------------- | ||
178 | public bool CreateStore(string value, out UUID result) | ||
179 | { | ||
180 | result = UUID.Zero; | ||
181 | |||
182 | if (! m_enabled) return false; | ||
183 | |||
184 | UUID uuid = UUID.Random(); | ||
185 | JsonStore map = null; | ||
186 | |||
187 | try | ||
188 | { | ||
189 | map = new JsonStore(value); | ||
190 | } | ||
191 | catch (Exception e) | ||
192 | { | ||
193 | m_log.InfoFormat("[JsonStore] Unable to initialize store from {0}; {1}",value,e.Message); | ||
194 | return false; | ||
195 | } | ||
196 | |||
197 | lock (m_JsonValueStore) | ||
198 | m_JsonValueStore.Add(uuid,map); | ||
199 | |||
200 | result = uuid; | ||
201 | return true; | ||
202 | } | ||
203 | |||
204 | // ----------------------------------------------------------------- | ||
205 | /// <summary> | ||
206 | /// | ||
207 | /// </summary> | ||
208 | // ----------------------------------------------------------------- | ||
209 | public bool DestroyStore(UUID storeID) | ||
210 | { | ||
211 | if (! m_enabled) return false; | ||
212 | |||
213 | lock (m_JsonValueStore) | ||
214 | m_JsonValueStore.Remove(storeID); | ||
215 | |||
216 | return true; | ||
217 | } | ||
218 | |||
219 | // ----------------------------------------------------------------- | ||
220 | /// <summary> | ||
221 | /// | ||
222 | /// </summary> | ||
223 | // ----------------------------------------------------------------- | ||
224 | public bool TestPath(UUID storeID, string path, bool useJson) | ||
225 | { | ||
226 | if (! m_enabled) return false; | ||
227 | |||
228 | JsonStore map = null; | ||
229 | lock (m_JsonValueStore) | ||
230 | { | ||
231 | if (! m_JsonValueStore.TryGetValue(storeID,out map)) | ||
232 | { | ||
233 | m_log.InfoFormat("[JsonStore] Missing store {0}",storeID); | ||
234 | return true; | ||
235 | } | ||
236 | } | ||
237 | |||
238 | try | ||
239 | { | ||
240 | lock (map) | ||
241 | return map.TestPath(path,useJson); | ||
242 | } | ||
243 | catch (Exception e) | ||
244 | { | ||
245 | m_log.InfoFormat("[JsonStore] Path test failed for {0} in {1}; {2}",path,storeID,e.Message); | ||
246 | } | ||
247 | |||
248 | return false; | ||
249 | } | ||
250 | |||
251 | // ----------------------------------------------------------------- | ||
252 | /// <summary> | ||
253 | /// | ||
254 | /// </summary> | ||
255 | // ----------------------------------------------------------------- | ||
256 | public bool SetValue(UUID storeID, string path, string value, bool useJson) | ||
257 | { | ||
258 | if (! m_enabled) return false; | ||
259 | |||
260 | JsonStore map = null; | ||
261 | lock (m_JsonValueStore) | ||
262 | { | ||
263 | if (! m_JsonValueStore.TryGetValue(storeID,out map)) | ||
264 | { | ||
265 | m_log.InfoFormat("[JsonStore] Missing store {0}",storeID); | ||
266 | return false; | ||
267 | } | ||
268 | } | ||
269 | |||
270 | try | ||
271 | { | ||
272 | lock (map) | ||
273 | if (map.SetValue(path,value,useJson)) | ||
274 | return true; | ||
275 | } | ||
276 | catch (Exception e) | ||
277 | { | ||
278 | m_log.InfoFormat("[JsonStore] Unable to assign {0} to {1} in {2}; {3}",value,path,storeID,e.Message); | ||
279 | } | ||
280 | |||
281 | return false; | ||
282 | } | ||
283 | |||
284 | // ----------------------------------------------------------------- | ||
285 | /// <summary> | ||
286 | /// | ||
287 | /// </summary> | ||
288 | // ----------------------------------------------------------------- | ||
289 | public bool RemoveValue(UUID storeID, string path) | ||
290 | { | ||
291 | if (! m_enabled) return false; | ||
292 | |||
293 | JsonStore map = null; | ||
294 | lock (m_JsonValueStore) | ||
295 | { | ||
296 | if (! m_JsonValueStore.TryGetValue(storeID,out map)) | ||
297 | { | ||
298 | m_log.InfoFormat("[JsonStore] Missing store {0}",storeID); | ||
299 | return false; | ||
300 | } | ||
301 | } | ||
302 | |||
303 | try | ||
304 | { | ||
305 | lock (map) | ||
306 | if (map.RemoveValue(path)) | ||
307 | return true; | ||
308 | } | ||
309 | catch (Exception e) | ||
310 | { | ||
311 | m_log.InfoFormat("[JsonStore] Unable to remove {0} in {1}; {2}",path,storeID,e.Message); | ||
312 | } | ||
313 | |||
314 | return false; | ||
315 | } | ||
316 | |||
317 | // ----------------------------------------------------------------- | ||
318 | /// <summary> | ||
319 | /// | ||
320 | /// </summary> | ||
321 | // ----------------------------------------------------------------- | ||
322 | public bool GetValue(UUID storeID, string path, bool useJson, out string value) | ||
323 | { | ||
324 | value = String.Empty; | ||
325 | |||
326 | if (! m_enabled) return false; | ||
327 | |||
328 | JsonStore map = null; | ||
329 | lock (m_JsonValueStore) | ||
330 | { | ||
331 | if (! m_JsonValueStore.TryGetValue(storeID,out map)) | ||
332 | return false; | ||
333 | } | ||
334 | |||
335 | try | ||
336 | { | ||
337 | lock (map) | ||
338 | { | ||
339 | return map.GetValue(path, out value, useJson); | ||
340 | } | ||
341 | } | ||
342 | catch (Exception e) | ||
343 | { | ||
344 | m_log.InfoFormat("[JsonStore] unable to retrieve value; {0}",e.Message); | ||
345 | } | ||
346 | |||
347 | return false; | ||
348 | } | ||
349 | |||
350 | // ----------------------------------------------------------------- | ||
351 | /// <summary> | ||
352 | /// | ||
353 | /// </summary> | ||
354 | // ----------------------------------------------------------------- | ||
355 | public void TakeValue(UUID storeID, string path, bool useJson, TakeValueCallback cback) | ||
356 | { | ||
357 | if (! m_enabled) | ||
358 | { | ||
359 | cback(String.Empty); | ||
360 | return; | ||
361 | } | ||
362 | |||
363 | JsonStore map = null; | ||
364 | lock (m_JsonValueStore) | ||
365 | { | ||
366 | if (! m_JsonValueStore.TryGetValue(storeID,out map)) | ||
367 | { | ||
368 | cback(String.Empty); | ||
369 | return; | ||
370 | } | ||
371 | } | ||
372 | |||
373 | try | ||
374 | { | ||
375 | lock (map) | ||
376 | { | ||
377 | map.TakeValue(path, useJson, cback); | ||
378 | return; | ||
379 | } | ||
380 | } | ||
381 | catch (Exception e) | ||
382 | { | ||
383 | m_log.InfoFormat("[JsonStore] unable to retrieve value; {0}",e.ToString()); | ||
384 | } | ||
385 | |||
386 | cback(String.Empty); | ||
387 | } | ||
388 | |||
389 | // ----------------------------------------------------------------- | ||
390 | /// <summary> | ||
391 | /// | ||
392 | /// </summary> | ||
393 | // ----------------------------------------------------------------- | ||
394 | public void ReadValue(UUID storeID, string path, bool useJson, TakeValueCallback cback) | ||
395 | { | ||
396 | if (! m_enabled) | ||
397 | { | ||
398 | cback(String.Empty); | ||
399 | return; | ||
400 | } | ||
401 | |||
402 | JsonStore map = null; | ||
403 | lock (m_JsonValueStore) | ||
404 | { | ||
405 | if (! m_JsonValueStore.TryGetValue(storeID,out map)) | ||
406 | { | ||
407 | cback(String.Empty); | ||
408 | return; | ||
409 | } | ||
410 | } | ||
411 | |||
412 | try | ||
413 | { | ||
414 | lock (map) | ||
415 | { | ||
416 | map.ReadValue(path, useJson, cback); | ||
417 | return; | ||
418 | } | ||
419 | } | ||
420 | catch (Exception e) | ||
421 | { | ||
422 | m_log.InfoFormat("[JsonStore] unable to retrieve value; {0}",e.ToString()); | ||
423 | } | ||
424 | |||
425 | cback(String.Empty); | ||
426 | } | ||
427 | |||
428 | #endregion | ||
429 | } | ||
430 | } | ||
diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs new file mode 100644 index 0000000..4949097 --- /dev/null +++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs | |||
@@ -0,0 +1,499 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors | ||
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 OpenSim 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 | using Mono.Addins; | ||
28 | |||
29 | using System; | ||
30 | using System.Reflection; | ||
31 | using System.Threading; | ||
32 | using System.Text; | ||
33 | using System.Net; | ||
34 | using System.Net.Sockets; | ||
35 | using log4net; | ||
36 | using Nini.Config; | ||
37 | using OpenMetaverse; | ||
38 | using OpenMetaverse.StructuredData; | ||
39 | using OpenSim.Framework; | ||
40 | using OpenSim.Region.Framework.Interfaces; | ||
41 | using OpenSim.Region.Framework.Scenes; | ||
42 | using System.Collections.Generic; | ||
43 | using System.Text.RegularExpressions; | ||
44 | |||
45 | namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | ||
46 | { | ||
47 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "JsonStoreScriptModule")] | ||
48 | |||
49 | public class JsonStoreScriptModule : INonSharedRegionModule | ||
50 | { | ||
51 | private static readonly ILog m_log = | ||
52 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
53 | |||
54 | private IConfig m_config = null; | ||
55 | private bool m_enabled = false; | ||
56 | private Scene m_scene = null; | ||
57 | |||
58 | private IScriptModuleComms m_comms; | ||
59 | private IJsonStoreModule m_store; | ||
60 | |||
61 | #region IRegionModule Members | ||
62 | |||
63 | // ----------------------------------------------------------------- | ||
64 | /// <summary> | ||
65 | /// Name of this shared module is it's class name | ||
66 | /// </summary> | ||
67 | // ----------------------------------------------------------------- | ||
68 | public string Name | ||
69 | { | ||
70 | get { return this.GetType().Name; } | ||
71 | } | ||
72 | |||
73 | // ----------------------------------------------------------------- | ||
74 | /// <summary> | ||
75 | /// Initialise this shared module | ||
76 | /// </summary> | ||
77 | /// <param name="scene">this region is getting initialised</param> | ||
78 | /// <param name="source">nini config, we are not using this</param> | ||
79 | // ----------------------------------------------------------------- | ||
80 | public void Initialise(IConfigSource config) | ||
81 | { | ||
82 | try | ||
83 | { | ||
84 | if ((m_config = config.Configs["JsonStore"]) == null) | ||
85 | { | ||
86 | // There is no configuration, the module is disabled | ||
87 | // m_log.InfoFormat("[JsonStoreScripts] no configuration info"); | ||
88 | return; | ||
89 | } | ||
90 | |||
91 | m_enabled = m_config.GetBoolean("Enabled", m_enabled); | ||
92 | } | ||
93 | catch (Exception e) | ||
94 | { | ||
95 | m_log.ErrorFormat("[JsonStoreScripts] initialization error: {0}",e.Message); | ||
96 | return; | ||
97 | } | ||
98 | |||
99 | if (m_enabled) | ||
100 | m_log.DebugFormat("[JsonStoreScripts] module is enabled"); | ||
101 | } | ||
102 | |||
103 | // ----------------------------------------------------------------- | ||
104 | /// <summary> | ||
105 | /// everything is loaded, perform post load configuration | ||
106 | /// </summary> | ||
107 | // ----------------------------------------------------------------- | ||
108 | public void PostInitialise() | ||
109 | { | ||
110 | } | ||
111 | |||
112 | // ----------------------------------------------------------------- | ||
113 | /// <summary> | ||
114 | /// Nothing to do on close | ||
115 | /// </summary> | ||
116 | // ----------------------------------------------------------------- | ||
117 | public void Close() | ||
118 | { | ||
119 | } | ||
120 | |||
121 | // ----------------------------------------------------------------- | ||
122 | /// <summary> | ||
123 | /// </summary> | ||
124 | // ----------------------------------------------------------------- | ||
125 | public void AddRegion(Scene scene) | ||
126 | { | ||
127 | } | ||
128 | |||
129 | // ----------------------------------------------------------------- | ||
130 | /// <summary> | ||
131 | /// </summary> | ||
132 | // ----------------------------------------------------------------- | ||
133 | public void RemoveRegion(Scene scene) | ||
134 | { | ||
135 | // need to remove all references to the scene in the subscription | ||
136 | // list to enable full garbage collection of the scene object | ||
137 | } | ||
138 | |||
139 | // ----------------------------------------------------------------- | ||
140 | /// <summary> | ||
141 | /// Called when all modules have been added for a region. This is | ||
142 | /// where we hook up events | ||
143 | /// </summary> | ||
144 | // ----------------------------------------------------------------- | ||
145 | public void RegionLoaded(Scene scene) | ||
146 | { | ||
147 | if (m_enabled) | ||
148 | { | ||
149 | m_scene = scene; | ||
150 | m_comms = m_scene.RequestModuleInterface<IScriptModuleComms>(); | ||
151 | if (m_comms == null) | ||
152 | { | ||
153 | m_log.ErrorFormat("[JsonStoreScripts] ScriptModuleComms interface not defined"); | ||
154 | m_enabled = false; | ||
155 | return; | ||
156 | } | ||
157 | |||
158 | m_store = m_scene.RequestModuleInterface<IJsonStoreModule>(); | ||
159 | if (m_store == null) | ||
160 | { | ||
161 | m_log.ErrorFormat("[JsonStoreScripts] JsonModule interface not defined"); | ||
162 | m_enabled = false; | ||
163 | return; | ||
164 | } | ||
165 | |||
166 | try | ||
167 | { | ||
168 | m_comms.RegisterScriptInvocation(this,"JsonCreateStore"); | ||
169 | m_comms.RegisterScriptInvocation(this,"JsonDestroyStore"); | ||
170 | |||
171 | m_comms.RegisterScriptInvocation(this,"JsonReadNotecard"); | ||
172 | m_comms.RegisterScriptInvocation(this,"JsonWriteNotecard"); | ||
173 | |||
174 | m_comms.RegisterScriptInvocation(this,"JsonTestPath"); | ||
175 | m_comms.RegisterScriptInvocation(this,"JsonTestPathJson"); | ||
176 | |||
177 | m_comms.RegisterScriptInvocation(this,"JsonGetValue"); | ||
178 | m_comms.RegisterScriptInvocation(this,"JsonGetValueJson"); | ||
179 | |||
180 | m_comms.RegisterScriptInvocation(this,"JsonTakeValue"); | ||
181 | m_comms.RegisterScriptInvocation(this,"JsonTakeValueJson"); | ||
182 | |||
183 | m_comms.RegisterScriptInvocation(this,"JsonReadValue"); | ||
184 | m_comms.RegisterScriptInvocation(this,"JsonReadValueJson"); | ||
185 | |||
186 | m_comms.RegisterScriptInvocation(this,"JsonSetValue"); | ||
187 | m_comms.RegisterScriptInvocation(this,"JsonSetValueJson"); | ||
188 | |||
189 | m_comms.RegisterScriptInvocation(this,"JsonRemoveValue"); | ||
190 | } | ||
191 | catch (Exception e) | ||
192 | { | ||
193 | // See http://opensimulator.org/mantis/view.php?id=5971 for more information | ||
194 | m_log.WarnFormat("[JsonStroreScripts] script method registration failed; {0}",e.Message); | ||
195 | m_enabled = false; | ||
196 | } | ||
197 | } | ||
198 | } | ||
199 | |||
200 | /// ----------------------------------------------------------------- | ||
201 | /// <summary> | ||
202 | /// </summary> | ||
203 | // ----------------------------------------------------------------- | ||
204 | public Type ReplaceableInterface | ||
205 | { | ||
206 | get { return null; } | ||
207 | } | ||
208 | |||
209 | #endregion | ||
210 | |||
211 | #region ScriptInvocationInteface | ||
212 | // ----------------------------------------------------------------- | ||
213 | /// <summary> | ||
214 | /// | ||
215 | /// </summary> | ||
216 | // ----------------------------------------------------------------- | ||
217 | protected void GenerateRuntimeError(string msg) | ||
218 | { | ||
219 | throw new Exception("JsonStore Runtime Error: " + msg); | ||
220 | } | ||
221 | |||
222 | // ----------------------------------------------------------------- | ||
223 | /// <summary> | ||
224 | /// | ||
225 | /// </summary> | ||
226 | // ----------------------------------------------------------------- | ||
227 | protected UUID JsonCreateStore(UUID hostID, UUID scriptID, string value) | ||
228 | { | ||
229 | UUID uuid = UUID.Zero; | ||
230 | if (! m_store.CreateStore(value, out uuid)) | ||
231 | GenerateRuntimeError("Failed to create Json store"); | ||
232 | |||
233 | return uuid; | ||
234 | } | ||
235 | |||
236 | // ----------------------------------------------------------------- | ||
237 | /// <summary> | ||
238 | /// | ||
239 | /// </summary> | ||
240 | // ----------------------------------------------------------------- | ||
241 | protected int JsonDestroyStore(UUID hostID, UUID scriptID, UUID storeID) | ||
242 | { | ||
243 | return m_store.DestroyStore(storeID) ? 1 : 0; | ||
244 | } | ||
245 | |||
246 | // ----------------------------------------------------------------- | ||
247 | /// <summary> | ||
248 | /// | ||
249 | /// </summary> | ||
250 | // ----------------------------------------------------------------- | ||
251 | protected UUID JsonReadNotecard(UUID hostID, UUID scriptID, UUID storeID, string path, UUID assetID) | ||
252 | { | ||
253 | UUID reqID = UUID.Random(); | ||
254 | Util.FireAndForget(delegate(object o) { DoJsonReadNotecard(reqID,hostID,scriptID,storeID,path,assetID); }); | ||
255 | return reqID; | ||
256 | } | ||
257 | |||
258 | // ----------------------------------------------------------------- | ||
259 | /// <summary> | ||
260 | /// | ||
261 | /// </summary> | ||
262 | // ----------------------------------------------------------------- | ||
263 | protected UUID JsonWriteNotecard(UUID hostID, UUID scriptID, UUID storeID, string path, string name) | ||
264 | { | ||
265 | UUID reqID = UUID.Random(); | ||
266 | Util.FireAndForget(delegate(object o) { DoJsonWriteNotecard(reqID,hostID,scriptID,storeID,path,name); }); | ||
267 | return reqID; | ||
268 | } | ||
269 | |||
270 | // ----------------------------------------------------------------- | ||
271 | /// <summary> | ||
272 | /// | ||
273 | /// </summary> | ||
274 | // ----------------------------------------------------------------- | ||
275 | protected int JsonTestPath(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
276 | { | ||
277 | return m_store.TestPath(storeID,path,false) ? 1 : 0; | ||
278 | } | ||
279 | |||
280 | protected int JsonTestPathJson(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
281 | { | ||
282 | return m_store.TestPath(storeID,path,true) ? 1 : 0; | ||
283 | } | ||
284 | |||
285 | // ----------------------------------------------------------------- | ||
286 | /// <summary> | ||
287 | /// | ||
288 | /// </summary> | ||
289 | // ----------------------------------------------------------------- | ||
290 | protected int JsonSetValue(UUID hostID, UUID scriptID, UUID storeID, string path, string value) | ||
291 | { | ||
292 | return m_store.SetValue(storeID,path,value,false) ? 1 : 0; | ||
293 | } | ||
294 | |||
295 | protected int JsonSetValueJson(UUID hostID, UUID scriptID, UUID storeID, string path, string value) | ||
296 | { | ||
297 | return m_store.SetValue(storeID,path,value,true) ? 1 : 0; | ||
298 | } | ||
299 | |||
300 | // ----------------------------------------------------------------- | ||
301 | /// <summary> | ||
302 | /// | ||
303 | /// </summary> | ||
304 | // ----------------------------------------------------------------- | ||
305 | protected int JsonRemoveValue(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
306 | { | ||
307 | return m_store.RemoveValue(storeID,path) ? 1 : 0; | ||
308 | } | ||
309 | |||
310 | // ----------------------------------------------------------------- | ||
311 | /// <summary> | ||
312 | /// | ||
313 | /// </summary> | ||
314 | // ----------------------------------------------------------------- | ||
315 | protected string JsonGetValue(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
316 | { | ||
317 | string value = String.Empty; | ||
318 | m_store.GetValue(storeID,path,false,out value); | ||
319 | return value; | ||
320 | } | ||
321 | |||
322 | protected string JsonGetValueJson(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
323 | { | ||
324 | string value = String.Empty; | ||
325 | m_store.GetValue(storeID,path,true, out value); | ||
326 | return value; | ||
327 | } | ||
328 | |||
329 | // ----------------------------------------------------------------- | ||
330 | /// <summary> | ||
331 | /// | ||
332 | /// </summary> | ||
333 | // ----------------------------------------------------------------- | ||
334 | protected UUID JsonTakeValue(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
335 | { | ||
336 | UUID reqID = UUID.Random(); | ||
337 | Util.FireAndForget(delegate(object o) { DoJsonTakeValue(scriptID,reqID,storeID,path,false); }); | ||
338 | return reqID; | ||
339 | } | ||
340 | |||
341 | protected UUID JsonTakeValueJson(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
342 | { | ||
343 | UUID reqID = UUID.Random(); | ||
344 | Util.FireAndForget(delegate(object o) { DoJsonTakeValue(scriptID,reqID,storeID,path,true); }); | ||
345 | return reqID; | ||
346 | } | ||
347 | |||
348 | private void DoJsonTakeValue(UUID scriptID, UUID reqID, UUID storeID, string path, bool useJson) | ||
349 | { | ||
350 | try | ||
351 | { | ||
352 | m_store.TakeValue(storeID,path,useJson,delegate(string value) { DispatchValue(scriptID,reqID,value); }); | ||
353 | return; | ||
354 | } | ||
355 | catch (Exception e) | ||
356 | { | ||
357 | m_log.InfoFormat("[JsonStoreScripts] unable to retrieve value; {0}",e.ToString()); | ||
358 | } | ||
359 | |||
360 | DispatchValue(scriptID,reqID,String.Empty); | ||
361 | } | ||
362 | |||
363 | |||
364 | // ----------------------------------------------------------------- | ||
365 | /// <summary> | ||
366 | /// | ||
367 | /// </summary> | ||
368 | // ----------------------------------------------------------------- | ||
369 | protected UUID JsonReadValue(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
370 | { | ||
371 | UUID reqID = UUID.Random(); | ||
372 | Util.FireAndForget(delegate(object o) { DoJsonReadValue(scriptID,reqID,storeID,path,false); }); | ||
373 | return reqID; | ||
374 | } | ||
375 | |||
376 | protected UUID JsonReadValueJson(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
377 | { | ||
378 | UUID reqID = UUID.Random(); | ||
379 | Util.FireAndForget(delegate(object o) { DoJsonReadValue(scriptID,reqID,storeID,path,true); }); | ||
380 | return reqID; | ||
381 | } | ||
382 | |||
383 | private void DoJsonReadValue(UUID scriptID, UUID reqID, UUID storeID, string path, bool useJson) | ||
384 | { | ||
385 | try | ||
386 | { | ||
387 | m_store.ReadValue(storeID,path,useJson,delegate(string value) { DispatchValue(scriptID,reqID,value); }); | ||
388 | return; | ||
389 | } | ||
390 | catch (Exception e) | ||
391 | { | ||
392 | m_log.InfoFormat("[JsonStoreScripts] unable to retrieve value; {0}",e.ToString()); | ||
393 | } | ||
394 | |||
395 | DispatchValue(scriptID,reqID,String.Empty); | ||
396 | } | ||
397 | |||
398 | #endregion | ||
399 | |||
400 | // ----------------------------------------------------------------- | ||
401 | /// <summary> | ||
402 | /// | ||
403 | /// </summary> | ||
404 | // ----------------------------------------------------------------- | ||
405 | protected void DispatchValue(UUID scriptID, UUID reqID, string value) | ||
406 | { | ||
407 | m_comms.DispatchReply(scriptID,1,value,reqID.ToString()); | ||
408 | } | ||
409 | |||
410 | // ----------------------------------------------------------------- | ||
411 | /// <summary> | ||
412 | /// | ||
413 | /// </summary> | ||
414 | // ----------------------------------------------------------------- | ||
415 | private void DoJsonReadNotecard(UUID reqID, UUID hostID, UUID scriptID, UUID storeID, string path, UUID assetID) | ||
416 | { | ||
417 | AssetBase a = m_scene.AssetService.Get(assetID.ToString()); | ||
418 | if (a == null) | ||
419 | GenerateRuntimeError(String.Format("Unable to find notecard asset {0}",assetID)); | ||
420 | |||
421 | if (a.Type != (sbyte)AssetType.Notecard) | ||
422 | GenerateRuntimeError(String.Format("Invalid notecard asset {0}",assetID)); | ||
423 | |||
424 | m_log.DebugFormat("[JsonStoreScripts] read notecard in context {0}",storeID); | ||
425 | |||
426 | try | ||
427 | { | ||
428 | System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); | ||
429 | string jsondata = SLUtil.ParseNotecardToString(enc.GetString(a.Data)); | ||
430 | int result = m_store.SetValue(storeID,path,jsondata,true) ? 1 : 0; | ||
431 | m_comms.DispatchReply(scriptID,result,"",reqID.ToString()); | ||
432 | return; | ||
433 | } | ||
434 | catch (Exception e) | ||
435 | { | ||
436 | m_log.WarnFormat("[JsonStoreScripts] Json parsing failed; {0}",e.Message); | ||
437 | } | ||
438 | |||
439 | GenerateRuntimeError(String.Format("Json parsing failed for {0}",assetID.ToString())); | ||
440 | m_comms.DispatchReply(scriptID,0,"",reqID.ToString()); | ||
441 | } | ||
442 | |||
443 | // ----------------------------------------------------------------- | ||
444 | /// <summary> | ||
445 | /// | ||
446 | /// </summary> | ||
447 | // ----------------------------------------------------------------- | ||
448 | private void DoJsonWriteNotecard(UUID reqID, UUID hostID, UUID scriptID, UUID storeID, string path, string name) | ||
449 | { | ||
450 | string data; | ||
451 | if (! m_store.GetValue(storeID,path,true, out data)) | ||
452 | { | ||
453 | m_comms.DispatchReply(scriptID,0,UUID.Zero.ToString(),reqID.ToString()); | ||
454 | return; | ||
455 | } | ||
456 | |||
457 | SceneObjectPart host = m_scene.GetSceneObjectPart(hostID); | ||
458 | |||
459 | // Create new asset | ||
460 | UUID assetID = UUID.Random(); | ||
461 | AssetBase asset = new AssetBase(assetID, name, (sbyte)AssetType.Notecard, host.OwnerID.ToString()); | ||
462 | asset.Description = "Json store"; | ||
463 | |||
464 | int textLength = data.Length; | ||
465 | data = "Linden text version 2\n{\nLLEmbeddedItems version 1\n{\ncount 0\n}\nText length " | ||
466 | + textLength.ToString() + "\n" + data + "}\n"; | ||
467 | |||
468 | asset.Data = Util.UTF8.GetBytes(data); | ||
469 | m_scene.AssetService.Store(asset); | ||
470 | |||
471 | // Create Task Entry | ||
472 | TaskInventoryItem taskItem = new TaskInventoryItem(); | ||
473 | |||
474 | taskItem.ResetIDs(host.UUID); | ||
475 | taskItem.ParentID = host.UUID; | ||
476 | taskItem.CreationDate = (uint)Util.UnixTimeSinceEpoch(); | ||
477 | taskItem.Name = asset.Name; | ||
478 | taskItem.Description = asset.Description; | ||
479 | taskItem.Type = (int)AssetType.Notecard; | ||
480 | taskItem.InvType = (int)InventoryType.Notecard; | ||
481 | taskItem.OwnerID = host.OwnerID; | ||
482 | taskItem.CreatorID = host.OwnerID; | ||
483 | taskItem.BasePermissions = (uint)PermissionMask.All; | ||
484 | taskItem.CurrentPermissions = (uint)PermissionMask.All; | ||
485 | taskItem.EveryonePermissions = 0; | ||
486 | taskItem.NextPermissions = (uint)PermissionMask.All; | ||
487 | taskItem.GroupID = host.GroupID; | ||
488 | taskItem.GroupPermissions = 0; | ||
489 | taskItem.Flags = 0; | ||
490 | taskItem.PermsGranter = UUID.Zero; | ||
491 | taskItem.PermsMask = 0; | ||
492 | taskItem.AssetID = asset.FullID; | ||
493 | |||
494 | host.Inventory.AddInventoryItem(taskItem, false); | ||
495 | |||
496 | m_comms.DispatchReply(scriptID,1,assetID.ToString(),reqID.ToString()); | ||
497 | } | ||
498 | } | ||
499 | } | ||
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SPAvatar.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SPAvatar.cs index 922eaaf..d192309 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SPAvatar.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SPAvatar.cs | |||
@@ -68,7 +68,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
68 | public Vector3 WorldPosition | 68 | public Vector3 WorldPosition |
69 | { | 69 | { |
70 | get { return GetSP().AbsolutePosition; } | 70 | get { return GetSP().AbsolutePosition; } |
71 | set { GetSP().TeleportWithMomentum(value); } | 71 | set { GetSP().Teleport(value); } |
72 | } | 72 | } |
73 | 73 | ||
74 | public bool IsChildAgent | 74 | public bool IsChildAgent |
diff --git a/OpenSim/Region/OptionalModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs b/OpenSim/Region/OptionalModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs index cab30de..74a85e2 100644 --- a/OpenSim/Region/OptionalModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs | |||
@@ -38,7 +38,7 @@ using OpenMetaverse; | |||
38 | using System.Linq; | 38 | using System.Linq; |
39 | using System.Linq.Expressions; | 39 | using System.Linq.Expressions; |
40 | 40 | ||
41 | namespace OpenSim.Region.CoreModules.Scripting.ScriptModuleComms | 41 | namespace OpenSim.Region.OptionalModules.Scripting.ScriptModuleComms |
42 | { | 42 | { |
43 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "ScriptModuleCommsModule")] | 43 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "ScriptModuleCommsModule")] |
44 | class ScriptModuleCommsModule : INonSharedRegionModule, IScriptModuleComms | 44 | class ScriptModuleCommsModule : INonSharedRegionModule, IScriptModuleComms |
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index 8996865..e798382 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs | |||
@@ -76,22 +76,27 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
76 | 76 | ||
77 | public void Say(string message) | 77 | public void Say(string message) |
78 | { | 78 | { |
79 | SendOnChatFromClient(message, ChatTypeEnum.Say); | 79 | SendOnChatFromClient(0, message, ChatTypeEnum.Say); |
80 | } | 80 | } |
81 | 81 | ||
82 | public void Shout(string message) | 82 | public void Say(int channel, string message) |
83 | { | 83 | { |
84 | SendOnChatFromClient(message, ChatTypeEnum.Shout); | 84 | SendOnChatFromClient(channel, message, ChatTypeEnum.Say); |
85 | } | 85 | } |
86 | 86 | ||
87 | public void Whisper(string message) | 87 | public void Shout(int channel, string message) |
88 | { | 88 | { |
89 | SendOnChatFromClient(message, ChatTypeEnum.Whisper); | 89 | SendOnChatFromClient(channel, message, ChatTypeEnum.Shout); |
90 | } | ||
91 | |||
92 | public void Whisper(int channel, string message) | ||
93 | { | ||
94 | SendOnChatFromClient(channel, message, ChatTypeEnum.Whisper); | ||
90 | } | 95 | } |
91 | 96 | ||
92 | public void Broadcast(string message) | 97 | public void Broadcast(string message) |
93 | { | 98 | { |
94 | SendOnChatFromClient(message, ChatTypeEnum.Broadcast); | 99 | SendOnChatFromClient(0, message, ChatTypeEnum.Broadcast); |
95 | } | 100 | } |
96 | 101 | ||
97 | public void GiveMoney(UUID target, int amount) | 102 | public void GiveMoney(UUID target, int amount) |
@@ -146,10 +151,10 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
146 | 151 | ||
147 | #region Internal Functions | 152 | #region Internal Functions |
148 | 153 | ||
149 | private void SendOnChatFromClient(string message, ChatTypeEnum chatType) | 154 | private void SendOnChatFromClient(int channel, string message, ChatTypeEnum chatType) |
150 | { | 155 | { |
151 | OSChatMessage chatFromClient = new OSChatMessage(); | 156 | OSChatMessage chatFromClient = new OSChatMessage(); |
152 | chatFromClient.Channel = 0; | 157 | chatFromClient.Channel = channel; |
153 | chatFromClient.From = Name; | 158 | chatFromClient.From = Name; |
154 | chatFromClient.Message = message; | 159 | chatFromClient.Message = message; |
155 | chatFromClient.Position = StartPos; | 160 | chatFromClient.Position = StartPos; |
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index ebf5e84..a32ab2a 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs | |||
@@ -155,18 +155,10 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
155 | ScenePresence sp; | 155 | ScenePresence sp; |
156 | if (scene.TryGetScenePresence(npcAvatar.AgentId, out sp)) | 156 | if (scene.TryGetScenePresence(npcAvatar.AgentId, out sp)) |
157 | { | 157 | { |
158 | m_log.DebugFormat( | ||
159 | "[NPC MODULE]: Successfully retrieved scene presence for NPC {0} {1}", sp.Name, sp.UUID); | ||
160 | |||
161 | sp.CompleteMovement(npcAvatar, false); | 158 | sp.CompleteMovement(npcAvatar, false); |
162 | m_avatars.Add(npcAvatar.AgentId, npcAvatar); | 159 | m_avatars.Add(npcAvatar.AgentId, npcAvatar); |
160 | m_log.DebugFormat("[NPC MODULE]: Created NPC {0} {1}", npcAvatar.AgentId, sp.Name); | ||
163 | } | 161 | } |
164 | else | ||
165 | { | ||
166 | m_log.WarnFormat("[NPC MODULE]: Could not find scene presence for NPC {0} {1}", sp.Name, sp.UUID); | ||
167 | npcAvatar.AgentId = UUID.Zero; | ||
168 | } | ||
169 | |||
170 | } | 162 | } |
171 | ev.Set(); | 163 | ev.Set(); |
172 | }); | 164 | }); |
@@ -178,7 +170,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
178 | return npcAvatar.AgentId; | 170 | return npcAvatar.AgentId; |
179 | } | 171 | } |
180 | 172 | ||
181 | public bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget) | 173 | public bool MoveToTarget(UUID agentID, Scene scene, Vector3 pos, bool noFly, bool landAtTarget, bool running) |
182 | { | 174 | { |
183 | lock (m_avatars) | 175 | lock (m_avatars) |
184 | { | 176 | { |
@@ -192,6 +184,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
192 | sp.Name, pos, scene.RegionInfo.RegionName, noFly, landAtTarget); | 184 | sp.Name, pos, scene.RegionInfo.RegionName, noFly, landAtTarget); |
193 | 185 | ||
194 | sp.MoveToTarget(pos, noFly, landAtTarget); | 186 | sp.MoveToTarget(pos, noFly, landAtTarget); |
187 | sp.SetAlwaysRun = running; | ||
195 | 188 | ||
196 | return true; | 189 | return true; |
197 | } | 190 | } |
@@ -221,6 +214,11 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
221 | 214 | ||
222 | public bool Say(UUID agentID, Scene scene, string text) | 215 | public bool Say(UUID agentID, Scene scene, string text) |
223 | { | 216 | { |
217 | return Say(agentID, scene, text, 0); | ||
218 | } | ||
219 | |||
220 | public bool Say(UUID agentID, Scene scene, string text, int channel) | ||
221 | { | ||
224 | lock (m_avatars) | 222 | lock (m_avatars) |
225 | { | 223 | { |
226 | if (m_avatars.ContainsKey(agentID)) | 224 | if (m_avatars.ContainsKey(agentID)) |
@@ -228,7 +226,25 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
228 | ScenePresence sp; | 226 | ScenePresence sp; |
229 | scene.TryGetScenePresence(agentID, out sp); | 227 | scene.TryGetScenePresence(agentID, out sp); |
230 | 228 | ||
231 | m_avatars[agentID].Say(text); | 229 | m_avatars[agentID].Say(channel, text); |
230 | |||
231 | return true; | ||
232 | } | ||
233 | } | ||
234 | |||
235 | return false; | ||
236 | } | ||
237 | |||
238 | public bool Shout(UUID agentID, Scene scene, string text, int channel) | ||
239 | { | ||
240 | lock (m_avatars) | ||
241 | { | ||
242 | if (m_avatars.ContainsKey(agentID)) | ||
243 | { | ||
244 | ScenePresence sp; | ||
245 | scene.TryGetScenePresence(agentID, out sp); | ||
246 | |||
247 | m_avatars[agentID].Shout(channel, text); | ||
232 | 248 | ||
233 | return true; | 249 | return true; |
234 | } | 250 | } |
@@ -255,6 +271,24 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
255 | return false; | 271 | return false; |
256 | } | 272 | } |
257 | 273 | ||
274 | public bool Whisper(UUID agentID, Scene scene, string text, int channel) | ||
275 | { | ||
276 | lock (m_avatars) | ||
277 | { | ||
278 | if (m_avatars.ContainsKey(agentID)) | ||
279 | { | ||
280 | ScenePresence sp; | ||
281 | scene.TryGetScenePresence(agentID, out sp); | ||
282 | |||
283 | m_avatars[agentID].Whisper(channel, text); | ||
284 | |||
285 | return true; | ||
286 | } | ||
287 | } | ||
288 | |||
289 | return false; | ||
290 | } | ||
291 | |||
258 | public bool Stand(UUID agentID, Scene scene) | 292 | public bool Stand(UUID agentID, Scene scene) |
259 | { | 293 | { |
260 | lock (m_avatars) | 294 | lock (m_avatars) |
@@ -308,7 +342,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
308 | scene.RemoveClient(agentID, false); | 342 | scene.RemoveClient(agentID, false); |
309 | m_avatars.Remove(agentID); | 343 | m_avatars.Remove(agentID); |
310 | 344 | ||
311 | // m_log.DebugFormat("[NPC MODULE]: Removed {0} {1}", agentID, av.Name); | 345 | m_log.DebugFormat("[NPC MODULE]: Removed NPC {0} {1}", agentID, av.Name); |
312 | return true; | 346 | return true; |
313 | } | 347 | } |
314 | } | 348 | } |
diff --git a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs index eea0b2e..65dad2d 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs | |||
@@ -85,7 +85,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests | |||
85 | m_attMod = new AttachmentsModule(); | 85 | m_attMod = new AttachmentsModule(); |
86 | m_npcMod = new NPCModule(); | 86 | m_npcMod = new NPCModule(); |
87 | 87 | ||
88 | m_scene = SceneHelpers.SetupScene(); | 88 | m_scene = new SceneHelpers().SetupScene(); |
89 | SceneHelpers.SetupSceneModules(m_scene, config, m_afMod, m_umMod, m_attMod, m_npcMod, new BasicInventoryAccessModule()); | 89 | SceneHelpers.SetupSceneModules(m_scene, config, m_afMod, m_umMod, m_attMod, m_npcMod, new BasicInventoryAccessModule()); |
90 | } | 90 | } |
91 | 91 | ||
@@ -242,7 +242,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests | |||
242 | Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos)); | 242 | Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos)); |
243 | 243 | ||
244 | Vector3 targetPos = startPos + new Vector3(0, 10, 0); | 244 | Vector3 targetPos = startPos + new Vector3(0, 10, 0); |
245 | m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false); | 245 | m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false, false); |
246 | 246 | ||
247 | Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos)); | 247 | Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos)); |
248 | //Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0.7071068f, 0.7071068f))); | 248 | //Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0.7071068f, 0.7071068f))); |
@@ -267,7 +267,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests | |||
267 | // Try a second movement | 267 | // Try a second movement |
268 | startPos = npc.AbsolutePosition; | 268 | startPos = npc.AbsolutePosition; |
269 | targetPos = startPos + new Vector3(10, 0, 0); | 269 | targetPos = startPos + new Vector3(10, 0, 0); |
270 | m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false); | 270 | m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false, false); |
271 | 271 | ||
272 | Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos)); | 272 | Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos)); |
273 | // Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0, 1))); | 273 | // Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0, 1))); |
diff --git a/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs b/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs index 48c242d..1aee39a 100644 --- a/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs +++ b/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs | |||
@@ -113,14 +113,15 @@ namespace OpenSim.Region.OptionalModules.World.WorldView | |||
113 | if (!m_Enabled) | 113 | if (!m_Enabled) |
114 | return new Byte[0]; | 114 | return new Byte[0]; |
115 | 115 | ||
116 | Bitmap bmp = m_Generator.CreateViewImage(pos, rot, fov, width, | 116 | using (Bitmap bmp = m_Generator.CreateViewImage(pos, rot, fov, width, height, usetex)) |
117 | height, usetex); | 117 | { |
118 | 118 | using (MemoryStream str = new MemoryStream()) | |
119 | MemoryStream str = new MemoryStream(); | 119 | { |
120 | 120 | bmp.Save(str, ImageFormat.Jpeg); | |
121 | bmp.Save(str, ImageFormat.Jpeg); | ||
122 | 121 | ||
123 | return str.ToArray(); | 122 | return str.ToArray(); |
123 | } | ||
124 | } | ||
124 | } | 125 | } |
125 | } | 126 | } |
126 | } | 127 | } |
diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs index b1a3ff9..e43136a 100644 --- a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs | |||
@@ -36,13 +36,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
36 | { | 36 | { |
37 | public class BasicActor : PhysicsActor | 37 | public class BasicActor : PhysicsActor |
38 | { | 38 | { |
39 | private Vector3 _position; | ||
40 | private Vector3 _velocity; | ||
41 | private Vector3 _acceleration; | ||
42 | private Vector3 _size; | 39 | private Vector3 _size; |
43 | private Vector3 m_rotationalVelocity; | ||
44 | private bool flying; | ||
45 | private bool iscolliding; | ||
46 | 40 | ||
47 | public BasicActor(Vector3 size) | 41 | public BasicActor(Vector3 size) |
48 | { | 42 | { |
@@ -55,11 +49,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
55 | set { return; } | 49 | set { return; } |
56 | } | 50 | } |
57 | 51 | ||
58 | public override Vector3 RotationalVelocity | 52 | public override Vector3 RotationalVelocity { get; set; } |
59 | { | ||
60 | get { return m_rotationalVelocity; } | ||
61 | set { m_rotationalVelocity = value; } | ||
62 | } | ||
63 | 53 | ||
64 | public override bool SetAlwaysRun | 54 | public override bool SetAlwaysRun |
65 | { | 55 | { |
@@ -105,17 +95,9 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
105 | set { return; } | 95 | set { return; } |
106 | } | 96 | } |
107 | 97 | ||
108 | public override bool Flying | 98 | public override bool Flying { get; set; } |
109 | { | ||
110 | get { return flying; } | ||
111 | set { flying = value; } | ||
112 | } | ||
113 | 99 | ||
114 | public override bool IsColliding | 100 | public override bool IsColliding { get; set; } |
115 | { | ||
116 | get { return iscolliding; } | ||
117 | set { iscolliding = value; } | ||
118 | } | ||
119 | 101 | ||
120 | public override bool CollidingGround | 102 | public override bool CollidingGround |
121 | { | 103 | { |
@@ -134,11 +116,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
134 | get { return false; } | 116 | get { return false; } |
135 | } | 117 | } |
136 | 118 | ||
137 | public override Vector3 Position | 119 | public override Vector3 Position { get; set; } |
138 | { | ||
139 | get { return _position; } | ||
140 | set { _position = value; } | ||
141 | } | ||
142 | 120 | ||
143 | public override Vector3 Size | 121 | public override Vector3 Size |
144 | { | 122 | { |
@@ -206,11 +184,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
206 | get { return Vector3.Zero; } | 184 | get { return Vector3.Zero; } |
207 | } | 185 | } |
208 | 186 | ||
209 | public override Vector3 Velocity | 187 | public override Vector3 Velocity { get; set; } |
210 | { | ||
211 | get { return _velocity; } | ||
212 | set { _velocity = value; } | ||
213 | } | ||
214 | 188 | ||
215 | public override Vector3 Torque | 189 | public override Vector3 Torque |
216 | { | 190 | { |
@@ -230,11 +204,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
230 | set { } | 204 | set { } |
231 | } | 205 | } |
232 | 206 | ||
233 | public override Vector3 Acceleration | 207 | public override Vector3 Acceleration { get; set; } |
234 | { | ||
235 | get { return _acceleration; } | ||
236 | set { _acceleration = value; } | ||
237 | } | ||
238 | 208 | ||
239 | public override bool Kinematic | 209 | public override bool Kinematic |
240 | { | 210 | { |
diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPrim.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPrim.cs new file mode 100644 index 0000000..b89eeed --- /dev/null +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPrim.cs | |||
@@ -0,0 +1,314 @@ | |||
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 Nini.Config; | ||
31 | using OpenMetaverse; | ||
32 | using OpenSim.Framework; | ||
33 | using OpenSim.Region.Physics.Manager; | ||
34 | |||
35 | namespace OpenSim.Region.Physics.BasicPhysicsPlugin | ||
36 | { | ||
37 | public class BasicPhysicsPrim : PhysicsActor | ||
38 | { | ||
39 | private Vector3 _size; | ||
40 | private PrimitiveBaseShape _shape; | ||
41 | |||
42 | public BasicPhysicsPrim( | ||
43 | string name, uint localId, Vector3 position, Vector3 size, Quaternion orientation, PrimitiveBaseShape shape) | ||
44 | { | ||
45 | Name = name; | ||
46 | LocalID = localId; | ||
47 | Position = position; | ||
48 | Size = size; | ||
49 | Orientation = orientation; | ||
50 | Shape = shape; | ||
51 | } | ||
52 | |||
53 | public override int PhysicsActorType | ||
54 | { | ||
55 | get { return (int) ActorTypes.Agent; } | ||
56 | set { return; } | ||
57 | } | ||
58 | |||
59 | public override Vector3 RotationalVelocity { get; set; } | ||
60 | |||
61 | public override bool SetAlwaysRun | ||
62 | { | ||
63 | get { return false; } | ||
64 | set { return; } | ||
65 | } | ||
66 | |||
67 | public override uint LocalID | ||
68 | { | ||
69 | set { return; } | ||
70 | } | ||
71 | |||
72 | public override bool Grabbed | ||
73 | { | ||
74 | set { return; } | ||
75 | } | ||
76 | |||
77 | public override bool Selected | ||
78 | { | ||
79 | set { return; } | ||
80 | } | ||
81 | |||
82 | public override float Buoyancy | ||
83 | { | ||
84 | get { return 0f; } | ||
85 | set { return; } | ||
86 | } | ||
87 | |||
88 | public override bool FloatOnWater | ||
89 | { | ||
90 | set { return; } | ||
91 | } | ||
92 | |||
93 | public override bool IsPhysical | ||
94 | { | ||
95 | get { return false; } | ||
96 | set { return; } | ||
97 | } | ||
98 | |||
99 | public override bool ThrottleUpdates | ||
100 | { | ||
101 | get { return false; } | ||
102 | set { return; } | ||
103 | } | ||
104 | |||
105 | public override bool Flying { get; set; } | ||
106 | |||
107 | public override bool IsColliding { get; set; } | ||
108 | |||
109 | public override bool CollidingGround | ||
110 | { | ||
111 | get { return false; } | ||
112 | set { return; } | ||
113 | } | ||
114 | |||
115 | public override bool CollidingObj | ||
116 | { | ||
117 | get { return false; } | ||
118 | set { return; } | ||
119 | } | ||
120 | |||
121 | public override bool Stopped | ||
122 | { | ||
123 | get { return false; } | ||
124 | } | ||
125 | |||
126 | public override Vector3 Position { get; set; } | ||
127 | |||
128 | public override Vector3 Size | ||
129 | { | ||
130 | get { return _size; } | ||
131 | set { | ||
132 | _size = value; | ||
133 | _size.Z = _size.Z / 2.0f; | ||
134 | } | ||
135 | } | ||
136 | |||
137 | public override PrimitiveBaseShape Shape | ||
138 | { | ||
139 | set { _shape = value; } | ||
140 | } | ||
141 | |||
142 | public override float Mass | ||
143 | { | ||
144 | get { return 0f; } | ||
145 | } | ||
146 | |||
147 | public override Vector3 Force | ||
148 | { | ||
149 | get { return Vector3.Zero; } | ||
150 | set { return; } | ||
151 | } | ||
152 | |||
153 | public override int VehicleType | ||
154 | { | ||
155 | get { return 0; } | ||
156 | set { return; } | ||
157 | } | ||
158 | |||
159 | public override void VehicleFloatParam(int param, float value) | ||
160 | { | ||
161 | |||
162 | } | ||
163 | |||
164 | public override void VehicleVectorParam(int param, Vector3 value) | ||
165 | { | ||
166 | |||
167 | } | ||
168 | |||
169 | public override void VehicleRotationParam(int param, Quaternion rotation) | ||
170 | { | ||
171 | |||
172 | } | ||
173 | |||
174 | public override void VehicleFlags(int param, bool remove) | ||
175 | { | ||
176 | |||
177 | } | ||
178 | |||
179 | public override void SetVolumeDetect(int param) | ||
180 | { | ||
181 | |||
182 | } | ||
183 | |||
184 | public override Vector3 CenterOfMass | ||
185 | { | ||
186 | get { return Vector3.Zero; } | ||
187 | } | ||
188 | |||
189 | public override Vector3 GeometricCenter | ||
190 | { | ||
191 | get { return Vector3.Zero; } | ||
192 | } | ||
193 | |||
194 | public override Vector3 Velocity { get; set; } | ||
195 | |||
196 | public override Vector3 Torque | ||
197 | { | ||
198 | get { return Vector3.Zero; } | ||
199 | set { return; } | ||
200 | } | ||
201 | |||
202 | public override float CollisionScore | ||
203 | { | ||
204 | get { return 0f; } | ||
205 | set { } | ||
206 | } | ||
207 | |||
208 | public override Quaternion Orientation { get; set; } | ||
209 | |||
210 | public override Vector3 Acceleration { get; set; } | ||
211 | |||
212 | public override bool Kinematic | ||
213 | { | ||
214 | get { return true; } | ||
215 | set { } | ||
216 | } | ||
217 | |||
218 | public override void link(PhysicsActor obj) | ||
219 | { | ||
220 | } | ||
221 | |||
222 | public override void delink() | ||
223 | { | ||
224 | } | ||
225 | |||
226 | public override void LockAngularMotion(Vector3 axis) | ||
227 | { | ||
228 | } | ||
229 | |||
230 | public override void AddForce(Vector3 force, bool pushforce) | ||
231 | { | ||
232 | } | ||
233 | |||
234 | public override void AddAngularForce(Vector3 force, bool pushforce) | ||
235 | { | ||
236 | } | ||
237 | |||
238 | public override void SetMomentum(Vector3 momentum) | ||
239 | { | ||
240 | } | ||
241 | |||
242 | public override void CrossingFailure() | ||
243 | { | ||
244 | } | ||
245 | |||
246 | public override Vector3 PIDTarget | ||
247 | { | ||
248 | set { return; } | ||
249 | } | ||
250 | |||
251 | public override bool PIDActive | ||
252 | { | ||
253 | set { return; } | ||
254 | } | ||
255 | |||
256 | public override float PIDTau | ||
257 | { | ||
258 | set { return; } | ||
259 | } | ||
260 | |||
261 | public override float PIDHoverHeight | ||
262 | { | ||
263 | set { return; } | ||
264 | } | ||
265 | |||
266 | public override bool PIDHoverActive | ||
267 | { | ||
268 | set { return; } | ||
269 | } | ||
270 | |||
271 | public override PIDHoverType PIDHoverType | ||
272 | { | ||
273 | set { return; } | ||
274 | } | ||
275 | |||
276 | public override float PIDHoverTau | ||
277 | { | ||
278 | set { return; } | ||
279 | } | ||
280 | |||
281 | public override Quaternion APIDTarget | ||
282 | { | ||
283 | set { return; } | ||
284 | } | ||
285 | |||
286 | public override bool APIDActive | ||
287 | { | ||
288 | set { return; } | ||
289 | } | ||
290 | |||
291 | public override float APIDStrength | ||
292 | { | ||
293 | set { return; } | ||
294 | } | ||
295 | |||
296 | public override float APIDDamping | ||
297 | { | ||
298 | set { return; } | ||
299 | } | ||
300 | |||
301 | public override void SubscribeEvents(int ms) | ||
302 | { | ||
303 | } | ||
304 | |||
305 | public override void UnSubscribeEvents() | ||
306 | { | ||
307 | } | ||
308 | |||
309 | public override bool SubscribedEvents() | ||
310 | { | ||
311 | return false; | ||
312 | } | ||
313 | } | ||
314 | } | ||
diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsScene.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsScene.cs index 2e14216..f5826ed 100644 --- a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsScene.cs +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsScene.cs | |||
@@ -34,9 +34,17 @@ using OpenSim.Region.Physics.Manager; | |||
34 | 34 | ||
35 | namespace OpenSim.Region.Physics.BasicPhysicsPlugin | 35 | namespace OpenSim.Region.Physics.BasicPhysicsPlugin |
36 | { | 36 | { |
37 | /// <summary> | ||
38 | /// This is an incomplete extremely basic physics implementation | ||
39 | /// </summary> | ||
40 | /// <remarks> | ||
41 | /// Not useful for anything at the moment apart from some regression testing in other components where some form | ||
42 | /// of physics plugin is needed. | ||
43 | /// </remarks> | ||
37 | public class BasicScene : PhysicsScene | 44 | public class BasicScene : PhysicsScene |
38 | { | 45 | { |
39 | private List<BasicActor> _actors = new List<BasicActor>(); | 46 | private List<BasicActor> _actors = new List<BasicActor>(); |
47 | private List<BasicPhysicsPrim> _prims = new List<BasicPhysicsPrim>(); | ||
40 | private float[] _heightMap; | 48 | private float[] _heightMap; |
41 | 49 | ||
42 | //protected internal string sceneIdentifier; | 50 | //protected internal string sceneIdentifier; |
@@ -50,10 +58,19 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
50 | { | 58 | { |
51 | } | 59 | } |
52 | 60 | ||
53 | public override void Dispose() | 61 | public override void Dispose() {} |
62 | |||
63 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, | ||
64 | Vector3 size, Quaternion rotation, bool isPhysical, uint localid) | ||
54 | { | 65 | { |
66 | BasicPhysicsPrim prim = new BasicPhysicsPrim(primName, localid, position, size, rotation, pbs); | ||
67 | prim.IsPhysical = isPhysical; | ||
68 | |||
69 | _prims.Add(prim); | ||
55 | 70 | ||
71 | return prim; | ||
56 | } | 72 | } |
73 | |||
57 | public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying) | 74 | public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying) |
58 | { | 75 | { |
59 | BasicActor act = new BasicActor(size); | 76 | BasicActor act = new BasicActor(size); |
@@ -63,30 +80,18 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
63 | return act; | 80 | return act; |
64 | } | 81 | } |
65 | 82 | ||
66 | public override void RemovePrim(PhysicsActor prim) | 83 | public override void RemovePrim(PhysicsActor actor) |
67 | { | 84 | { |
85 | BasicPhysicsPrim prim = (BasicPhysicsPrim)actor; | ||
86 | if (_prims.Contains(prim)) | ||
87 | _prims.Remove(prim); | ||
68 | } | 88 | } |
69 | 89 | ||
70 | public override void RemoveAvatar(PhysicsActor actor) | 90 | public override void RemoveAvatar(PhysicsActor actor) |
71 | { | 91 | { |
72 | BasicActor act = (BasicActor) actor; | 92 | BasicActor act = (BasicActor)actor; |
73 | if (_actors.Contains(act)) | 93 | if (_actors.Contains(act)) |
74 | { | ||
75 | _actors.Remove(act); | 94 | _actors.Remove(act); |
76 | } | ||
77 | } | ||
78 | |||
79 | /* | ||
80 | public override PhysicsActor AddPrim(Vector3 position, Vector3 size, Quaternion rotation) | ||
81 | { | ||
82 | return null; | ||
83 | } | ||
84 | */ | ||
85 | |||
86 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, | ||
87 | Vector3 size, Quaternion rotation, bool isPhysical, uint localid) | ||
88 | { | ||
89 | return null; | ||
90 | } | 95 | } |
91 | 96 | ||
92 | public override void AddPhysicsActorTaint(PhysicsActor prim) | 97 | public override void AddPhysicsActorTaint(PhysicsActor prim) |
diff --git a/OpenSim/Region/Physics/Manager/PhysicsScene.cs b/OpenSim/Region/Physics/Manager/PhysicsScene.cs index d10a2aa..cfede55 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsScene.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsScene.cs | |||
@@ -241,8 +241,22 @@ namespace OpenSim.Region.Physics.Manager | |||
241 | 241 | ||
242 | public abstract void AddPhysicsActorTaint(PhysicsActor prim); | 242 | public abstract void AddPhysicsActorTaint(PhysicsActor prim); |
243 | 243 | ||
244 | /// <summary> | ||
245 | /// Perform a simulation of the current physics scene over the given timestep. | ||
246 | /// </summary> | ||
247 | /// <param name="timeStep"></param> | ||
248 | /// <returns>The number of frames simulated over that period.</returns> | ||
244 | public abstract float Simulate(float timeStep); | 249 | public abstract float Simulate(float timeStep); |
245 | 250 | ||
251 | /// <summary> | ||
252 | /// Get statistics about this scene. | ||
253 | /// </summary> | ||
254 | /// <remarks>This facility is currently experimental and subject to change.</remarks> | ||
255 | /// <returns> | ||
256 | /// A dictionary where the key is the statistic name. If no statistics are supplied then returns null. | ||
257 | /// </returns> | ||
258 | public virtual Dictionary<string, float> GetStats() { return null; } | ||
259 | |||
246 | public abstract void GetResults(); | 260 | public abstract void GetResults(); |
247 | 261 | ||
248 | public abstract void SetTerrain(float[] heightMap); | 262 | public abstract void SetTerrain(float[] heightMap); |
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index 8397eb4..54b69a2 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | |||
@@ -1261,14 +1261,20 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1261 | { | 1261 | { |
1262 | m_requestedUpdateFrequency = ms; | 1262 | m_requestedUpdateFrequency = ms; |
1263 | m_eventsubscription = ms; | 1263 | m_eventsubscription = ms; |
1264 | CollisionEventsThisFrame.Clear(); | 1264 | |
1265 | // Don't clear collision event reporting here. This is called directly from scene code and so can lead | ||
1266 | // to a race condition with the simulate loop | ||
1267 | |||
1265 | _parent_scene.AddCollisionEventReporting(this); | 1268 | _parent_scene.AddCollisionEventReporting(this); |
1266 | } | 1269 | } |
1267 | 1270 | ||
1268 | public override void UnSubscribeEvents() | 1271 | public override void UnSubscribeEvents() |
1269 | { | 1272 | { |
1270 | CollisionEventsThisFrame.Clear(); | 1273 | CollisionEventsThisFrame.Clear(); |
1271 | _parent_scene.RemoveCollisionEventReporting(this); | 1274 | |
1275 | // Don't clear collision event reporting here. This is called directly from scene code and so can lead | ||
1276 | // to a race condition with the simulate loop | ||
1277 | |||
1272 | m_requestedUpdateFrequency = 0; | 1278 | m_requestedUpdateFrequency = 0; |
1273 | m_eventsubscription = 0; | 1279 | m_eventsubscription = 0; |
1274 | } | 1280 | } |
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 6f37347..a41c856 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | |||
@@ -156,7 +156,15 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
156 | /// </summary> | 156 | /// </summary> |
157 | public IntPtr m_targetSpace = IntPtr.Zero; | 157 | public IntPtr m_targetSpace = IntPtr.Zero; |
158 | 158 | ||
159 | /// <summary> | ||
160 | /// The prim geometry, used for collision detection. | ||
161 | /// </summary> | ||
162 | /// <remarks> | ||
163 | /// This is never null except for a brief period when the geometry needs to be replaced (due to resizing or | ||
164 | /// mesh change) or when the physical prim is being removed from the scene. | ||
165 | /// </remarks> | ||
159 | public IntPtr prim_geom { get; private set; } | 166 | public IntPtr prim_geom { get; private set; } |
167 | |||
160 | public IntPtr _triMeshData { get; private set; } | 168 | public IntPtr _triMeshData { get; private set; } |
161 | 169 | ||
162 | private IntPtr _linkJointGroup = IntPtr.Zero; | 170 | private IntPtr _linkJointGroup = IntPtr.Zero; |
@@ -325,14 +333,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
325 | { | 333 | { |
326 | prim_geom = geom; | 334 | prim_geom = geom; |
327 | //Console.WriteLine("SetGeom to " + prim_geom + " for " + Name); | 335 | //Console.WriteLine("SetGeom to " + prim_geom + " for " + Name); |
328 | if (prim_geom != IntPtr.Zero) | ||
329 | { | ||
330 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | ||
331 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
332 | 336 | ||
333 | _parent_scene.geom_name_map[prim_geom] = Name; | 337 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); |
334 | _parent_scene.actor_name_map[prim_geom] = this; | 338 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); |
335 | } | 339 | |
340 | _parent_scene.geom_name_map[prim_geom] = Name; | ||
341 | _parent_scene.actor_name_map[prim_geom] = this; | ||
336 | 342 | ||
337 | if (childPrim) | 343 | if (childPrim) |
338 | { | 344 | { |
@@ -765,11 +771,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
765 | m_collisionCategories &= ~CollisionCategories.Body; | 771 | m_collisionCategories &= ~CollisionCategories.Body; |
766 | m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); | 772 | m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); |
767 | 773 | ||
768 | if (prim_geom != IntPtr.Zero) | 774 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); |
769 | { | 775 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); |
770 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | ||
771 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
772 | } | ||
773 | 776 | ||
774 | d.BodyDestroy(Body); | 777 | d.BodyDestroy(Body); |
775 | lock (childrenPrim) | 778 | lock (childrenPrim) |
@@ -793,11 +796,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
793 | m_collisionCategories &= ~CollisionCategories.Body; | 796 | m_collisionCategories &= ~CollisionCategories.Body; |
794 | m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); | 797 | m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); |
795 | 798 | ||
796 | if (prim_geom != IntPtr.Zero) | 799 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); |
797 | { | 800 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); |
798 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | ||
799 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
800 | } | ||
801 | 801 | ||
802 | Body = IntPtr.Zero; | 802 | Body = IntPtr.Zero; |
803 | } | 803 | } |
@@ -864,10 +864,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
864 | // _parent_scene.waitForSpaceUnlock(m_targetSpace); | 864 | // _parent_scene.waitForSpaceUnlock(m_targetSpace); |
865 | try | 865 | try |
866 | { | 866 | { |
867 | if (prim_geom == IntPtr.Zero) | 867 | SetGeom(d.CreateTriMesh(m_targetSpace, _triMeshData, parent_scene.triCallback, null, null)); |
868 | { | ||
869 | SetGeom(d.CreateTriMesh(m_targetSpace, _triMeshData, parent_scene.triCallback, null, null)); | ||
870 | } | ||
871 | } | 868 | } |
872 | catch (AccessViolationException) | 869 | catch (AccessViolationException) |
873 | { | 870 | { |
@@ -890,73 +887,67 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
890 | #if SPAM | 887 | #if SPAM |
891 | Console.WriteLine("ZProcessTaints for " + Name); | 888 | Console.WriteLine("ZProcessTaints for " + Name); |
892 | #endif | 889 | #endif |
890 | |||
891 | // This must be processed as the very first taint so that later operations have a prim_geom to work with | ||
892 | // if this is a new prim. | ||
893 | if (m_taintadd) | 893 | if (m_taintadd) |
894 | { | ||
895 | changeadd(); | 894 | changeadd(); |
896 | } | ||
897 | |||
898 | if (prim_geom != IntPtr.Zero) | ||
899 | { | ||
900 | if (!_position.ApproxEquals(m_taintposition, 0f)) | ||
901 | changemove(); | ||
902 | 895 | ||
903 | if (m_taintrot != _orientation) | 896 | if (!_position.ApproxEquals(m_taintposition, 0f)) |
904 | { | 897 | changemove(); |
905 | if (childPrim && IsPhysical) // For physical child prim... | 898 | |
906 | { | 899 | if (m_taintrot != _orientation) |
907 | rotate(); | 900 | { |
908 | // KF: ODE will also rotate the parent prim! | 901 | if (childPrim && IsPhysical) // For physical child prim... |
909 | // so rotate the root back to where it was | 902 | { |
910 | OdePrim parent = (OdePrim)_parent; | 903 | rotate(); |
911 | parent.rotate(); | 904 | // KF: ODE will also rotate the parent prim! |
912 | } | 905 | // so rotate the root back to where it was |
913 | else | 906 | OdePrim parent = (OdePrim)_parent; |
914 | { | 907 | parent.rotate(); |
915 | //Just rotate the prim | ||
916 | rotate(); | ||
917 | } | ||
918 | } | 908 | } |
919 | 909 | else | |
920 | if (m_taintPhysics != IsPhysical && !(m_taintparent != _parent)) | 910 | { |
921 | changePhysicsStatus(); | 911 | //Just rotate the prim |
912 | rotate(); | ||
913 | } | ||
914 | } | ||
915 | |||
916 | if (m_taintPhysics != IsPhysical && !(m_taintparent != _parent)) | ||
917 | changePhysicsStatus(); | ||
922 | 918 | ||
923 | if (!_size.ApproxEquals(m_taintsize, 0f)) | 919 | if (!_size.ApproxEquals(m_taintsize, 0f)) |
924 | changesize(); | 920 | changesize(); |
925 | 921 | ||
926 | if (m_taintshape) | 922 | if (m_taintshape) |
927 | changeshape(); | 923 | changeshape(); |
928 | 924 | ||
929 | if (m_taintforce) | 925 | if (m_taintforce) |
930 | changeAddForce(); | 926 | changeAddForce(); |
931 | 927 | ||
932 | if (m_taintaddangularforce) | 928 | if (m_taintaddangularforce) |
933 | changeAddAngularForce(); | 929 | changeAddAngularForce(); |
934 | 930 | ||
935 | if (!m_taintTorque.ApproxEquals(Vector3.Zero, 0.001f)) | 931 | if (!m_taintTorque.ApproxEquals(Vector3.Zero, 0.001f)) |
936 | changeSetTorque(); | 932 | changeSetTorque(); |
937 | 933 | ||
938 | if (m_taintdisable) | 934 | if (m_taintdisable) |
939 | changedisable(); | 935 | changedisable(); |
940 | 936 | ||
941 | if (m_taintselected != m_isSelected) | 937 | if (m_taintselected != m_isSelected) |
942 | changeSelectedStatus(); | 938 | changeSelectedStatus(); |
943 | 939 | ||
944 | if (!m_taintVelocity.ApproxEquals(Vector3.Zero, 0.001f)) | 940 | if (!m_taintVelocity.ApproxEquals(Vector3.Zero, 0.001f)) |
945 | changevelocity(); | 941 | changevelocity(); |
946 | 942 | ||
947 | if (m_taintparent != _parent) | 943 | if (m_taintparent != _parent) |
948 | changelink(); | 944 | changelink(); |
949 | 945 | ||
950 | if (m_taintCollidesWater != m_collidesWater) | 946 | if (m_taintCollidesWater != m_collidesWater) |
951 | changefloatonwater(); | 947 | changefloatonwater(); |
952 | 948 | ||
953 | if (!m_angularlock.ApproxEquals(m_taintAngularLock,0f)) | 949 | if (!m_angularlock.ApproxEquals(m_taintAngularLock,0f)) |
954 | changeAngularLock(); | 950 | changeAngularLock(); |
955 | } | ||
956 | else | ||
957 | { | ||
958 | m_log.ErrorFormat("[PHYSICS]: The scene reused a disposed PhysActor for {0}! *waves finger*, Don't be evil. A couple of things can cause this. An improper prim breakdown(be sure to set prim_geom to zero after d.GeomDestroy! An improper buildup (creating the geom failed). Or, the Scene Reused a physics actor after disposing it.)", Name); | ||
959 | } | ||
960 | } | 951 | } |
961 | 952 | ||
962 | /// <summary> | 953 | /// <summary> |
@@ -1052,150 +1043,146 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1052 | /// <param name="prim">Child prim</param> | 1043 | /// <param name="prim">Child prim</param> |
1053 | private void AddChildPrim(OdePrim prim) | 1044 | private void AddChildPrim(OdePrim prim) |
1054 | { | 1045 | { |
1055 | //Console.WriteLine("AddChildPrim " + Name); | 1046 | if (LocalID == prim.LocalID) |
1056 | if (LocalID != prim.LocalID) | 1047 | return; |
1048 | |||
1049 | if (Body == IntPtr.Zero) | ||
1057 | { | 1050 | { |
1058 | if (Body == IntPtr.Zero) | 1051 | Body = d.BodyCreate(_parent_scene.world); |
1052 | setMass(); | ||
1053 | } | ||
1054 | |||
1055 | lock (childrenPrim) | ||
1056 | { | ||
1057 | if (childrenPrim.Contains(prim)) | ||
1058 | return; | ||
1059 | |||
1060 | // m_log.DebugFormat( | ||
1061 | // "[ODE PRIM]: Linking prim {0} {1} to {2} {3}", prim.Name, prim.LocalID, Name, LocalID); | ||
1062 | |||
1063 | childrenPrim.Add(prim); | ||
1064 | |||
1065 | foreach (OdePrim prm in childrenPrim) | ||
1059 | { | 1066 | { |
1060 | Body = d.BodyCreate(_parent_scene.world); | 1067 | d.Mass m2; |
1061 | setMass(); | 1068 | d.MassSetZero(out m2); |
1069 | d.MassSetBoxTotal(out m2, prim.CalculateMass(), prm._size.X, prm._size.Y, prm._size.Z); | ||
1070 | |||
1071 | d.Quaternion quat = new d.Quaternion(); | ||
1072 | quat.W = prm._orientation.W; | ||
1073 | quat.X = prm._orientation.X; | ||
1074 | quat.Y = prm._orientation.Y; | ||
1075 | quat.Z = prm._orientation.Z; | ||
1076 | |||
1077 | d.Matrix3 mat = new d.Matrix3(); | ||
1078 | d.RfromQ(out mat, ref quat); | ||
1079 | d.MassRotate(ref m2, ref mat); | ||
1080 | d.MassTranslate(ref m2, Position.X - prm.Position.X, Position.Y - prm.Position.Y, Position.Z - prm.Position.Z); | ||
1081 | d.MassAdd(ref pMass, ref m2); | ||
1062 | } | 1082 | } |
1063 | if (Body != IntPtr.Zero) | 1083 | |
1084 | foreach (OdePrim prm in childrenPrim) | ||
1064 | { | 1085 | { |
1065 | lock (childrenPrim) | 1086 | prm.m_collisionCategories |= CollisionCategories.Body; |
1066 | { | 1087 | prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); |
1067 | if (!childrenPrim.Contains(prim)) | ||
1068 | { | ||
1069 | //Console.WriteLine("childrenPrim.Add " + prim); | ||
1070 | childrenPrim.Add(prim); | ||
1071 | |||
1072 | foreach (OdePrim prm in childrenPrim) | ||
1073 | { | ||
1074 | d.Mass m2; | ||
1075 | d.MassSetZero(out m2); | ||
1076 | d.MassSetBoxTotal(out m2, prim.CalculateMass(), prm._size.X, prm._size.Y, prm._size.Z); | ||
1077 | |||
1078 | d.Quaternion quat = new d.Quaternion(); | ||
1079 | quat.W = prm._orientation.W; | ||
1080 | quat.X = prm._orientation.X; | ||
1081 | quat.Y = prm._orientation.Y; | ||
1082 | quat.Z = prm._orientation.Z; | ||
1083 | |||
1084 | d.Matrix3 mat = new d.Matrix3(); | ||
1085 | d.RfromQ(out mat, ref quat); | ||
1086 | d.MassRotate(ref m2, ref mat); | ||
1087 | d.MassTranslate(ref m2, Position.X - prm.Position.X, Position.Y - prm.Position.Y, Position.Z - prm.Position.Z); | ||
1088 | d.MassAdd(ref pMass, ref m2); | ||
1089 | } | ||
1090 | |||
1091 | foreach (OdePrim prm in childrenPrim) | ||
1092 | { | ||
1093 | prm.m_collisionCategories |= CollisionCategories.Body; | ||
1094 | prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); | ||
1095 | 1088 | ||
1096 | if (prm.prim_geom == IntPtr.Zero) | ||
1097 | { | ||
1098 | m_log.WarnFormat( | ||
1099 | "[PHYSICS]: Unable to link one of the linkset elements {0} for parent {1}. No geom yet", | ||
1100 | prm.Name, prim.Name); | ||
1101 | continue; | ||
1102 | } | ||
1103 | //Console.WriteLine(" GeomSetCategoryBits 1: " + prm.prim_geom + " - " + (int)prm.m_collisionCategories + " for " + Name); | 1089 | //Console.WriteLine(" GeomSetCategoryBits 1: " + prm.prim_geom + " - " + (int)prm.m_collisionCategories + " for " + Name); |
1104 | d.GeomSetCategoryBits(prm.prim_geom, (int)prm.m_collisionCategories); | 1090 | d.GeomSetCategoryBits(prm.prim_geom, (int)prm.m_collisionCategories); |
1105 | d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags); | 1091 | d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags); |
1106 | |||
1107 | 1092 | ||
1108 | d.Quaternion quat = new d.Quaternion(); | 1093 | d.Quaternion quat = new d.Quaternion(); |
1109 | quat.W = prm._orientation.W; | 1094 | quat.W = prm._orientation.W; |
1110 | quat.X = prm._orientation.X; | 1095 | quat.X = prm._orientation.X; |
1111 | quat.Y = prm._orientation.Y; | 1096 | quat.Y = prm._orientation.Y; |
1112 | quat.Z = prm._orientation.Z; | 1097 | quat.Z = prm._orientation.Z; |
1113 | 1098 | ||
1114 | d.Matrix3 mat = new d.Matrix3(); | 1099 | d.Matrix3 mat = new d.Matrix3(); |
1115 | d.RfromQ(out mat, ref quat); | 1100 | d.RfromQ(out mat, ref quat); |
1116 | if (Body != IntPtr.Zero) | 1101 | if (Body != IntPtr.Zero) |
1117 | { | 1102 | { |
1118 | d.GeomSetBody(prm.prim_geom, Body); | 1103 | d.GeomSetBody(prm.prim_geom, Body); |
1119 | prm.childPrim = true; | 1104 | prm.childPrim = true; |
1120 | d.GeomSetOffsetWorldPosition(prm.prim_geom, prm.Position.X , prm.Position.Y, prm.Position.Z); | 1105 | d.GeomSetOffsetWorldPosition(prm.prim_geom, prm.Position.X , prm.Position.Y, prm.Position.Z); |
1121 | //d.GeomSetOffsetPosition(prim.prim_geom, | 1106 | //d.GeomSetOffsetPosition(prim.prim_geom, |
1122 | // (Position.X - prm.Position.X) - pMass.c.X, | 1107 | // (Position.X - prm.Position.X) - pMass.c.X, |
1123 | // (Position.Y - prm.Position.Y) - pMass.c.Y, | 1108 | // (Position.Y - prm.Position.Y) - pMass.c.Y, |
1124 | // (Position.Z - prm.Position.Z) - pMass.c.Z); | 1109 | // (Position.Z - prm.Position.Z) - pMass.c.Z); |
1125 | d.GeomSetOffsetWorldRotation(prm.prim_geom, ref mat); | 1110 | d.GeomSetOffsetWorldRotation(prm.prim_geom, ref mat); |
1126 | //d.GeomSetOffsetRotation(prm.prim_geom, ref mat); | 1111 | //d.GeomSetOffsetRotation(prm.prim_geom, ref mat); |
1127 | d.MassTranslate(ref pMass, -pMass.c.X, -pMass.c.Y, -pMass.c.Z); | 1112 | d.MassTranslate(ref pMass, -pMass.c.X, -pMass.c.Y, -pMass.c.Z); |
1128 | d.BodySetMass(Body, ref pMass); | 1113 | d.BodySetMass(Body, ref pMass); |
1129 | } | 1114 | } |
1130 | else | 1115 | else |
1131 | { | 1116 | { |
1132 | m_log.DebugFormat("[PHYSICS]: {0} ain't got no boooooooooddy, no body", Name); | 1117 | m_log.DebugFormat("[PHYSICS]: {0} ain't got no boooooooooddy, no body", Name); |
1133 | } | 1118 | } |
1134 | 1119 | ||
1135 | prm.m_interpenetrationcount = 0; | 1120 | prm.m_interpenetrationcount = 0; |
1136 | prm.m_collisionscore = 0; | 1121 | prm.m_collisionscore = 0; |
1137 | prm.m_disabled = false; | 1122 | prm.m_disabled = false; |
1138 | 1123 | ||
1139 | // The body doesn't already have a finite rotation mode set here | 1124 | // The body doesn't already have a finite rotation mode set here |
1140 | if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null) | 1125 | if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null) |
1141 | { | 1126 | { |
1142 | prm.createAMotor(m_angularlock); | 1127 | prm.createAMotor(m_angularlock); |
1143 | } | 1128 | } |
1144 | prm.Body = Body; | 1129 | prm.Body = Body; |
1145 | _parent_scene.ActivatePrim(prm); | 1130 | _parent_scene.ActivatePrim(prm); |
1146 | } | 1131 | } |
1147 | 1132 | ||
1148 | m_collisionCategories |= CollisionCategories.Body; | 1133 | m_collisionCategories |= CollisionCategories.Body; |
1149 | m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); | 1134 | m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); |
1150 | 1135 | ||
1151 | //Console.WriteLine("GeomSetCategoryBits 2: " + prim_geom + " - " + (int)m_collisionCategories + " for " + Name); | 1136 | //Console.WriteLine("GeomSetCategoryBits 2: " + prim_geom + " - " + (int)m_collisionCategories + " for " + Name); |
1152 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | 1137 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); |
1153 | //Console.WriteLine(" Post GeomSetCategoryBits 2"); | 1138 | //Console.WriteLine(" Post GeomSetCategoryBits 2"); |
1154 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | 1139 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); |
1155 | |||
1156 | d.Quaternion quat2 = new d.Quaternion(); | ||
1157 | quat2.W = _orientation.W; | ||
1158 | quat2.X = _orientation.X; | ||
1159 | quat2.Y = _orientation.Y; | ||
1160 | quat2.Z = _orientation.Z; | ||
1161 | |||
1162 | d.Matrix3 mat2 = new d.Matrix3(); | ||
1163 | d.RfromQ(out mat2, ref quat2); | ||
1164 | d.GeomSetBody(prim_geom, Body); | ||
1165 | d.GeomSetOffsetWorldPosition(prim_geom, Position.X - pMass.c.X, Position.Y - pMass.c.Y, Position.Z - pMass.c.Z); | ||
1166 | //d.GeomSetOffsetPosition(prim.prim_geom, | ||
1167 | // (Position.X - prm.Position.X) - pMass.c.X, | ||
1168 | // (Position.Y - prm.Position.Y) - pMass.c.Y, | ||
1169 | // (Position.Z - prm.Position.Z) - pMass.c.Z); | ||
1170 | //d.GeomSetOffsetRotation(prim_geom, ref mat2); | ||
1171 | d.MassTranslate(ref pMass, -pMass.c.X, -pMass.c.Y, -pMass.c.Z); | ||
1172 | d.BodySetMass(Body, ref pMass); | ||
1173 | |||
1174 | d.BodySetAutoDisableFlag(Body, true); | ||
1175 | d.BodySetAutoDisableSteps(Body, body_autodisable_frames); | ||
1176 | 1140 | ||
1177 | m_interpenetrationcount = 0; | 1141 | d.Quaternion quat2 = new d.Quaternion(); |
1178 | m_collisionscore = 0; | 1142 | quat2.W = _orientation.W; |
1179 | m_disabled = false; | 1143 | quat2.X = _orientation.X; |
1144 | quat2.Y = _orientation.Y; | ||
1145 | quat2.Z = _orientation.Z; | ||
1180 | 1146 | ||
1181 | // The body doesn't already have a finite rotation mode set here | 1147 | d.Matrix3 mat2 = new d.Matrix3(); |
1182 | if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null) | 1148 | d.RfromQ(out mat2, ref quat2); |
1183 | { | 1149 | d.GeomSetBody(prim_geom, Body); |
1184 | createAMotor(m_angularlock); | 1150 | d.GeomSetOffsetWorldPosition(prim_geom, Position.X - pMass.c.X, Position.Y - pMass.c.Y, Position.Z - pMass.c.Z); |
1185 | } | 1151 | //d.GeomSetOffsetPosition(prim.prim_geom, |
1186 | d.BodySetPosition(Body, Position.X, Position.Y, Position.Z); | 1152 | // (Position.X - prm.Position.X) - pMass.c.X, |
1187 | if (m_vehicle.Type != Vehicle.TYPE_NONE) | 1153 | // (Position.Y - prm.Position.Y) - pMass.c.Y, |
1188 | m_vehicle.Enable(Body, _parent_scene); | 1154 | // (Position.Z - prm.Position.Z) - pMass.c.Z); |
1155 | //d.GeomSetOffsetRotation(prim_geom, ref mat2); | ||
1156 | d.MassTranslate(ref pMass, -pMass.c.X, -pMass.c.Y, -pMass.c.Z); | ||
1157 | d.BodySetMass(Body, ref pMass); | ||
1189 | 1158 | ||
1190 | _parent_scene.ActivatePrim(this); | 1159 | d.BodySetAutoDisableFlag(Body, true); |
1191 | } | 1160 | d.BodySetAutoDisableSteps(Body, body_autodisable_frames); |
1192 | } | 1161 | |
1162 | m_interpenetrationcount = 0; | ||
1163 | m_collisionscore = 0; | ||
1164 | m_disabled = false; | ||
1165 | |||
1166 | // The body doesn't already have a finite rotation mode set here | ||
1167 | if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null) | ||
1168 | { | ||
1169 | createAMotor(m_angularlock); | ||
1193 | } | 1170 | } |
1171 | |||
1172 | d.BodySetPosition(Body, Position.X, Position.Y, Position.Z); | ||
1173 | |||
1174 | if (m_vehicle.Type != Vehicle.TYPE_NONE) | ||
1175 | m_vehicle.Enable(Body, _parent_scene); | ||
1176 | |||
1177 | _parent_scene.ActivatePrim(this); | ||
1194 | } | 1178 | } |
1195 | } | 1179 | } |
1196 | 1180 | ||
1197 | private void ChildSetGeom(OdePrim odePrim) | 1181 | private void ChildSetGeom(OdePrim odePrim) |
1198 | { | 1182 | { |
1183 | // m_log.DebugFormat( | ||
1184 | // "[ODE PRIM]: ChildSetGeom {0} {1} for {2} {3}", odePrim.Name, odePrim.LocalID, Name, LocalID); | ||
1185 | |||
1199 | //if (IsPhysical && Body != IntPtr.Zero) | 1186 | //if (IsPhysical && Body != IntPtr.Zero) |
1200 | lock (childrenPrim) | 1187 | lock (childrenPrim) |
1201 | { | 1188 | { |
@@ -1210,12 +1197,14 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1210 | //prm.childPrim = false; | 1197 | //prm.childPrim = false; |
1211 | } | 1198 | } |
1212 | } | 1199 | } |
1200 | |||
1213 | disableBody(); | 1201 | disableBody(); |
1214 | 1202 | ||
1215 | if (Body != IntPtr.Zero) | 1203 | // Spurious - Body == IntPtr.Zero after disableBody() |
1216 | { | 1204 | // if (Body != IntPtr.Zero) |
1217 | _parent_scene.DeactivatePrim(this); | 1205 | // { |
1218 | } | 1206 | // _parent_scene.DeactivatePrim(this); |
1207 | // } | ||
1219 | 1208 | ||
1220 | lock (childrenPrim) | 1209 | lock (childrenPrim) |
1221 | { | 1210 | { |
@@ -1229,6 +1218,9 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1229 | 1218 | ||
1230 | private void ChildDelink(OdePrim odePrim) | 1219 | private void ChildDelink(OdePrim odePrim) |
1231 | { | 1220 | { |
1221 | // m_log.DebugFormat( | ||
1222 | // "[ODE PRIM]: Delinking prim {0} {1} from {2} {3}", odePrim.Name, odePrim.LocalID, Name, LocalID); | ||
1223 | |||
1232 | // Okay, we have a delinked child.. need to rebuild the body. | 1224 | // Okay, we have a delinked child.. need to rebuild the body. |
1233 | lock (childrenPrim) | 1225 | lock (childrenPrim) |
1234 | { | 1226 | { |
@@ -1243,6 +1235,7 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1243 | //prm.childPrim = false; | 1235 | //prm.childPrim = false; |
1244 | } | 1236 | } |
1245 | } | 1237 | } |
1238 | |||
1246 | disableBody(); | 1239 | disableBody(); |
1247 | 1240 | ||
1248 | lock (childrenPrim) | 1241 | lock (childrenPrim) |
@@ -1251,10 +1244,11 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1251 | childrenPrim.Remove(odePrim); | 1244 | childrenPrim.Remove(odePrim); |
1252 | } | 1245 | } |
1253 | 1246 | ||
1254 | if (Body != IntPtr.Zero) | 1247 | // Spurious - Body == IntPtr.Zero after disableBody() |
1255 | { | 1248 | // if (Body != IntPtr.Zero) |
1256 | _parent_scene.DeactivatePrim(this); | 1249 | // { |
1257 | } | 1250 | // _parent_scene.DeactivatePrim(this); |
1251 | // } | ||
1258 | 1252 | ||
1259 | lock (childrenPrim) | 1253 | lock (childrenPrim) |
1260 | { | 1254 | { |
@@ -1303,11 +1297,8 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1303 | disableBodySoft(); | 1297 | disableBodySoft(); |
1304 | } | 1298 | } |
1305 | 1299 | ||
1306 | if (prim_geom != IntPtr.Zero) | 1300 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); |
1307 | { | 1301 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); |
1308 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | ||
1309 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
1310 | } | ||
1311 | 1302 | ||
1312 | if (IsPhysical) | 1303 | if (IsPhysical) |
1313 | { | 1304 | { |
@@ -1328,11 +1319,8 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1328 | if (m_collidesWater) | 1319 | if (m_collidesWater) |
1329 | m_collisionFlags |= CollisionCategories.Water; | 1320 | m_collisionFlags |= CollisionCategories.Water; |
1330 | 1321 | ||
1331 | if (prim_geom != IntPtr.Zero) | 1322 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); |
1332 | { | 1323 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); |
1333 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | ||
1334 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
1335 | } | ||
1336 | 1324 | ||
1337 | if (IsPhysical) | 1325 | if (IsPhysical) |
1338 | { | 1326 | { |
@@ -1472,6 +1460,9 @@ Console.WriteLine("CreateGeom:"); | |||
1472 | } | 1460 | } |
1473 | else | 1461 | else |
1474 | { | 1462 | { |
1463 | m_log.WarnFormat( | ||
1464 | "[ODE PRIM]: Called RemoveGeom() on {0} {1} where geometry was already null.", Name, LocalID); | ||
1465 | |||
1475 | return false; | 1466 | return false; |
1476 | } | 1467 | } |
1477 | } | 1468 | } |
@@ -1505,16 +1496,13 @@ Console.WriteLine("changeadd 1"); | |||
1505 | #endif | 1496 | #endif |
1506 | CreateGeom(m_targetSpace, mesh); | 1497 | CreateGeom(m_targetSpace, mesh); |
1507 | 1498 | ||
1508 | if (prim_geom != IntPtr.Zero) | 1499 | d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); |
1509 | { | 1500 | d.Quaternion myrot = new d.Quaternion(); |
1510 | d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); | 1501 | myrot.X = _orientation.X; |
1511 | d.Quaternion myrot = new d.Quaternion(); | 1502 | myrot.Y = _orientation.Y; |
1512 | myrot.X = _orientation.X; | 1503 | myrot.Z = _orientation.Z; |
1513 | myrot.Y = _orientation.Y; | 1504 | myrot.W = _orientation.W; |
1514 | myrot.Z = _orientation.Z; | 1505 | d.GeomSetQuaternion(prim_geom, ref myrot); |
1515 | myrot.W = _orientation.W; | ||
1516 | d.GeomSetQuaternion(prim_geom, ref myrot); | ||
1517 | } | ||
1518 | 1506 | ||
1519 | if (IsPhysical && Body == IntPtr.Zero) | 1507 | if (IsPhysical && Body == IntPtr.Zero) |
1520 | enableBody(); | 1508 | enableBody(); |
@@ -1579,24 +1567,20 @@ Console.WriteLine(" JointCreateFixed"); | |||
1579 | //m_log.Debug("[BUG]: race!"); | 1567 | //m_log.Debug("[BUG]: race!"); |
1580 | //} | 1568 | //} |
1581 | } | 1569 | } |
1582 | else | ||
1583 | { | ||
1584 | // string primScenAvatarIn = _parent_scene.whichspaceamIin(_position); | ||
1585 | // int[] arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position); | ||
1586 | // _parent_scene.waitForSpaceUnlock(m_targetSpace); | ||
1587 | 1570 | ||
1588 | IntPtr tempspace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position, m_targetSpace); | 1571 | // string primScenAvatarIn = _parent_scene.whichspaceamIin(_position); |
1589 | m_targetSpace = tempspace; | 1572 | // int[] arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position); |
1573 | // _parent_scene.waitForSpaceUnlock(m_targetSpace); | ||
1574 | |||
1575 | IntPtr tempspace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position, m_targetSpace); | ||
1576 | m_targetSpace = tempspace; | ||
1590 | 1577 | ||
1591 | // _parent_scene.waitForSpaceUnlock(m_targetSpace); | 1578 | // _parent_scene.waitForSpaceUnlock(m_targetSpace); |
1592 | if (prim_geom != IntPtr.Zero) | 1579 | |
1593 | { | 1580 | d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); |
1594 | d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); | ||
1595 | 1581 | ||
1596 | // _parent_scene.waitForSpaceUnlock(m_targetSpace); | 1582 | // _parent_scene.waitForSpaceUnlock(m_targetSpace); |
1597 | d.SpaceAdd(m_targetSpace, prim_geom); | 1583 | d.SpaceAdd(m_targetSpace, prim_geom); |
1598 | } | ||
1599 | } | ||
1600 | 1584 | ||
1601 | changeSelectedStatus(); | 1585 | changeSelectedStatus(); |
1602 | 1586 | ||
@@ -2047,18 +2031,16 @@ Console.WriteLine(" JointCreateFixed"); | |||
2047 | { | 2031 | { |
2048 | m_collidesWater = m_taintCollidesWater; | 2032 | m_collidesWater = m_taintCollidesWater; |
2049 | 2033 | ||
2050 | if (prim_geom != IntPtr.Zero) | 2034 | if (m_collidesWater) |
2051 | { | 2035 | { |
2052 | if (m_collidesWater) | 2036 | m_collisionFlags |= CollisionCategories.Water; |
2053 | { | ||
2054 | m_collisionFlags |= CollisionCategories.Water; | ||
2055 | } | ||
2056 | else | ||
2057 | { | ||
2058 | m_collisionFlags &= ~CollisionCategories.Water; | ||
2059 | } | ||
2060 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
2061 | } | 2037 | } |
2038 | else | ||
2039 | { | ||
2040 | m_collisionFlags &= ~CollisionCategories.Water; | ||
2041 | } | ||
2042 | |||
2043 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
2062 | } | 2044 | } |
2063 | 2045 | ||
2064 | /// <summary> | 2046 | /// <summary> |
diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 842ff91..c6ecc68 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs | |||
@@ -30,20 +30,21 @@ | |||
30 | 30 | ||
31 | using System; | 31 | using System; |
32 | using System.Collections.Generic; | 32 | using System.Collections.Generic; |
33 | using System.Diagnostics; | ||
34 | using System.IO; | ||
35 | using System.Linq; | ||
33 | using System.Reflection; | 36 | using System.Reflection; |
34 | using System.Runtime.InteropServices; | 37 | using System.Runtime.InteropServices; |
35 | using System.Threading; | 38 | using System.Threading; |
36 | using System.IO; | ||
37 | using System.Diagnostics; | ||
38 | using log4net; | 39 | using log4net; |
39 | using Nini.Config; | 40 | using Nini.Config; |
40 | using Ode.NET; | 41 | using Ode.NET; |
42 | using OpenMetaverse; | ||
41 | #if USE_DRAWSTUFF | 43 | #if USE_DRAWSTUFF |
42 | using Drawstuff.NET; | 44 | using Drawstuff.NET; |
43 | #endif | 45 | #endif |
44 | using OpenSim.Framework; | 46 | using OpenSim.Framework; |
45 | using OpenSim.Region.Physics.Manager; | 47 | using OpenSim.Region.Physics.Manager; |
46 | using OpenMetaverse; | ||
47 | 48 | ||
48 | namespace OpenSim.Region.Physics.OdePlugin | 49 | namespace OpenSim.Region.Physics.OdePlugin |
49 | { | 50 | { |
@@ -54,15 +55,15 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
54 | End = 2 | 55 | End = 2 |
55 | } | 56 | } |
56 | 57 | ||
57 | public struct sCollisionData | 58 | // public struct sCollisionData |
58 | { | 59 | // { |
59 | public uint ColliderLocalId; | 60 | // public uint ColliderLocalId; |
60 | public uint CollidedWithLocalId; | 61 | // public uint CollidedWithLocalId; |
61 | public int NumberOfCollisions; | 62 | // public int NumberOfCollisions; |
62 | public int CollisionType; | 63 | // public int CollisionType; |
63 | public int StatusIndicator; | 64 | // public int StatusIndicator; |
64 | public int lastframe; | 65 | // public int lastframe; |
65 | } | 66 | // } |
66 | 67 | ||
67 | [Flags] | 68 | [Flags] |
68 | public enum CollisionCategories : int | 69 | public enum CollisionCategories : int |
@@ -131,6 +132,135 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
131 | /// </remarks> | 132 | /// </remarks> |
132 | internal static Object UniversalColliderSyncObject = new Object(); | 133 | internal static Object UniversalColliderSyncObject = new Object(); |
133 | 134 | ||
135 | /// <summary> | ||
136 | /// Is stats collecting enabled for this ODE scene? | ||
137 | /// </summary> | ||
138 | public bool CollectStats { get; set; } | ||
139 | |||
140 | /// <summary> | ||
141 | /// Statistics for this scene. | ||
142 | /// </summary> | ||
143 | private Dictionary<string, float> m_stats = new Dictionary<string, float>(); | ||
144 | |||
145 | /// <summary> | ||
146 | /// Stat name for total number of avatars in this ODE scene. | ||
147 | /// </summary> | ||
148 | public const string ODETotalAvatarsStatName = "ODETotalAvatars"; | ||
149 | |||
150 | /// <summary> | ||
151 | /// Stat name for total number of prims in this ODE scene. | ||
152 | /// </summary> | ||
153 | public const string ODETotalPrimsStatName = "ODETotalPrims"; | ||
154 | |||
155 | /// <summary> | ||
156 | /// Stat name for total number of prims with active physics in this ODE scene. | ||
157 | /// </summary> | ||
158 | public const string ODEActivePrimsStatName = "ODEActivePrims"; | ||
159 | |||
160 | /// <summary> | ||
161 | /// Stat name for the total time spent in ODE frame processing. | ||
162 | /// </summary> | ||
163 | /// <remarks> | ||
164 | /// A sanity check for the main scene loop physics time. | ||
165 | /// </remarks> | ||
166 | public const string ODETotalFrameMsStatName = "ODETotalFrameMS"; | ||
167 | |||
168 | /// <summary> | ||
169 | /// Stat name for time spent processing avatar taints per frame | ||
170 | /// </summary> | ||
171 | public const string ODEAvatarTaintMsStatName = "ODEAvatarTaintFrameMS"; | ||
172 | |||
173 | /// <summary> | ||
174 | /// Stat name for time spent processing prim taints per frame | ||
175 | /// </summary> | ||
176 | public const string ODEPrimTaintMsStatName = "ODEPrimTaintFrameMS"; | ||
177 | |||
178 | /// <summary> | ||
179 | /// Stat name for time spent calculating avatar forces per frame. | ||
180 | /// </summary> | ||
181 | public const string ODEAvatarForcesFrameMsStatName = "ODEAvatarForcesFrameMS"; | ||
182 | |||
183 | /// <summary> | ||
184 | /// Stat name for time spent calculating prim forces per frame | ||
185 | /// </summary> | ||
186 | public const string ODEPrimForcesFrameMsStatName = "ODEPrimForcesFrameMS"; | ||
187 | |||
188 | /// <summary> | ||
189 | /// Stat name for time spent fulfilling raycasting requests per frame | ||
190 | /// </summary> | ||
191 | public const string ODERaycastingFrameMsStatName = "ODERaycastingFrameMS"; | ||
192 | |||
193 | /// <summary> | ||
194 | /// Stat name for time spent in native code that actually steps through the simulation. | ||
195 | /// </summary> | ||
196 | public const string ODENativeStepFrameMsStatName = "ODENativeStepFrameMS"; | ||
197 | |||
198 | /// <summary> | ||
199 | /// Stat name for the number of milliseconds that ODE spends in native space collision code. | ||
200 | /// </summary> | ||
201 | public const string ODENativeSpaceCollisionFrameMsStatName = "ODENativeSpaceCollisionFrameMS"; | ||
202 | |||
203 | /// <summary> | ||
204 | /// Stat name for milliseconds that ODE spends in native geom collision code. | ||
205 | /// </summary> | ||
206 | public const string ODENativeGeomCollisionFrameMsStatName = "ODENativeGeomCollisionFrameMS"; | ||
207 | |||
208 | /// <summary> | ||
209 | /// Time spent in collision processing that is not spent in native space or geom collision code. | ||
210 | /// </summary> | ||
211 | public const string ODEOtherCollisionFrameMsStatName = "ODEOtherCollisionFrameMS"; | ||
212 | |||
213 | /// <summary> | ||
214 | /// Stat name for time spent notifying listeners of collisions | ||
215 | /// </summary> | ||
216 | public const string ODECollisionNotificationFrameMsStatName = "ODECollisionNotificationFrameMS"; | ||
217 | |||
218 | /// <summary> | ||
219 | /// Stat name for milliseconds spent updating avatar position and velocity | ||
220 | /// </summary> | ||
221 | public const string ODEAvatarUpdateFrameMsStatName = "ODEAvatarUpdateFrameMS"; | ||
222 | |||
223 | /// <summary> | ||
224 | /// Stat name for the milliseconds spent updating prim position and velocity | ||
225 | /// </summary> | ||
226 | public const string ODEPrimUpdateFrameMsStatName = "ODEPrimUpdateFrameMS"; | ||
227 | |||
228 | /// <summary> | ||
229 | /// Stat name for avatar collisions with another entity. | ||
230 | /// </summary> | ||
231 | public const string ODEAvatarContactsStatsName = "ODEAvatarContacts"; | ||
232 | |||
233 | /// <summary> | ||
234 | /// Stat name for prim collisions with another entity. | ||
235 | /// </summary> | ||
236 | public const string ODEPrimContactsStatName = "ODEPrimContacts"; | ||
237 | |||
238 | /// <summary> | ||
239 | /// Used to hold tick numbers for stat collection purposes. | ||
240 | /// </summary> | ||
241 | private int m_nativeCollisionStartTick; | ||
242 | |||
243 | /// <summary> | ||
244 | /// A messy way to tell if we need to avoid adding a collision time because this was already done in the callback. | ||
245 | /// </summary> | ||
246 | private bool m_inCollisionTiming; | ||
247 | |||
248 | /// <summary> | ||
249 | /// A temporary holder for the number of avatar collisions in a frame, so we can work out how many object | ||
250 | /// collisions occured using the _perloopcontact if stats collection is enabled. | ||
251 | /// </summary> | ||
252 | private int m_tempAvatarCollisionsThisFrame; | ||
253 | |||
254 | /// <summary> | ||
255 | /// Used in calculating physics frame time dilation | ||
256 | /// </summary> | ||
257 | private int tickCountFrameRun; | ||
258 | |||
259 | /// <summary> | ||
260 | /// Used in calculating physics frame time dilation | ||
261 | /// </summary> | ||
262 | private int latertickcount; | ||
263 | |||
134 | private Random fluidRandomizer = new Random(Environment.TickCount); | 264 | private Random fluidRandomizer = new Random(Environment.TickCount); |
135 | 265 | ||
136 | private const uint m_regionWidth = Constants.RegionSize; | 266 | private const uint m_regionWidth = Constants.RegionSize; |
@@ -345,9 +475,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
345 | private OdePrim cp1; | 475 | private OdePrim cp1; |
346 | private OdeCharacter cc2; | 476 | private OdeCharacter cc2; |
347 | private OdePrim cp2; | 477 | private OdePrim cp2; |
348 | private int tickCountFrameRun; | ||
349 | |||
350 | private int latertickcount=0; | ||
351 | //private int cStartStop = 0; | 478 | //private int cStartStop = 0; |
352 | //private string cDictKey = ""; | 479 | //private string cDictKey = ""; |
353 | 480 | ||
@@ -440,6 +567,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
440 | // Initialize the mesh plugin | 567 | // Initialize the mesh plugin |
441 | public override void Initialise(IMesher meshmerizer, IConfigSource config) | 568 | public override void Initialise(IMesher meshmerizer, IConfigSource config) |
442 | { | 569 | { |
570 | InitializeExtraStats(); | ||
571 | |||
443 | mesher = meshmerizer; | 572 | mesher = meshmerizer; |
444 | m_config = config; | 573 | m_config = config; |
445 | // Defaults | 574 | // Defaults |
@@ -464,6 +593,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
464 | IConfig physicsconfig = m_config.Configs["ODEPhysicsSettings"]; | 593 | IConfig physicsconfig = m_config.Configs["ODEPhysicsSettings"]; |
465 | if (physicsconfig != null) | 594 | if (physicsconfig != null) |
466 | { | 595 | { |
596 | CollectStats = physicsconfig.GetBoolean("collect_stats", false); | ||
597 | |||
467 | gravityx = physicsconfig.GetFloat("world_gravityx", 0f); | 598 | gravityx = physicsconfig.GetFloat("world_gravityx", 0f); |
468 | gravityy = physicsconfig.GetFloat("world_gravityy", 0f); | 599 | gravityy = physicsconfig.GetFloat("world_gravityy", 0f); |
469 | gravityz = physicsconfig.GetFloat("world_gravityz", -9.8f); | 600 | gravityz = physicsconfig.GetFloat("world_gravityz", -9.8f); |
@@ -765,6 +896,62 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
765 | #region Collision Detection | 896 | #region Collision Detection |
766 | 897 | ||
767 | /// <summary> | 898 | /// <summary> |
899 | /// Collides two geometries. | ||
900 | /// </summary> | ||
901 | /// <returns></returns> | ||
902 | /// <param name='geom1'></param> | ||
903 | /// <param name='geom2'>/param> | ||
904 | /// <param name='maxContacts'></param> | ||
905 | /// <param name='contactsArray'></param> | ||
906 | /// <param name='contactGeomSize'></param> | ||
907 | private int CollideGeoms( | ||
908 | IntPtr geom1, IntPtr geom2, int maxContacts, Ode.NET.d.ContactGeom[] contactsArray, int contactGeomSize) | ||
909 | { | ||
910 | int count; | ||
911 | |||
912 | lock (OdeScene.UniversalColliderSyncObject) | ||
913 | { | ||
914 | // We do this inside the lock so that we don't count any delay in acquiring it | ||
915 | if (CollectStats) | ||
916 | m_nativeCollisionStartTick = Util.EnvironmentTickCount(); | ||
917 | |||
918 | count = d.Collide(geom1, geom2, maxContacts, contactsArray, contactGeomSize); | ||
919 | } | ||
920 | |||
921 | // We do this outside the lock so that any waiting threads aren't held up, though the effect is probably | ||
922 | // negligable | ||
923 | if (CollectStats) | ||
924 | m_stats[ODENativeGeomCollisionFrameMsStatName] | ||
925 | += Util.EnvironmentTickCountSubtract(m_nativeCollisionStartTick); | ||
926 | |||
927 | return count; | ||
928 | } | ||
929 | |||
930 | /// <summary> | ||
931 | /// Collide two spaces or a space and a geometry. | ||
932 | /// </summary> | ||
933 | /// <param name='space1'></param> | ||
934 | /// <param name='space2'>/param> | ||
935 | /// <param name='data'></param> | ||
936 | private void CollideSpaces(IntPtr space1, IntPtr space2, IntPtr data) | ||
937 | { | ||
938 | if (CollectStats) | ||
939 | { | ||
940 | m_inCollisionTiming = true; | ||
941 | m_nativeCollisionStartTick = Util.EnvironmentTickCount(); | ||
942 | } | ||
943 | |||
944 | d.SpaceCollide2(space1, space2, data, nearCallback); | ||
945 | |||
946 | if (CollectStats && m_inCollisionTiming) | ||
947 | { | ||
948 | m_stats[ODENativeSpaceCollisionFrameMsStatName] | ||
949 | += Util.EnvironmentTickCountSubtract(m_nativeCollisionStartTick); | ||
950 | m_inCollisionTiming = false; | ||
951 | } | ||
952 | } | ||
953 | |||
954 | /// <summary> | ||
768 | /// This is our near callback. A geometry is near a body | 955 | /// This is our near callback. A geometry is near a body |
769 | /// </summary> | 956 | /// </summary> |
770 | /// <param name="space">The space that contains the geoms. Remember, spaces are also geoms</param> | 957 | /// <param name="space">The space that contains the geoms. Remember, spaces are also geoms</param> |
@@ -772,6 +959,13 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
772 | /// <param name="g2">another geometry or space</param> | 959 | /// <param name="g2">another geometry or space</param> |
773 | private void near(IntPtr space, IntPtr g1, IntPtr g2) | 960 | private void near(IntPtr space, IntPtr g1, IntPtr g2) |
774 | { | 961 | { |
962 | if (CollectStats && m_inCollisionTiming) | ||
963 | { | ||
964 | m_stats[ODENativeSpaceCollisionFrameMsStatName] | ||
965 | += Util.EnvironmentTickCountSubtract(m_nativeCollisionStartTick); | ||
966 | m_inCollisionTiming = false; | ||
967 | } | ||
968 | |||
775 | // m_log.DebugFormat("[PHYSICS]: Colliding {0} and {1} in {2}", g1, g2, space); | 969 | // m_log.DebugFormat("[PHYSICS]: Colliding {0} and {1} in {2}", g1, g2, space); |
776 | // no lock here! It's invoked from within Simulate(), which is thread-locked | 970 | // no lock here! It's invoked from within Simulate(), which is thread-locked |
777 | 971 | ||
@@ -789,7 +983,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
789 | // contact points in the space | 983 | // contact points in the space |
790 | try | 984 | try |
791 | { | 985 | { |
792 | d.SpaceCollide2(g1, g2, IntPtr.Zero, nearCallback); | 986 | CollideSpaces(g1, g2, IntPtr.Zero); |
793 | } | 987 | } |
794 | catch (AccessViolationException) | 988 | catch (AccessViolationException) |
795 | { | 989 | { |
@@ -832,6 +1026,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
832 | 1026 | ||
833 | // Figure out how many contact points we have | 1027 | // Figure out how many contact points we have |
834 | int count = 0; | 1028 | int count = 0; |
1029 | |||
835 | try | 1030 | try |
836 | { | 1031 | { |
837 | // Colliding Geom To Geom | 1032 | // Colliding Geom To Geom |
@@ -843,8 +1038,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
843 | if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact)) | 1038 | if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact)) |
844 | return; | 1039 | return; |
845 | 1040 | ||
846 | lock (OdeScene.UniversalColliderSyncObject) | 1041 | count = CollideGeoms(g1, g2, contacts.Length, contacts, d.ContactGeom.SizeOf); |
847 | count = d.Collide(g1, g2, contacts.Length, contacts, d.ContactGeom.SizeOf); | 1042 | |
1043 | // All code after this is only relevant if we have any collisions | ||
1044 | if (count <= 0) | ||
1045 | return; | ||
848 | 1046 | ||
849 | if (count > contacts.Length) | 1047 | if (count > contacts.Length) |
850 | m_log.Error("[ODE SCENE]: Got " + count + " contacts when we asked for a maximum of " + contacts.Length); | 1048 | m_log.Error("[ODE SCENE]: Got " + count + " contacts when we asked for a maximum of " + contacts.Length); |
@@ -1113,14 +1311,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1113 | { | 1311 | { |
1114 | _perloopContact.Add(curContact); | 1312 | _perloopContact.Add(curContact); |
1115 | 1313 | ||
1116 | // If we're colliding against terrain | ||
1117 | if (name1 == "Terrain" || name2 == "Terrain") | 1314 | if (name1 == "Terrain" || name2 == "Terrain") |
1118 | { | 1315 | { |
1119 | // If we're moving | ||
1120 | if ((p2.PhysicsActorType == (int) ActorTypes.Agent) && | 1316 | if ((p2.PhysicsActorType == (int) ActorTypes.Agent) && |
1121 | (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) | 1317 | (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) |
1122 | { | 1318 | { |
1123 | // Use the movement terrain contact | 1319 | // Avatar is moving on terrain, use the movement terrain contact |
1124 | AvatarMovementTerrainContact.geom = curContact; | 1320 | AvatarMovementTerrainContact.geom = curContact; |
1125 | 1321 | ||
1126 | if (m_global_contactcount < maxContactsbeforedeath) | 1322 | if (m_global_contactcount < maxContactsbeforedeath) |
@@ -1133,7 +1329,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1133 | { | 1329 | { |
1134 | if (p2.PhysicsActorType == (int)ActorTypes.Agent) | 1330 | if (p2.PhysicsActorType == (int)ActorTypes.Agent) |
1135 | { | 1331 | { |
1136 | // Use the non moving terrain contact | 1332 | // Avatar is standing on terrain, use the non moving terrain contact |
1137 | TerrainContact.geom = curContact; | 1333 | TerrainContact.geom = curContact; |
1138 | 1334 | ||
1139 | if (m_global_contactcount < maxContactsbeforedeath) | 1335 | if (m_global_contactcount < maxContactsbeforedeath) |
@@ -1228,13 +1424,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1228 | } | 1424 | } |
1229 | else | 1425 | else |
1230 | { | 1426 | { |
1231 | // we're colliding with prim or avatar | ||
1232 | // check if we're moving | ||
1233 | if ((p2.PhysicsActorType == (int)ActorTypes.Agent)) | 1427 | if ((p2.PhysicsActorType == (int)ActorTypes.Agent)) |
1234 | { | 1428 | { |
1235 | if ((Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) | 1429 | if ((Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) |
1236 | { | 1430 | { |
1237 | // Use the Movement prim contact | 1431 | // Avatar is moving on a prim, use the Movement prim contact |
1238 | AvatarMovementprimContact.geom = curContact; | 1432 | AvatarMovementprimContact.geom = curContact; |
1239 | 1433 | ||
1240 | if (m_global_contactcount < maxContactsbeforedeath) | 1434 | if (m_global_contactcount < maxContactsbeforedeath) |
@@ -1245,9 +1439,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1245 | } | 1439 | } |
1246 | else | 1440 | else |
1247 | { | 1441 | { |
1248 | // Use the non movement contact | 1442 | // Avatar is standing still on a prim, use the non movement contact |
1249 | contact.geom = curContact; | 1443 | contact.geom = curContact; |
1250 | _perloopContact.Add(curContact); | ||
1251 | 1444 | ||
1252 | if (m_global_contactcount < maxContactsbeforedeath) | 1445 | if (m_global_contactcount < maxContactsbeforedeath) |
1253 | { | 1446 | { |
@@ -1355,7 +1548,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1355 | break; | 1548 | break; |
1356 | } | 1549 | } |
1357 | } | 1550 | } |
1358 | //m_log.DebugFormat("[Collsion]: Depth {0}", Math.Abs(contact.depth - contactGeom.depth)); | 1551 | //m_log.DebugFormat("[Collision]: Depth {0}", Math.Abs(contact.depth - contactGeom.depth)); |
1359 | //m_log.DebugFormat("[Collision]: <{0},{1},{2}>", Math.Abs(contactGeom.normal.X - contact.normal.X), Math.Abs(contactGeom.normal.Y - contact.normal.Y), Math.Abs(contactGeom.normal.Z - contact.normal.Z)); | 1552 | //m_log.DebugFormat("[Collision]: <{0},{1},{2}>", Math.Abs(contactGeom.normal.X - contact.normal.X), Math.Abs(contactGeom.normal.Y - contact.normal.Y), Math.Abs(contactGeom.normal.Z - contact.normal.Z)); |
1360 | } | 1553 | } |
1361 | } | 1554 | } |
@@ -1578,7 +1771,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1578 | // and we'll run it again on all of them. | 1771 | // and we'll run it again on all of them. |
1579 | try | 1772 | try |
1580 | { | 1773 | { |
1581 | d.SpaceCollide2(space, chr.Shell, IntPtr.Zero, nearCallback); | 1774 | CollideSpaces(space, chr.Shell, IntPtr.Zero); |
1582 | } | 1775 | } |
1583 | catch (AccessViolationException) | 1776 | catch (AccessViolationException) |
1584 | { | 1777 | { |
@@ -1593,6 +1786,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1593 | //} | 1786 | //} |
1594 | } | 1787 | } |
1595 | 1788 | ||
1789 | if (CollectStats) | ||
1790 | { | ||
1791 | m_tempAvatarCollisionsThisFrame = _perloopContact.Count; | ||
1792 | m_stats[ODEAvatarContactsStatsName] += m_tempAvatarCollisionsThisFrame; | ||
1793 | } | ||
1794 | |||
1596 | List<OdePrim> removeprims = null; | 1795 | List<OdePrim> removeprims = null; |
1597 | foreach (OdePrim chr in _activeprims) | 1796 | foreach (OdePrim chr in _activeprims) |
1598 | { | 1797 | { |
@@ -1604,7 +1803,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1604 | { | 1803 | { |
1605 | if (space != IntPtr.Zero && chr.prim_geom != IntPtr.Zero && chr.m_taintremove == false) | 1804 | if (space != IntPtr.Zero && chr.prim_geom != IntPtr.Zero && chr.m_taintremove == false) |
1606 | { | 1805 | { |
1607 | d.SpaceCollide2(space, chr.prim_geom, IntPtr.Zero, nearCallback); | 1806 | CollideSpaces(space, chr.prim_geom, IntPtr.Zero); |
1608 | } | 1807 | } |
1609 | else | 1808 | else |
1610 | { | 1809 | { |
@@ -1625,6 +1824,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1625 | } | 1824 | } |
1626 | } | 1825 | } |
1627 | 1826 | ||
1827 | if (CollectStats) | ||
1828 | m_stats[ODEPrimContactsStatName] += _perloopContact.Count - m_tempAvatarCollisionsThisFrame; | ||
1829 | |||
1628 | if (removeprims != null) | 1830 | if (removeprims != null) |
1629 | { | 1831 | { |
1630 | foreach (OdePrim chr in removeprims) | 1832 | foreach (OdePrim chr in removeprims) |
@@ -2226,7 +2428,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2226 | /// <param name="prim"></param> | 2428 | /// <param name="prim"></param> |
2227 | internal void RemovePrimThreadLocked(OdePrim prim) | 2429 | internal void RemovePrimThreadLocked(OdePrim prim) |
2228 | { | 2430 | { |
2229 | //Console.WriteLine("RemovePrimThreadLocked " + prim.m_primName); | 2431 | // m_log.DebugFormat("[ODE SCENE]: Removing physical prim {0} {1}", prim.Name, prim.LocalID); |
2432 | |||
2230 | lock (prim) | 2433 | lock (prim) |
2231 | { | 2434 | { |
2232 | RemoveCollisionEventReporting(prim); | 2435 | RemoveCollisionEventReporting(prim); |
@@ -2682,21 +2885,23 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2682 | 2885 | ||
2683 | /// <summary> | 2886 | /// <summary> |
2684 | /// This is our main simulate loop | 2887 | /// This is our main simulate loop |
2888 | /// </summary> | ||
2889 | /// <remarks> | ||
2685 | /// It's thread locked by a Mutex in the scene. | 2890 | /// It's thread locked by a Mutex in the scene. |
2686 | /// It holds Collisions, it instructs ODE to step through the physical reactions | 2891 | /// It holds Collisions, it instructs ODE to step through the physical reactions |
2687 | /// It moves the objects around in memory | 2892 | /// It moves the objects around in memory |
2688 | /// It calls the methods that report back to the object owners.. (scenepresence, SceneObjectGroup) | 2893 | /// It calls the methods that report back to the object owners.. (scenepresence, SceneObjectGroup) |
2689 | /// </summary> | 2894 | /// </remarks> |
2690 | /// <param name="timeStep"></param> | 2895 | /// <param name="timeStep"></param> |
2691 | /// <returns></returns> | 2896 | /// <returns>The number of frames simulated over that period.</returns> |
2692 | public override float Simulate(float timeStep) | 2897 | public override float Simulate(float timeStep) |
2693 | { | 2898 | { |
2899 | int startFrameTick = CollectStats ? Util.EnvironmentTickCount() : 0; | ||
2900 | int tempTick = 0, tempTick2 = 0; | ||
2901 | |||
2694 | if (framecount >= int.MaxValue) | 2902 | if (framecount >= int.MaxValue) |
2695 | framecount = 0; | 2903 | framecount = 0; |
2696 | 2904 | ||
2697 | //if (m_worldOffset != Vector3.Zero) | ||
2698 | // return 0; | ||
2699 | |||
2700 | framecount++; | 2905 | framecount++; |
2701 | 2906 | ||
2702 | float fps = 0; | 2907 | float fps = 0; |
@@ -2704,7 +2909,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2704 | float timeLeft = timeStep; | 2909 | float timeLeft = timeStep; |
2705 | 2910 | ||
2706 | //m_log.Info(timeStep.ToString()); | 2911 | //m_log.Info(timeStep.ToString()); |
2707 | // step_time += timeStep; | 2912 | // step_time += timeSte |
2708 | // | 2913 | // |
2709 | // // If We're loaded down by something else, | 2914 | // // If We're loaded down by something else, |
2710 | // // or debugging with the Visual Studio project on pause | 2915 | // // or debugging with the Visual Studio project on pause |
@@ -2770,6 +2975,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2770 | { | 2975 | { |
2771 | try | 2976 | try |
2772 | { | 2977 | { |
2978 | if (CollectStats) | ||
2979 | tempTick = Util.EnvironmentTickCount(); | ||
2980 | |||
2773 | lock (_taintedActors) | 2981 | lock (_taintedActors) |
2774 | { | 2982 | { |
2775 | foreach (OdeCharacter character in _taintedActors) | 2983 | foreach (OdeCharacter character in _taintedActors) |
@@ -2778,6 +2986,13 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2778 | _taintedActors.Clear(); | 2986 | _taintedActors.Clear(); |
2779 | } | 2987 | } |
2780 | 2988 | ||
2989 | if (CollectStats) | ||
2990 | { | ||
2991 | tempTick2 = Util.EnvironmentTickCount(); | ||
2992 | m_stats[ODEAvatarTaintMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); | ||
2993 | tempTick = tempTick2; | ||
2994 | } | ||
2995 | |||
2781 | lock (_taintedPrims) | 2996 | lock (_taintedPrims) |
2782 | { | 2997 | { |
2783 | foreach (OdePrim prim in _taintedPrims) | 2998 | foreach (OdePrim prim in _taintedPrims) |
@@ -2808,6 +3023,13 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2808 | _taintedPrims.Clear(); | 3023 | _taintedPrims.Clear(); |
2809 | } | 3024 | } |
2810 | 3025 | ||
3026 | if (CollectStats) | ||
3027 | { | ||
3028 | tempTick2 = Util.EnvironmentTickCount(); | ||
3029 | m_stats[ODEPrimTaintMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); | ||
3030 | tempTick = tempTick2; | ||
3031 | } | ||
3032 | |||
2811 | // Move characters | 3033 | // Move characters |
2812 | foreach (OdeCharacter actor in _characters) | 3034 | foreach (OdeCharacter actor in _characters) |
2813 | actor.Move(defects); | 3035 | actor.Move(defects); |
@@ -2827,6 +3049,13 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2827 | defects.Clear(); | 3049 | defects.Clear(); |
2828 | } | 3050 | } |
2829 | 3051 | ||
3052 | if (CollectStats) | ||
3053 | { | ||
3054 | tempTick2 = Util.EnvironmentTickCount(); | ||
3055 | m_stats[ODEAvatarForcesFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); | ||
3056 | tempTick = tempTick2; | ||
3057 | } | ||
3058 | |||
2830 | // Move other active objects | 3059 | // Move other active objects |
2831 | foreach (OdePrim prim in _activeprims) | 3060 | foreach (OdePrim prim in _activeprims) |
2832 | { | 3061 | { |
@@ -2834,14 +3063,35 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2834 | prim.Move(timeStep); | 3063 | prim.Move(timeStep); |
2835 | } | 3064 | } |
2836 | 3065 | ||
3066 | if (CollectStats) | ||
3067 | { | ||
3068 | tempTick2 = Util.EnvironmentTickCount(); | ||
3069 | m_stats[ODEPrimForcesFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); | ||
3070 | tempTick = tempTick2; | ||
3071 | } | ||
3072 | |||
2837 | //if ((framecount % m_randomizeWater) == 0) | 3073 | //if ((framecount % m_randomizeWater) == 0) |
2838 | // randomizeWater(waterlevel); | 3074 | // randomizeWater(waterlevel); |
2839 | 3075 | ||
2840 | //int RayCastTimeMS = m_rayCastManager.ProcessQueuedRequests(); | 3076 | //int RayCastTimeMS = m_rayCastManager.ProcessQueuedRequests(); |
2841 | m_rayCastManager.ProcessQueuedRequests(); | 3077 | m_rayCastManager.ProcessQueuedRequests(); |
2842 | 3078 | ||
3079 | if (CollectStats) | ||
3080 | { | ||
3081 | tempTick2 = Util.EnvironmentTickCount(); | ||
3082 | m_stats[ODERaycastingFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); | ||
3083 | tempTick = tempTick2; | ||
3084 | } | ||
3085 | |||
2843 | collision_optimized(); | 3086 | collision_optimized(); |
2844 | 3087 | ||
3088 | if (CollectStats) | ||
3089 | { | ||
3090 | tempTick2 = Util.EnvironmentTickCount(); | ||
3091 | m_stats[ODEOtherCollisionFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); | ||
3092 | tempTick = tempTick2; | ||
3093 | } | ||
3094 | |||
2845 | foreach (PhysicsActor obj in _collisionEventPrim.Values) | 3095 | foreach (PhysicsActor obj in _collisionEventPrim.Values) |
2846 | { | 3096 | { |
2847 | // m_log.DebugFormat("[PHYSICS]: Assessing {0} {1} for collision events", obj.SOPName, obj.LocalID); | 3097 | // m_log.DebugFormat("[PHYSICS]: Assessing {0} {1} for collision events", obj.SOPName, obj.LocalID); |
@@ -2866,9 +3116,19 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2866 | // "[PHYSICS]: Collision contacts to process this frame = {0}", m_global_contactcount); | 3116 | // "[PHYSICS]: Collision contacts to process this frame = {0}", m_global_contactcount); |
2867 | 3117 | ||
2868 | m_global_contactcount = 0; | 3118 | m_global_contactcount = 0; |
2869 | 3119 | ||
3120 | if (CollectStats) | ||
3121 | { | ||
3122 | tempTick2 = Util.EnvironmentTickCount(); | ||
3123 | m_stats[ODECollisionNotificationFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); | ||
3124 | tempTick = tempTick2; | ||
3125 | } | ||
3126 | |||
2870 | d.WorldQuickStep(world, ODE_STEPSIZE); | 3127 | d.WorldQuickStep(world, ODE_STEPSIZE); |
2871 | 3128 | ||
3129 | if (CollectStats) | ||
3130 | m_stats[ODENativeStepFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick); | ||
3131 | |||
2872 | d.JointGroupEmpty(contactgroup); | 3132 | d.JointGroupEmpty(contactgroup); |
2873 | } | 3133 | } |
2874 | catch (Exception e) | 3134 | catch (Exception e) |
@@ -2879,6 +3139,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2879 | timeLeft -= ODE_STEPSIZE; | 3139 | timeLeft -= ODE_STEPSIZE; |
2880 | } | 3140 | } |
2881 | 3141 | ||
3142 | if (CollectStats) | ||
3143 | tempTick = Util.EnvironmentTickCount(); | ||
3144 | |||
2882 | foreach (OdeCharacter actor in _characters) | 3145 | foreach (OdeCharacter actor in _characters) |
2883 | { | 3146 | { |
2884 | if (actor.bad) | 3147 | if (actor.bad) |
@@ -2902,6 +3165,13 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2902 | defects.Clear(); | 3165 | defects.Clear(); |
2903 | } | 3166 | } |
2904 | 3167 | ||
3168 | if (CollectStats) | ||
3169 | { | ||
3170 | tempTick2 = Util.EnvironmentTickCount(); | ||
3171 | m_stats[ODEAvatarUpdateFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); | ||
3172 | tempTick = tempTick2; | ||
3173 | } | ||
3174 | |||
2905 | //if (timeStep < 0.2f) | 3175 | //if (timeStep < 0.2f) |
2906 | 3176 | ||
2907 | foreach (OdePrim prim in _activeprims) | 3177 | foreach (OdePrim prim in _activeprims) |
@@ -2915,6 +3185,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2915 | } | 3185 | } |
2916 | } | 3186 | } |
2917 | 3187 | ||
3188 | if (CollectStats) | ||
3189 | m_stats[ODEPrimUpdateFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick); | ||
3190 | |||
2918 | //DumpJointInfo(); | 3191 | //DumpJointInfo(); |
2919 | 3192 | ||
2920 | // Finished with all sim stepping. If requested, dump world state to file for debugging. | 3193 | // Finished with all sim stepping. If requested, dump world state to file for debugging. |
@@ -2936,7 +3209,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2936 | d.WorldExportDIF(world, fname, physics_logging_append_existing_logfile, prefix); | 3209 | d.WorldExportDIF(world, fname, physics_logging_append_existing_logfile, prefix); |
2937 | } | 3210 | } |
2938 | 3211 | ||
2939 | latertickcount = Util.EnvironmentTickCount() - tickCountFrameRun; | 3212 | latertickcount = Util.EnvironmentTickCountSubtract(tickCountFrameRun); |
2940 | 3213 | ||
2941 | // OpenSimulator above does 10 fps. 10 fps = means that the main thread loop and physics | 3214 | // OpenSimulator above does 10 fps. 10 fps = means that the main thread loop and physics |
2942 | // has a max of 100 ms to run theoretically. | 3215 | // has a max of 100 ms to run theoretically. |
@@ -2956,6 +3229,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2956 | tickCountFrameRun = Util.EnvironmentTickCount(); | 3229 | tickCountFrameRun = Util.EnvironmentTickCount(); |
2957 | } | 3230 | } |
2958 | 3231 | ||
3232 | if (CollectStats) | ||
3233 | m_stats[ODETotalFrameMsStatName] += Util.EnvironmentTickCountSubtract(startFrameTick); | ||
3234 | |||
2959 | return fps; | 3235 | return fps; |
2960 | } | 3236 | } |
2961 | 3237 | ||
@@ -3189,7 +3465,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
3189 | public override bool IsThreaded | 3465 | public override bool IsThreaded |
3190 | { | 3466 | { |
3191 | // for now we won't be multithreaded | 3467 | // for now we won't be multithreaded |
3192 | get { return (false); } | 3468 | get { return false; } |
3193 | } | 3469 | } |
3194 | 3470 | ||
3195 | #region ODE Specific Terrain Fixes | 3471 | #region ODE Specific Terrain Fixes |
@@ -3765,26 +4041,19 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
3765 | 4041 | ||
3766 | public override Dictionary<uint, float> GetTopColliders() | 4042 | public override Dictionary<uint, float> GetTopColliders() |
3767 | { | 4043 | { |
3768 | Dictionary<uint, float> returncolliders = new Dictionary<uint, float>(); | 4044 | Dictionary<uint, float> topColliders; |
3769 | int cnt = 0; | 4045 | |
3770 | lock (_prims) | 4046 | lock (_prims) |
3771 | { | 4047 | { |
3772 | foreach (OdePrim prm in _prims) | 4048 | List<OdePrim> orderedPrims = new List<OdePrim>(_prims); |
3773 | { | 4049 | orderedPrims.OrderByDescending(p => p.CollisionScore).Take(25); |
3774 | if (prm.CollisionScore > 0) | 4050 | topColliders = orderedPrims.ToDictionary(p => p.LocalID, p => p.CollisionScore); |
3775 | { | 4051 | |
3776 | returncolliders.Add(prm.LocalID, prm.CollisionScore); | 4052 | foreach (OdePrim p in _prims) |
3777 | cnt++; | 4053 | p.CollisionScore = 0; |
3778 | prm.CollisionScore = 0f; | ||
3779 | if (cnt > 25) | ||
3780 | { | ||
3781 | break; | ||
3782 | } | ||
3783 | } | ||
3784 | } | ||
3785 | } | 4054 | } |
3786 | 4055 | ||
3787 | return returncolliders; | 4056 | return topColliders; |
3788 | } | 4057 | } |
3789 | 4058 | ||
3790 | public override bool SupportsRayCast() | 4059 | public override bool SupportsRayCast() |
@@ -3954,5 +4223,52 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
3954 | ds.SetViewpoint(ref xyz, ref hpr); | 4223 | ds.SetViewpoint(ref xyz, ref hpr); |
3955 | } | 4224 | } |
3956 | #endif | 4225 | #endif |
4226 | |||
4227 | public override Dictionary<string, float> GetStats() | ||
4228 | { | ||
4229 | if (!CollectStats) | ||
4230 | return null; | ||
4231 | |||
4232 | Dictionary<string, float> returnStats; | ||
4233 | |||
4234 | lock (OdeLock) | ||
4235 | { | ||
4236 | returnStats = new Dictionary<string, float>(m_stats); | ||
4237 | |||
4238 | // FIXME: This is a SUPER DUMB HACK until we can establish stats that aren't subject to a division by | ||
4239 | // 3 from the SimStatsReporter. | ||
4240 | returnStats[ODETotalAvatarsStatName] = _characters.Count * 3; | ||
4241 | returnStats[ODETotalPrimsStatName] = _prims.Count * 3; | ||
4242 | returnStats[ODEActivePrimsStatName] = _activeprims.Count * 3; | ||
4243 | |||
4244 | InitializeExtraStats(); | ||
4245 | } | ||
4246 | |||
4247 | returnStats[ODEOtherCollisionFrameMsStatName] | ||
4248 | = returnStats[ODEOtherCollisionFrameMsStatName] | ||
4249 | - returnStats[ODENativeSpaceCollisionFrameMsStatName] | ||
4250 | - returnStats[ODENativeGeomCollisionFrameMsStatName]; | ||
4251 | |||
4252 | return returnStats; | ||
4253 | } | ||
4254 | |||
4255 | private void InitializeExtraStats() | ||
4256 | { | ||
4257 | m_stats[ODETotalFrameMsStatName] = 0; | ||
4258 | m_stats[ODEAvatarTaintMsStatName] = 0; | ||
4259 | m_stats[ODEPrimTaintMsStatName] = 0; | ||
4260 | m_stats[ODEAvatarForcesFrameMsStatName] = 0; | ||
4261 | m_stats[ODEPrimForcesFrameMsStatName] = 0; | ||
4262 | m_stats[ODERaycastingFrameMsStatName] = 0; | ||
4263 | m_stats[ODENativeStepFrameMsStatName] = 0; | ||
4264 | m_stats[ODENativeSpaceCollisionFrameMsStatName] = 0; | ||
4265 | m_stats[ODENativeGeomCollisionFrameMsStatName] = 0; | ||
4266 | m_stats[ODEOtherCollisionFrameMsStatName] = 0; | ||
4267 | m_stats[ODECollisionNotificationFrameMsStatName] = 0; | ||
4268 | m_stats[ODEAvatarContactsStatsName] = 0; | ||
4269 | m_stats[ODEPrimContactsStatName] = 0; | ||
4270 | m_stats[ODEAvatarUpdateFrameMsStatName] = 0; | ||
4271 | m_stats[ODEPrimUpdateFrameMsStatName] = 0; | ||
4272 | } | ||
3957 | } | 4273 | } |
3958 | } \ No newline at end of file | 4274 | } \ No newline at end of file |
diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs index d8d9554..204c4ff 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs | |||
@@ -43,9 +43,8 @@ using Mono.Addins; | |||
43 | [assembly: AddinDependency("OpenSim", "0.5")] | 43 | [assembly: AddinDependency("OpenSim", "0.5")] |
44 | namespace OpenSim.Region.RegionCombinerModule | 44 | namespace OpenSim.Region.RegionCombinerModule |
45 | { | 45 | { |
46 | |||
47 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] | 46 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] |
48 | public class RegionCombinerModule : ISharedRegionModule | 47 | public class RegionCombinerModule : ISharedRegionModule, IRegionCombinerModule |
49 | { | 48 | { |
50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 49 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
51 | 50 | ||
@@ -59,19 +58,33 @@ namespace OpenSim.Region.RegionCombinerModule | |||
59 | get { return null; } | 58 | get { return null; } |
60 | } | 59 | } |
61 | 60 | ||
61 | /// <summary> | ||
62 | /// Is this module enabled? | ||
63 | /// </summary> | ||
64 | private bool m_combineContiguousRegions = false; | ||
65 | |||
66 | /// <summary> | ||
67 | /// This holds the root regions for the megaregions. | ||
68 | /// </summary> | ||
69 | /// <remarks> | ||
70 | /// Usually there is only ever one megaregion (and hence only one entry here). | ||
71 | /// </remarks> | ||
62 | private Dictionary<UUID, RegionConnections> m_regions = new Dictionary<UUID, RegionConnections>(); | 72 | private Dictionary<UUID, RegionConnections> m_regions = new Dictionary<UUID, RegionConnections>(); |
63 | private bool enabledYN = false; | 73 | |
74 | /// <summary> | ||
75 | /// The scenes that comprise the megaregion. | ||
76 | /// </summary> | ||
64 | private Dictionary<UUID, Scene> m_startingScenes = new Dictionary<UUID, Scene>(); | 77 | private Dictionary<UUID, Scene> m_startingScenes = new Dictionary<UUID, Scene>(); |
65 | 78 | ||
66 | public void Initialise(IConfigSource source) | 79 | public void Initialise(IConfigSource source) |
67 | { | 80 | { |
68 | IConfig myConfig = source.Configs["Startup"]; | 81 | IConfig myConfig = source.Configs["Startup"]; |
69 | enabledYN = myConfig.GetBoolean("CombineContiguousRegions", false); | 82 | m_combineContiguousRegions = myConfig.GetBoolean("CombineContiguousRegions", false); |
70 | 83 | ||
71 | if (enabledYN) | 84 | MainConsole.Instance.Commands.AddCommand( |
72 | MainConsole.Instance.Commands.AddCommand( | 85 | "RegionCombinerModule", false, "fix-phantoms", "fix-phantoms", |
73 | "RegionCombinerModule", false, "fix-phantoms", "fix-phantoms", | 86 | "Fixes phantom objects after an import to a megaregion or a change from a megaregion back to normal regions", |
74 | "Fixes phantom objects after an import to megaregions", FixPhantoms); | 87 | FixPhantoms); |
75 | } | 88 | } |
76 | 89 | ||
77 | public void Close() | 90 | public void Close() |
@@ -80,6 +93,8 @@ namespace OpenSim.Region.RegionCombinerModule | |||
80 | 93 | ||
81 | public void AddRegion(Scene scene) | 94 | public void AddRegion(Scene scene) |
82 | { | 95 | { |
96 | if (m_combineContiguousRegions) | ||
97 | scene.RegisterModuleInterface<IRegionCombinerModule>(this); | ||
83 | } | 98 | } |
84 | 99 | ||
85 | public void RemoveRegion(Scene scene) | 100 | public void RemoveRegion(Scene scene) |
@@ -88,8 +103,113 @@ namespace OpenSim.Region.RegionCombinerModule | |||
88 | 103 | ||
89 | public void RegionLoaded(Scene scene) | 104 | public void RegionLoaded(Scene scene) |
90 | { | 105 | { |
91 | if (enabledYN) | 106 | lock (m_startingScenes) |
107 | m_startingScenes.Add(scene.RegionInfo.originRegionID, scene); | ||
108 | |||
109 | if (m_combineContiguousRegions) | ||
110 | { | ||
92 | RegionLoadedDoWork(scene); | 111 | RegionLoadedDoWork(scene); |
112 | |||
113 | scene.EventManager.OnNewPresence += NewPresence; | ||
114 | } | ||
115 | } | ||
116 | |||
117 | public bool IsRootForMegaregion(UUID regionId) | ||
118 | { | ||
119 | lock (m_regions) | ||
120 | return m_regions.ContainsKey(regionId); | ||
121 | } | ||
122 | |||
123 | public Vector2 GetSizeOfMegaregion(UUID regionId) | ||
124 | { | ||
125 | lock (m_regions) | ||
126 | { | ||
127 | if (m_regions.ContainsKey(regionId)) | ||
128 | { | ||
129 | RegionConnections rootConn = m_regions[regionId]; | ||
130 | |||
131 | return new Vector2((float)rootConn.XEnd, (float)rootConn.YEnd); | ||
132 | } | ||
133 | } | ||
134 | |||
135 | throw new Exception(string.Format("Region with id {0} not found", regionId)); | ||
136 | } | ||
137 | |||
138 | private void NewPresence(ScenePresence presence) | ||
139 | { | ||
140 | if (presence.IsChildAgent) | ||
141 | { | ||
142 | byte[] throttleData; | ||
143 | |||
144 | try | ||
145 | { | ||
146 | throttleData = presence.ControllingClient.GetThrottlesPacked(1); | ||
147 | } | ||
148 | catch (NotImplementedException) | ||
149 | { | ||
150 | return; | ||
151 | } | ||
152 | |||
153 | if (throttleData == null) | ||
154 | return; | ||
155 | |||
156 | if (throttleData.Length == 0) | ||
157 | return; | ||
158 | |||
159 | if (throttleData.Length != 28) | ||
160 | return; | ||
161 | |||
162 | byte[] adjData; | ||
163 | int pos = 0; | ||
164 | |||
165 | if (!BitConverter.IsLittleEndian) | ||
166 | { | ||
167 | byte[] newData = new byte[7 * 4]; | ||
168 | Buffer.BlockCopy(throttleData, 0, newData, 0, 7 * 4); | ||
169 | |||
170 | for (int i = 0; i < 7; i++) | ||
171 | Array.Reverse(newData, i * 4, 4); | ||
172 | |||
173 | adjData = newData; | ||
174 | } | ||
175 | else | ||
176 | { | ||
177 | adjData = throttleData; | ||
178 | } | ||
179 | |||
180 | // 0.125f converts from bits to bytes | ||
181 | int resend = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4; | ||
182 | int land = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4; | ||
183 | int wind = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4; | ||
184 | int cloud = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4; | ||
185 | int task = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4; | ||
186 | int texture = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4; | ||
187 | int asset = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); | ||
188 | // State is a subcategory of task that we allocate a percentage to | ||
189 | |||
190 | |||
191 | //int total = resend + land + wind + cloud + task + texture + asset; | ||
192 | |||
193 | byte[] data = new byte[7 * 4]; | ||
194 | int ii = 0; | ||
195 | |||
196 | Buffer.BlockCopy(Utils.FloatToBytes(resend), 0, data, ii, 4); ii += 4; | ||
197 | Buffer.BlockCopy(Utils.FloatToBytes(land * 50), 0, data, ii, 4); ii += 4; | ||
198 | Buffer.BlockCopy(Utils.FloatToBytes(wind), 0, data, ii, 4); ii += 4; | ||
199 | Buffer.BlockCopy(Utils.FloatToBytes(cloud), 0, data, ii, 4); ii += 4; | ||
200 | Buffer.BlockCopy(Utils.FloatToBytes(task), 0, data, ii, 4); ii += 4; | ||
201 | Buffer.BlockCopy(Utils.FloatToBytes(texture), 0, data, ii, 4); ii += 4; | ||
202 | Buffer.BlockCopy(Utils.FloatToBytes(asset), 0, data, ii, 4); | ||
203 | |||
204 | try | ||
205 | { | ||
206 | presence.ControllingClient.SetChildAgentThrottle(data); | ||
207 | } | ||
208 | catch (NotImplementedException) | ||
209 | { | ||
210 | return; | ||
211 | } | ||
212 | } | ||
93 | } | 213 | } |
94 | 214 | ||
95 | private void RegionLoadedDoWork(Scene scene) | 215 | private void RegionLoadedDoWork(Scene scene) |
@@ -100,8 +220,6 @@ namespace OpenSim.Region.RegionCombinerModule | |||
100 | return; | 220 | return; |
101 | // | 221 | // |
102 | */ | 222 | */ |
103 | lock (m_startingScenes) | ||
104 | m_startingScenes.Add(scene.RegionInfo.originRegionID, scene); | ||
105 | 223 | ||
106 | // Give each region a standard set of non-infinite borders | 224 | // Give each region a standard set of non-infinite borders |
107 | Border northBorder = new Border(); | 225 | Border northBorder = new Border(); |
@@ -124,24 +242,21 @@ namespace OpenSim.Region.RegionCombinerModule | |||
124 | westBorder.CrossDirection = Cardinals.W; | 242 | westBorder.CrossDirection = Cardinals.W; |
125 | scene.WestBorders[0] = westBorder; | 243 | scene.WestBorders[0] = westBorder; |
126 | 244 | ||
127 | 245 | RegionConnections newConn = new RegionConnections(); | |
128 | 246 | newConn.ConnectedRegions = new List<RegionData>(); | |
129 | RegionConnections regionConnections = new RegionConnections(); | 247 | newConn.RegionScene = scene; |
130 | regionConnections.ConnectedRegions = new List<RegionData>(); | 248 | newConn.RegionLandChannel = scene.LandChannel; |
131 | regionConnections.RegionScene = scene; | 249 | newConn.RegionId = scene.RegionInfo.originRegionID; |
132 | regionConnections.RegionLandChannel = scene.LandChannel; | 250 | newConn.X = scene.RegionInfo.RegionLocX; |
133 | regionConnections.RegionId = scene.RegionInfo.originRegionID; | 251 | newConn.Y = scene.RegionInfo.RegionLocY; |
134 | regionConnections.X = scene.RegionInfo.RegionLocX; | 252 | newConn.XEnd = (int)Constants.RegionSize; |
135 | regionConnections.Y = scene.RegionInfo.RegionLocY; | 253 | newConn.YEnd = (int)Constants.RegionSize; |
136 | regionConnections.XEnd = (int)Constants.RegionSize; | ||
137 | regionConnections.YEnd = (int)Constants.RegionSize; | ||
138 | |||
139 | 254 | ||
140 | lock (m_regions) | 255 | lock (m_regions) |
141 | { | 256 | { |
142 | bool connectedYN = false; | 257 | bool connectedYN = false; |
143 | 258 | ||
144 | foreach (RegionConnections conn in m_regions.Values) | 259 | foreach (RegionConnections rootConn in m_regions.Values) |
145 | { | 260 | { |
146 | #region commented | 261 | #region commented |
147 | /* | 262 | /* |
@@ -306,13 +421,9 @@ namespace OpenSim.Region.RegionCombinerModule | |||
306 | //xxy | 421 | //xxy |
307 | //xxx | 422 | //xxx |
308 | 423 | ||
309 | 424 | if (rootConn.PosX + rootConn.XEnd >= newConn.PosX && rootConn.PosY >= newConn.PosY) | |
310 | if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd | ||
311 | >= (regionConnections.X * (int)Constants.RegionSize)) | ||
312 | && (((int)conn.Y * (int)Constants.RegionSize) | ||
313 | >= (regionConnections.Y * (int)Constants.RegionSize))) | ||
314 | { | 425 | { |
315 | connectedYN = DoWorkForOneRegionOverPlusXY(conn, regionConnections, scene); | 426 | connectedYN = DoWorkForOneRegionOverPlusXY(rootConn, newConn, scene); |
316 | break; | 427 | break; |
317 | } | 428 | } |
318 | 429 | ||
@@ -320,12 +431,9 @@ namespace OpenSim.Region.RegionCombinerModule | |||
320 | //xyx | 431 | //xyx |
321 | //xxx | 432 | //xxx |
322 | //xxx | 433 | //xxx |
323 | if ((((int)conn.X * (int)Constants.RegionSize) | 434 | if (rootConn.PosX >= newConn.PosX && rootConn.PosY + rootConn.YEnd >= newConn.PosY) |
324 | >= (regionConnections.X * (int)Constants.RegionSize)) | ||
325 | && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd | ||
326 | >= (regionConnections.Y * (int)Constants.RegionSize))) | ||
327 | { | 435 | { |
328 | connectedYN = DoWorkForOneRegionOverXPlusY(conn, regionConnections, scene); | 436 | connectedYN = DoWorkForOneRegionOverXPlusY(rootConn, newConn, scene); |
329 | break; | 437 | break; |
330 | } | 438 | } |
331 | 439 | ||
@@ -333,12 +441,9 @@ namespace OpenSim.Region.RegionCombinerModule | |||
333 | //xxy | 441 | //xxy |
334 | //xxx | 442 | //xxx |
335 | //xxx | 443 | //xxx |
336 | if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd | 444 | if (rootConn.PosX + rootConn.XEnd >= newConn.PosX && rootConn.PosY + rootConn.YEnd >= newConn.PosY) |
337 | >= (regionConnections.X * (int)Constants.RegionSize)) | ||
338 | && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd | ||
339 | >= (regionConnections.Y * (int)Constants.RegionSize))) | ||
340 | { | 445 | { |
341 | connectedYN = DoWorkForOneRegionOverPlusXPlusY(conn, regionConnections, scene); | 446 | connectedYN = DoWorkForOneRegionOverPlusXPlusY(rootConn, newConn, scene); |
342 | break; | 447 | break; |
343 | 448 | ||
344 | } | 449 | } |
@@ -347,66 +452,63 @@ namespace OpenSim.Region.RegionCombinerModule | |||
347 | // If !connectYN means that this region is a root region | 452 | // If !connectYN means that this region is a root region |
348 | if (!connectedYN) | 453 | if (!connectedYN) |
349 | { | 454 | { |
350 | DoWorkForRootRegion(regionConnections, scene); | 455 | DoWorkForRootRegion(newConn, scene); |
351 | |||
352 | } | 456 | } |
353 | } | 457 | } |
458 | |||
354 | // Set up infinite borders around the entire AABB of the combined ConnectedRegions | 459 | // Set up infinite borders around the entire AABB of the combined ConnectedRegions |
355 | AdjustLargeRegionBounds(); | 460 | AdjustLargeRegionBounds(); |
356 | } | 461 | } |
357 | 462 | ||
358 | private bool DoWorkForOneRegionOverPlusXY(RegionConnections conn, RegionConnections regionConnections, Scene scene) | 463 | private bool DoWorkForOneRegionOverPlusXY(RegionConnections rootConn, RegionConnections newConn, Scene scene) |
359 | { | 464 | { |
360 | Vector3 offset = Vector3.Zero; | 465 | Vector3 offset = Vector3.Zero; |
361 | offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - | 466 | offset.X = newConn.PosX - rootConn.PosX; |
362 | ((conn.X * (int)Constants.RegionSize))); | 467 | offset.Y = newConn.PosY - rootConn.PosY; |
363 | offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - | ||
364 | ((conn.Y * (int)Constants.RegionSize))); | ||
365 | 468 | ||
366 | Vector3 extents = Vector3.Zero; | 469 | Vector3 extents = Vector3.Zero; |
367 | extents.Y = conn.YEnd; | 470 | extents.Y = rootConn.YEnd; |
368 | extents.X = conn.XEnd + regionConnections.XEnd; | 471 | extents.X = rootConn.XEnd + newConn.XEnd; |
369 | 472 | ||
370 | conn.UpdateExtents(extents); | 473 | rootConn.UpdateExtents(extents); |
371 | 474 | ||
372 | m_log.DebugFormat("Scene: {0} to the west of Scene{1} Offset: {2}. Extents:{3}", | 475 | m_log.DebugFormat( |
373 | conn.RegionScene.RegionInfo.RegionName, | 476 | "[REGION COMBINER MODULE]: Root region {0} is to the west of region {1}, Offset: {2}, Extents: {3}", |
374 | regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); | 477 | rootConn.RegionScene.RegionInfo.RegionName, |
478 | newConn.RegionScene.RegionInfo.RegionName, offset, extents); | ||
375 | 479 | ||
376 | scene.BordersLocked = true; | 480 | scene.BordersLocked = true; |
377 | conn.RegionScene.BordersLocked = true; | 481 | rootConn.RegionScene.BordersLocked = true; |
378 | 482 | ||
379 | RegionData ConnectedRegion = new RegionData(); | 483 | RegionData ConnectedRegion = new RegionData(); |
380 | ConnectedRegion.Offset = offset; | 484 | ConnectedRegion.Offset = offset; |
381 | ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; | 485 | ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; |
382 | ConnectedRegion.RegionScene = scene; | 486 | ConnectedRegion.RegionScene = scene; |
383 | conn.ConnectedRegions.Add(ConnectedRegion); | 487 | rootConn.ConnectedRegions.Add(ConnectedRegion); |
384 | 488 | ||
385 | // Inform root region Physics about the extents of this region | 489 | // Inform root region Physics about the extents of this region |
386 | conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); | 490 | rootConn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); |
387 | 491 | ||
388 | // Inform Child region that it needs to forward it's terrain to the root region | 492 | // Inform Child region that it needs to forward it's terrain to the root region |
389 | scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); | 493 | scene.PhysicsScene.Combine(rootConn.RegionScene.PhysicsScene, offset, Vector3.Zero); |
390 | 494 | ||
391 | // Extend the borders as appropriate | 495 | // Extend the borders as appropriate |
392 | lock (conn.RegionScene.EastBorders) | 496 | lock (rootConn.RegionScene.EastBorders) |
393 | conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; | 497 | rootConn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; |
394 | 498 | ||
395 | lock (conn.RegionScene.NorthBorders) | 499 | lock (rootConn.RegionScene.NorthBorders) |
396 | conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; | 500 | rootConn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; |
397 | 501 | ||
398 | lock (conn.RegionScene.SouthBorders) | 502 | lock (rootConn.RegionScene.SouthBorders) |
399 | conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; | 503 | rootConn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; |
400 | 504 | ||
401 | lock (scene.WestBorders) | 505 | lock (scene.WestBorders) |
402 | { | 506 | { |
403 | 507 | scene.WestBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocX - rootConn.RegionScene.RegionInfo.RegionLocX) * (int)Constants.RegionSize); //auto teleport West | |
404 | |||
405 | scene.WestBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocX - conn.RegionScene.RegionInfo.RegionLocX) * (int)Constants.RegionSize); //auto teleport West | ||
406 | 508 | ||
407 | // Trigger auto teleport to root region | 509 | // Trigger auto teleport to root region |
408 | scene.WestBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX; | 510 | scene.WestBorders[0].TriggerRegionX = rootConn.RegionScene.RegionInfo.RegionLocX; |
409 | scene.WestBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY; | 511 | scene.WestBorders[0].TriggerRegionY = rootConn.RegionScene.RegionInfo.RegionLocY; |
410 | } | 512 | } |
411 | 513 | ||
412 | // Reset Terrain.. since terrain loads before we get here, we need to load | 514 | // Reset Terrain.. since terrain loads before we get here, we need to load |
@@ -415,56 +517,58 @@ namespace OpenSim.Region.RegionCombinerModule | |||
415 | scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); | 517 | scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); |
416 | 518 | ||
417 | // Unlock borders | 519 | // Unlock borders |
418 | conn.RegionScene.BordersLocked = false; | 520 | rootConn.RegionScene.BordersLocked = false; |
419 | scene.BordersLocked = false; | 521 | scene.BordersLocked = false; |
420 | 522 | ||
421 | // Create a client event forwarder and add this region's events to the root region. | 523 | // Create a client event forwarder and add this region's events to the root region. |
422 | if (conn.ClientEventForwarder != null) | 524 | if (rootConn.ClientEventForwarder != null) |
423 | conn.ClientEventForwarder.AddSceneToEventForwarding(scene); | 525 | rootConn.ClientEventForwarder.AddSceneToEventForwarding(scene); |
424 | 526 | ||
425 | return true; | 527 | return true; |
426 | } | 528 | } |
427 | 529 | ||
428 | private bool DoWorkForOneRegionOverXPlusY(RegionConnections conn, RegionConnections regionConnections, Scene scene) | 530 | private bool DoWorkForOneRegionOverXPlusY(RegionConnections rootConn, RegionConnections newConn, Scene scene) |
429 | { | 531 | { |
430 | Vector3 offset = Vector3.Zero; | 532 | Vector3 offset = Vector3.Zero; |
431 | offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - | 533 | offset.X = newConn.PosX - rootConn.PosX; |
432 | ((conn.X * (int)Constants.RegionSize))); | 534 | offset.Y = newConn.PosY - rootConn.PosY; |
433 | offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - | ||
434 | ((conn.Y * (int)Constants.RegionSize))); | ||
435 | 535 | ||
436 | Vector3 extents = Vector3.Zero; | 536 | Vector3 extents = Vector3.Zero; |
437 | extents.Y = regionConnections.YEnd + conn.YEnd; | 537 | extents.Y = newConn.YEnd + rootConn.YEnd; |
438 | extents.X = conn.XEnd; | 538 | extents.X = rootConn.XEnd; |
439 | conn.UpdateExtents(extents); | 539 | rootConn.UpdateExtents(extents); |
440 | 540 | ||
441 | scene.BordersLocked = true; | 541 | scene.BordersLocked = true; |
442 | conn.RegionScene.BordersLocked = true; | 542 | rootConn.RegionScene.BordersLocked = true; |
443 | 543 | ||
444 | RegionData ConnectedRegion = new RegionData(); | 544 | RegionData ConnectedRegion = new RegionData(); |
445 | ConnectedRegion.Offset = offset; | 545 | ConnectedRegion.Offset = offset; |
446 | ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; | 546 | ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; |
447 | ConnectedRegion.RegionScene = scene; | 547 | ConnectedRegion.RegionScene = scene; |
448 | conn.ConnectedRegions.Add(ConnectedRegion); | 548 | rootConn.ConnectedRegions.Add(ConnectedRegion); |
549 | |||
550 | m_log.DebugFormat( | ||
551 | "[REGION COMBINER MODULE]: Root region {0} is to the south of region {1}, Offset: {2}, Extents: {3}", | ||
552 | rootConn.RegionScene.RegionInfo.RegionName, | ||
553 | newConn.RegionScene.RegionInfo.RegionName, offset, extents); | ||
554 | |||
555 | rootConn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); | ||
556 | scene.PhysicsScene.Combine(rootConn.RegionScene.PhysicsScene, offset, Vector3.Zero); | ||
449 | 557 | ||
450 | m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}", | 558 | lock (rootConn.RegionScene.NorthBorders) |
451 | conn.RegionScene.RegionInfo.RegionName, | 559 | rootConn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; |
452 | regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); | ||
453 | 560 | ||
454 | conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); | 561 | lock (rootConn.RegionScene.EastBorders) |
455 | scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); | 562 | rootConn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; |
563 | |||
564 | lock (rootConn.RegionScene.WestBorders) | ||
565 | rootConn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
456 | 566 | ||
457 | lock (conn.RegionScene.NorthBorders) | ||
458 | conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; | ||
459 | lock (conn.RegionScene.EastBorders) | ||
460 | conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
461 | lock (conn.RegionScene.WestBorders) | ||
462 | conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
463 | lock (scene.SouthBorders) | 567 | lock (scene.SouthBorders) |
464 | { | 568 | { |
465 | scene.SouthBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocY - conn.RegionScene.RegionInfo.RegionLocY) * (int)Constants.RegionSize); //auto teleport south | 569 | scene.SouthBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocY - rootConn.RegionScene.RegionInfo.RegionLocY) * (int)Constants.RegionSize); //auto teleport south |
466 | scene.SouthBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX; | 570 | scene.SouthBorders[0].TriggerRegionX = rootConn.RegionScene.RegionInfo.RegionLocX; |
467 | scene.SouthBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY; | 571 | scene.SouthBorders[0].TriggerRegionY = rootConn.RegionScene.RegionInfo.RegionLocY; |
468 | } | 572 | } |
469 | 573 | ||
470 | // Reset Terrain.. since terrain normally loads first. | 574 | // Reset Terrain.. since terrain normally loads first. |
@@ -473,83 +577,92 @@ namespace OpenSim.Region.RegionCombinerModule | |||
473 | //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); | 577 | //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); |
474 | 578 | ||
475 | scene.BordersLocked = false; | 579 | scene.BordersLocked = false; |
476 | conn.RegionScene.BordersLocked = false; | 580 | rootConn.RegionScene.BordersLocked = false; |
477 | if (conn.ClientEventForwarder != null) | 581 | |
478 | conn.ClientEventForwarder.AddSceneToEventForwarding(scene); | 582 | if (rootConn.ClientEventForwarder != null) |
583 | rootConn.ClientEventForwarder.AddSceneToEventForwarding(scene); | ||
584 | |||
479 | return true; | 585 | return true; |
480 | } | 586 | } |
481 | 587 | ||
482 | private bool DoWorkForOneRegionOverPlusXPlusY(RegionConnections conn, RegionConnections regionConnections, Scene scene) | 588 | private bool DoWorkForOneRegionOverPlusXPlusY(RegionConnections rootConn, RegionConnections newConn, Scene scene) |
483 | { | 589 | { |
484 | Vector3 offset = Vector3.Zero; | 590 | Vector3 offset = Vector3.Zero; |
485 | offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - | 591 | offset.X = newConn.PosX - rootConn.PosX; |
486 | ((conn.X * (int)Constants.RegionSize))); | 592 | offset.Y = newConn.PosY - rootConn.PosY; |
487 | offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - | ||
488 | ((conn.Y * (int)Constants.RegionSize))); | ||
489 | 593 | ||
490 | Vector3 extents = Vector3.Zero; | 594 | Vector3 extents = Vector3.Zero; |
491 | extents.Y = regionConnections.YEnd + conn.YEnd; | 595 | |
492 | extents.X = regionConnections.XEnd + conn.XEnd; | 596 | // We do not want to inflate the extents for regions strictly to the NE of the root region, since this |
493 | conn.UpdateExtents(extents); | 597 | // would double count regions strictly to the north and east that have already been added. |
598 | // extents.Y = regionConnections.YEnd + conn.YEnd; | ||
599 | // extents.X = regionConnections.XEnd + conn.XEnd; | ||
600 | // conn.UpdateExtents(extents); | ||
601 | |||
602 | extents.Y = rootConn.YEnd; | ||
603 | extents.X = rootConn.XEnd; | ||
494 | 604 | ||
495 | scene.BordersLocked = true; | 605 | scene.BordersLocked = true; |
496 | conn.RegionScene.BordersLocked = true; | 606 | rootConn.RegionScene.BordersLocked = true; |
497 | 607 | ||
498 | RegionData ConnectedRegion = new RegionData(); | 608 | RegionData ConnectedRegion = new RegionData(); |
499 | ConnectedRegion.Offset = offset; | 609 | ConnectedRegion.Offset = offset; |
500 | ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; | 610 | ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; |
501 | ConnectedRegion.RegionScene = scene; | 611 | ConnectedRegion.RegionScene = scene; |
502 | 612 | ||
503 | conn.ConnectedRegions.Add(ConnectedRegion); | 613 | rootConn.ConnectedRegions.Add(ConnectedRegion); |
614 | |||
615 | m_log.DebugFormat( | ||
616 | "[REGION COMBINER MODULE]: Region {0} is to the southwest of Scene {1}, Offset: {2}, Extents: {3}", | ||
617 | rootConn.RegionScene.RegionInfo.RegionName, | ||
618 | newConn.RegionScene.RegionInfo.RegionName, offset, extents); | ||
504 | 619 | ||
505 | m_log.DebugFormat("Scene: {0} to the NorthEast of Scene{1} Offset: {2}. Extents:{3}", | 620 | rootConn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); |
506 | conn.RegionScene.RegionInfo.RegionName, | 621 | scene.PhysicsScene.Combine(rootConn.RegionScene.PhysicsScene, offset, Vector3.Zero); |
507 | regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); | ||
508 | 622 | ||
509 | conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); | 623 | lock (rootConn.RegionScene.NorthBorders) |
510 | scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); | ||
511 | lock (conn.RegionScene.NorthBorders) | ||
512 | { | 624 | { |
513 | if (conn.RegionScene.NorthBorders.Count == 1)// && 2) | 625 | if (rootConn.RegionScene.NorthBorders.Count == 1)// && 2) |
514 | { | 626 | { |
515 | //compound border | 627 | //compound border |
516 | // already locked above | 628 | // already locked above |
517 | conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; | 629 | rootConn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; |
630 | |||
631 | lock (rootConn.RegionScene.EastBorders) | ||
632 | rootConn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
518 | 633 | ||
519 | lock (conn.RegionScene.EastBorders) | 634 | lock (rootConn.RegionScene.WestBorders) |
520 | conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; | 635 | rootConn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; |
521 | lock (conn.RegionScene.WestBorders) | ||
522 | conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
523 | } | 636 | } |
524 | } | 637 | } |
525 | 638 | ||
526 | lock (scene.SouthBorders) | 639 | lock (scene.SouthBorders) |
527 | { | 640 | { |
528 | scene.SouthBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocY - conn.RegionScene.RegionInfo.RegionLocY) * (int)Constants.RegionSize); //auto teleport south | 641 | scene.SouthBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocY - rootConn.RegionScene.RegionInfo.RegionLocY) * (int)Constants.RegionSize); //auto teleport south |
529 | scene.SouthBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX; | 642 | scene.SouthBorders[0].TriggerRegionX = rootConn.RegionScene.RegionInfo.RegionLocX; |
530 | scene.SouthBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY; | 643 | scene.SouthBorders[0].TriggerRegionY = rootConn.RegionScene.RegionInfo.RegionLocY; |
531 | } | 644 | } |
532 | 645 | ||
533 | lock (conn.RegionScene.EastBorders) | 646 | lock (rootConn.RegionScene.EastBorders) |
534 | { | 647 | { |
535 | if (conn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2) | 648 | if (rootConn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2) |
536 | { | 649 | { |
537 | 650 | ||
538 | conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; | 651 | rootConn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; |
539 | lock (conn.RegionScene.NorthBorders) | ||
540 | conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
541 | lock (conn.RegionScene.SouthBorders) | ||
542 | conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
543 | 652 | ||
653 | lock (rootConn.RegionScene.NorthBorders) | ||
654 | rootConn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
544 | 655 | ||
656 | lock (rootConn.RegionScene.SouthBorders) | ||
657 | rootConn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
545 | } | 658 | } |
546 | } | 659 | } |
547 | 660 | ||
548 | lock (scene.WestBorders) | 661 | lock (scene.WestBorders) |
549 | { | 662 | { |
550 | scene.WestBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocX - conn.RegionScene.RegionInfo.RegionLocX) * (int)Constants.RegionSize); //auto teleport West | 663 | scene.WestBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocX - rootConn.RegionScene.RegionInfo.RegionLocX) * (int)Constants.RegionSize); //auto teleport West |
551 | scene.WestBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX; | 664 | scene.WestBorders[0].TriggerRegionX = rootConn.RegionScene.RegionInfo.RegionLocX; |
552 | scene.WestBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY; | 665 | scene.WestBorders[0].TriggerRegionY = rootConn.RegionScene.RegionInfo.RegionLocY; |
553 | } | 666 | } |
554 | 667 | ||
555 | /* | 668 | /* |
@@ -568,46 +681,50 @@ namespace OpenSim.Region.RegionCombinerModule | |||
568 | scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); | 681 | scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); |
569 | //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); | 682 | //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); |
570 | scene.BordersLocked = false; | 683 | scene.BordersLocked = false; |
571 | conn.RegionScene.BordersLocked = false; | 684 | rootConn.RegionScene.BordersLocked = false; |
572 | 685 | ||
573 | if (conn.ClientEventForwarder != null) | 686 | if (rootConn.ClientEventForwarder != null) |
574 | conn.ClientEventForwarder.AddSceneToEventForwarding(scene); | 687 | rootConn.ClientEventForwarder.AddSceneToEventForwarding(scene); |
575 | 688 | ||
576 | return true; | 689 | return true; |
577 | 690 | ||
578 | //scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset,extents); | 691 | //scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset,extents); |
579 | |||
580 | } | 692 | } |
581 | 693 | ||
582 | private void DoWorkForRootRegion(RegionConnections regionConnections, Scene scene) | 694 | private void DoWorkForRootRegion(RegionConnections rootConn, Scene scene) |
583 | { | 695 | { |
696 | m_log.DebugFormat("[REGION COMBINER MODULE]: Adding root region {0}", scene.RegionInfo.RegionName); | ||
697 | |||
584 | RegionData rdata = new RegionData(); | 698 | RegionData rdata = new RegionData(); |
585 | rdata.Offset = Vector3.Zero; | 699 | rdata.Offset = Vector3.Zero; |
586 | rdata.RegionId = scene.RegionInfo.originRegionID; | 700 | rdata.RegionId = scene.RegionInfo.originRegionID; |
587 | rdata.RegionScene = scene; | 701 | rdata.RegionScene = scene; |
588 | // save it's land channel | 702 | // save it's land channel |
589 | regionConnections.RegionLandChannel = scene.LandChannel; | 703 | rootConn.RegionLandChannel = scene.LandChannel; |
590 | 704 | ||
591 | // Substitue our landchannel | 705 | // Substitue our landchannel |
592 | RegionCombinerLargeLandChannel lnd = new RegionCombinerLargeLandChannel(rdata, scene.LandChannel, | 706 | RegionCombinerLargeLandChannel lnd = new RegionCombinerLargeLandChannel(rdata, scene.LandChannel, |
593 | regionConnections.ConnectedRegions); | 707 | rootConn.ConnectedRegions); |
708 | |||
594 | scene.LandChannel = lnd; | 709 | scene.LandChannel = lnd; |
710 | |||
595 | // Forward the permissions modules of each of the connected regions to the root region | 711 | // Forward the permissions modules of each of the connected regions to the root region |
596 | lock (m_regions) | 712 | lock (m_regions) |
597 | { | 713 | { |
598 | foreach (RegionData r in regionConnections.ConnectedRegions) | 714 | foreach (RegionData r in rootConn.ConnectedRegions) |
599 | { | 715 | { |
600 | ForwardPermissionRequests(regionConnections, r.RegionScene); | 716 | ForwardPermissionRequests(rootConn, r.RegionScene); |
601 | } | 717 | } |
602 | } | ||
603 | // Create the root region's Client Event Forwarder | ||
604 | regionConnections.ClientEventForwarder = new RegionCombinerClientEventForwarder(regionConnections); | ||
605 | |||
606 | // Sets up the CoarseLocationUpdate forwarder for this root region | ||
607 | scene.EventManager.OnNewPresence += SetCourseLocationDelegate; | ||
608 | 718 | ||
609 | // Adds this root region to a dictionary of regions that are connectable | 719 | // Create the root region's Client Event Forwarder |
610 | m_regions.Add(scene.RegionInfo.originRegionID, regionConnections); | 720 | rootConn.ClientEventForwarder = new RegionCombinerClientEventForwarder(rootConn); |
721 | |||
722 | // Sets up the CoarseLocationUpdate forwarder for this root region | ||
723 | scene.EventManager.OnNewPresence += SetCourseLocationDelegate; | ||
724 | |||
725 | // Adds this root region to a dictionary of regions that are connectable | ||
726 | m_regions.Add(scene.RegionInfo.originRegionID, rootConn); | ||
727 | } | ||
611 | } | 728 | } |
612 | 729 | ||
613 | private void SetCourseLocationDelegate(ScenePresence presence) | 730 | private void SetCourseLocationDelegate(ScenePresence presence) |
@@ -864,6 +981,7 @@ namespace OpenSim.Region.RegionCombinerModule | |||
864 | return true; | 981 | return true; |
865 | } | 982 | } |
866 | } | 983 | } |
984 | |||
867 | oborder = null; | 985 | oborder = null; |
868 | return false; | 986 | return false; |
869 | } | 987 | } |
@@ -873,14 +991,19 @@ namespace OpenSim.Region.RegionCombinerModule | |||
873 | pPosition = pPosition/(int) Constants.RegionSize; | 991 | pPosition = pPosition/(int) Constants.RegionSize; |
874 | int OffsetX = (int) pPosition.X; | 992 | int OffsetX = (int) pPosition.X; |
875 | int OffsetY = (int) pPosition.Y; | 993 | int OffsetY = (int) pPosition.Y; |
876 | foreach (RegionConnections regConn in m_regions.Values) | 994 | |
995 | lock (m_regions) | ||
877 | { | 996 | { |
878 | foreach (RegionData reg in regConn.ConnectedRegions) | 997 | foreach (RegionConnections regConn in m_regions.Values) |
879 | { | 998 | { |
880 | if (reg.Offset.X == OffsetX && reg.Offset.Y == OffsetY) | 999 | foreach (RegionData reg in regConn.ConnectedRegions) |
881 | return reg; | 1000 | { |
1001 | if (reg.Offset.X == OffsetX && reg.Offset.Y == OffsetY) | ||
1002 | return reg; | ||
1003 | } | ||
882 | } | 1004 | } |
883 | } | 1005 | } |
1006 | |||
884 | return new RegionData(); | 1007 | return new RegionData(); |
885 | } | 1008 | } |
886 | 1009 | ||
@@ -936,18 +1059,19 @@ namespace OpenSim.Region.RegionCombinerModule | |||
936 | } | 1059 | } |
937 | 1060 | ||
938 | #region console commands | 1061 | #region console commands |
1062 | |||
939 | public void FixPhantoms(string module, string[] cmdparams) | 1063 | public void FixPhantoms(string module, string[] cmdparams) |
940 | { | 1064 | { |
941 | List<Scene> scenes = new List<Scene>(m_startingScenes.Values); | 1065 | List<Scene> scenes = new List<Scene>(m_startingScenes.Values); |
1066 | |||
942 | foreach (Scene s in scenes) | 1067 | foreach (Scene s in scenes) |
943 | { | 1068 | { |
944 | s.ForEachSOG(delegate(SceneObjectGroup e) | 1069 | MainConsole.Instance.OutputFormat("Fixing phantoms for {0}", s.RegionInfo.RegionName); |
945 | { | 1070 | |
946 | e.AbsolutePosition = e.AbsolutePosition; | 1071 | s.ForEachSOG(so => so.AbsolutePosition = so.AbsolutePosition); |
947 | } | ||
948 | ); | ||
949 | } | 1072 | } |
950 | } | 1073 | } |
1074 | |||
951 | #endregion | 1075 | #endregion |
952 | } | 1076 | } |
953 | } | 1077 | } |
diff --git a/OpenSim/Region/RegionCombinerModule/RegionConnections.cs b/OpenSim/Region/RegionCombinerModule/RegionConnections.cs index 3aa9f20..fba51d2 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionConnections.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionConnections.cs | |||
@@ -28,6 +28,7 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using OpenMetaverse; | 30 | using OpenMetaverse; |
31 | using OpenSim.Framework; | ||
31 | using OpenSim.Region.Framework.Interfaces; | 32 | using OpenSim.Region.Framework.Interfaces; |
32 | using OpenSim.Region.Framework.Scenes; | 33 | using OpenSim.Region.Framework.Scenes; |
33 | 34 | ||
@@ -49,17 +50,45 @@ namespace OpenSim.Region.RegionCombinerModule | |||
49 | /// LargeLandChannel for combined region | 50 | /// LargeLandChannel for combined region |
50 | /// </summary> | 51 | /// </summary> |
51 | public ILandChannel RegionLandChannel; | 52 | public ILandChannel RegionLandChannel; |
53 | |||
54 | /// <summary> | ||
55 | /// The x map co-ordinate for this region (where each co-ordinate is a Constants.RegionSize block). | ||
56 | /// </summary> | ||
52 | public uint X; | 57 | public uint X; |
58 | |||
59 | /// <summary> | ||
60 | /// The y co-ordinate for this region (where each cor-odinate is a Constants.RegionSize block). | ||
61 | /// </summary> | ||
53 | public uint Y; | 62 | public uint Y; |
54 | public int XEnd; | 63 | |
55 | public int YEnd; | 64 | /// <summary> |
65 | /// The X meters position of this connection. | ||
66 | /// </summary> | ||
67 | public uint PosX { get { return X * Constants.RegionSize; } } | ||
68 | |||
69 | /// <summary> | ||
70 | /// The Y meters co-ordinate of this connection. | ||
71 | /// </summary> | ||
72 | public uint PosY { get { return Y * Constants.RegionSize; } } | ||
73 | |||
74 | /// <summary> | ||
75 | /// The size of the megaregion in meters. | ||
76 | /// </summary> | ||
77 | public uint XEnd; | ||
78 | |||
79 | /// <summary> | ||
80 | /// The size of the megaregion in meters. | ||
81 | /// </summary> | ||
82 | public uint YEnd; | ||
83 | |||
56 | public List<RegionData> ConnectedRegions; | 84 | public List<RegionData> ConnectedRegions; |
57 | public RegionCombinerPermissionModule PermissionModule; | 85 | public RegionCombinerPermissionModule PermissionModule; |
58 | public RegionCombinerClientEventForwarder ClientEventForwarder; | 86 | public RegionCombinerClientEventForwarder ClientEventForwarder; |
87 | |||
59 | public void UpdateExtents(Vector3 extents) | 88 | public void UpdateExtents(Vector3 extents) |
60 | { | 89 | { |
61 | XEnd = (int)extents.X; | 90 | XEnd = (uint)extents.X; |
62 | YEnd = (int)extents.Y; | 91 | YEnd = (uint)extents.Y; |
63 | } | 92 | } |
64 | } | 93 | } |
65 | } \ No newline at end of file | 94 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs index bb5bacc..2027ca6 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs | |||
@@ -27,17 +27,22 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using OpenMetaverse; | 29 | using OpenMetaverse; |
30 | using OpenSim.Framework; | ||
30 | using OpenSim.Region.Framework.Scenes; | 31 | using OpenSim.Region.Framework.Scenes; |
31 | 32 | ||
32 | |||
33 | namespace OpenSim.Region.ScriptEngine.Interfaces | 33 | namespace OpenSim.Region.ScriptEngine.Interfaces |
34 | { | 34 | { |
35 | public interface IScriptApi | 35 | public interface IScriptApi |
36 | { | 36 | { |
37 | // | 37 | /// <summary> |
38 | // Each API has an identifier, which is used to load the | 38 | /// Initialize the API |
39 | // proper runtime assembly at load time. | 39 | /// </summary> |
40 | // | 40 | /// <remarks> |
41 | void Initialize(IScriptEngine engine, SceneObjectPart part, uint localID, UUID item); | 41 | /// Each API has an identifier, which is used to load the |
42 | /// proper runtime assembly at load time. | ||
43 | /// <param name='engine'>/param> | ||
44 | /// <param name='part'></param> | ||
45 | /// <param name='item'></param> | ||
46 | void Initialize(IScriptEngine engine, SceneObjectPart part, TaskInventoryItem item); | ||
42 | } | 47 | } |
43 | } | 48 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs index 47ed6ba..684138f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs | |||
@@ -29,42 +29,43 @@ using System; | |||
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Reflection; | 31 | using System.Reflection; |
32 | using log4net; | ||
32 | using OpenSim.Region.ScriptEngine.Interfaces; | 33 | using OpenSim.Region.ScriptEngine.Interfaces; |
33 | 34 | ||
34 | namespace OpenSim.Region.ScriptEngine.Shared.Api | 35 | namespace OpenSim.Region.ScriptEngine.Shared.Api |
35 | { | 36 | { |
36 | public class ApiManager | 37 | public class ApiManager |
37 | { | 38 | { |
39 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
40 | |||
38 | private Dictionary<string,Type> m_Apis = new Dictionary<string,Type>(); | 41 | private Dictionary<string,Type> m_Apis = new Dictionary<string,Type>(); |
39 | 42 | ||
40 | public string[] GetApis() | 43 | public string[] GetApis() |
41 | { | 44 | { |
42 | if (m_Apis.Count > 0) | 45 | if (m_Apis.Count <= 0) |
43 | { | 46 | { |
44 | List<string> l = new List<string>(m_Apis.Keys); | 47 | Assembly a = Assembly.GetExecutingAssembly(); |
45 | return l.ToArray(); | ||
46 | } | ||
47 | 48 | ||
48 | Assembly a = Assembly.GetExecutingAssembly(); | 49 | Type[] types = a.GetExportedTypes(); |
49 | 50 | ||
50 | Type[] types = a.GetExportedTypes(); | 51 | foreach (Type t in types) |
51 | |||
52 | foreach (Type t in types) | ||
53 | { | ||
54 | string name = t.ToString(); | ||
55 | int idx = name.LastIndexOf('.'); | ||
56 | if (idx != -1) | ||
57 | name = name.Substring(idx+1); | ||
58 | |||
59 | if (name.EndsWith("_Api")) | ||
60 | { | 52 | { |
61 | name = name.Substring(0, name.Length - 4); | 53 | string name = t.ToString(); |
62 | m_Apis[name] = t; | 54 | int idx = name.LastIndexOf('.'); |
55 | if (idx != -1) | ||
56 | name = name.Substring(idx+1); | ||
57 | |||
58 | if (name.EndsWith("_Api")) | ||
59 | { | ||
60 | name = name.Substring(0, name.Length - 4); | ||
61 | m_Apis[name] = t; | ||
62 | } | ||
63 | } | 63 | } |
64 | } | 64 | } |
65 | 65 | ||
66 | List<string> ret = new List<string>(m_Apis.Keys); | 66 | // m_log.DebugFormat("[API MANAGER]: Found {0} apis", m_Apis.Keys.Count); |
67 | return ret.ToArray(); | 67 | |
68 | return new List<string>(m_Apis.Keys).ToArray(); | ||
68 | } | 69 | } |
69 | 70 | ||
70 | public IScriptApi CreateApi(string api) | 71 | public IScriptApi CreateApi(string api) |
@@ -76,4 +77,4 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
76 | return ret; | 77 | return ret; |
77 | } | 78 | } |
78 | } | 79 | } |
79 | } | 80 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs index 489c1c6..b5fa6de 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs | |||
@@ -59,16 +59,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
59 | { | 59 | { |
60 | internal IScriptEngine m_ScriptEngine; | 60 | internal IScriptEngine m_ScriptEngine; |
61 | internal SceneObjectPart m_host; | 61 | internal SceneObjectPart m_host; |
62 | internal uint m_localID; | 62 | internal TaskInventoryItem m_item; |
63 | internal UUID m_itemID; | ||
64 | internal bool m_CMFunctionsEnabled = false; | 63 | internal bool m_CMFunctionsEnabled = false; |
65 | 64 | ||
66 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) | 65 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) |
67 | { | 66 | { |
68 | m_ScriptEngine = ScriptEngine; | 67 | m_ScriptEngine = ScriptEngine; |
69 | m_host = host; | 68 | m_host = host; |
70 | m_localID = localID; | 69 | m_item = item; |
71 | m_itemID = itemID; | ||
72 | 70 | ||
73 | if (m_ScriptEngine.Config.GetBoolean("AllowCareminsterFunctions", false)) | 71 | if (m_ScriptEngine.Config.GetBoolean("AllowCareminsterFunctions", false)) |
74 | m_CMFunctionsEnabled = true; | 72 | m_CMFunctionsEnabled = true; |
@@ -95,7 +93,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
95 | public string cmDetectedCountry(int number) | 93 | public string cmDetectedCountry(int number) |
96 | { | 94 | { |
97 | m_host.AddScriptLPS(1); | 95 | m_host.AddScriptLPS(1); |
98 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 96 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
99 | if (detectedParams == null) | 97 | if (detectedParams == null) |
100 | return String.Empty; | 98 | return String.Empty; |
101 | return detectedParams.Country; | 99 | return detectedParams.Country; |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 065d3df..713f832 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -88,8 +88,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
88 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 88 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
89 | protected IScriptEngine m_ScriptEngine; | 89 | protected IScriptEngine m_ScriptEngine; |
90 | protected SceneObjectPart m_host; | 90 | protected SceneObjectPart m_host; |
91 | protected uint m_localID; | 91 | |
92 | protected UUID m_itemID; | 92 | /// <summary> |
93 | /// The item that hosts this script | ||
94 | /// </summary> | ||
95 | protected TaskInventoryItem m_item; | ||
96 | |||
93 | protected bool throwErrorOnNotImplemented = true; | 97 | protected bool throwErrorOnNotImplemented = true; |
94 | protected AsyncCommandManager AsyncCommands = null; | 98 | protected AsyncCommandManager AsyncCommands = null; |
95 | protected float m_ScriptDelayFactor = 1.0f; | 99 | protected float m_ScriptDelayFactor = 1.0f; |
@@ -107,6 +111,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
107 | protected IUrlModule m_UrlModule = null; | 111 | protected IUrlModule m_UrlModule = null; |
108 | protected Dictionary<UUID, UserInfoCacheEntry> m_userInfoCache = | 112 | protected Dictionary<UUID, UserInfoCacheEntry> m_userInfoCache = |
109 | new Dictionary<UUID, UserInfoCacheEntry>(); | 113 | new Dictionary<UUID, UserInfoCacheEntry>(); |
114 | protected int EMAIL_PAUSE_TIME = 20; // documented delay value for smtp. | ||
110 | 115 | ||
111 | protected Timer m_ShoutSayTimer; | 116 | protected Timer m_ShoutSayTimer; |
112 | protected int m_SayShoutCount = 0; | 117 | protected int m_SayShoutCount = 0; |
@@ -133,7 +138,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
133 | {"TURNRIGHT", "Turning Right"} | 138 | {"TURNRIGHT", "Turning Right"} |
134 | }; | 139 | }; |
135 | 140 | ||
136 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) | 141 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) |
137 | { | 142 | { |
138 | m_ShoutSayTimer = new Timer(1000); | 143 | m_ShoutSayTimer = new Timer(1000); |
139 | m_ShoutSayTimer.Elapsed += SayShoutTimerElapsed; | 144 | m_ShoutSayTimer.Elapsed += SayShoutTimerElapsed; |
@@ -142,10 +147,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
142 | 147 | ||
143 | m_ScriptEngine = ScriptEngine; | 148 | m_ScriptEngine = ScriptEngine; |
144 | m_host = host; | 149 | m_host = host; |
145 | m_localID = localID; | 150 | m_item = item; |
146 | m_itemID = itemID; | ||
147 | m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); | 151 | m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); |
148 | 152 | ||
153 | LoadLimits(); // read script limits from config. | ||
154 | |||
155 | m_TransferModule = | ||
156 | m_ScriptEngine.World.RequestModuleInterface<IMessageTransferModule>(); | ||
157 | m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>(); | ||
158 | |||
159 | AsyncCommands = new AsyncCommandManager(ScriptEngine); | ||
160 | } | ||
161 | |||
162 | /* load configuration items that affect script, object and run-time behavior. */ | ||
163 | private void LoadLimits() | ||
164 | { | ||
149 | m_ScriptDelayFactor = | 165 | m_ScriptDelayFactor = |
150 | m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f); | 166 | m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f); |
151 | m_ScriptDistanceFactor = | 167 | m_ScriptDistanceFactor = |
@@ -158,12 +174,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
158 | m_ScriptEngine.Config.GetInt("NotecardLineReadCharsMax", 255); | 174 | m_ScriptEngine.Config.GetInt("NotecardLineReadCharsMax", 255); |
159 | if (m_notecardLineReadCharsMax > 65535) | 175 | if (m_notecardLineReadCharsMax > 65535) |
160 | m_notecardLineReadCharsMax = 65535; | 176 | m_notecardLineReadCharsMax = 65535; |
161 | 177 | // load limits for particular subsystems. | |
162 | m_TransferModule = | 178 | IConfig SMTPConfig; |
163 | m_ScriptEngine.World.RequestModuleInterface<IMessageTransferModule>(); | 179 | if ((SMTPConfig = m_ScriptEngine.ConfigSource.Configs["SMTP"]) != null) { |
164 | m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>(); | 180 | // there's an smtp config, so load in the snooze time. |
165 | 181 | EMAIL_PAUSE_TIME = SMTPConfig.GetInt("email_pause_time", EMAIL_PAUSE_TIME); | |
166 | AsyncCommands = new AsyncCommandManager(ScriptEngine); | 182 | } |
167 | } | 183 | } |
168 | 184 | ||
169 | public override Object InitializeLifetimeService() | 185 | public override Object InitializeLifetimeService() |
@@ -195,7 +211,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
195 | [DebuggerNonUserCode] | 211 | [DebuggerNonUserCode] |
196 | public void state(string newState) | 212 | public void state(string newState) |
197 | { | 213 | { |
198 | m_ScriptEngine.SetState(m_itemID, newState); | 214 | m_ScriptEngine.SetState(m_item.ItemID, newState); |
199 | } | 215 | } |
200 | 216 | ||
201 | /// <summary> | 217 | /// <summary> |
@@ -206,7 +222,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
206 | public void llResetScript() | 222 | public void llResetScript() |
207 | { | 223 | { |
208 | m_host.AddScriptLPS(1); | 224 | m_host.AddScriptLPS(1); |
209 | m_ScriptEngine.ApiResetScript(m_itemID); | 225 | m_ScriptEngine.ApiResetScript(m_item.ItemID); |
210 | } | 226 | } |
211 | 227 | ||
212 | public void llResetOtherScript(string name) | 228 | public void llResetOtherScript(string name) |
@@ -358,77 +374,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
358 | } | 374 | } |
359 | } | 375 | } |
360 | 376 | ||
361 | protected UUID InventorySelf() | ||
362 | { | ||
363 | UUID invItemID = new UUID(); | ||
364 | bool unlock = false; | ||
365 | if (!m_host.TaskInventory.IsReadLockedByMe()) | ||
366 | { | ||
367 | m_host.TaskInventory.LockItemsForRead(true); | ||
368 | unlock = true; | ||
369 | } | ||
370 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
371 | { | ||
372 | if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID) | ||
373 | { | ||
374 | invItemID = inv.Key; | ||
375 | break; | ||
376 | } | ||
377 | } | ||
378 | if (unlock) | ||
379 | { | ||
380 | m_host.TaskInventory.LockItemsForRead(false); | ||
381 | } | ||
382 | return invItemID; | ||
383 | } | ||
384 | |||
385 | protected UUID InventoryKey(string name, int type) | 377 | protected UUID InventoryKey(string name, int type) |
386 | { | 378 | { |
387 | m_host.AddScriptLPS(1); | 379 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name); |
388 | m_host.TaskInventory.LockItemsForRead(true); | ||
389 | |||
390 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
391 | { | ||
392 | if (inv.Value.Name == name) | ||
393 | { | ||
394 | m_host.TaskInventory.LockItemsForRead(false); | ||
395 | |||
396 | if (inv.Value.Type != type) | ||
397 | { | ||
398 | return UUID.Zero; | ||
399 | } | ||
400 | |||
401 | return inv.Value.AssetID; | ||
402 | } | ||
403 | } | ||
404 | |||
405 | m_host.TaskInventory.LockItemsForRead(false); | ||
406 | return UUID.Zero; | ||
407 | } | ||
408 | |||
409 | protected UUID InventoryKey(string name) | ||
410 | { | ||
411 | m_host.AddScriptLPS(1); | ||
412 | 380 | ||
413 | 381 | if (item != null && item.Type == type) | |
414 | m_host.TaskInventory.LockItemsForRead(true); | 382 | return item.AssetID; |
415 | 383 | else | |
416 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | 384 | return UUID.Zero; |
417 | { | ||
418 | if (inv.Value.Name == name) | ||
419 | { | ||
420 | m_host.TaskInventory.LockItemsForRead(false); | ||
421 | return inv.Value.AssetID; | ||
422 | } | ||
423 | } | ||
424 | |||
425 | m_host.TaskInventory.LockItemsForRead(false); | ||
426 | |||
427 | |||
428 | return UUID.Zero; | ||
429 | } | 385 | } |
430 | 386 | ||
431 | |||
432 | /// <summary> | 387 | /// <summary> |
433 | /// accepts a valid UUID, -or- a name of an inventory item. | 388 | /// accepts a valid UUID, -or- a name of an inventory item. |
434 | /// Returns a valid UUID or UUID.Zero if key invalid and item not found | 389 | /// Returns a valid UUID or UUID.Zero if key invalid and item not found |
@@ -438,19 +393,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
438 | /// <returns></returns> | 393 | /// <returns></returns> |
439 | protected UUID KeyOrName(string k) | 394 | protected UUID KeyOrName(string k) |
440 | { | 395 | { |
441 | UUID key = UUID.Zero; | 396 | UUID key; |
442 | 397 | ||
443 | // if we can parse the string as a key, use it. | 398 | // if we can parse the string as a key, use it. |
444 | if (UUID.TryParse(k, out key)) | ||
445 | { | ||
446 | return key; | ||
447 | } | ||
448 | // else try to locate the name in inventory of object. found returns key, | 399 | // else try to locate the name in inventory of object. found returns key, |
449 | // not found returns UUID.Zero which will translate to the default particle texture | 400 | // not found returns UUID.Zero |
450 | else | 401 | if (!UUID.TryParse(k, out key)) |
451 | { | 402 | { |
452 | return InventoryKey(k); | 403 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(k); |
404 | |||
405 | if (item != null) | ||
406 | key = item.AssetID; | ||
407 | else | ||
408 | key = UUID.Zero; | ||
453 | } | 409 | } |
410 | |||
411 | return key; | ||
454 | } | 412 | } |
455 | 413 | ||
456 | // convert a LSL_Rotation to a Quaternion | 414 | // convert a LSL_Rotation to a Quaternion |
@@ -963,20 +921,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
963 | 921 | ||
964 | public void llRegionSayTo(string target, int channel, string msg) | 922 | public void llRegionSayTo(string target, int channel, string msg) |
965 | { | 923 | { |
966 | string error = String.Empty; | ||
967 | |||
968 | if (msg.Length > 1023) | 924 | if (msg.Length > 1023) |
969 | msg = msg.Substring(0, 1023); | 925 | msg = msg.Substring(0, 1023); |
970 | 926 | ||
971 | m_host.AddScriptLPS(1); | 927 | m_host.AddScriptLPS(1); |
972 | 928 | ||
929 | if (channel == ScriptBaseClass.DEBUG_CHANNEL) | ||
930 | { | ||
931 | return; | ||
932 | } | ||
933 | |||
973 | UUID TargetID; | 934 | UUID TargetID; |
974 | UUID.TryParse(target, out TargetID); | 935 | UUID.TryParse(target, out TargetID); |
975 | 936 | ||
976 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | 937 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); |
977 | if (wComm != null) | 938 | if (wComm != null) |
978 | if (!wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg, out error)) | 939 | wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg); |
979 | LSLError(error); | ||
980 | } | 940 | } |
981 | 941 | ||
982 | public LSL_Integer llListen(int channelID, string name, string ID, string msg) | 942 | public LSL_Integer llListen(int channelID, string name, string ID, string msg) |
@@ -986,7 +946,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
986 | UUID.TryParse(ID, out keyID); | 946 | UUID.TryParse(ID, out keyID); |
987 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | 947 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); |
988 | if (wComm != null) | 948 | if (wComm != null) |
989 | return wComm.Listen(m_localID, m_itemID, m_host.UUID, channelID, name, keyID, msg); | 949 | return wComm.Listen(m_host.LocalId, m_item.ItemID, m_host.UUID, channelID, name, keyID, msg); |
990 | else | 950 | else |
991 | return -1; | 951 | return -1; |
992 | } | 952 | } |
@@ -996,7 +956,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
996 | m_host.AddScriptLPS(1); | 956 | m_host.AddScriptLPS(1); |
997 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | 957 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); |
998 | if (wComm != null) | 958 | if (wComm != null) |
999 | wComm.ListenControl(m_itemID, number, active); | 959 | wComm.ListenControl(m_item.ItemID, number, active); |
1000 | } | 960 | } |
1001 | 961 | ||
1002 | public void llListenRemove(int number) | 962 | public void llListenRemove(int number) |
@@ -1004,7 +964,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1004 | m_host.AddScriptLPS(1); | 964 | m_host.AddScriptLPS(1); |
1005 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | 965 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); |
1006 | if (wComm != null) | 966 | if (wComm != null) |
1007 | wComm.ListenRemove(m_itemID, number); | 967 | wComm.ListenRemove(m_item.ItemID, number); |
1008 | } | 968 | } |
1009 | 969 | ||
1010 | public void llSensor(string name, string id, int type, double range, double arc) | 970 | public void llSensor(string name, string id, int type, double range, double arc) |
@@ -1013,7 +973,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1013 | UUID keyID = UUID.Zero; | 973 | UUID keyID = UUID.Zero; |
1014 | UUID.TryParse(id, out keyID); | 974 | UUID.TryParse(id, out keyID); |
1015 | 975 | ||
1016 | AsyncCommands.SensorRepeatPlugin.SenseOnce(m_localID, m_itemID, name, keyID, type, range, arc, m_host); | 976 | AsyncCommands.SensorRepeatPlugin.SenseOnce(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, m_host); |
1017 | } | 977 | } |
1018 | 978 | ||
1019 | public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) | 979 | public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) |
@@ -1022,13 +982,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1022 | UUID keyID = UUID.Zero; | 982 | UUID keyID = UUID.Zero; |
1023 | UUID.TryParse(id, out keyID); | 983 | UUID.TryParse(id, out keyID); |
1024 | 984 | ||
1025 | AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_localID, m_itemID, name, keyID, type, range, arc, rate, m_host); | 985 | AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, rate, m_host); |
1026 | } | 986 | } |
1027 | 987 | ||
1028 | public void llSensorRemove() | 988 | public void llSensorRemove() |
1029 | { | 989 | { |
1030 | m_host.AddScriptLPS(1); | 990 | m_host.AddScriptLPS(1); |
1031 | AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_localID, m_itemID); | 991 | AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_host.LocalId, m_item.ItemID); |
1032 | } | 992 | } |
1033 | 993 | ||
1034 | public string resolveName(UUID objecUUID) | 994 | public string resolveName(UUID objecUUID) |
@@ -1069,7 +1029,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1069 | public LSL_String llDetectedName(int number) | 1029 | public LSL_String llDetectedName(int number) |
1070 | { | 1030 | { |
1071 | m_host.AddScriptLPS(1); | 1031 | m_host.AddScriptLPS(1); |
1072 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1032 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1073 | if (detectedParams == null) | 1033 | if (detectedParams == null) |
1074 | return String.Empty; | 1034 | return String.Empty; |
1075 | return detectedParams.Name; | 1035 | return detectedParams.Name; |
@@ -1078,7 +1038,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1078 | public LSL_String llDetectedKey(int number) | 1038 | public LSL_String llDetectedKey(int number) |
1079 | { | 1039 | { |
1080 | m_host.AddScriptLPS(1); | 1040 | m_host.AddScriptLPS(1); |
1081 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1041 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1082 | if (detectedParams == null) | 1042 | if (detectedParams == null) |
1083 | return String.Empty; | 1043 | return String.Empty; |
1084 | return detectedParams.Key.ToString(); | 1044 | return detectedParams.Key.ToString(); |
@@ -1087,7 +1047,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1087 | public LSL_String llDetectedOwner(int number) | 1047 | public LSL_String llDetectedOwner(int number) |
1088 | { | 1048 | { |
1089 | m_host.AddScriptLPS(1); | 1049 | m_host.AddScriptLPS(1); |
1090 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1050 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1091 | if (detectedParams == null) | 1051 | if (detectedParams == null) |
1092 | return String.Empty; | 1052 | return String.Empty; |
1093 | return detectedParams.Owner.ToString(); | 1053 | return detectedParams.Owner.ToString(); |
@@ -1096,7 +1056,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1096 | public LSL_Integer llDetectedType(int number) | 1056 | public LSL_Integer llDetectedType(int number) |
1097 | { | 1057 | { |
1098 | m_host.AddScriptLPS(1); | 1058 | m_host.AddScriptLPS(1); |
1099 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1059 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1100 | if (detectedParams == null) | 1060 | if (detectedParams == null) |
1101 | return 0; | 1061 | return 0; |
1102 | return new LSL_Integer(detectedParams.Type); | 1062 | return new LSL_Integer(detectedParams.Type); |
@@ -1105,7 +1065,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1105 | public LSL_Vector llDetectedPos(int number) | 1065 | public LSL_Vector llDetectedPos(int number) |
1106 | { | 1066 | { |
1107 | m_host.AddScriptLPS(1); | 1067 | m_host.AddScriptLPS(1); |
1108 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1068 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1109 | if (detectedParams == null) | 1069 | if (detectedParams == null) |
1110 | return new LSL_Vector(); | 1070 | return new LSL_Vector(); |
1111 | return detectedParams.Position; | 1071 | return detectedParams.Position; |
@@ -1114,7 +1074,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1114 | public LSL_Vector llDetectedVel(int number) | 1074 | public LSL_Vector llDetectedVel(int number) |
1115 | { | 1075 | { |
1116 | m_host.AddScriptLPS(1); | 1076 | m_host.AddScriptLPS(1); |
1117 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1077 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1118 | if (detectedParams == null) | 1078 | if (detectedParams == null) |
1119 | return new LSL_Vector(); | 1079 | return new LSL_Vector(); |
1120 | return detectedParams.Velocity; | 1080 | return detectedParams.Velocity; |
@@ -1123,7 +1083,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1123 | public LSL_Vector llDetectedGrab(int number) | 1083 | public LSL_Vector llDetectedGrab(int number) |
1124 | { | 1084 | { |
1125 | m_host.AddScriptLPS(1); | 1085 | m_host.AddScriptLPS(1); |
1126 | DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1086 | DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1127 | if (parms == null) | 1087 | if (parms == null) |
1128 | return new LSL_Vector(0, 0, 0); | 1088 | return new LSL_Vector(0, 0, 0); |
1129 | 1089 | ||
@@ -1133,7 +1093,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1133 | public LSL_Rotation llDetectedRot(int number) | 1093 | public LSL_Rotation llDetectedRot(int number) |
1134 | { | 1094 | { |
1135 | m_host.AddScriptLPS(1); | 1095 | m_host.AddScriptLPS(1); |
1136 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1096 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1137 | if (detectedParams == null) | 1097 | if (detectedParams == null) |
1138 | return new LSL_Rotation(); | 1098 | return new LSL_Rotation(); |
1139 | return detectedParams.Rotation; | 1099 | return detectedParams.Rotation; |
@@ -1142,7 +1102,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1142 | public LSL_Integer llDetectedGroup(int number) | 1102 | public LSL_Integer llDetectedGroup(int number) |
1143 | { | 1103 | { |
1144 | m_host.AddScriptLPS(1); | 1104 | m_host.AddScriptLPS(1); |
1145 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1105 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1146 | if (detectedParams == null) | 1106 | if (detectedParams == null) |
1147 | return new LSL_Integer(0); | 1107 | return new LSL_Integer(0); |
1148 | if (m_host.GroupID == detectedParams.Group) | 1108 | if (m_host.GroupID == detectedParams.Group) |
@@ -1153,7 +1113,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1153 | public LSL_Integer llDetectedLinkNumber(int number) | 1113 | public LSL_Integer llDetectedLinkNumber(int number) |
1154 | { | 1114 | { |
1155 | m_host.AddScriptLPS(1); | 1115 | m_host.AddScriptLPS(1); |
1156 | DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1116 | DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1157 | if (parms == null) | 1117 | if (parms == null) |
1158 | return new LSL_Integer(0); | 1118 | return new LSL_Integer(0); |
1159 | 1119 | ||
@@ -1166,7 +1126,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1166 | public LSL_Vector llDetectedTouchBinormal(int index) | 1126 | public LSL_Vector llDetectedTouchBinormal(int index) |
1167 | { | 1127 | { |
1168 | m_host.AddScriptLPS(1); | 1128 | m_host.AddScriptLPS(1); |
1169 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); | 1129 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); |
1170 | if (detectedParams == null) | 1130 | if (detectedParams == null) |
1171 | return new LSL_Vector(); | 1131 | return new LSL_Vector(); |
1172 | return detectedParams.TouchBinormal; | 1132 | return detectedParams.TouchBinormal; |
@@ -1178,7 +1138,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1178 | public LSL_Integer llDetectedTouchFace(int index) | 1138 | public LSL_Integer llDetectedTouchFace(int index) |
1179 | { | 1139 | { |
1180 | m_host.AddScriptLPS(1); | 1140 | m_host.AddScriptLPS(1); |
1181 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); | 1141 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); |
1182 | if (detectedParams == null) | 1142 | if (detectedParams == null) |
1183 | return new LSL_Integer(-1); | 1143 | return new LSL_Integer(-1); |
1184 | return new LSL_Integer(detectedParams.TouchFace); | 1144 | return new LSL_Integer(detectedParams.TouchFace); |
@@ -1190,7 +1150,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1190 | public LSL_Vector llDetectedTouchNormal(int index) | 1150 | public LSL_Vector llDetectedTouchNormal(int index) |
1191 | { | 1151 | { |
1192 | m_host.AddScriptLPS(1); | 1152 | m_host.AddScriptLPS(1); |
1193 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); | 1153 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); |
1194 | if (detectedParams == null) | 1154 | if (detectedParams == null) |
1195 | return new LSL_Vector(); | 1155 | return new LSL_Vector(); |
1196 | return detectedParams.TouchNormal; | 1156 | return detectedParams.TouchNormal; |
@@ -1202,7 +1162,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1202 | public LSL_Vector llDetectedTouchPos(int index) | 1162 | public LSL_Vector llDetectedTouchPos(int index) |
1203 | { | 1163 | { |
1204 | m_host.AddScriptLPS(1); | 1164 | m_host.AddScriptLPS(1); |
1205 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); | 1165 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); |
1206 | if (detectedParams == null) | 1166 | if (detectedParams == null) |
1207 | return new LSL_Vector(); | 1167 | return new LSL_Vector(); |
1208 | return detectedParams.TouchPos; | 1168 | return detectedParams.TouchPos; |
@@ -1214,7 +1174,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1214 | public LSL_Vector llDetectedTouchST(int index) | 1174 | public LSL_Vector llDetectedTouchST(int index) |
1215 | { | 1175 | { |
1216 | m_host.AddScriptLPS(1); | 1176 | m_host.AddScriptLPS(1); |
1217 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); | 1177 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); |
1218 | if (detectedParams == null) | 1178 | if (detectedParams == null) |
1219 | return new LSL_Vector(-1.0, -1.0, 0.0); | 1179 | return new LSL_Vector(-1.0, -1.0, 0.0); |
1220 | return detectedParams.TouchST; | 1180 | return detectedParams.TouchST; |
@@ -1226,7 +1186,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1226 | public LSL_Vector llDetectedTouchUV(int index) | 1186 | public LSL_Vector llDetectedTouchUV(int index) |
1227 | { | 1187 | { |
1228 | m_host.AddScriptLPS(1); | 1188 | m_host.AddScriptLPS(1); |
1229 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); | 1189 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); |
1230 | if (detectedParams == null) | 1190 | if (detectedParams == null) |
1231 | return new LSL_Vector(-1.0, -1.0, 0.0); | 1191 | return new LSL_Vector(-1.0, -1.0, 0.0); |
1232 | return detectedParams.TouchUV; | 1192 | return detectedParams.TouchUV; |
@@ -1929,12 +1889,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1929 | 1889 | ||
1930 | return rgb; | 1890 | return rgb; |
1931 | } | 1891 | } |
1892 | |||
1932 | if (face >= 0 && face < GetNumberOfSides(part)) | 1893 | if (face >= 0 && face < GetNumberOfSides(part)) |
1933 | { | 1894 | { |
1934 | texcolor = tex.GetFace((uint)face).RGBA; | 1895 | texcolor = tex.GetFace((uint)face).RGBA; |
1935 | rgb.x = texcolor.R; | 1896 | rgb.x = texcolor.R; |
1936 | rgb.y = texcolor.G; | 1897 | rgb.y = texcolor.G; |
1937 | rgb.z = texcolor.B; | 1898 | rgb.z = texcolor.B; |
1899 | |||
1938 | return rgb; | 1900 | return rgb; |
1939 | } | 1901 | } |
1940 | else | 1902 | else |
@@ -2975,20 +2937,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2975 | 2937 | ||
2976 | public LSL_Integer llGiveMoney(string destination, int amount) | 2938 | public LSL_Integer llGiveMoney(string destination, int amount) |
2977 | { | 2939 | { |
2978 | UUID invItemID=InventorySelf(); | ||
2979 | if (invItemID == UUID.Zero) | ||
2980 | return 0; | ||
2981 | |||
2982 | m_host.AddScriptLPS(1); | 2940 | m_host.AddScriptLPS(1); |
2983 | 2941 | ||
2984 | m_host.TaskInventory.LockItemsForRead(true); | 2942 | if (m_item.PermsGranter == UUID.Zero) |
2985 | TaskInventoryItem item = m_host.TaskInventory[invItemID]; | ||
2986 | m_host.TaskInventory.LockItemsForRead(false); | ||
2987 | |||
2988 | if (item.PermsGranter == UUID.Zero) | ||
2989 | return 0; | 2943 | return 0; |
2990 | 2944 | ||
2991 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0) | 2945 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0) |
2992 | { | 2946 | { |
2993 | LSLError("No permissions to give money"); | 2947 | LSLError("No permissions to give money"); |
2994 | return 0; | 2948 | return 0; |
@@ -3176,11 +3130,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3176 | sec = m_MinTimerInterval; | 3130 | sec = m_MinTimerInterval; |
3177 | m_host.AddScriptLPS(1); | 3131 | m_host.AddScriptLPS(1); |
3178 | // Setting timer repeat | 3132 | // Setting timer repeat |
3179 | AsyncCommands.TimerPlugin.SetTimerEvent(m_localID, m_itemID, sec); | 3133 | AsyncCommands.TimerPlugin.SetTimerEvent(m_host.LocalId, m_item.ItemID, sec); |
3180 | } | 3134 | } |
3181 | 3135 | ||
3182 | public virtual void llSleep(double sec) | 3136 | public virtual void llSleep(double sec) |
3183 | { | 3137 | { |
3138 | // m_log.Info("llSleep snoozing " + sec + "s."); | ||
3184 | m_host.AddScriptLPS(1); | 3139 | m_host.AddScriptLPS(1); |
3185 | Thread.Sleep((int)(sec * 1000)); | 3140 | Thread.Sleep((int)(sec * 1000)); |
3186 | } | 3141 | } |
@@ -3239,29 +3194,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3239 | 3194 | ||
3240 | public void llTakeControls(int controls, int accept, int pass_on) | 3195 | public void llTakeControls(int controls, int accept, int pass_on) |
3241 | { | 3196 | { |
3242 | TaskInventoryItem item; | 3197 | if (m_item.PermsGranter != UUID.Zero) |
3243 | |||
3244 | m_host.TaskInventory.LockItemsForRead(true); | ||
3245 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | ||
3246 | { | ||
3247 | m_host.TaskInventory.LockItemsForRead(false); | ||
3248 | return; | ||
3249 | } | ||
3250 | else | ||
3251 | { | 3198 | { |
3252 | item = m_host.TaskInventory[InventorySelf()]; | 3199 | ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); |
3253 | } | ||
3254 | m_host.TaskInventory.LockItemsForRead(false); | ||
3255 | |||
3256 | if (item.PermsGranter != UUID.Zero) | ||
3257 | { | ||
3258 | ScenePresence presence = World.GetScenePresence(item.PermsGranter); | ||
3259 | 3200 | ||
3260 | if (presence != null) | 3201 | if (presence != null) |
3261 | { | 3202 | { |
3262 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) | 3203 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) |
3263 | { | 3204 | { |
3264 | presence.RegisterControlEventsToScript(controls, accept, pass_on, m_localID, m_itemID); | 3205 | presence.RegisterControlEventsToScript(controls, accept, pass_on, m_host.LocalId, m_item.ItemID); |
3265 | } | 3206 | } |
3266 | } | 3207 | } |
3267 | } | 3208 | } |
@@ -3271,38 +3212,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3271 | 3212 | ||
3272 | public void llReleaseControls() | 3213 | public void llReleaseControls() |
3273 | { | 3214 | { |
3274 | TaskInventoryItem item; | ||
3275 | |||
3276 | m_host.TaskInventory.LockItemsForRead(true); | ||
3277 | lock (m_host.TaskInventory) | ||
3278 | { | ||
3279 | |||
3280 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | ||
3281 | { | ||
3282 | m_host.TaskInventory.LockItemsForRead(false); | ||
3283 | return; | ||
3284 | } | ||
3285 | else | ||
3286 | { | ||
3287 | item = m_host.TaskInventory[InventorySelf()]; | ||
3288 | } | ||
3289 | } | ||
3290 | m_host.TaskInventory.LockItemsForRead(false); | ||
3291 | |||
3292 | m_host.AddScriptLPS(1); | 3215 | m_host.AddScriptLPS(1); |
3293 | 3216 | ||
3294 | if (item.PermsGranter != UUID.Zero) | 3217 | if (m_item.PermsGranter != UUID.Zero) |
3295 | { | 3218 | { |
3296 | ScenePresence presence = World.GetScenePresence(item.PermsGranter); | 3219 | ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); |
3297 | 3220 | ||
3298 | if (presence != null) | 3221 | if (presence != null) |
3299 | { | 3222 | { |
3300 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) | 3223 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) |
3301 | { | 3224 | { |
3302 | // Unregister controls from Presence | 3225 | // Unregister controls from Presence |
3303 | presence.UnRegisterControlEventsToScript(m_localID, m_itemID); | 3226 | presence.UnRegisterControlEventsToScript(m_host.LocalId, m_item.ItemID); |
3304 | // Remove Take Control permission. | 3227 | // Remove Take Control permission. |
3305 | item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS; | 3228 | m_item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS; |
3306 | } | 3229 | } |
3307 | } | 3230 | } |
3308 | } | 3231 | } |
@@ -3315,86 +3238,71 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3315 | m_UrlModule.ReleaseURL(url); | 3238 | m_UrlModule.ReleaseURL(url); |
3316 | } | 3239 | } |
3317 | 3240 | ||
3318 | public void llAttachToAvatar(int attachment) | 3241 | /// <summary> |
3242 | /// Attach the object containing this script to the avatar that owns it. | ||
3243 | /// </summary> | ||
3244 | /// <param name='attachment'>The attachment point (e.g. ATTACH_CHEST)</param> | ||
3245 | /// <returns>true if the attach suceeded, false if it did not</returns> | ||
3246 | public bool AttachToAvatar(int attachmentPoint) | ||
3319 | { | 3247 | { |
3320 | m_host.AddScriptLPS(1); | 3248 | SceneObjectGroup grp = m_host.ParentGroup; |
3249 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); | ||
3321 | 3250 | ||
3322 | TaskInventoryItem item; | 3251 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; |
3323 | |||
3324 | m_host.TaskInventory.LockItemsForRead(true); | ||
3325 | 3252 | ||
3326 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | 3253 | if (attachmentsModule != null) |
3327 | { | 3254 | return attachmentsModule.AttachObject(presence, grp, (uint)attachmentPoint, false, true); |
3328 | m_host.TaskInventory.LockItemsForRead(false); | ||
3329 | return; | ||
3330 | } | ||
3331 | else | 3255 | else |
3332 | { | 3256 | return false; |
3333 | item = m_host.TaskInventory[InventorySelf()]; | 3257 | } |
3334 | } | ||
3335 | |||
3336 | m_host.TaskInventory.LockItemsForRead(false); | ||
3337 | 3258 | ||
3338 | if (item.PermsGranter != m_host.OwnerID) | 3259 | /// <summary> |
3339 | return; | 3260 | /// Detach the object containing this script from the avatar it is attached to. |
3261 | /// </summary> | ||
3262 | /// <remarks> | ||
3263 | /// Nothing happens if the object is not attached. | ||
3264 | /// </remarks> | ||
3265 | public void DetachFromAvatar() | ||
3266 | { | ||
3267 | Util.FireAndForget(DetachWrapper, m_host); | ||
3268 | } | ||
3340 | 3269 | ||
3341 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) | 3270 | private void DetachWrapper(object o) |
3342 | { | 3271 | { |
3343 | SceneObjectGroup grp = m_host.ParentGroup; | 3272 | SceneObjectPart host = (SceneObjectPart)o; |
3344 | 3273 | ||
3345 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); | 3274 | SceneObjectGroup grp = host.ParentGroup; |
3275 | UUID itemID = grp.FromItemID; | ||
3276 | ScenePresence presence = World.GetScenePresence(host.OwnerID); | ||
3346 | 3277 | ||
3347 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; | 3278 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; |
3348 | if (attachmentsModule != null) | 3279 | if (attachmentsModule != null) |
3349 | attachmentsModule.AttachObject(presence, grp, (uint)attachment, false, true); | 3280 | attachmentsModule.DetachSingleAttachmentToInv(presence, itemID); |
3350 | } | ||
3351 | } | 3281 | } |
3352 | 3282 | ||
3353 | public void llDetachFromAvatar() | 3283 | public void llAttachToAvatar(int attachmentPoint) |
3354 | { | 3284 | { |
3355 | m_host.AddScriptLPS(1); | 3285 | m_host.AddScriptLPS(1); |
3356 | 3286 | ||
3357 | if (m_host.ParentGroup.AttachmentPoint == 0) | 3287 | if (m_item.PermsGranter != m_host.OwnerID) |
3358 | return; | 3288 | return; |
3359 | 3289 | ||
3360 | TaskInventoryItem item; | 3290 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) |
3291 | AttachToAvatar(attachmentPoint); | ||
3292 | } | ||
3361 | 3293 | ||
3362 | m_host.TaskInventory.LockItemsForRead(true); | 3294 | public void llDetachFromAvatar() |
3295 | { | ||
3296 | m_host.AddScriptLPS(1); | ||
3363 | 3297 | ||
3364 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | 3298 | if (m_host.ParentGroup.AttachmentPoint == 0) |
3365 | { | ||
3366 | m_host.TaskInventory.LockItemsForRead(false); | ||
3367 | return; | 3299 | return; |
3368 | } | ||
3369 | else | ||
3370 | { | ||
3371 | item = m_host.TaskInventory[InventorySelf()]; | ||
3372 | } | ||
3373 | m_host.TaskInventory.LockItemsForRead(false); | ||
3374 | |||
3375 | 3300 | ||
3376 | if (item.PermsGranter != m_host.OwnerID) | 3301 | if (m_item.PermsGranter != m_host.OwnerID) |
3377 | return; | 3302 | return; |
3378 | 3303 | ||
3379 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) | 3304 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) |
3380 | { | 3305 | DetachFromAvatar(); |
3381 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; | ||
3382 | if (attachmentsModule != null) | ||
3383 | Util.FireAndForget(DetachWrapper, m_host); | ||
3384 | } | ||
3385 | } | ||
3386 | |||
3387 | private void DetachWrapper(object o) | ||
3388 | { | ||
3389 | SceneObjectPart host = (SceneObjectPart)o; | ||
3390 | |||
3391 | SceneObjectGroup grp = host.ParentGroup; | ||
3392 | UUID itemID = grp.FromItemID; | ||
3393 | ScenePresence presence = World.GetScenePresence(host.OwnerID); | ||
3394 | |||
3395 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; | ||
3396 | if (attachmentsModule != null) | ||
3397 | attachmentsModule.DetachSingleAttachmentToInv(presence, itemID); | ||
3398 | } | 3306 | } |
3399 | 3307 | ||
3400 | public void llTakeCamera(string avatar) | 3308 | public void llTakeCamera(string avatar) |
@@ -3515,7 +3423,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3515 | } | 3423 | } |
3516 | 3424 | ||
3517 | emailModule.SendEmail(m_host.UUID, address, subject, message); | 3425 | emailModule.SendEmail(m_host.UUID, address, subject, message); |
3518 | ScriptSleep(15000); | 3426 | ScriptSleep(EMAIL_PAUSE_TIME * 1000); |
3519 | } | 3427 | } |
3520 | 3428 | ||
3521 | public void llGetNextEmail(string address, string subject) | 3429 | public void llGetNextEmail(string address, string subject) |
@@ -3552,6 +3460,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3552 | return m_host.UUID.ToString(); | 3460 | return m_host.UUID.ToString(); |
3553 | } | 3461 | } |
3554 | 3462 | ||
3463 | public LSL_Key llGenerateKey() | ||
3464 | { | ||
3465 | m_host.AddScriptLPS(1); | ||
3466 | return UUID.Random().ToString(); | ||
3467 | } | ||
3468 | |||
3555 | public void llSetBuoyancy(double buoyancy) | 3469 | public void llSetBuoyancy(double buoyancy) |
3556 | { | 3470 | { |
3557 | m_host.AddScriptLPS(1); | 3471 | m_host.AddScriptLPS(1); |
@@ -3598,7 +3512,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3598 | m_host.AddScriptLPS(1); | 3512 | m_host.AddScriptLPS(1); |
3599 | try | 3513 | try |
3600 | { | 3514 | { |
3601 | m_ScriptEngine.SetMinEventDelay(m_itemID, delay); | 3515 | m_ScriptEngine.SetMinEventDelay(m_item.ItemID, delay); |
3602 | } | 3516 | } |
3603 | catch (NotImplementedException) | 3517 | catch (NotImplementedException) |
3604 | { | 3518 | { |
@@ -3651,29 +3565,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3651 | { | 3565 | { |
3652 | m_host.AddScriptLPS(1); | 3566 | m_host.AddScriptLPS(1); |
3653 | 3567 | ||
3654 | UUID invItemID = InventorySelf(); | 3568 | if (m_item.PermsGranter == UUID.Zero) |
3655 | if (invItemID == UUID.Zero) | ||
3656 | return; | ||
3657 | |||
3658 | TaskInventoryItem item; | ||
3659 | |||
3660 | m_host.TaskInventory.LockItemsForRead(true); | ||
3661 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | ||
3662 | { | ||
3663 | m_host.TaskInventory.LockItemsForRead(false); | ||
3664 | return; | ||
3665 | } | ||
3666 | else | ||
3667 | { | ||
3668 | item = m_host.TaskInventory[InventorySelf()]; | ||
3669 | } | ||
3670 | m_host.TaskInventory.LockItemsForRead(false); | ||
3671 | if (item.PermsGranter == UUID.Zero) | ||
3672 | return; | 3569 | return; |
3673 | 3570 | ||
3674 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) | 3571 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) |
3675 | { | 3572 | { |
3676 | ScenePresence presence = World.GetScenePresence(item.PermsGranter); | 3573 | ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); |
3677 | 3574 | ||
3678 | if (presence != null) | 3575 | if (presence != null) |
3679 | { | 3576 | { |
@@ -3691,41 +3588,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3691 | { | 3588 | { |
3692 | m_host.AddScriptLPS(1); | 3589 | m_host.AddScriptLPS(1); |
3693 | 3590 | ||
3694 | UUID invItemID=InventorySelf(); | 3591 | if (m_item.PermsGranter == UUID.Zero) |
3695 | if (invItemID == UUID.Zero) | ||
3696 | return; | 3592 | return; |
3697 | 3593 | ||
3698 | TaskInventoryItem item; | 3594 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) |
3699 | |||
3700 | m_host.TaskInventory.LockItemsForRead(true); | ||
3701 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | ||
3702 | { | ||
3703 | m_host.TaskInventory.LockItemsForRead(false); | ||
3704 | return; | ||
3705 | } | ||
3706 | else | ||
3707 | { | 3595 | { |
3708 | item = m_host.TaskInventory[InventorySelf()]; | 3596 | ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); |
3709 | } | ||
3710 | m_host.TaskInventory.LockItemsForRead(false); | ||
3711 | |||
3712 | |||
3713 | if (item.PermsGranter == UUID.Zero) | ||
3714 | return; | ||
3715 | |||
3716 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) | ||
3717 | { | ||
3718 | UUID animID = new UUID(); | ||
3719 | |||
3720 | if (!UUID.TryParse(anim, out animID)) | ||
3721 | { | ||
3722 | animID=InventoryKey(anim); | ||
3723 | } | ||
3724 | |||
3725 | ScenePresence presence = World.GetScenePresence(item.PermsGranter); | ||
3726 | 3597 | ||
3727 | if (presence != null) | 3598 | if (presence != null) |
3728 | { | 3599 | { |
3600 | UUID animID = KeyOrName(anim); | ||
3601 | |||
3729 | if (animID == UUID.Zero) | 3602 | if (animID == UUID.Zero) |
3730 | presence.Animator.RemoveAnimation(anim); | 3603 | presence.Animator.RemoveAnimation(anim); |
3731 | else | 3604 | else |
@@ -3758,44 +3631,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3758 | public LSL_Integer llGetStartParameter() | 3631 | public LSL_Integer llGetStartParameter() |
3759 | { | 3632 | { |
3760 | m_host.AddScriptLPS(1); | 3633 | m_host.AddScriptLPS(1); |
3761 | return m_ScriptEngine.GetStartParameter(m_itemID); | 3634 | return m_ScriptEngine.GetStartParameter(m_item.ItemID); |
3762 | } | 3635 | } |
3763 | 3636 | ||
3764 | public void llRequestPermissions(string agent, int perm) | 3637 | public void llRequestPermissions(string agent, int perm) |
3765 | { | 3638 | { |
3766 | UUID agentID = new UUID(); | 3639 | UUID agentID; |
3767 | 3640 | ||
3768 | if (!UUID.TryParse(agent, out agentID)) | 3641 | if (!UUID.TryParse(agent, out agentID)) |
3769 | return; | 3642 | return; |
3770 | 3643 | ||
3771 | UUID invItemID = InventorySelf(); | ||
3772 | |||
3773 | if (invItemID == UUID.Zero) | ||
3774 | return; // Not in a prim? How?? | ||
3775 | |||
3776 | TaskInventoryItem item; | ||
3777 | |||
3778 | |||
3779 | m_host.TaskInventory.LockItemsForRead(true); | ||
3780 | if (!m_host.TaskInventory.ContainsKey(invItemID)) | ||
3781 | { | ||
3782 | m_host.TaskInventory.LockItemsForRead(false); | ||
3783 | return; | ||
3784 | } | ||
3785 | else | ||
3786 | { | ||
3787 | item = m_host.TaskInventory[invItemID]; | ||
3788 | } | ||
3789 | m_host.TaskInventory.LockItemsForRead(false); | ||
3790 | |||
3791 | if (agentID == UUID.Zero || perm == 0) // Releasing permissions | 3644 | if (agentID == UUID.Zero || perm == 0) // Releasing permissions |
3792 | { | 3645 | { |
3793 | llReleaseControls(); | 3646 | llReleaseControls(); |
3794 | 3647 | ||
3795 | item.PermsGranter = UUID.Zero; | 3648 | m_item.PermsGranter = UUID.Zero; |
3796 | item.PermsMask = 0; | 3649 | m_item.PermsMask = 0; |
3797 | 3650 | ||
3798 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( | 3651 | m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( |
3799 | "run_time_permissions", new Object[] { | 3652 | "run_time_permissions", new Object[] { |
3800 | new LSL_Integer(0) }, | 3653 | new LSL_Integer(0) }, |
3801 | new DetectParams[0])); | 3654 | new DetectParams[0])); |
@@ -3803,7 +3656,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3803 | return; | 3656 | return; |
3804 | } | 3657 | } |
3805 | 3658 | ||
3806 | if (item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) | 3659 | if (m_item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) |
3807 | llReleaseControls(); | 3660 | llReleaseControls(); |
3808 | 3661 | ||
3809 | m_host.AddScriptLPS(1); | 3662 | m_host.AddScriptLPS(1); |
@@ -3820,11 +3673,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3820 | if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms | 3673 | if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms |
3821 | { | 3674 | { |
3822 | m_host.TaskInventory.LockItemsForWrite(true); | 3675 | m_host.TaskInventory.LockItemsForWrite(true); |
3823 | m_host.TaskInventory[invItemID].PermsGranter = agentID; | 3676 | m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID; |
3824 | m_host.TaskInventory[invItemID].PermsMask = perm; | 3677 | m_host.TaskInventory[m_item.ItemID].PermsMask = perm; |
3825 | m_host.TaskInventory.LockItemsForWrite(false); | 3678 | m_host.TaskInventory.LockItemsForWrite(false); |
3826 | 3679 | ||
3827 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( | 3680 | m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( |
3828 | "run_time_permissions", new Object[] { | 3681 | "run_time_permissions", new Object[] { |
3829 | new LSL_Integer(perm) }, | 3682 | new LSL_Integer(perm) }, |
3830 | new DetectParams[0])); | 3683 | new DetectParams[0])); |
@@ -3859,11 +3712,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3859 | if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms | 3712 | if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms |
3860 | { | 3713 | { |
3861 | m_host.TaskInventory.LockItemsForWrite(true); | 3714 | m_host.TaskInventory.LockItemsForWrite(true); |
3862 | m_host.TaskInventory[invItemID].PermsGranter = agentID; | 3715 | m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID; |
3863 | m_host.TaskInventory[invItemID].PermsMask = perm; | 3716 | m_host.TaskInventory[m_item.ItemID].PermsMask = perm; |
3864 | m_host.TaskInventory.LockItemsForWrite(false); | 3717 | m_host.TaskInventory.LockItemsForWrite(false); |
3865 | 3718 | ||
3866 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( | 3719 | m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( |
3867 | "run_time_permissions", new Object[] { | 3720 | "run_time_permissions", new Object[] { |
3868 | new LSL_Integer(perm) }, | 3721 | new LSL_Integer(perm) }, |
3869 | new DetectParams[0])); | 3722 | new DetectParams[0])); |
@@ -3874,9 +3727,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3874 | } | 3727 | } |
3875 | 3728 | ||
3876 | ScenePresence presence = World.GetScenePresence(agentID); | 3729 | ScenePresence presence = World.GetScenePresence(agentID); |
3877 | |||
3878 | if (presence != null) | 3730 | if (presence != null) |
3879 | { | 3731 | { |
3732 | // If permissions are being requested from an NPC and were not implicitly granted above then | ||
3733 | // auto grant all reuqested permissions if the script is owned by the NPC or the NPCs owner | ||
3734 | INPCModule npcModule = World.RequestModuleInterface<INPCModule>(); | ||
3735 | if (npcModule != null && npcModule.IsNPC(agentID, World)) | ||
3736 | { | ||
3737 | if (agentID == m_host.ParentGroup.OwnerID || npcModule.GetOwner(agentID) == m_host.ParentGroup.OwnerID) | ||
3738 | { | ||
3739 | lock (m_host.TaskInventory) | ||
3740 | { | ||
3741 | m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID; | ||
3742 | m_host.TaskInventory[m_item.ItemID].PermsMask = perm; | ||
3743 | } | ||
3744 | |||
3745 | m_ScriptEngine.PostScriptEvent( | ||
3746 | m_item.ItemID, | ||
3747 | new EventParams( | ||
3748 | "run_time_permissions", new Object[] { new LSL_Integer(perm) }, new DetectParams[0])); | ||
3749 | } | ||
3750 | |||
3751 | // it is an NPC, exit even if the permissions werent granted above, they are not going to answer | ||
3752 | // the question! | ||
3753 | return; | ||
3754 | } | ||
3755 | |||
3880 | string ownerName = resolveName(m_host.ParentGroup.RootPart.OwnerID); | 3756 | string ownerName = resolveName(m_host.ParentGroup.RootPart.OwnerID); |
3881 | if (ownerName == String.Empty) | 3757 | if (ownerName == String.Empty) |
3882 | ownerName = "(hippos)"; | 3758 | ownerName = "(hippos)"; |
@@ -3884,8 +3760,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3884 | if (!m_waitingForScriptAnswer) | 3760 | if (!m_waitingForScriptAnswer) |
3885 | { | 3761 | { |
3886 | m_host.TaskInventory.LockItemsForWrite(true); | 3762 | m_host.TaskInventory.LockItemsForWrite(true); |
3887 | m_host.TaskInventory[invItemID].PermsGranter = agentID; | 3763 | m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID; |
3888 | m_host.TaskInventory[invItemID].PermsMask = 0; | 3764 | m_host.TaskInventory[m_item.ItemID].PermsMask = 0; |
3889 | m_host.TaskInventory.LockItemsForWrite(false); | 3765 | m_host.TaskInventory.LockItemsForWrite(false); |
3890 | 3766 | ||
3891 | presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; | 3767 | presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; |
@@ -3893,16 +3769,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3893 | } | 3769 | } |
3894 | 3770 | ||
3895 | presence.ControllingClient.SendScriptQuestion( | 3771 | presence.ControllingClient.SendScriptQuestion( |
3896 | m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, invItemID, perm); | 3772 | m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, m_item.ItemID, perm); |
3897 | 3773 | ||
3898 | return; | 3774 | return; |
3899 | } | 3775 | } |
3900 | 3776 | ||
3901 | // Requested agent is not in range, refuse perms | 3777 | // Requested agent is not in range, refuse perms |
3902 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( | 3778 | m_ScriptEngine.PostScriptEvent( |
3903 | "run_time_permissions", new Object[] { | 3779 | m_item.ItemID, |
3904 | new LSL_Integer(0) }, | 3780 | new EventParams("run_time_permissions", new Object[] { new LSL_Integer(0) }, new DetectParams[0])); |
3905 | new DetectParams[0])); | ||
3906 | } | 3781 | } |
3907 | 3782 | ||
3908 | void handleScriptAnswer(IClientAPI client, UUID taskID, UUID itemID, int answer) | 3783 | void handleScriptAnswer(IClientAPI client, UUID taskID, UUID itemID, int answer) |
@@ -3910,24 +3785,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3910 | if (taskID != m_host.UUID) | 3785 | if (taskID != m_host.UUID) |
3911 | return; | 3786 | return; |
3912 | 3787 | ||
3913 | UUID invItemID = InventorySelf(); | 3788 | client.OnScriptAnswer -= handleScriptAnswer; |
3914 | 3789 | m_waitingForScriptAnswer = false; | |
3915 | if (invItemID == UUID.Zero) | ||
3916 | return; | ||
3917 | |||
3918 | client.OnScriptAnswer-=handleScriptAnswer; | ||
3919 | m_waitingForScriptAnswer=false; | ||
3920 | 3790 | ||
3921 | if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) | 3791 | if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) |
3922 | llReleaseControls(); | 3792 | llReleaseControls(); |
3923 | 3793 | ||
3924 | |||
3925 | m_host.TaskInventory.LockItemsForWrite(true); | 3794 | m_host.TaskInventory.LockItemsForWrite(true); |
3926 | m_host.TaskInventory[invItemID].PermsMask = answer; | 3795 | m_host.TaskInventory[m_item.ItemID].PermsMask = answer; |
3927 | m_host.TaskInventory.LockItemsForWrite(false); | 3796 | m_host.TaskInventory.LockItemsForWrite(false); |
3928 | 3797 | ||
3929 | 3798 | m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( | |
3930 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( | ||
3931 | "run_time_permissions", new Object[] { | 3799 | "run_time_permissions", new Object[] { |
3932 | new LSL_Integer(answer) }, | 3800 | new LSL_Integer(answer) }, |
3933 | new DetectParams[0])); | 3801 | new DetectParams[0])); |
@@ -3937,41 +3805,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3937 | { | 3805 | { |
3938 | m_host.AddScriptLPS(1); | 3806 | m_host.AddScriptLPS(1); |
3939 | 3807 | ||
3940 | m_host.TaskInventory.LockItemsForRead(true); | 3808 | return m_item.PermsGranter.ToString(); |
3941 | |||
3942 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
3943 | { | ||
3944 | if (item.Type == 10 && item.ItemID == m_itemID) | ||
3945 | { | ||
3946 | m_host.TaskInventory.LockItemsForRead(false); | ||
3947 | return item.PermsGranter.ToString(); | ||
3948 | } | ||
3949 | } | ||
3950 | m_host.TaskInventory.LockItemsForRead(false); | ||
3951 | |||
3952 | return UUID.Zero.ToString(); | ||
3953 | } | 3809 | } |
3954 | 3810 | ||
3955 | public LSL_Integer llGetPermissions() | 3811 | public LSL_Integer llGetPermissions() |
3956 | { | 3812 | { |
3957 | m_host.AddScriptLPS(1); | 3813 | m_host.AddScriptLPS(1); |
3958 | 3814 | ||
3959 | m_host.TaskInventory.LockItemsForRead(true); | 3815 | int perms = m_item.PermsMask; |
3960 | 3816 | ||
3961 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | 3817 | if (m_automaticLinkPermission) |
3962 | { | 3818 | perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; |
3963 | if (item.Type == 10 && item.ItemID == m_itemID) | ||
3964 | { | ||
3965 | int perms = item.PermsMask; | ||
3966 | if (m_automaticLinkPermission) | ||
3967 | perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; | ||
3968 | m_host.TaskInventory.LockItemsForRead(false); | ||
3969 | return perms; | ||
3970 | } | ||
3971 | } | ||
3972 | m_host.TaskInventory.LockItemsForRead(false); | ||
3973 | 3819 | ||
3974 | return 0; | 3820 | return perms; |
3975 | } | 3821 | } |
3976 | 3822 | ||
3977 | public LSL_Integer llGetLinkNumber() | 3823 | public LSL_Integer llGetLinkNumber() |
@@ -4009,18 +3855,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4009 | public void llCreateLink(string target, int parent) | 3855 | public void llCreateLink(string target, int parent) |
4010 | { | 3856 | { |
4011 | m_host.AddScriptLPS(1); | 3857 | m_host.AddScriptLPS(1); |
4012 | UUID invItemID = InventorySelf(); | 3858 | |
4013 | UUID targetID; | 3859 | UUID targetID; |
4014 | 3860 | ||
4015 | if (!UUID.TryParse(target, out targetID)) | 3861 | if (!UUID.TryParse(target, out targetID)) |
4016 | return; | 3862 | return; |
4017 | 3863 | ||
4018 | TaskInventoryItem item; | 3864 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 |
4019 | m_host.TaskInventory.LockItemsForRead(true); | ||
4020 | item = m_host.TaskInventory[invItemID]; | ||
4021 | m_host.TaskInventory.LockItemsForRead(false); | ||
4022 | |||
4023 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 | ||
4024 | && !m_automaticLinkPermission) | 3865 | && !m_automaticLinkPermission) |
4025 | { | 3866 | { |
4026 | ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); | 3867 | ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); |
@@ -4028,7 +3869,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4028 | } | 3869 | } |
4029 | 3870 | ||
4030 | IClientAPI client = null; | 3871 | IClientAPI client = null; |
4031 | ScenePresence sp = World.GetScenePresence(item.PermsGranter); | 3872 | ScenePresence sp = World.GetScenePresence(m_item.PermsGranter); |
4032 | if (sp != null) | 3873 | if (sp != null) |
4033 | client = sp.ControllingClient; | 3874 | client = sp.ControllingClient; |
4034 | 3875 | ||
@@ -4074,18 +3915,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4074 | public void llBreakLink(int linknum) | 3915 | public void llBreakLink(int linknum) |
4075 | { | 3916 | { |
4076 | m_host.AddScriptLPS(1); | 3917 | m_host.AddScriptLPS(1); |
4077 | UUID invItemID = InventorySelf(); | ||
4078 | 3918 | ||
4079 | m_host.TaskInventory.LockItemsForRead(true); | 3919 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 |
4080 | if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 | 3920 | && !m_automaticLinkPermission) |
4081 | && !m_automaticLinkPermission) | 3921 | { |
4082 | { | 3922 | ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); |
4083 | ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); | 3923 | return; |
4084 | m_host.TaskInventory.LockItemsForRead(false); | 3924 | } |
4085 | return; | 3925 | |
4086 | } | ||
4087 | m_host.TaskInventory.LockItemsForRead(false); | ||
4088 | |||
4089 | if (linknum < ScriptBaseClass.LINK_THIS) | 3926 | if (linknum < ScriptBaseClass.LINK_THIS) |
4090 | return; | 3927 | return; |
4091 | 3928 | ||
@@ -4184,12 +4021,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4184 | { | 4021 | { |
4185 | m_host.AddScriptLPS(1); | 4022 | m_host.AddScriptLPS(1); |
4186 | 4023 | ||
4187 | UUID invItemID = InventorySelf(); | 4024 | TaskInventoryItem item = m_item; |
4188 | |||
4189 | TaskInventoryItem item; | ||
4190 | m_host.TaskInventory.LockItemsForRead(true); | ||
4191 | item = m_host.TaskInventory[invItemID]; | ||
4192 | m_host.TaskInventory.LockItemsForRead(false); | ||
4193 | 4025 | ||
4194 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 | 4026 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 |
4195 | && !m_automaticLinkPermission) | 4027 | && !m_automaticLinkPermission) |
@@ -4500,7 +4332,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4500 | { | 4332 | { |
4501 | if (item.Name == name) | 4333 | if (item.Name == name) |
4502 | { | 4334 | { |
4503 | if (item.ItemID == m_itemID) | 4335 | if (item.ItemID == m_item.ItemID) |
4504 | throw new ScriptDeleteException(); | 4336 | throw new ScriptDeleteException(); |
4505 | else | 4337 | else |
4506 | m_host.Inventory.RemoveInventoryItem(item.ItemID); | 4338 | m_host.Inventory.RemoveInventoryItem(item.ItemID); |
@@ -4634,8 +4466,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4634 | UUID rq = UUID.Random(); | 4466 | UUID rq = UUID.Random(); |
4635 | 4467 | ||
4636 | UUID tid = AsyncCommands. | 4468 | UUID tid = AsyncCommands. |
4637 | DataserverPlugin.RegisterRequest(m_localID, | 4469 | DataserverPlugin.RegisterRequest(m_host.LocalId, |
4638 | m_itemID, rq.ToString()); | 4470 | m_item.ItemID, rq.ToString()); |
4639 | 4471 | ||
4640 | AsyncCommands. | 4472 | AsyncCommands. |
4641 | DataserverPlugin.DataserverReply(rq.ToString(), reply); | 4473 | DataserverPlugin.DataserverReply(rq.ToString(), reply); |
@@ -4662,8 +4494,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4662 | if (item.Type == 3 && item.Name == name) | 4494 | if (item.Type == 3 && item.Name == name) |
4663 | { | 4495 | { |
4664 | UUID tid = AsyncCommands. | 4496 | UUID tid = AsyncCommands. |
4665 | DataserverPlugin.RegisterRequest(m_localID, | 4497 | DataserverPlugin.RegisterRequest(m_host.LocalId, |
4666 | m_itemID, item.AssetID.ToString()); | 4498 | m_item.ItemID, item.AssetID.ToString()); |
4667 | 4499 | ||
4668 | Vector3 region = new Vector3( | 4500 | Vector3 region = new Vector3( |
4669 | World.RegionInfo.RegionLocX * Constants.RegionSize, | 4501 | World.RegionInfo.RegionLocX * Constants.RegionSize, |
@@ -5136,22 +4968,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5136 | 4968 | ||
5137 | public LSL_String llGetScriptName() | 4969 | public LSL_String llGetScriptName() |
5138 | { | 4970 | { |
5139 | string result = String.Empty; | ||
5140 | |||
5141 | m_host.AddScriptLPS(1); | 4971 | m_host.AddScriptLPS(1); |
5142 | 4972 | ||
5143 | m_host.TaskInventory.LockItemsForRead(true); | 4973 | return m_item.Name != null ? m_item.Name : String.Empty; |
5144 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
5145 | { | ||
5146 | if (item.Type == 10 && item.ItemID == m_itemID) | ||
5147 | { | ||
5148 | result = item.Name!=null?item.Name:String.Empty; | ||
5149 | break; | ||
5150 | } | ||
5151 | } | ||
5152 | m_host.TaskInventory.LockItemsForRead(false); | ||
5153 | |||
5154 | return result; | ||
5155 | } | 4974 | } |
5156 | 4975 | ||
5157 | public LSL_Integer llGetLinkNumberOfSides(int link) | 4976 | public LSL_Integer llGetLinkNumberOfSides(int link) |
@@ -6285,7 +6104,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6285 | } | 6104 | } |
6286 | } | 6105 | } |
6287 | } | 6106 | } |
6288 | List<UUID> presenceIds = new List<UUID>(); | ||
6289 | 6107 | ||
6290 | World.ForEachRootScenePresence( | 6108 | World.ForEachRootScenePresence( |
6291 | delegate (ScenePresence ssp) | 6109 | delegate (ScenePresence ssp) |
@@ -6436,7 +6254,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6436 | if (m_host.OwnerID == land.LandData.OwnerID) | 6254 | if (m_host.OwnerID == land.LandData.OwnerID) |
6437 | { | 6255 | { |
6438 | Vector3 pos = World.GetNearestAllowedPosition(presence, land); | 6256 | Vector3 pos = World.GetNearestAllowedPosition(presence, land); |
6439 | presence.TeleportWithMomentum(pos); | 6257 | presence.TeleportWithMomentum(pos, null); |
6440 | presence.ControllingClient.SendAlertMessage("You have been ejected from this land"); | 6258 | presence.ControllingClient.SendAlertMessage("You have been ejected from this land"); |
6441 | } | 6259 | } |
6442 | } | 6260 | } |
@@ -7383,14 +7201,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7383 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | 7201 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); |
7384 | if (xmlrpcMod.IsEnabled()) | 7202 | if (xmlrpcMod.IsEnabled()) |
7385 | { | 7203 | { |
7386 | UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_itemID, UUID.Zero); | 7204 | UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_host.LocalId, m_item.ItemID, UUID.Zero); |
7387 | IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface<IXmlRpcRouter>(); | 7205 | IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface<IXmlRpcRouter>(); |
7388 | if (xmlRpcRouter != null) | 7206 | if (xmlRpcRouter != null) |
7389 | { | 7207 | { |
7390 | string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName; | 7208 | string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName; |
7391 | 7209 | ||
7392 | xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID, | 7210 | xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID, |
7393 | m_itemID, String.Format("http://{0}:{1}/", ExternalHostName, | 7211 | m_item.ItemID, String.Format("http://{0}:{1}/", ExternalHostName, |
7394 | xmlrpcMod.Port.ToString())); | 7212 | xmlrpcMod.Port.ToString())); |
7395 | } | 7213 | } |
7396 | object[] resobj = new object[] | 7214 | object[] resobj = new object[] |
@@ -7402,7 +7220,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7402 | new LSL_Integer(0), | 7220 | new LSL_Integer(0), |
7403 | new LSL_String(String.Empty) | 7221 | new LSL_String(String.Empty) |
7404 | }; | 7222 | }; |
7405 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams("remote_data", resobj, | 7223 | m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams("remote_data", resobj, |
7406 | new DetectParams[0])); | 7224 | new DetectParams[0])); |
7407 | } | 7225 | } |
7408 | ScriptSleep(1000); | 7226 | ScriptSleep(1000); |
@@ -7413,7 +7231,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7413 | m_host.AddScriptLPS(1); | 7231 | m_host.AddScriptLPS(1); |
7414 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | 7232 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); |
7415 | ScriptSleep(3000); | 7233 | ScriptSleep(3000); |
7416 | return (xmlrpcMod.SendRemoteData(m_localID, m_itemID, channel, dest, idata, sdata)).ToString(); | 7234 | return (xmlrpcMod.SendRemoteData(m_host.LocalId, m_item.ItemID, channel, dest, idata, sdata)).ToString(); |
7417 | } | 7235 | } |
7418 | 7236 | ||
7419 | public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) | 7237 | public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) |
@@ -8252,7 +8070,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
8252 | return; | 8070 | return; |
8253 | face = (int)rules.GetLSLIntegerItem(idx++); | 8071 | face = (int)rules.GetLSLIntegerItem(idx++); |
8254 | int shiny = (int)rules.GetLSLIntegerItem(idx++); | 8072 | int shiny = (int)rules.GetLSLIntegerItem(idx++); |
8255 | Bumpiness bump = (Bumpiness)Convert.ToByte((int)rules.GetLSLIntegerItem(idx++)); | 8073 | Bumpiness bump = (Bumpiness)(int)rules.GetLSLIntegerItem(idx++); |
8256 | 8074 | ||
8257 | SetShiny(part, face, shiny, bump); | 8075 | SetShiny(part, face, shiny, bump); |
8258 | 8076 | ||
@@ -9717,7 +9535,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
9717 | public LSL_String llGetSimulatorHostname() | 9535 | public LSL_String llGetSimulatorHostname() |
9718 | { | 9536 | { |
9719 | m_host.AddScriptLPS(1); | 9537 | m_host.AddScriptLPS(1); |
9720 | return System.Environment.MachineName; | 9538 | IUrlModule UrlModule = World.RequestModuleInterface<IUrlModule>(); |
9539 | return UrlModule.ExternalHostNameForLSL; | ||
9721 | } | 9540 | } |
9722 | 9541 | ||
9723 | // <summary> | 9542 | // <summary> |
@@ -10056,13 +9875,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10056 | { | 9875 | { |
10057 | m_host.AddScriptLPS(1); | 9876 | m_host.AddScriptLPS(1); |
10058 | if (m_UrlModule != null) | 9877 | if (m_UrlModule != null) |
10059 | return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); | 9878 | return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString(); |
10060 | return UUID.Zero.ToString(); | 9879 | return UUID.Zero.ToString(); |
10061 | } | 9880 | } |
10062 | 9881 | ||
10063 | public LSL_String llRequestSimulatorData(string simulator, int data) | 9882 | public LSL_String llRequestSimulatorData(string simulator, int data) |
10064 | { | 9883 | { |
10065 | IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_itemID, "OSSL"); | 9884 | IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "OSSL"); |
10066 | 9885 | ||
10067 | try | 9886 | try |
10068 | { | 9887 | { |
@@ -10072,7 +9891,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10072 | 9891 | ||
10073 | GridRegion info; | 9892 | GridRegion info; |
10074 | 9893 | ||
10075 | if (m_ScriptEngine.World.RegionInfo.RegionName == simulator) | 9894 | if (m_ScriptEngine.World.RegionInfo.RegionName == simulator) //Det data for this simulator? |
9895 | |||
10076 | info = new GridRegion(m_ScriptEngine.World.RegionInfo); | 9896 | info = new GridRegion(m_ScriptEngine.World.RegionInfo); |
10077 | else | 9897 | else |
10078 | info = m_ScriptEngine.World.GridService.GetRegionByName(m_ScriptEngine.World.RegionInfo.ScopeID, simulator); | 9898 | info = m_ScriptEngine.World.GridService.GetRegionByName(m_ScriptEngine.World.RegionInfo.ScopeID, simulator); |
@@ -10085,10 +9905,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10085 | ScriptSleep(1000); | 9905 | ScriptSleep(1000); |
10086 | return UUID.Zero.ToString(); | 9906 | return UUID.Zero.ToString(); |
10087 | } | 9907 | } |
10088 | reply = new LSL_Vector( | 9908 | if (m_ScriptEngine.World.RegionInfo.RegionName != simulator) |
10089 | info.RegionLocX, | 9909 | { |
10090 | info.RegionLocY, | 9910 | //Hypergrid Region co-ordinates |
10091 | 0).ToString(); | 9911 | uint rx = 0, ry = 0; |
9912 | Utils.LongToUInts(Convert.ToUInt64(info.RegionSecret), out rx, out ry); | ||
9913 | |||
9914 | reply = new LSL_Vector( | ||
9915 | rx, | ||
9916 | ry, | ||
9917 | 0).ToString(); | ||
9918 | } | ||
9919 | else | ||
9920 | { | ||
9921 | //Local-cooridnates | ||
9922 | reply = new LSL_Vector( | ||
9923 | info.RegionLocX, | ||
9924 | info.RegionLocY, | ||
9925 | 0).ToString(); | ||
9926 | } | ||
10092 | break; | 9927 | break; |
10093 | case ScriptBaseClass.DATA_SIM_STATUS: | 9928 | case ScriptBaseClass.DATA_SIM_STATUS: |
10094 | if (info != null) | 9929 | if (info != null) |
@@ -10124,7 +9959,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10124 | UUID rq = UUID.Random(); | 9959 | UUID rq = UUID.Random(); |
10125 | 9960 | ||
10126 | UUID tid = AsyncCommands. | 9961 | UUID tid = AsyncCommands. |
10127 | DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); | 9962 | DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString()); |
10128 | 9963 | ||
10129 | AsyncCommands. | 9964 | AsyncCommands. |
10130 | DataserverPlugin.DataserverReply(rq.ToString(), reply); | 9965 | DataserverPlugin.DataserverReply(rq.ToString(), reply); |
@@ -10143,7 +9978,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10143 | m_host.AddScriptLPS(1); | 9978 | m_host.AddScriptLPS(1); |
10144 | 9979 | ||
10145 | if (m_UrlModule != null) | 9980 | if (m_UrlModule != null) |
10146 | return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); | 9981 | return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString(); |
10147 | return UUID.Zero.ToString(); | 9982 | return UUID.Zero.ToString(); |
10148 | } | 9983 | } |
10149 | 9984 | ||
@@ -10179,7 +10014,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10179 | // child agents have a mass of 1.0 | 10014 | // child agents have a mass of 1.0 |
10180 | return 1; | 10015 | return 1; |
10181 | else | 10016 | else |
10182 | return avatar.GetMass(); | 10017 | return (double)avatar.GetMass(); |
10183 | } | 10018 | } |
10184 | catch (KeyNotFoundException) | 10019 | catch (KeyNotFoundException) |
10185 | { | 10020 | { |
@@ -10622,32 +10457,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10622 | public LSL_Vector llGetCameraPos() | 10457 | public LSL_Vector llGetCameraPos() |
10623 | { | 10458 | { |
10624 | m_host.AddScriptLPS(1); | 10459 | m_host.AddScriptLPS(1); |
10625 | UUID invItemID = InventorySelf(); | ||
10626 | 10460 | ||
10627 | if (invItemID == UUID.Zero) | 10461 | if (m_item.PermsGranter == UUID.Zero) |
10628 | return new LSL_Vector(); | 10462 | return new LSL_Vector(); |
10629 | |||
10630 | m_host.TaskInventory.LockItemsForRead(true); | ||
10631 | |||
10632 | UUID agentID = m_host.TaskInventory[invItemID].PermsGranter; | ||
10633 | |||
10634 | // if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) | ||
10635 | if (agentID == UUID.Zero) | ||
10636 | { | ||
10637 | m_host.TaskInventory.LockItemsForRead(false); | ||
10638 | return new LSL_Vector(); | ||
10639 | } | ||
10640 | 10463 | ||
10641 | if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) | 10464 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) |
10642 | { | 10465 | { |
10643 | ShoutError("No permissions to track the camera"); | 10466 | ShoutError("No permissions to track the camera"); |
10644 | m_host.TaskInventory.LockItemsForRead(false); | ||
10645 | return new LSL_Vector(); | 10467 | return new LSL_Vector(); |
10646 | } | 10468 | } |
10647 | m_host.TaskInventory.LockItemsForRead(false); | ||
10648 | 10469 | ||
10649 | // ScenePresence presence = World.GetScenePresence(m_host.OwnerID); | 10470 | // ScenePresence presence = World.GetScenePresence(m_host.OwnerID); |
10650 | ScenePresence presence = World.GetScenePresence(agentID); | 10471 | ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); |
10651 | if (presence != null) | 10472 | if (presence != null) |
10652 | { | 10473 | { |
10653 | LSL_Vector pos = new LSL_Vector(presence.CameraPosition.X, presence.CameraPosition.Y, presence.CameraPosition.Z); | 10474 | LSL_Vector pos = new LSL_Vector(presence.CameraPosition.X, presence.CameraPosition.Y, presence.CameraPosition.Z); |
@@ -10659,30 +10480,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10659 | public LSL_Rotation llGetCameraRot() | 10480 | public LSL_Rotation llGetCameraRot() |
10660 | { | 10481 | { |
10661 | m_host.AddScriptLPS(1); | 10482 | m_host.AddScriptLPS(1); |
10662 | UUID invItemID = InventorySelf(); | ||
10663 | if (invItemID == UUID.Zero) | ||
10664 | return new LSL_Rotation(); | ||
10665 | |||
10666 | m_host.TaskInventory.LockItemsForRead(true); | ||
10667 | 10483 | ||
10668 | UUID agentID = m_host.TaskInventory[invItemID].PermsGranter; | 10484 | if (m_item.PermsGranter == UUID.Zero) |
10485 | return new LSL_Rotation(); | ||
10669 | 10486 | ||
10670 | // if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) | 10487 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) |
10671 | if (agentID == UUID.Zero) | ||
10672 | { | ||
10673 | m_host.TaskInventory.LockItemsForRead(false); | ||
10674 | return new LSL_Rotation(); | ||
10675 | } | ||
10676 | if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) | ||
10677 | { | 10488 | { |
10678 | ShoutError("No permissions to track the camera"); | 10489 | ShoutError("No permissions to track the camera"); |
10679 | m_host.TaskInventory.LockItemsForRead(false); | ||
10680 | return new LSL_Rotation(); | 10490 | return new LSL_Rotation(); |
10681 | } | 10491 | } |
10682 | m_host.TaskInventory.LockItemsForRead(false); | ||
10683 | 10492 | ||
10684 | // ScenePresence presence = World.GetScenePresence(m_host.OwnerID); | 10493 | // ScenePresence presence = World.GetScenePresence(m_host.OwnerID); |
10685 | ScenePresence presence = World.GetScenePresence(agentID); | 10494 | ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); |
10686 | if (presence != null) | 10495 | if (presence != null) |
10687 | { | 10496 | { |
10688 | return new LSL_Rotation(presence.CameraRotation.X, presence.CameraRotation.Y, presence.CameraRotation.Z, presence.CameraRotation.W); | 10497 | return new LSL_Rotation(presence.CameraRotation.X, presence.CameraRotation.Y, presence.CameraRotation.Z, presence.CameraRotation.W); |
@@ -10741,7 +10550,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10741 | public void llMapDestination(string simname, LSL_Vector pos, LSL_Vector lookAt) | 10550 | public void llMapDestination(string simname, LSL_Vector pos, LSL_Vector lookAt) |
10742 | { | 10551 | { |
10743 | m_host.AddScriptLPS(1); | 10552 | m_host.AddScriptLPS(1); |
10744 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, 0); | 10553 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, 0); |
10745 | if (detectedParams == null) | 10554 | if (detectedParams == null) |
10746 | { | 10555 | { |
10747 | if (m_host.ParentGroup.IsAttachment == true) | 10556 | if (m_host.ParentGroup.IsAttachment == true) |
@@ -10865,30 +10674,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10865 | { | 10674 | { |
10866 | m_host.AddScriptLPS(1); | 10675 | m_host.AddScriptLPS(1); |
10867 | 10676 | ||
10868 | // our key in the object we are in | ||
10869 | UUID invItemID = InventorySelf(); | ||
10870 | if (invItemID == UUID.Zero) return; | ||
10871 | |||
10872 | // the object we are in | 10677 | // the object we are in |
10873 | UUID objectID = m_host.ParentUUID; | 10678 | UUID objectID = m_host.ParentUUID; |
10874 | if (objectID == UUID.Zero) return; | 10679 | if (objectID == UUID.Zero) |
10680 | return; | ||
10875 | 10681 | ||
10876 | UUID agentID; | ||
10877 | m_host.TaskInventory.LockItemsForRead(true); | ||
10878 | // we need the permission first, to know which avatar we want to set the camera for | 10682 | // we need the permission first, to know which avatar we want to set the camera for |
10879 | agentID = m_host.TaskInventory[invItemID].PermsGranter; | 10683 | UUID agentID = m_item.PermsGranter; |
10880 | 10684 | ||
10881 | if (agentID == UUID.Zero) | 10685 | if (agentID == UUID.Zero) |
10882 | { | ||
10883 | m_host.TaskInventory.LockItemsForRead(false); | ||
10884 | return; | 10686 | return; |
10885 | } | 10687 | |
10886 | if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) | 10688 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) |
10887 | { | ||
10888 | m_host.TaskInventory.LockItemsForRead(false); | ||
10889 | return; | 10689 | return; |
10890 | } | ||
10891 | m_host.TaskInventory.LockItemsForRead(false); | ||
10892 | 10690 | ||
10893 | ScenePresence presence = World.GetScenePresence(agentID); | 10691 | ScenePresence presence = World.GetScenePresence(agentID); |
10894 | 10692 | ||
@@ -10930,34 +10728,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10930 | { | 10728 | { |
10931 | m_host.AddScriptLPS(1); | 10729 | m_host.AddScriptLPS(1); |
10932 | 10730 | ||
10933 | // our key in the object we are in | ||
10934 | UUID invItemID=InventorySelf(); | ||
10935 | if (invItemID == UUID.Zero) return; | ||
10936 | |||
10937 | // the object we are in | 10731 | // the object we are in |
10938 | UUID objectID = m_host.ParentUUID; | 10732 | UUID objectID = m_host.ParentUUID; |
10939 | if (objectID == UUID.Zero) return; | 10733 | if (objectID == UUID.Zero) |
10734 | return; | ||
10940 | 10735 | ||
10941 | // we need the permission first, to know which avatar we want to clear the camera for | 10736 | // we need the permission first, to know which avatar we want to clear the camera for |
10942 | UUID agentID; | 10737 | UUID agentID = m_item.PermsGranter; |
10943 | m_host.TaskInventory.LockItemsForRead(true); | 10738 | |
10944 | agentID = m_host.TaskInventory[invItemID].PermsGranter; | ||
10945 | if (agentID == UUID.Zero) | 10739 | if (agentID == UUID.Zero) |
10946 | { | ||
10947 | m_host.TaskInventory.LockItemsForRead(false); | ||
10948 | return; | 10740 | return; |
10949 | } | 10741 | |
10950 | if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) | 10742 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) |
10951 | { | ||
10952 | m_host.TaskInventory.LockItemsForRead(false); | ||
10953 | return; | 10743 | return; |
10954 | } | ||
10955 | m_host.TaskInventory.LockItemsForRead(false); | ||
10956 | 10744 | ||
10957 | ScenePresence presence = World.GetScenePresence(agentID); | 10745 | ScenePresence presence = World.GetScenePresence(agentID); |
10958 | 10746 | ||
10959 | // we are not interested in child-agents | 10747 | // we are not interested in child-agents |
10960 | if (presence.IsChildAgent) return; | 10748 | if (presence.IsChildAgent) |
10749 | return; | ||
10961 | 10750 | ||
10962 | presence.ControllingClient.SendClearFollowCamProperties(objectID); | 10751 | presence.ControllingClient.SendClearFollowCamProperties(objectID); |
10963 | } | 10752 | } |
@@ -11148,8 +10937,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
11148 | } | 10937 | } |
11149 | } | 10938 | } |
11150 | 10939 | ||
11151 | UUID reqID = httpScriptMod. | 10940 | UUID reqID |
11152 | StartHttpRequest(m_localID, m_itemID, url, param, httpHeaders, body); | 10941 | = httpScriptMod.StartHttpRequest(m_host.LocalId, m_item.ItemID, url, param, httpHeaders, body); |
11153 | 10942 | ||
11154 | if (reqID != UUID.Zero) | 10943 | if (reqID != UUID.Zero) |
11155 | return reqID.ToString(); | 10944 | return reqID.ToString(); |
@@ -11381,19 +11170,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
11381 | break; | 11170 | break; |
11382 | // For the following 8 see the Object version below | 11171 | // For the following 8 see the Object version below |
11383 | case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: | 11172 | case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: |
11384 | ret.Add(new LSL_Integer(0)); | 11173 | ret.Add(new LSL_Integer(av.RunningScriptCount())); |
11385 | break; | 11174 | break; |
11386 | case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: | 11175 | case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: |
11387 | ret.Add(new LSL_Integer(0)); | 11176 | ret.Add(new LSL_Integer(av.ScriptCount())); |
11388 | break; | 11177 | break; |
11389 | case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: | 11178 | case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: |
11390 | ret.Add(new LSL_Integer(0)); | 11179 | ret.Add(new LSL_Integer(av.RunningScriptCount() * 16384)); |
11391 | break; | 11180 | break; |
11392 | case ScriptBaseClass.OBJECT_SCRIPT_TIME: | 11181 | case ScriptBaseClass.OBJECT_SCRIPT_TIME: |
11393 | ret.Add(new LSL_Float(0)); | 11182 | ret.Add(new LSL_Float(av.ScriptExecutionTime() / 1000.0f)); |
11394 | break; | 11183 | break; |
11395 | case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: | 11184 | case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: |
11396 | ret.Add(new LSL_Integer(0)); | 11185 | ret.Add(new LSL_Integer(1)); |
11397 | break; | 11186 | break; |
11398 | case ScriptBaseClass.OBJECT_SERVER_COST: | 11187 | case ScriptBaseClass.OBJECT_SERVER_COST: |
11399 | ret.Add(new LSL_Float(0)); | 11188 | ret.Add(new LSL_Float(0)); |
@@ -11445,43 +11234,48 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
11445 | case ScriptBaseClass.OBJECT_CREATOR: | 11234 | case ScriptBaseClass.OBJECT_CREATOR: |
11446 | ret.Add(new LSL_String(obj.CreatorID.ToString())); | 11235 | ret.Add(new LSL_String(obj.CreatorID.ToString())); |
11447 | break; | 11236 | break; |
11448 | // The following 8 I have intentionaly coded to return zero. They are part of | ||
11449 | // "Land Impact" calculations. These calculations are probably not applicable | ||
11450 | // to OpenSim, required figures (cpu/memory usage) are not currently tracked | ||
11451 | // I have intentionally left these all at zero rather than return possibly | ||
11452 | // missleading numbers | ||
11453 | case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: | 11237 | case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: |
11454 | // in SL this currently includes crashed scripts | 11238 | ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount())); |
11455 | ret.Add(new LSL_Integer(0)); | ||
11456 | break; | 11239 | break; |
11457 | case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: | 11240 | case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: |
11458 | ret.Add(new LSL_Integer(0)); | 11241 | ret.Add(new LSL_Integer(obj.ParentGroup.ScriptCount())); |
11459 | break; | 11242 | break; |
11460 | case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: | 11243 | case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: |
11461 | // The value returned in SL for mono scripts is 65536 * number of active scripts | 11244 | // The value returned in SL for mono scripts is 65536 * number of active scripts |
11462 | ret.Add(new LSL_Integer(0)); | 11245 | // and 16384 * number of active scripts for LSO. since llGetFreememory |
11246 | // is coded to give the LSO value use it here | ||
11247 | ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount() * 16384)); | ||
11463 | break; | 11248 | break; |
11464 | case ScriptBaseClass.OBJECT_SCRIPT_TIME: | 11249 | case ScriptBaseClass.OBJECT_SCRIPT_TIME: |
11465 | // Average cpu time per simulator frame expended on all scripts in the objetc | 11250 | // Average cpu time in seconds per simulator frame expended on all scripts in the object |
11466 | ret.Add(new LSL_Float(0)); | 11251 | ret.Add(new LSL_Float(obj.ParentGroup.ScriptExecutionTime() / 1000.0f)); |
11467 | break; | 11252 | break; |
11468 | case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: | 11253 | case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: |
11469 | // according to the SL wiki A prim or linkset will have prim | 11254 | // according to the SL wiki A prim or linkset will have prim |
11470 | // equivalent of the number of prims in a linkset if it does not | 11255 | // equivalent of the number of prims in a linkset if it does not |
11471 | // contain a mesh anywhere in the link set or is not a normal prim | 11256 | // contain a mesh anywhere in the link set or is not a normal prim |
11472 | // The value returned in SL for normal prims is prim count | 11257 | // The value returned in SL for normal prims is prim count |
11473 | ret.Add(new LSL_Integer(0)); | 11258 | ret.Add(new LSL_Integer(obj.ParentGroup.PrimCount)); |
11474 | break; | 11259 | break; |
11260 | // The following 3 costs I have intentionaly coded to return zero. They are part of | ||
11261 | // "Land Impact" calculations. These calculations are probably not applicable | ||
11262 | // to OpenSim and are not yet complete in SL | ||
11475 | case ScriptBaseClass.OBJECT_SERVER_COST: | 11263 | case ScriptBaseClass.OBJECT_SERVER_COST: |
11476 | // The value returned in SL for normal prims is prim count | 11264 | // The linden calculation is here |
11265 | // http://wiki.secondlife.com/wiki/Mesh/Mesh_Server_Weight | ||
11266 | // The value returned in SL for normal prims looks like the prim count | ||
11477 | ret.Add(new LSL_Float(0)); | 11267 | ret.Add(new LSL_Float(0)); |
11478 | break; | 11268 | break; |
11479 | case ScriptBaseClass.OBJECT_STREAMING_COST: | 11269 | case ScriptBaseClass.OBJECT_STREAMING_COST: |
11480 | // The value returned in SL for normal prims is prim count * 0.06 | 11270 | // The linden calculation is here |
11271 | // http://wiki.secondlife.com/wiki/Mesh/Mesh_Streaming_Cost | ||
11272 | // The value returned in SL for normal prims looks like the prim count * 0.06 | ||
11481 | ret.Add(new LSL_Float(0)); | 11273 | ret.Add(new LSL_Float(0)); |
11482 | break; | 11274 | break; |
11483 | case ScriptBaseClass.OBJECT_PHYSICS_COST: | 11275 | case ScriptBaseClass.OBJECT_PHYSICS_COST: |
11484 | // The value returned in SL for normal prims is prim count | 11276 | // The linden calculation is here |
11277 | // http://wiki.secondlife.com/wiki/Mesh/Mesh_physics | ||
11278 | // The value returned in SL for normal prims looks like the prim count | ||
11485 | ret.Add(new LSL_Float(0)); | 11279 | ret.Add(new LSL_Float(0)); |
11486 | break; | 11280 | break; |
11487 | default: | 11281 | default: |
@@ -11579,7 +11373,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
11579 | } | 11373 | } |
11580 | 11374 | ||
11581 | // was: UUID tid = tid = AsyncCommands. | 11375 | // was: UUID tid = tid = AsyncCommands. |
11582 | UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); | 11376 | UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString()); |
11583 | 11377 | ||
11584 | if (NotecardCache.IsCached(assetID)) | 11378 | if (NotecardCache.IsCached(assetID)) |
11585 | { | 11379 | { |
@@ -11642,7 +11436,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
11642 | } | 11436 | } |
11643 | 11437 | ||
11644 | // was: UUID tid = tid = AsyncCommands. | 11438 | // was: UUID tid = tid = AsyncCommands. |
11645 | UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); | 11439 | UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString()); |
11646 | 11440 | ||
11647 | if (NotecardCache.IsCached(assetID)) | 11441 | if (NotecardCache.IsCached(assetID)) |
11648 | { | 11442 | { |
@@ -11726,7 +11520,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
11726 | { | 11520 | { |
11727 | UUID rq = UUID.Random(); | 11521 | UUID rq = UUID.Random(); |
11728 | 11522 | ||
11729 | AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); | 11523 | AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString()); |
11730 | 11524 | ||
11731 | AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id))); | 11525 | AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id))); |
11732 | 11526 | ||
@@ -11742,7 +11536,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
11742 | { | 11536 | { |
11743 | UUID rq = UUID.Random(); | 11537 | UUID rq = UUID.Random(); |
11744 | 11538 | ||
11745 | AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); | 11539 | AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString()); |
11746 | 11540 | ||
11747 | AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id)); | 11541 | AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id)); |
11748 | 11542 | ||
@@ -12236,7 +12030,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12236 | bool isAccount = false; | 12030 | bool isAccount = false; |
12237 | bool isGroup = false; | 12031 | bool isGroup = false; |
12238 | 12032 | ||
12239 | if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManager(m_host.OwnerID)) | 12033 | if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManagerOrOwner(m_host.OwnerID)) |
12240 | return 0; | 12034 | return 0; |
12241 | 12035 | ||
12242 | UUID id = new UUID(); | 12036 | UUID id = new UUID(); |
@@ -12298,35 +12092,50 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12298 | return 1; | 12092 | return 1; |
12299 | } | 12093 | } |
12300 | 12094 | ||
12301 | #region Not Implemented | 12095 | public LSL_Integer llGetMemoryLimit() |
12302 | // | 12096 | { |
12303 | // Listing the unimplemented lsl functions here, please move | 12097 | m_host.AddScriptLPS(1); |
12304 | // them from this region as they are completed | 12098 | // The value returned for LSO scripts in SL |
12305 | // | 12099 | return 16384; |
12100 | } | ||
12306 | 12101 | ||
12307 | public void llGetEnv(LSL_String name) | 12102 | public LSL_Integer llSetMemoryLimit(LSL_Integer limit) |
12308 | { | 12103 | { |
12309 | m_host.AddScriptLPS(1); | 12104 | m_host.AddScriptLPS(1); |
12310 | NotImplemented("llGetEnv"); | 12105 | // Treat as an LSO script |
12106 | return ScriptBaseClass.FALSE; | ||
12311 | } | 12107 | } |
12312 | 12108 | ||
12313 | public void llGetSPMaxMemory() | 12109 | public LSL_Integer llGetSPMaxMemory() |
12314 | { | 12110 | { |
12315 | m_host.AddScriptLPS(1); | 12111 | m_host.AddScriptLPS(1); |
12316 | NotImplemented("llGetSPMaxMemory"); | 12112 | // The value returned for LSO scripts in SL |
12113 | return 16384; | ||
12317 | } | 12114 | } |
12318 | 12115 | ||
12319 | public virtual LSL_Integer llGetUsedMemory() | 12116 | public virtual LSL_Integer llGetUsedMemory() |
12320 | { | 12117 | { |
12321 | m_host.AddScriptLPS(1); | 12118 | m_host.AddScriptLPS(1); |
12322 | NotImplemented("llGetUsedMemory"); | 12119 | // The value returned for LSO scripts in SL |
12323 | return 0; | 12120 | return 16384; |
12324 | } | 12121 | } |
12325 | 12122 | ||
12326 | public void llScriptProfiler(LSL_Integer flags) | 12123 | public void llScriptProfiler(LSL_Integer flags) |
12327 | { | 12124 | { |
12328 | m_host.AddScriptLPS(1); | 12125 | m_host.AddScriptLPS(1); |
12329 | //NotImplemented("llScriptProfiler"); | 12126 | // This does nothing for LSO scripts in SL |
12127 | } | ||
12128 | |||
12129 | #region Not Implemented | ||
12130 | // | ||
12131 | // Listing the unimplemented lsl functions here, please move | ||
12132 | // them from this region as they are completed | ||
12133 | // | ||
12134 | |||
12135 | public void llGetEnv(LSL_String name) | ||
12136 | { | ||
12137 | m_host.AddScriptLPS(1); | ||
12138 | NotImplemented("llGetEnv"); | ||
12330 | } | 12139 | } |
12331 | 12140 | ||
12332 | public void llSetSoundQueueing(int queue) | 12141 | public void llSetSoundQueueing(int queue) |
@@ -12406,8 +12215,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12406 | 12215 | ||
12407 | try | 12216 | try |
12408 | { | 12217 | { |
12409 | UUID invItemID=InventorySelf(); | 12218 | TaskInventoryItem item = m_item; |
12410 | if (invItemID == UUID.Zero) | 12219 | if (item == null) |
12411 | { | 12220 | { |
12412 | replydata = "SERVICE_ERROR"; | 12221 | replydata = "SERVICE_ERROR"; |
12413 | return; | 12222 | return; |
@@ -12415,10 +12224,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12415 | 12224 | ||
12416 | m_host.AddScriptLPS(1); | 12225 | m_host.AddScriptLPS(1); |
12417 | 12226 | ||
12418 | m_host.TaskInventory.LockItemsForRead(true); | ||
12419 | TaskInventoryItem item = m_host.TaskInventory[invItemID]; | ||
12420 | m_host.TaskInventory.LockItemsForRead(false); | ||
12421 | |||
12422 | if (item.PermsGranter == UUID.Zero) | 12227 | if (item.PermsGranter == UUID.Zero) |
12423 | { | 12228 | { |
12424 | replydata = "MISSING_PERMISSION_DEBIT"; | 12229 | replydata = "MISSING_PERMISSION_DEBIT"; |
@@ -12460,7 +12265,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12460 | } | 12265 | } |
12461 | finally | 12266 | finally |
12462 | { | 12267 | { |
12463 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( | 12268 | m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( |
12464 | "transaction_result", new Object[] { | 12269 | "transaction_result", new Object[] { |
12465 | new LSL_String(txn.ToString()), | 12270 | new LSL_String(txn.ToString()), |
12466 | new LSL_Integer(replycode), | 12271 | new LSL_Integer(replycode), |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs index 77a784d..795de80 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs | |||
@@ -58,17 +58,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
58 | { | 58 | { |
59 | internal IScriptEngine m_ScriptEngine; | 59 | internal IScriptEngine m_ScriptEngine; |
60 | internal SceneObjectPart m_host; | 60 | internal SceneObjectPart m_host; |
61 | internal uint m_localID; | ||
62 | internal UUID m_itemID; | ||
63 | internal bool m_LSFunctionsEnabled = false; | 61 | internal bool m_LSFunctionsEnabled = false; |
64 | internal IScriptModuleComms m_comms = null; | 62 | internal IScriptModuleComms m_comms = null; |
65 | 63 | ||
66 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) | 64 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) |
67 | { | 65 | { |
68 | m_ScriptEngine = ScriptEngine; | 66 | m_ScriptEngine = ScriptEngine; |
69 | m_host = host; | 67 | m_host = host; |
70 | m_localID = localID; | ||
71 | m_itemID = itemID; | ||
72 | 68 | ||
73 | if (m_ScriptEngine.Config.GetBoolean("AllowLightShareFunctions", false)) | 69 | if (m_ScriptEngine.Config.GetBoolean("AllowLightShareFunctions", false)) |
74 | m_LSFunctionsEnabled = true; | 70 | m_LSFunctionsEnabled = true; |
@@ -449,7 +445,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
449 | LSShoutError("LightShare functions are not enabled."); | 445 | LSShoutError("LightShare functions are not enabled."); |
450 | return 0; | 446 | return 0; |
451 | } | 447 | } |
452 | if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) | 448 | if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) |
453 | { | 449 | { |
454 | LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); | 450 | LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); |
455 | return 0; | 451 | return 0; |
@@ -477,7 +473,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
477 | LSShoutError("LightShare functions are not enabled."); | 473 | LSShoutError("LightShare functions are not enabled."); |
478 | return; | 474 | return; |
479 | } | 475 | } |
480 | if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) | 476 | if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) |
481 | { | 477 | { |
482 | LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); | 478 | LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); |
483 | return; | 479 | return; |
@@ -500,7 +496,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
500 | LSShoutError("LightShare functions are not enabled."); | 496 | LSShoutError("LightShare functions are not enabled."); |
501 | return 0; | 497 | return 0; |
502 | } | 498 | } |
503 | if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) | 499 | if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) |
504 | { | 500 | { |
505 | LSShoutError("lsSetWindlightSceneTargeted can only be used by estate managers or owners."); | 501 | LSShoutError("lsSetWindlightSceneTargeted can only be used by estate managers or owners."); |
506 | return 0; | 502 | return 0; |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs index 7c07e15..4bd3dff 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs | |||
@@ -57,17 +57,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
57 | { | 57 | { |
58 | internal IScriptEngine m_ScriptEngine; | 58 | internal IScriptEngine m_ScriptEngine; |
59 | internal SceneObjectPart m_host; | 59 | internal SceneObjectPart m_host; |
60 | internal uint m_localID; | 60 | internal TaskInventoryItem m_item; |
61 | internal UUID m_itemID; | ||
62 | internal bool m_MODFunctionsEnabled = false; | 61 | internal bool m_MODFunctionsEnabled = false; |
63 | internal IScriptModuleComms m_comms = null; | 62 | internal IScriptModuleComms m_comms = null; |
64 | 63 | ||
65 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) | 64 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) |
66 | { | 65 | { |
67 | m_ScriptEngine = ScriptEngine; | 66 | m_ScriptEngine = ScriptEngine; |
68 | m_host = host; | 67 | m_host = host; |
69 | m_localID = localID; | 68 | m_item = item; |
70 | m_itemID = itemID; | ||
71 | 69 | ||
72 | if (m_ScriptEngine.Config.GetBoolean("AllowMODFunctions", false)) | 70 | if (m_ScriptEngine.Config.GetBoolean("AllowMODFunctions", false)) |
73 | m_MODFunctionsEnabled = true; | 71 | m_MODFunctionsEnabled = true; |
@@ -252,7 +250,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
252 | // non-null but don't trust it completely | 250 | // non-null but don't trust it completely |
253 | try | 251 | try |
254 | { | 252 | { |
255 | object result = m_comms.InvokeOperation(m_host.UUID, m_itemID, fname, convertedParms); | 253 | object result = m_comms.InvokeOperation(m_host.UUID, m_item.ItemID, fname, convertedParms); |
256 | if (result != null) | 254 | if (result != null) |
257 | return result; | 255 | return result; |
258 | 256 | ||
@@ -279,7 +277,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
279 | 277 | ||
280 | UUID req = UUID.Random(); | 278 | UUID req = UUID.Random(); |
281 | 279 | ||
282 | m_comms.RaiseEvent(m_itemID, req.ToString(), module, command, k); | 280 | m_comms.RaiseEvent(m_item.ItemID, req.ToString(), module, command, k); |
283 | 281 | ||
284 | return req.ToString(); | 282 | return req.ToString(); |
285 | } | 283 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 0dc2aa2..8237b60 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | |||
@@ -128,11 +128,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
128 | { | 128 | { |
129 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 129 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
130 | 130 | ||
131 | public const string GridInfoServiceConfigSectionName = "GridInfoService"; | ||
132 | |||
131 | internal IScriptEngine m_ScriptEngine; | 133 | internal IScriptEngine m_ScriptEngine; |
132 | internal ILSL_Api m_LSL_Api = null; // get a reference to the LSL API so we can call methods housed there | 134 | internal ILSL_Api m_LSL_Api = null; // get a reference to the LSL API so we can call methods housed there |
133 | internal SceneObjectPart m_host; | 135 | internal SceneObjectPart m_host; |
134 | internal uint m_localID; | 136 | internal TaskInventoryItem m_item; |
135 | internal UUID m_itemID; | ||
136 | internal bool m_OSFunctionsEnabled = false; | 137 | internal bool m_OSFunctionsEnabled = false; |
137 | internal ThreatLevel m_MaxThreatLevel = ThreatLevel.VeryLow; | 138 | internal ThreatLevel m_MaxThreatLevel = ThreatLevel.VeryLow; |
138 | internal float m_ScriptDelayFactor = 1.0f; | 139 | internal float m_ScriptDelayFactor = 1.0f; |
@@ -140,12 +141,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
140 | internal bool m_debuggerSafe = false; | 141 | internal bool m_debuggerSafe = false; |
141 | internal Dictionary<string, FunctionPerms > m_FunctionPerms = new Dictionary<string, FunctionPerms >(); | 142 | internal Dictionary<string, FunctionPerms > m_FunctionPerms = new Dictionary<string, FunctionPerms >(); |
142 | 143 | ||
143 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) | 144 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) |
144 | { | 145 | { |
145 | m_ScriptEngine = ScriptEngine; | 146 | m_ScriptEngine = ScriptEngine; |
146 | m_host = host; | 147 | m_host = host; |
147 | m_localID = localID; | 148 | m_item = item; |
148 | m_itemID = itemID; | ||
149 | m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); | 149 | m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); |
150 | 150 | ||
151 | if (m_ScriptEngine.Config.GetBoolean("AllowOSFunctions", false)) | 151 | if (m_ScriptEngine.Config.GetBoolean("AllowOSFunctions", false)) |
@@ -218,12 +218,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
218 | } | 218 | } |
219 | } | 219 | } |
220 | 220 | ||
221 | /// <summary> | ||
222 | /// Initialize the LSL interface. | ||
223 | /// </summary> | ||
224 | /// <remarks> | ||
225 | /// FIXME: This is an abomination. We should be able to set this up earlier but currently we have no | ||
226 | /// guarantee the interface is present on Initialize(). There needs to be another post initialize call from | ||
227 | /// ScriptInstance. | ||
228 | /// </remarks> | ||
221 | private void InitLSL() | 229 | private void InitLSL() |
222 | { | 230 | { |
223 | if (m_LSL_Api != null) | 231 | if (m_LSL_Api != null) |
224 | return; | 232 | return; |
225 | 233 | ||
226 | m_LSL_Api = (ILSL_Api)m_ScriptEngine.GetApi(m_itemID, "LSL"); | 234 | m_LSL_Api = (ILSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "LSL"); |
227 | } | 235 | } |
228 | 236 | ||
229 | // | 237 | // |
@@ -342,22 +350,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
342 | return; | 350 | return; |
343 | } | 351 | } |
344 | 352 | ||
345 | TaskInventoryItem ti = m_host.Inventory.GetInventoryItem(m_itemID); | 353 | UUID ownerID = m_item.OwnerID; |
346 | if (ti == null) | ||
347 | { | ||
348 | OSSLError( | ||
349 | String.Format("{0} permission error. Can't find script in prim inventory.", | ||
350 | function)); | ||
351 | } | ||
352 | |||
353 | UUID ownerID = ti.OwnerID; | ||
354 | 354 | ||
355 | //OSSL only may be used if objet is in the same group as the parcel | 355 | //OSSL only may be used if object is in the same group as the parcel |
356 | if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("PARCEL_GROUP_MEMBER")) | 356 | if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("PARCEL_GROUP_MEMBER")) |
357 | { | 357 | { |
358 | ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); | 358 | ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); |
359 | 359 | ||
360 | if (land.LandData.GroupID == ti.GroupID && land.LandData.GroupID != UUID.Zero) | 360 | if (land.LandData.GroupID == m_item.GroupID && land.LandData.GroupID != UUID.Zero) |
361 | { | 361 | { |
362 | return; | 362 | return; |
363 | } | 363 | } |
@@ -378,7 +378,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
378 | if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("ESTATE_MANAGER")) | 378 | if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("ESTATE_MANAGER")) |
379 | { | 379 | { |
380 | //Only Estate Managers may use the function | 380 | //Only Estate Managers may use the function |
381 | if (World.RegionInfo.EstateSettings.IsEstateManager(ownerID) && World.RegionInfo.EstateSettings.EstateOwner != ownerID) | 381 | if (World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(ownerID) && World.RegionInfo.EstateSettings.EstateOwner != ownerID) |
382 | { | 382 | { |
383 | return; | 383 | return; |
384 | } | 384 | } |
@@ -393,13 +393,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
393 | } | 393 | } |
394 | } | 394 | } |
395 | 395 | ||
396 | if (!m_FunctionPerms[function].AllowedCreators.Contains(ti.CreatorID)) | 396 | if (!m_FunctionPerms[function].AllowedCreators.Contains(m_item.CreatorID)) |
397 | OSSLError( | 397 | OSSLError( |
398 | String.Format("{0} permission denied. Script creator is not in the list of users allowed to execute this function and prim owner also has no permission.", | 398 | String.Format("{0} permission denied. Script creator is not in the list of users allowed to execute this function and prim owner also has no permission.", |
399 | function)); | 399 | function)); |
400 | if (ti.CreatorID != ownerID) | 400 | |
401 | if (m_item.CreatorID != ownerID) | ||
401 | { | 402 | { |
402 | if ((ti.CurrentPermissions & (uint)PermissionMask.Modify) != 0) | 403 | if ((m_item.CurrentPermissions & (uint)PermissionMask.Modify) != 0) |
403 | OSSLError( | 404 | OSSLError( |
404 | String.Format("{0} permission denied. Script permissions error.", | 405 | String.Format("{0} permission denied. Script permissions error.", |
405 | function)); | 406 | function)); |
@@ -730,11 +731,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
730 | 731 | ||
731 | m_host.AddScriptLPS(1); | 732 | m_host.AddScriptLPS(1); |
732 | 733 | ||
734 | // For safety, we add another permission check here, and don't rely only on the standard OSSL permissions | ||
733 | if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) | 735 | if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) |
734 | { | 736 | { |
735 | MainConsole.Instance.RunCommand(command); | 737 | MainConsole.Instance.RunCommand(command); |
736 | return true; | 738 | return true; |
737 | } | 739 | } |
740 | |||
738 | return false; | 741 | return false; |
739 | } | 742 | } |
740 | 743 | ||
@@ -957,21 +960,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
957 | UUID avatarID = (UUID)avatar; | 960 | UUID avatarID = (UUID)avatar; |
958 | 961 | ||
959 | m_host.AddScriptLPS(1); | 962 | m_host.AddScriptLPS(1); |
963 | |||
964 | // FIXME: What we really want to do here is factor out the similar code in llStopAnimation() to a common | ||
965 | // method (though see that doesn't do the is animation check, which is probably a bug) and have both | ||
966 | // these functions call that common code. However, this does mean navigating the brain-dead requirement | ||
967 | // of calling InitLSL() | ||
960 | if (World.Entities.ContainsKey(avatarID) && World.Entities[avatarID] is ScenePresence) | 968 | if (World.Entities.ContainsKey(avatarID) && World.Entities[avatarID] is ScenePresence) |
961 | { | 969 | { |
962 | ScenePresence target = (ScenePresence)World.Entities[avatarID]; | 970 | ScenePresence target = (ScenePresence)World.Entities[avatarID]; |
963 | if (target != null) | 971 | if (target != null) |
964 | { | 972 | { |
965 | UUID animID = UUID.Zero; | 973 | UUID animID; |
966 | m_host.TaskInventory.LockItemsForRead(true); | 974 | |
967 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | 975 | if (!UUID.TryParse(animation, out animID)) |
968 | { | 976 | { |
969 | if (inv.Value.Name == animation) | 977 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(animation); |
970 | { | 978 | if (item != null && item.Type == (int)AssetType.Animation) |
971 | if (inv.Value.Type == (int)AssetType.Animation) | 979 | animID = item.AssetID; |
972 | animID = inv.Value.AssetID; | 980 | else |
973 | continue; | 981 | animID = UUID.Zero; |
974 | } | ||
975 | } | 982 | } |
976 | m_host.TaskInventory.LockItemsForRead(false); | 983 | m_host.TaskInventory.LockItemsForRead(false); |
977 | 984 | ||
@@ -1178,7 +1185,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1178 | CheckThreatLevel(ThreatLevel.High, "osSetStateEvents"); | 1185 | CheckThreatLevel(ThreatLevel.High, "osSetStateEvents"); |
1179 | m_host.AddScriptLPS(1); | 1186 | m_host.AddScriptLPS(1); |
1180 | 1187 | ||
1181 | m_host.SetScriptEvents(m_itemID, events); | 1188 | m_host.SetScriptEvents(m_item.ItemID, events); |
1182 | } | 1189 | } |
1183 | 1190 | ||
1184 | public void osSetRegionWaterHeight(double height) | 1191 | public void osSetRegionWaterHeight(double height) |
@@ -1186,12 +1193,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1186 | CheckThreatLevel(ThreatLevel.High, "osSetRegionWaterHeight"); | 1193 | CheckThreatLevel(ThreatLevel.High, "osSetRegionWaterHeight"); |
1187 | 1194 | ||
1188 | m_host.AddScriptLPS(1); | 1195 | m_host.AddScriptLPS(1); |
1189 | //Check to make sure that the script's owner is the estate manager/master | 1196 | |
1190 | //World.Permissions.GenericEstatePermission( | 1197 | World.EventManager.TriggerRequestChangeWaterHeight((float)height); |
1191 | if (World.Permissions.IsGod(m_host.OwnerID)) | ||
1192 | { | ||
1193 | World.EventManager.TriggerRequestChangeWaterHeight((float)height); | ||
1194 | } | ||
1195 | } | 1198 | } |
1196 | 1199 | ||
1197 | /// <summary> | 1200 | /// <summary> |
@@ -1202,27 +1205,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1202 | /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param> | 1205 | /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param> |
1203 | public void osSetRegionSunSettings(bool useEstateSun, bool sunFixed, double sunHour) | 1206 | public void osSetRegionSunSettings(bool useEstateSun, bool sunFixed, double sunHour) |
1204 | { | 1207 | { |
1205 | CheckThreatLevel(ThreatLevel.Nuisance, "osSetRegionSunSettings"); | 1208 | CheckThreatLevel(ThreatLevel.High, "osSetRegionSunSettings"); |
1206 | 1209 | ||
1207 | m_host.AddScriptLPS(1); | 1210 | m_host.AddScriptLPS(1); |
1208 | //Check to make sure that the script's owner is the estate manager/master | ||
1209 | //World.Permissions.GenericEstatePermission( | ||
1210 | if (World.Permissions.IsGod(m_host.OwnerID)) | ||
1211 | { | ||
1212 | while (sunHour > 24.0) | ||
1213 | sunHour -= 24.0; | ||
1214 | 1211 | ||
1215 | while (sunHour < 0) | 1212 | while (sunHour > 24.0) |
1216 | sunHour += 24.0; | 1213 | sunHour -= 24.0; |
1217 | 1214 | ||
1215 | while (sunHour < 0) | ||
1216 | sunHour += 24.0; | ||
1218 | 1217 | ||
1219 | World.RegionInfo.RegionSettings.UseEstateSun = useEstateSun; | 1218 | World.RegionInfo.RegionSettings.UseEstateSun = useEstateSun; |
1220 | World.RegionInfo.RegionSettings.SunPosition = sunHour + 6; // LL Region Sun Hour is 6 to 30 | 1219 | World.RegionInfo.RegionSettings.SunPosition = sunHour + 6; // LL Region Sun Hour is 6 to 30 |
1221 | World.RegionInfo.RegionSettings.FixedSun = sunFixed; | 1220 | World.RegionInfo.RegionSettings.FixedSun = sunFixed; |
1222 | World.RegionInfo.RegionSettings.Save(); | 1221 | World.RegionInfo.RegionSettings.Save(); |
1223 | 1222 | ||
1224 | World.EventManager.TriggerEstateToolsSunUpdate(World.RegionInfo.RegionHandle, sunFixed, useEstateSun, (float)sunHour); | 1223 | World.EventManager.TriggerEstateToolsSunUpdate( |
1225 | } | 1224 | World.RegionInfo.RegionHandle, sunFixed, useEstateSun, (float)sunHour); |
1226 | } | 1225 | } |
1227 | 1226 | ||
1228 | /// <summary> | 1227 | /// <summary> |
@@ -1232,26 +1231,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1232 | /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param> | 1231 | /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param> |
1233 | public void osSetEstateSunSettings(bool sunFixed, double sunHour) | 1232 | public void osSetEstateSunSettings(bool sunFixed, double sunHour) |
1234 | { | 1233 | { |
1235 | CheckThreatLevel(ThreatLevel.Nuisance, "osSetEstateSunSettings"); | 1234 | CheckThreatLevel(ThreatLevel.High, "osSetEstateSunSettings"); |
1236 | 1235 | ||
1237 | m_host.AddScriptLPS(1); | 1236 | m_host.AddScriptLPS(1); |
1238 | //Check to make sure that the script's owner is the estate manager/master | ||
1239 | //World.Permissions.GenericEstatePermission( | ||
1240 | if (World.Permissions.IsGod(m_host.OwnerID)) | ||
1241 | { | ||
1242 | while (sunHour > 24.0) | ||
1243 | sunHour -= 24.0; | ||
1244 | 1237 | ||
1245 | while (sunHour < 0) | 1238 | while (sunHour > 24.0) |
1246 | sunHour += 24.0; | 1239 | sunHour -= 24.0; |
1247 | 1240 | ||
1248 | World.RegionInfo.EstateSettings.UseGlobalTime = !sunFixed; | 1241 | while (sunHour < 0) |
1249 | World.RegionInfo.EstateSettings.SunPosition = sunHour; | 1242 | sunHour += 24.0; |
1250 | World.RegionInfo.EstateSettings.FixedSun = sunFixed; | ||
1251 | World.RegionInfo.EstateSettings.Save(); | ||
1252 | 1243 | ||
1253 | World.EventManager.TriggerEstateToolsSunUpdate(World.RegionInfo.RegionHandle, sunFixed, World.RegionInfo.RegionSettings.UseEstateSun, (float)sunHour); | 1244 | World.RegionInfo.EstateSettings.UseGlobalTime = !sunFixed; |
1254 | } | 1245 | World.RegionInfo.EstateSettings.SunPosition = sunHour; |
1246 | World.RegionInfo.EstateSettings.FixedSun = sunFixed; | ||
1247 | World.RegionInfo.EstateSettings.Save(); | ||
1248 | |||
1249 | World.EventManager.TriggerEstateToolsSunUpdate( | ||
1250 | World.RegionInfo.RegionHandle, sunFixed, World.RegionInfo.RegionSettings.UseEstateSun, (float)sunHour); | ||
1255 | } | 1251 | } |
1256 | 1252 | ||
1257 | /// <summary> | 1253 | /// <summary> |
@@ -1627,7 +1623,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1627 | 1623 | ||
1628 | public Object osParseJSONNew(string JSON) | 1624 | public Object osParseJSONNew(string JSON) |
1629 | { | 1625 | { |
1630 | CheckThreatLevel(ThreatLevel.None, "osParseJSON"); | 1626 | CheckThreatLevel(ThreatLevel.None, "osParseJSONNew"); |
1631 | 1627 | ||
1632 | m_host.AddScriptLPS(1); | 1628 | m_host.AddScriptLPS(1); |
1633 | 1629 | ||
@@ -2042,8 +2038,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2042 | string nick = String.Empty; | 2038 | string nick = String.Empty; |
2043 | IConfigSource config = m_ScriptEngine.ConfigSource; | 2039 | IConfigSource config = m_ScriptEngine.ConfigSource; |
2044 | 2040 | ||
2045 | if (config.Configs["GridInfo"] != null) | 2041 | if (config.Configs[GridInfoServiceConfigSectionName] != null) |
2046 | nick = config.Configs["GridInfo"].GetString("gridnick", nick); | 2042 | nick = config.Configs[GridInfoServiceConfigSectionName].GetString("gridnick", nick); |
2047 | 2043 | ||
2048 | if (String.IsNullOrEmpty(nick)) | 2044 | if (String.IsNullOrEmpty(nick)) |
2049 | nick = GridUserInfo(InfoType.Nick); | 2045 | nick = GridUserInfo(InfoType.Nick); |
@@ -2059,8 +2055,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2059 | string name = String.Empty; | 2055 | string name = String.Empty; |
2060 | IConfigSource config = m_ScriptEngine.ConfigSource; | 2056 | IConfigSource config = m_ScriptEngine.ConfigSource; |
2061 | 2057 | ||
2062 | if (config.Configs["GridInfo"] != null) | 2058 | if (config.Configs[GridInfoServiceConfigSectionName] != null) |
2063 | name = config.Configs["GridInfo"].GetString("gridname", name); | 2059 | name = config.Configs[GridInfoServiceConfigSectionName].GetString("gridname", name); |
2064 | 2060 | ||
2065 | if (String.IsNullOrEmpty(name)) | 2061 | if (String.IsNullOrEmpty(name)) |
2066 | name = GridUserInfo(InfoType.Name); | 2062 | name = GridUserInfo(InfoType.Name); |
@@ -2076,8 +2072,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2076 | string loginURI = String.Empty; | 2072 | string loginURI = String.Empty; |
2077 | IConfigSource config = m_ScriptEngine.ConfigSource; | 2073 | IConfigSource config = m_ScriptEngine.ConfigSource; |
2078 | 2074 | ||
2079 | if (config.Configs["GridInfo"] != null) | 2075 | if (config.Configs[GridInfoServiceConfigSectionName] != null) |
2080 | loginURI = config.Configs["GridInfo"].GetString("login", loginURI); | 2076 | loginURI = config.Configs[GridInfoServiceConfigSectionName].GetString("login", loginURI); |
2081 | 2077 | ||
2082 | if (String.IsNullOrEmpty(loginURI)) | 2078 | if (String.IsNullOrEmpty(loginURI)) |
2083 | loginURI = GridUserInfo(InfoType.Login); | 2079 | loginURI = GridUserInfo(InfoType.Login); |
@@ -2124,8 +2120,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2124 | string retval = String.Empty; | 2120 | string retval = String.Empty; |
2125 | IConfigSource config = m_ScriptEngine.ConfigSource; | 2121 | IConfigSource config = m_ScriptEngine.ConfigSource; |
2126 | 2122 | ||
2127 | if (config.Configs["GridInfo"] != null) | 2123 | if (config.Configs[GridInfoServiceConfigSectionName] != null) |
2128 | retval = config.Configs["GridInfo"].GetString(key, retval); | 2124 | retval = config.Configs[GridInfoServiceConfigSectionName].GetString(key, retval); |
2129 | 2125 | ||
2130 | if (String.IsNullOrEmpty(retval)) | 2126 | if (String.IsNullOrEmpty(retval)) |
2131 | retval = GridUserInfo(InfoType.Custom, key); | 2127 | retval = GridUserInfo(InfoType.Custom, key); |
@@ -2480,7 +2476,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2480 | return; | 2476 | return; |
2481 | 2477 | ||
2482 | Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z); | 2478 | Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z); |
2483 | module.MoveToTarget(npcId, World, pos, false, true); | 2479 | module.MoveToTarget(npcId, World, pos, false, true, false); |
2484 | } | 2480 | } |
2485 | } | 2481 | } |
2486 | 2482 | ||
@@ -2505,7 +2501,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2505 | World, | 2501 | World, |
2506 | pos, | 2502 | pos, |
2507 | (options & ScriptBaseClass.OS_NPC_NO_FLY) != 0, | 2503 | (options & ScriptBaseClass.OS_NPC_NO_FLY) != 0, |
2508 | (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0); | 2504 | (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0, |
2505 | (options & ScriptBaseClass.OS_NPC_RUNNING) != 0); | ||
2509 | } | 2506 | } |
2510 | } | 2507 | } |
2511 | 2508 | ||
@@ -2555,7 +2552,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2555 | 2552 | ||
2556 | public void osNpcStopMoveToTarget(LSL_Key npc) | 2553 | public void osNpcStopMoveToTarget(LSL_Key npc) |
2557 | { | 2554 | { |
2558 | CheckThreatLevel(ThreatLevel.VeryLow, "osNpcStopMoveTo"); | 2555 | CheckThreatLevel(ThreatLevel.High, "osNpcStopMoveToTarget"); |
2559 | m_host.AddScriptLPS(1); | 2556 | m_host.AddScriptLPS(1); |
2560 | 2557 | ||
2561 | INPCModule module = World.RequestModuleInterface<INPCModule>(); | 2558 | INPCModule module = World.RequestModuleInterface<INPCModule>(); |
@@ -2572,6 +2569,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2572 | 2569 | ||
2573 | public void osNpcSay(LSL_Key npc, string message) | 2570 | public void osNpcSay(LSL_Key npc, string message) |
2574 | { | 2571 | { |
2572 | osNpcSay(npc, 0, message); | ||
2573 | } | ||
2574 | |||
2575 | public void osNpcSay(LSL_Key npc, int channel, string message) | ||
2576 | { | ||
2575 | CheckThreatLevel(ThreatLevel.High, "osNpcSay"); | 2577 | CheckThreatLevel(ThreatLevel.High, "osNpcSay"); |
2576 | m_host.AddScriptLPS(1); | 2578 | m_host.AddScriptLPS(1); |
2577 | 2579 | ||
@@ -2583,7 +2585,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2583 | if (!module.CheckPermissions(npcId, m_host.OwnerID)) | 2585 | if (!module.CheckPermissions(npcId, m_host.OwnerID)) |
2584 | return; | 2586 | return; |
2585 | 2587 | ||
2586 | module.Say(npcId, World, message); | 2588 | module.Say(npcId, World, message, channel); |
2589 | } | ||
2590 | } | ||
2591 | |||
2592 | public void osNpcShout(LSL_Key npc, int channel, string message) | ||
2593 | { | ||
2594 | CheckThreatLevel(ThreatLevel.High, "osNpcShout"); | ||
2595 | m_host.AddScriptLPS(1); | ||
2596 | |||
2597 | INPCModule module = World.RequestModuleInterface<INPCModule>(); | ||
2598 | if (module != null) | ||
2599 | { | ||
2600 | UUID npcId = new UUID(npc.m_string); | ||
2601 | |||
2602 | if (!module.CheckPermissions(npcId, m_host.OwnerID)) | ||
2603 | return; | ||
2604 | |||
2605 | module.Shout(npcId, World, message, channel); | ||
2587 | } | 2606 | } |
2588 | } | 2607 | } |
2589 | 2608 | ||
@@ -2684,6 +2703,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2684 | } | 2703 | } |
2685 | } | 2704 | } |
2686 | 2705 | ||
2706 | public void osNpcWhisper(LSL_Key npc, int channel, string message) | ||
2707 | { | ||
2708 | CheckThreatLevel(ThreatLevel.High, "osNpcWhisper"); | ||
2709 | m_host.AddScriptLPS(1); | ||
2710 | |||
2711 | INPCModule module = World.RequestModuleInterface<INPCModule>(); | ||
2712 | if (module != null) | ||
2713 | { | ||
2714 | UUID npcId = new UUID(npc.m_string); | ||
2715 | |||
2716 | if (!module.CheckPermissions(npcId, m_host.OwnerID)) | ||
2717 | return; | ||
2718 | |||
2719 | module.Whisper(npcId, World, message, channel); | ||
2720 | } | ||
2721 | } | ||
2722 | |||
2687 | /// <summary> | 2723 | /// <summary> |
2688 | /// Save the current appearance of the script owner permanently to the named notecard. | 2724 | /// Save the current appearance of the script owner permanently to the named notecard. |
2689 | /// </summary> | 2725 | /// </summary> |
@@ -2835,21 +2871,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2835 | CheckThreatLevel(ThreatLevel.Severe, "osKickAvatar"); | 2871 | CheckThreatLevel(ThreatLevel.Severe, "osKickAvatar"); |
2836 | m_host.AddScriptLPS(1); | 2872 | m_host.AddScriptLPS(1); |
2837 | 2873 | ||
2838 | if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) | 2874 | World.ForEachRootScenePresence(delegate(ScenePresence sp) |
2839 | { | 2875 | { |
2840 | World.ForEachRootScenePresence(delegate(ScenePresence sp) | 2876 | if (sp.Firstname == FirstName && sp.Lastname == SurName) |
2841 | { | 2877 | { |
2842 | if (sp.Firstname == FirstName && sp.Lastname == SurName) | 2878 | // kick client... |
2843 | { | 2879 | if (alert != null) |
2844 | // kick client... | 2880 | sp.ControllingClient.Kick(alert); |
2845 | if (alert != null) | ||
2846 | sp.ControllingClient.Kick(alert); | ||
2847 | 2881 | ||
2848 | // ...and close on our side | 2882 | // ...and close on our side |
2849 | sp.Scene.IncomingCloseAgent(sp.UUID); | 2883 | sp.Scene.IncomingCloseAgent(sp.UUID); |
2850 | } | 2884 | } |
2851 | }); | 2885 | }); |
2852 | } | ||
2853 | } | 2886 | } |
2854 | 2887 | ||
2855 | public void osCauseDamage(string avatar, double damage) | 2888 | public void osCauseDamage(string avatar, double damage) |
@@ -3095,5 +3128,80 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3095 | 3128 | ||
3096 | return ScriptBaseClass.TRUE; | 3129 | return ScriptBaseClass.TRUE; |
3097 | } | 3130 | } |
3131 | |||
3132 | /// <summary> | ||
3133 | /// Sets terrain estate texture | ||
3134 | /// </summary> | ||
3135 | /// <param name="level"></param> | ||
3136 | /// <param name="texture"></param> | ||
3137 | /// <returns></returns> | ||
3138 | public void osSetTerrainTexture(int level, LSL_Key texture) | ||
3139 | { | ||
3140 | CheckThreatLevel(ThreatLevel.High, "osSetTerrainTexture"); | ||
3141 | |||
3142 | m_host.AddScriptLPS(1); | ||
3143 | //Check to make sure that the script's owner is the estate manager/master | ||
3144 | //World.Permissions.GenericEstatePermission( | ||
3145 | if (World.Permissions.IsGod(m_host.OwnerID)) | ||
3146 | { | ||
3147 | if (level < 0 || level > 3) | ||
3148 | return; | ||
3149 | |||
3150 | UUID textureID = new UUID(); | ||
3151 | if (!UUID.TryParse(texture, out textureID)) | ||
3152 | return; | ||
3153 | |||
3154 | // estate module is required | ||
3155 | IEstateModule estate = World.RequestModuleInterface<IEstateModule>(); | ||
3156 | if (estate != null) | ||
3157 | estate.setEstateTerrainBaseTexture(level, textureID); | ||
3158 | } | ||
3159 | } | ||
3160 | |||
3161 | /// <summary> | ||
3162 | /// Sets terrain heights of estate | ||
3163 | /// </summary> | ||
3164 | /// <param name="corner"></param> | ||
3165 | /// <param name="low"></param> | ||
3166 | /// <param name="high"></param> | ||
3167 | /// <returns></returns> | ||
3168 | public void osSetTerrainTextureHeight(int corner, double low, double high) | ||
3169 | { | ||
3170 | CheckThreatLevel(ThreatLevel.High, "osSetTerrainTextureHeight"); | ||
3171 | |||
3172 | m_host.AddScriptLPS(1); | ||
3173 | //Check to make sure that the script's owner is the estate manager/master | ||
3174 | //World.Permissions.GenericEstatePermission( | ||
3175 | if (World.Permissions.IsGod(m_host.OwnerID)) | ||
3176 | { | ||
3177 | if (corner < 0 || corner > 3) | ||
3178 | return; | ||
3179 | |||
3180 | // estate module is required | ||
3181 | IEstateModule estate = World.RequestModuleInterface<IEstateModule>(); | ||
3182 | if (estate != null) | ||
3183 | estate.setEstateTerrainTextureHeights(corner, (float)low, (float)high); | ||
3184 | } | ||
3185 | } | ||
3186 | |||
3187 | public void osForceAttachToAvatar(int attachmentPoint) | ||
3188 | { | ||
3189 | CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatar"); | ||
3190 | |||
3191 | m_host.AddScriptLPS(1); | ||
3192 | |||
3193 | InitLSL(); | ||
3194 | ((LSL_Api)m_LSL_Api).AttachToAvatar(attachmentPoint); | ||
3195 | } | ||
3196 | |||
3197 | public void osForceDetachFromAvatar() | ||
3198 | { | ||
3199 | CheckThreatLevel(ThreatLevel.High, "osForceDetachFromAvatar"); | ||
3200 | |||
3201 | m_host.AddScriptLPS(1); | ||
3202 | |||
3203 | InitLSL(); | ||
3204 | ((LSL_Api)m_LSL_Api).DetachFromAvatar(); | ||
3205 | } | ||
3098 | } | 3206 | } |
3099 | } | 3207 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs index 1373971..19f3ce1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs | |||
@@ -308,7 +308,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins | |||
308 | } | 308 | } |
309 | SceneObjectPart SensePoint = ts.host; | 309 | SceneObjectPart SensePoint = ts.host; |
310 | 310 | ||
311 | Vector3 fromRegionPos = SensePoint.AbsolutePosition; | 311 | Vector3 fromRegionPos = SensePoint.GetWorldPosition(); |
312 | 312 | ||
313 | // pre define some things to avoid repeated definitions in the loop body | 313 | // pre define some things to avoid repeated definitions in the loop body |
314 | Vector3 toRegionPos; | 314 | Vector3 toRegionPos; |
@@ -323,13 +323,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins | |||
323 | Quaternion q = SensePoint.GetWorldRotation(); // non-attached prim Sensor *always* uses World rotation! | 323 | Quaternion q = SensePoint.GetWorldRotation(); // non-attached prim Sensor *always* uses World rotation! |
324 | if (SensePoint.ParentGroup.IsAttachment) | 324 | if (SensePoint.ParentGroup.IsAttachment) |
325 | { | 325 | { |
326 | // In attachments, the sensor cone always orients with the | 326 | // In attachments, rotate the sensor cone with the |
327 | // avatar rotation. This may include a nonzero elevation if | 327 | // avatar rotation. This may include a nonzero elevation if |
328 | // in mouselook. | 328 | // in mouselook. |
329 | // This will not include the rotation and position of the | ||
330 | // attachment point (e.g. your head when a sensor is in your | ||
331 | // hair attached to your scull. Your hair will turn with | ||
332 | // your head but the sensor will stay with your (global) | ||
333 | // avatar rotation and position. | ||
334 | // Position of a sensor in a child prim attached to an avatar | ||
335 | // will be still wrong. | ||
329 | ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); | 336 | ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); |
330 | fromRegionPos = avatar.AbsolutePosition; | 337 | fromRegionPos = avatar.AbsolutePosition; |
331 | q = avatar.Rotation; | 338 | q = avatar.Rotation; |
332 | } | 339 | } |
340 | |||
333 | LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); | 341 | LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); |
334 | LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); | 342 | LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); |
335 | double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); | 343 | double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); |
@@ -441,14 +449,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins | |||
441 | return sensedEntities; | 449 | return sensedEntities; |
442 | 450 | ||
443 | SceneObjectPart SensePoint = ts.host; | 451 | SceneObjectPart SensePoint = ts.host; |
444 | Vector3 fromRegionPos = SensePoint.AbsolutePosition; | 452 | Vector3 fromRegionPos = SensePoint.GetWorldPosition(); |
445 | 453 | ||
446 | Quaternion q = SensePoint.RotationOffset; | 454 | Quaternion q = SensePoint.GetWorldRotation(); |
447 | if (SensePoint.ParentGroup.IsAttachment) | 455 | if (SensePoint.ParentGroup.IsAttachment) |
448 | { | 456 | { |
449 | // In attachments, the sensor cone always orients with the | 457 | // In attachments, rotate the sensor cone with the |
450 | // avatar rotation. This may include a nonzero elevation if | 458 | // avatar rotation. This may include a nonzero elevation if |
451 | // in mouselook. | 459 | // in mouselook. |
460 | // This will not include the rotation and position of the | ||
461 | // attachment point (e.g. your head when a sensor is in your | ||
462 | // hair attached to your scull. Your hair will turn with | ||
463 | // your head but the sensor will stay with your (global) | ||
464 | // avatar rotation and position. | ||
465 | // Position of a sensor in a child prim attached to an avatar | ||
466 | // will be still wrong. | ||
452 | ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); | 467 | ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); |
453 | if (avatar == null) | 468 | if (avatar == null) |
454 | return sensedEntities; | 469 | return sensedEntities; |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs index 50f520a..749fc97 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs | |||
@@ -105,6 +105,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
105 | LSL_Integer llFloor(double f); | 105 | LSL_Integer llFloor(double f); |
106 | void llForceMouselook(int mouselook); | 106 | void llForceMouselook(int mouselook); |
107 | LSL_Float llFrand(double mag); | 107 | LSL_Float llFrand(double mag); |
108 | LSL_Key llGenerateKey(); | ||
108 | LSL_Vector llGetAccel(); | 109 | LSL_Vector llGetAccel(); |
109 | LSL_Integer llGetAgentInfo(string id); | 110 | LSL_Integer llGetAgentInfo(string id); |
110 | LSL_String llGetAgentLanguage(string id); | 111 | LSL_String llGetAgentLanguage(string id); |
@@ -150,7 +151,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
150 | LSL_Rotation llGetLocalRot(); | 151 | LSL_Rotation llGetLocalRot(); |
151 | LSL_Float llGetMass(); | 152 | LSL_Float llGetMass(); |
152 | LSL_Float llGetMassMKS(); | 153 | LSL_Float llGetMassMKS(); |
153 | void llGetNextEmail(string address, string subject); | 154 | LSL_Integer llGetMemoryLimit(); |
155 | void llGetNextEmail(string address, string subject); | ||
154 | LSL_String llGetNotecardLine(string name, int line); | 156 | LSL_String llGetNotecardLine(string name, int line); |
155 | LSL_Key llGetNumberOfNotecardLines(string name); | 157 | LSL_Key llGetNumberOfNotecardLines(string name); |
156 | LSL_Integer llGetNumberOfPrims(); | 158 | LSL_Integer llGetNumberOfPrims(); |
@@ -188,6 +190,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
188 | LSL_String llGetScriptName(); | 190 | LSL_String llGetScriptName(); |
189 | LSL_Integer llGetScriptState(string name); | 191 | LSL_Integer llGetScriptState(string name); |
190 | LSL_String llGetSimulatorHostname(); | 192 | LSL_String llGetSimulatorHostname(); |
193 | LSL_Integer llGetSPMaxMemory(); | ||
191 | LSL_Integer llGetStartParameter(); | 194 | LSL_Integer llGetStartParameter(); |
192 | LSL_Integer llGetStatus(int status); | 195 | LSL_Integer llGetStatus(int status); |
193 | LSL_String llGetSubString(string src, int start, int end); | 196 | LSL_String llGetSubString(string src, int start, int end); |
@@ -323,6 +326,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
323 | void llSay(int channelID, string text); | 326 | void llSay(int channelID, string text); |
324 | void llScaleTexture(double u, double v, int face); | 327 | void llScaleTexture(double u, double v, int face); |
325 | LSL_Integer llScriptDanger(LSL_Vector pos); | 328 | LSL_Integer llScriptDanger(LSL_Vector pos); |
329 | void llScriptProfiler(LSL_Integer flag); | ||
326 | LSL_Key llSendRemoteData(string channel, string dest, int idata, string sdata); | 330 | LSL_Key llSendRemoteData(string channel, string dest, int idata, string sdata); |
327 | void llSensor(string name, string id, int type, double range, double arc); | 331 | void llSensor(string name, string id, int type, double range, double arc); |
328 | void llSensorRemove(); | 332 | void llSensorRemove(); |
@@ -346,6 +350,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
346 | void llSetLinkTexture(int linknumber, string texture, int face); | 350 | void llSetLinkTexture(int linknumber, string texture, int face); |
347 | void llSetLinkTextureAnim(int linknum, int mode, int face, int sizex, int sizey, double start, double length, double rate); | 351 | void llSetLinkTextureAnim(int linknum, int mode, int face, int sizex, int sizey, double start, double length, double rate); |
348 | void llSetLocalRot(LSL_Rotation rot); | 352 | void llSetLocalRot(LSL_Rotation rot); |
353 | LSL_Integer llSetMemoryLimit(LSL_Integer limit); | ||
349 | void llSetObjectDesc(string desc); | 354 | void llSetObjectDesc(string desc); |
350 | void llSetObjectName(string name); | 355 | void llSetObjectName(string name); |
351 | void llSetObjectPermMask(int mask, int value); | 356 | void llSetObjectPermMask(int mask, int value); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 444a681..7382495 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs | |||
@@ -98,6 +98,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
98 | void osAvatarPlayAnimation(string avatar, string animation); | 98 | void osAvatarPlayAnimation(string avatar, string animation); |
99 | void osAvatarStopAnimation(string avatar, string animation); | 99 | void osAvatarStopAnimation(string avatar, string animation); |
100 | 100 | ||
101 | // Attachment commands | ||
102 | |||
103 | /// <summary> | ||
104 | /// Attach the object containing this script to the avatar that owns it without checking for PERMISSION_ATTACH | ||
105 | /// </summary> | ||
106 | /// <param name='attachment'>The attachment point. For example, ATTACH_CHEST</param> | ||
107 | void osForceAttachToAvatar(int attachment); | ||
108 | |||
109 | /// <summary> | ||
110 | /// Detach the object containing this script from the avatar it is attached to without checking for PERMISSION_ATTACH | ||
111 | /// </summary> | ||
112 | /// <remarks>Nothing happens if the object is not attached.</remarks> | ||
113 | void osForceDetachFromAvatar(); | ||
114 | |||
101 | //texture draw functions | 115 | //texture draw functions |
102 | string osMovePen(string drawList, int x, int y); | 116 | string osMovePen(string drawList, int x, int y); |
103 | string osDrawLine(string drawList, int startX, int startY, int endX, int endY); | 117 | string osDrawLine(string drawList, int startX, int startY, int endX, int endY); |
@@ -203,11 +217,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
203 | void osNpcSetRot(LSL_Key npc, rotation rot); | 217 | void osNpcSetRot(LSL_Key npc, rotation rot); |
204 | void osNpcStopMoveToTarget(LSL_Key npc); | 218 | void osNpcStopMoveToTarget(LSL_Key npc); |
205 | void osNpcSay(key npc, string message); | 219 | void osNpcSay(key npc, string message); |
220 | void osNpcSay(key npc, int channel, string message); | ||
221 | void osNpcShout(key npc, int channel, string message); | ||
206 | void osNpcSit(key npc, key target, int options); | 222 | void osNpcSit(key npc, key target, int options); |
207 | void osNpcStand(LSL_Key npc); | 223 | void osNpcStand(LSL_Key npc); |
208 | void osNpcRemove(key npc); | 224 | void osNpcRemove(key npc); |
209 | void osNpcPlayAnimation(LSL_Key npc, string animation); | 225 | void osNpcPlayAnimation(LSL_Key npc, string animation); |
210 | void osNpcStopAnimation(LSL_Key npc, string animation); | 226 | void osNpcStopAnimation(LSL_Key npc, string animation); |
227 | void osNpcWhisper(key npc, int channel, string message); | ||
211 | 228 | ||
212 | LSL_Key osOwnerSaveAppearance(string notecard); | 229 | LSL_Key osOwnerSaveAppearance(string notecard); |
213 | LSL_Key osAgentSaveAppearance(key agentId, string notecard); | 230 | LSL_Key osAgentSaveAppearance(key agentId, string notecard); |
@@ -234,5 +251,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
234 | 251 | ||
235 | LSL_Integer osInviteToGroup(LSL_Key agentId); | 252 | LSL_Integer osInviteToGroup(LSL_Key agentId); |
236 | LSL_Integer osEjectFromGroup(LSL_Key agentId); | 253 | LSL_Integer osEjectFromGroup(LSL_Key agentId); |
254 | |||
255 | void osSetTerrainTexture(int level, LSL_Key texture); | ||
256 | void osSetTerrainTextureHeight(int corner, double low, double high); | ||
237 | } | 257 | } |
238 | } | 258 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index 278f74e..5c6ad8a 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs | |||
@@ -383,6 +383,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
383 | public const int PRIM_SCULPT_FLAG_INVERT = 64; | 383 | public const int PRIM_SCULPT_FLAG_INVERT = 64; |
384 | public const int PRIM_SCULPT_FLAG_MIRROR = 128; | 384 | public const int PRIM_SCULPT_FLAG_MIRROR = 128; |
385 | 385 | ||
386 | public const int PROFILE_NONE = 0; | ||
387 | public const int PROFILE_SCRIPT_MEMORY = 1; | ||
388 | |||
386 | public const int MASK_BASE = 0; | 389 | public const int MASK_BASE = 0; |
387 | public const int MASK_OWNER = 1; | 390 | public const int MASK_OWNER = 1; |
388 | public const int MASK_GROUP = 2; | 391 | public const int MASK_GROUP = 2; |
@@ -641,6 +644,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
641 | public const int OS_NPC_FLY = 0; | 644 | public const int OS_NPC_FLY = 0; |
642 | public const int OS_NPC_NO_FLY = 1; | 645 | public const int OS_NPC_NO_FLY = 1; |
643 | public const int OS_NPC_LAND_AT_TARGET = 2; | 646 | public const int OS_NPC_LAND_AT_TARGET = 2; |
647 | public const int OS_NPC_RUNNING = 4; | ||
644 | 648 | ||
645 | public const int OS_NPC_SIT_NOW = 0; | 649 | public const int OS_NPC_SIT_NOW = 0; |
646 | 650 | ||
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs index 116f639..976969a 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs | |||
@@ -376,6 +376,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
376 | return m_LSL_Functions.llFrand(mag); | 376 | return m_LSL_Functions.llFrand(mag); |
377 | } | 377 | } |
378 | 378 | ||
379 | public LSL_Key llGenerateKey() | ||
380 | { | ||
381 | return m_LSL_Functions.llGenerateKey(); | ||
382 | } | ||
383 | |||
379 | public LSL_Vector llGetAccel() | 384 | public LSL_Vector llGetAccel() |
380 | { | 385 | { |
381 | return m_LSL_Functions.llGetAccel(); | 386 | return m_LSL_Functions.llGetAccel(); |
@@ -591,6 +596,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
591 | return m_LSL_Functions.llGetMassMKS(); | 596 | return m_LSL_Functions.llGetMassMKS(); |
592 | } | 597 | } |
593 | 598 | ||
599 | public LSL_Integer llGetMemoryLimit() | ||
600 | { | ||
601 | return m_LSL_Functions.llGetMemoryLimit(); | ||
602 | } | ||
603 | |||
594 | public void llGetNextEmail(string address, string subject) | 604 | public void llGetNextEmail(string address, string subject) |
595 | { | 605 | { |
596 | m_LSL_Functions.llGetNextEmail(address, subject); | 606 | m_LSL_Functions.llGetNextEmail(address, subject); |
@@ -781,6 +791,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
781 | return m_LSL_Functions.llGetSimulatorHostname(); | 791 | return m_LSL_Functions.llGetSimulatorHostname(); |
782 | } | 792 | } |
783 | 793 | ||
794 | public LSL_Integer llGetSPMaxMemory() | ||
795 | { | ||
796 | return m_LSL_Functions.llGetSPMaxMemory(); | ||
797 | } | ||
798 | |||
784 | public LSL_Integer llGetStartParameter() | 799 | public LSL_Integer llGetStartParameter() |
785 | { | 800 | { |
786 | return m_LSL_Functions.llGetStartParameter(); | 801 | return m_LSL_Functions.llGetStartParameter(); |
@@ -1450,6 +1465,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
1450 | return m_LSL_Functions.llScriptDanger(pos); | 1465 | return m_LSL_Functions.llScriptDanger(pos); |
1451 | } | 1466 | } |
1452 | 1467 | ||
1468 | public void llScriptProfiler(LSL_Integer flags) | ||
1469 | { | ||
1470 | m_LSL_Functions.llScriptProfiler(flags); | ||
1471 | } | ||
1472 | |||
1453 | public LSL_Key llSendRemoteData(string channel, string dest, int idata, string sdata) | 1473 | public LSL_Key llSendRemoteData(string channel, string dest, int idata, string sdata) |
1454 | { | 1474 | { |
1455 | return m_LSL_Functions.llSendRemoteData(channel, dest, idata, sdata); | 1475 | return m_LSL_Functions.llSendRemoteData(channel, dest, idata, sdata); |
@@ -1560,6 +1580,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
1560 | m_LSL_Functions.llSetLocalRot(rot); | 1580 | m_LSL_Functions.llSetLocalRot(rot); |
1561 | } | 1581 | } |
1562 | 1582 | ||
1583 | public LSL_Integer llSetMemoryLimit(LSL_Integer limit) | ||
1584 | { | ||
1585 | return m_LSL_Functions.llSetMemoryLimit(limit); | ||
1586 | } | ||
1587 | |||
1563 | public void llSetObjectDesc(string desc) | 1588 | public void llSetObjectDesc(string desc) |
1564 | { | 1589 | { |
1565 | m_LSL_Functions.llSetObjectDesc(desc); | 1590 | m_LSL_Functions.llSetObjectDesc(desc); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 680cefb4..d230662 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | |||
@@ -289,8 +289,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
289 | m_OSSL_Functions.osAvatarStopAnimation(avatar, animation); | 289 | m_OSSL_Functions.osAvatarStopAnimation(avatar, animation); |
290 | } | 290 | } |
291 | 291 | ||
292 | // Avatar functions | ||
292 | 293 | ||
293 | //Texture Draw functions | 294 | public void osForceAttachToAvatar(int attachmentPoint) |
295 | { | ||
296 | m_OSSL_Functions.osForceAttachToAvatar(attachmentPoint); | ||
297 | } | ||
298 | |||
299 | public void osForceDetachFromAvatar() | ||
300 | { | ||
301 | m_OSSL_Functions.osForceDetachFromAvatar(); | ||
302 | } | ||
303 | |||
304 | // Texture Draw functions | ||
294 | 305 | ||
295 | public string osMovePen(string drawList, int x, int y) | 306 | public string osMovePen(string drawList, int x, int y) |
296 | { | 307 | { |
@@ -569,6 +580,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
569 | m_OSSL_Functions.osNpcSay(npc, message); | 580 | m_OSSL_Functions.osNpcSay(npc, message); |
570 | } | 581 | } |
571 | 582 | ||
583 | public void osNpcSay(key npc, int channel, string message) | ||
584 | { | ||
585 | m_OSSL_Functions.osNpcSay(npc, channel, message); | ||
586 | } | ||
587 | |||
588 | |||
589 | public void osNpcShout(key npc, int channel, string message) | ||
590 | { | ||
591 | m_OSSL_Functions.osNpcShout(npc, channel, message); | ||
592 | } | ||
593 | |||
572 | public void osNpcSit(LSL_Key npc, LSL_Key target, int options) | 594 | public void osNpcSit(LSL_Key npc, LSL_Key target, int options) |
573 | { | 595 | { |
574 | m_OSSL_Functions.osNpcSit(npc, target, options); | 596 | m_OSSL_Functions.osNpcSit(npc, target, options); |
@@ -594,6 +616,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
594 | m_OSSL_Functions.osNpcStopAnimation(npc, animation); | 616 | m_OSSL_Functions.osNpcStopAnimation(npc, animation); |
595 | } | 617 | } |
596 | 618 | ||
619 | public void osNpcWhisper(key npc, int channel, string message) | ||
620 | { | ||
621 | m_OSSL_Functions.osNpcWhisper(npc, channel, message); | ||
622 | } | ||
623 | |||
597 | public LSL_Key osOwnerSaveAppearance(string notecard) | 624 | public LSL_Key osOwnerSaveAppearance(string notecard) |
598 | { | 625 | { |
599 | return m_OSSL_Functions.osOwnerSaveAppearance(notecard); | 626 | return m_OSSL_Functions.osOwnerSaveAppearance(notecard); |
@@ -878,5 +905,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
878 | { | 905 | { |
879 | return m_OSSL_Functions.osEjectFromGroup(agentId); | 906 | return m_OSSL_Functions.osEjectFromGroup(agentId); |
880 | } | 907 | } |
908 | |||
909 | public void osSetTerrainTexture(int level, LSL_Key texture) | ||
910 | { | ||
911 | m_OSSL_Functions.osSetTerrainTexture(level, texture); | ||
912 | } | ||
913 | |||
914 | public void osSetTerrainTextureHeight(int corner, double low, double high) | ||
915 | { | ||
916 | m_OSSL_Functions.osSetTerrainTextureHeight(corner, low, high); | ||
917 | } | ||
881 | } | 918 | } |
882 | } | 919 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 5e68d69..1c59d45 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | |||
@@ -232,7 +232,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
232 | foreach (string api in am.GetApis()) | 232 | foreach (string api in am.GetApis()) |
233 | { | 233 | { |
234 | m_Apis[api] = am.CreateApi(api); | 234 | m_Apis[api] = am.CreateApi(api); |
235 | m_Apis[api].Initialize(engine, part, LocalID, itemID); | 235 | m_Apis[api].Initialize(engine, part, ScriptTask); |
236 | } | 236 | } |
237 | 237 | ||
238 | try | 238 | try |
@@ -966,7 +966,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
966 | public IScriptApi GetApi(string name) | 966 | public IScriptApi GetApi(string name) |
967 | { | 967 | { |
968 | if (m_Apis.ContainsKey(name)) | 968 | if (m_Apis.ContainsKey(name)) |
969 | { | ||
970 | // m_log.DebugFormat("[SCRIPT INSTANCE]: Found api {0} in {1}@{2}", name, ScriptName, PrimName); | ||
971 | |||
969 | return m_Apis[name]; | 972 | return m_Apis[name]; |
973 | } | ||
974 | |||
975 | // m_log.DebugFormat("[SCRIPT INSTANCE]: Did not find api {0} in {1}@{2}", name, ScriptName, PrimName); | ||
976 | |||
970 | return null; | 977 | return null; |
971 | } | 978 | } |
972 | 979 | ||
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs index e2d0db2..c73e22f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs | |||
@@ -63,7 +63,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests | |||
63 | IConfig config = initConfigSource.AddConfig("XEngine"); | 63 | IConfig config = initConfigSource.AddConfig("XEngine"); |
64 | config.Set("Enabled", "true"); | 64 | config.Set("Enabled", "true"); |
65 | 65 | ||
66 | m_scene = SceneHelpers.SetupScene(); | 66 | m_scene = new SceneHelpers().SetupScene(); |
67 | SceneHelpers.SetupSceneModules(m_scene, initConfigSource); | 67 | SceneHelpers.SetupSceneModules(m_scene, initConfigSource); |
68 | 68 | ||
69 | m_engine = new XEngine.XEngine(); | 69 | m_engine = new XEngine.XEngine(); |
@@ -91,7 +91,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests | |||
91 | TaskInventoryHelpers.AddSceneObject(m_scene, so1.RootPart, inventoryItemName, itemId, userId); | 91 | TaskInventoryHelpers.AddSceneObject(m_scene, so1.RootPart, inventoryItemName, itemId, userId); |
92 | 92 | ||
93 | LSL_Api api = new LSL_Api(); | 93 | LSL_Api api = new LSL_Api(); |
94 | api.Initialize(m_engine, so1.RootPart, so1.RootPart.LocalId, so1.RootPart.UUID); | 94 | api.Initialize(m_engine, so1.RootPart, null); |
95 | 95 | ||
96 | // Create a second object | 96 | // Create a second object |
97 | SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, userId, "so2", 0x100); | 97 | SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, userId, "so2", 0x100); |
@@ -124,7 +124,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests | |||
124 | SceneObjectGroup so1 = SceneHelpers.CreateSceneObject(1, user1Id, "so1", 0x10); | 124 | SceneObjectGroup so1 = SceneHelpers.CreateSceneObject(1, user1Id, "so1", 0x10); |
125 | m_scene.AddSceneObject(so1); | 125 | m_scene.AddSceneObject(so1); |
126 | LSL_Api api = new LSL_Api(); | 126 | LSL_Api api = new LSL_Api(); |
127 | api.Initialize(m_engine, so1.RootPart, so1.RootPart.LocalId, so1.RootPart.UUID); | 127 | api.Initialize(m_engine, so1.RootPart, null); |
128 | 128 | ||
129 | // Create an object embedded inside the first | 129 | // Create an object embedded inside the first |
130 | UUID itemId = TestHelpers.ParseTail(0x20); | 130 | UUID itemId = TestHelpers.ParseTail(0x20); |
@@ -134,7 +134,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests | |||
134 | SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, user2Id, "so2", 0x100); | 134 | SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, user2Id, "so2", 0x100); |
135 | m_scene.AddSceneObject(so2); | 135 | m_scene.AddSceneObject(so2); |
136 | LSL_Api api2 = new LSL_Api(); | 136 | LSL_Api api2 = new LSL_Api(); |
137 | api2.Initialize(m_engine, so2.RootPart, so2.RootPart.LocalId, so2.RootPart.UUID); | 137 | api2.Initialize(m_engine, so2.RootPart, null); |
138 | 138 | ||
139 | // *** Firstly, we test where llAllowInventoryDrop() has not been called. *** | 139 | // *** Firstly, we test where llAllowInventoryDrop() has not been called. *** |
140 | api.llGiveInventory(so2.UUID.ToString(), inventoryItemName); | 140 | api.llGiveInventory(so2.UUID.ToString(), inventoryItemName); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs new file mode 100644 index 0000000..bc3b790 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs | |||
@@ -0,0 +1,139 @@ | |||
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.Reflection; | ||
31 | using System.Text; | ||
32 | using log4net; | ||
33 | using Nini.Config; | ||
34 | using NUnit.Framework; | ||
35 | using OpenMetaverse; | ||
36 | using OpenMetaverse.Assets; | ||
37 | using OpenMetaverse.StructuredData; | ||
38 | using OpenSim.Framework; | ||
39 | using OpenSim.Region.CoreModules.Avatar.AvatarFactory; | ||
40 | using OpenSim.Region.OptionalModules.World.NPC; | ||
41 | using OpenSim.Region.Framework.Scenes; | ||
42 | using OpenSim.Region.ScriptEngine.Shared; | ||
43 | using OpenSim.Region.ScriptEngine.Shared.Api; | ||
44 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; | ||
45 | using OpenSim.Services.Interfaces; | ||
46 | using OpenSim.Tests.Common; | ||
47 | using OpenSim.Tests.Common.Mock; | ||
48 | |||
49 | namespace OpenSim.Region.ScriptEngine.Shared.Tests | ||
50 | { | ||
51 | /// <summary> | ||
52 | /// Tests for linking functions in LSL | ||
53 | /// </summary> | ||
54 | /// <remarks> | ||
55 | /// This relates to LSL. Actual linking functionality should be tested in the main | ||
56 | /// OpenSim.Region.Framework.Scenes.Tests.SceneObjectLinkingTests. | ||
57 | /// </remarks> | ||
58 | [TestFixture] | ||
59 | public class LSL_ApiLinkingTests | ||
60 | { | ||
61 | protected Scene m_scene; | ||
62 | protected XEngine.XEngine m_engine; | ||
63 | |||
64 | [SetUp] | ||
65 | public void SetUp() | ||
66 | { | ||
67 | IConfigSource initConfigSource = new IniConfigSource(); | ||
68 | IConfig config = initConfigSource.AddConfig("XEngine"); | ||
69 | config.Set("Enabled", "true"); | ||
70 | |||
71 | m_scene = new SceneHelpers().SetupScene(); | ||
72 | SceneHelpers.SetupSceneModules(m_scene, initConfigSource); | ||
73 | |||
74 | m_engine = new XEngine.XEngine(); | ||
75 | m_engine.Initialise(initConfigSource); | ||
76 | m_engine.AddRegion(m_scene); | ||
77 | } | ||
78 | |||
79 | [Test] | ||
80 | public void TestllCreateLink() | ||
81 | { | ||
82 | TestHelpers.InMethod(); | ||
83 | |||
84 | UUID ownerId = TestHelpers.ParseTail(0x1); | ||
85 | |||
86 | SceneObjectGroup grp1 = SceneHelpers.CreateSceneObject(2, ownerId, "grp1-", 0x10); | ||
87 | grp1.AbsolutePosition = new Vector3(10, 10, 10); | ||
88 | m_scene.AddSceneObject(grp1); | ||
89 | |||
90 | // FIXME: This should really be a script item (with accompanying script) | ||
91 | TaskInventoryItem grp1Item | ||
92 | = TaskInventoryHelpers.AddNotecard(m_scene, grp1.RootPart); | ||
93 | grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; | ||
94 | |||
95 | SceneObjectGroup grp2 = SceneHelpers.CreateSceneObject(2, ownerId, "grp2-", 0x20); | ||
96 | grp2.AbsolutePosition = new Vector3(20, 20, 20); | ||
97 | |||
98 | // <180,0,0> | ||
99 | grp2.UpdateGroupRotationR(Quaternion.CreateFromEulers(180 * Utils.DEG_TO_RAD, 0, 0)); | ||
100 | |||
101 | m_scene.AddSceneObject(grp2); | ||
102 | |||
103 | LSL_Api apiGrp1 = new LSL_Api(); | ||
104 | apiGrp1.Initialize(m_engine, grp1.RootPart, grp1Item); | ||
105 | |||
106 | apiGrp1.llCreateLink(grp2.UUID.ToString(), ScriptBaseClass.TRUE); | ||
107 | |||
108 | Assert.That(grp1.Parts.Length, Is.EqualTo(4)); | ||
109 | Assert.That(grp2.IsDeleted, Is.True); | ||
110 | } | ||
111 | |||
112 | [Test] | ||
113 | public void TestllBreakLink() | ||
114 | { | ||
115 | TestHelpers.InMethod(); | ||
116 | |||
117 | UUID ownerId = TestHelpers.ParseTail(0x1); | ||
118 | |||
119 | SceneObjectGroup grp1 = SceneHelpers.CreateSceneObject(2, ownerId, "grp1-", 0x10); | ||
120 | grp1.AbsolutePosition = new Vector3(10, 10, 10); | ||
121 | m_scene.AddSceneObject(grp1); | ||
122 | |||
123 | // FIXME: This should really be a script item (with accompanying script) | ||
124 | TaskInventoryItem grp1Item | ||
125 | = TaskInventoryHelpers.AddNotecard(m_scene, grp1.RootPart); | ||
126 | grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; | ||
127 | |||
128 | LSL_Api apiGrp1 = new LSL_Api(); | ||
129 | apiGrp1.Initialize(m_engine, grp1.RootPart, grp1Item); | ||
130 | |||
131 | apiGrp1.llBreakLink(2); | ||
132 | |||
133 | Assert.That(grp1.Parts.Length, Is.EqualTo(1)); | ||
134 | |||
135 | SceneObjectGroup grp2 = m_scene.GetSceneObjectGroup("grp1-Part1"); | ||
136 | Assert.That(grp2, Is.Not.Null); | ||
137 | } | ||
138 | } | ||
139 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs index 9cf9258..f96a156 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs | |||
@@ -58,7 +58,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests | |||
58 | IConfig config = initConfigSource.AddConfig("XEngine"); | 58 | IConfig config = initConfigSource.AddConfig("XEngine"); |
59 | config.Set("Enabled", "true"); | 59 | config.Set("Enabled", "true"); |
60 | 60 | ||
61 | Scene scene = SceneHelpers.SetupScene(); | 61 | Scene scene = new SceneHelpers().SetupScene(); |
62 | SceneObjectPart part = SceneHelpers.AddSceneObject(scene); | 62 | SceneObjectPart part = SceneHelpers.AddSceneObject(scene); |
63 | 63 | ||
64 | XEngine.XEngine engine = new XEngine.XEngine(); | 64 | XEngine.XEngine engine = new XEngine.XEngine(); |
@@ -66,8 +66,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests | |||
66 | engine.AddRegion(scene); | 66 | engine.AddRegion(scene); |
67 | 67 | ||
68 | m_lslApi = new LSL_Api(); | 68 | m_lslApi = new LSL_Api(); |
69 | m_lslApi.Initialize(engine, part, part.LocalId, part.UUID); | 69 | m_lslApi.Initialize(engine, part, null); |
70 | |||
71 | } | 70 | } |
72 | 71 | ||
73 | [Test] | 72 | [Test] |
@@ -261,7 +260,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests | |||
261 | TestHelpers.InMethod(); | 260 | TestHelpers.InMethod(); |
262 | 261 | ||
263 | // Create Prim1. | 262 | // Create Prim1. |
264 | Scene scene = SceneHelpers.SetupScene(); | 263 | Scene scene = new SceneHelpers().SetupScene(); |
265 | string obj1Name = "Prim1"; | 264 | string obj1Name = "Prim1"; |
266 | UUID objUuid = new UUID("00000000-0000-0000-0000-000000000001"); | 265 | UUID objUuid = new UUID("00000000-0000-0000-0000-000000000001"); |
267 | SceneObjectPart part1 = | 266 | SceneObjectPart part1 = |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs index 7573dff..3965734 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs | |||
@@ -67,7 +67,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests | |||
67 | config = initConfigSource.AddConfig("NPC"); | 67 | config = initConfigSource.AddConfig("NPC"); |
68 | config.Set("Enabled", "true"); | 68 | config.Set("Enabled", "true"); |
69 | 69 | ||
70 | m_scene = SceneHelpers.SetupScene(); | 70 | m_scene = new SceneHelpers().SetupScene(); |
71 | SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule()); | 71 | SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule()); |
72 | 72 | ||
73 | m_engine = new XEngine.XEngine(); | 73 | m_engine = new XEngine.XEngine(); |
@@ -95,7 +95,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests | |||
95 | m_scene.AddSceneObject(so); | 95 | m_scene.AddSceneObject(so); |
96 | 96 | ||
97 | OSSL_Api osslApi = new OSSL_Api(); | 97 | OSSL_Api osslApi = new OSSL_Api(); |
98 | osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); | 98 | osslApi.Initialize(m_engine, part, null); |
99 | 99 | ||
100 | string notecardName = "appearanceNc"; | 100 | string notecardName = "appearanceNc"; |
101 | osslApi.osOwnerSaveAppearance(notecardName); | 101 | osslApi.osOwnerSaveAppearance(notecardName); |
@@ -130,7 +130,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests | |||
130 | m_scene.AddSceneObject(so); | 130 | m_scene.AddSceneObject(so); |
131 | 131 | ||
132 | OSSL_Api osslApi = new OSSL_Api(); | 132 | OSSL_Api osslApi = new OSSL_Api(); |
133 | osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); | 133 | osslApi.Initialize(m_engine, part, null); |
134 | 134 | ||
135 | string notecardName = "appearanceNc"; | 135 | string notecardName = "appearanceNc"; |
136 | osslApi.osOwnerSaveAppearance(notecardName); | 136 | osslApi.osOwnerSaveAppearance(notecardName); |
@@ -161,7 +161,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests | |||
161 | m_scene.AddSceneObject(so); | 161 | m_scene.AddSceneObject(so); |
162 | 162 | ||
163 | OSSL_Api osslApi = new OSSL_Api(); | 163 | OSSL_Api osslApi = new OSSL_Api(); |
164 | osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); | 164 | osslApi.Initialize(m_engine, part, null); |
165 | 165 | ||
166 | string notecardName = "appearanceNc"; | 166 | string notecardName = "appearanceNc"; |
167 | 167 | ||
@@ -202,7 +202,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests | |||
202 | m_scene.AddSceneObject(so); | 202 | m_scene.AddSceneObject(so); |
203 | 203 | ||
204 | OSSL_Api osslApi = new OSSL_Api(); | 204 | OSSL_Api osslApi = new OSSL_Api(); |
205 | osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); | 205 | osslApi.Initialize(m_engine, part, null); |
206 | 206 | ||
207 | string notecardName = "appearanceNc"; | 207 | string notecardName = "appearanceNc"; |
208 | 208 | ||
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs index 9d9fc51..0ccd889 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs | |||
@@ -68,7 +68,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests | |||
68 | config = initConfigSource.AddConfig("NPC"); | 68 | config = initConfigSource.AddConfig("NPC"); |
69 | config.Set("Enabled", "true"); | 69 | config.Set("Enabled", "true"); |
70 | 70 | ||
71 | m_scene = SceneHelpers.SetupScene(); | 71 | m_scene = new SceneHelpers().SetupScene(); |
72 | SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule()); | 72 | SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule()); |
73 | 73 | ||
74 | m_engine = new XEngine.XEngine(); | 74 | m_engine = new XEngine.XEngine(); |
@@ -104,10 +104,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests | |||
104 | m_scene.AddSceneObject(otherSo); | 104 | m_scene.AddSceneObject(otherSo); |
105 | 105 | ||
106 | OSSL_Api osslApi = new OSSL_Api(); | 106 | OSSL_Api osslApi = new OSSL_Api(); |
107 | osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); | 107 | osslApi.Initialize(m_engine, part, null); |
108 | 108 | ||
109 | OSSL_Api otherOsslApi = new OSSL_Api(); | 109 | OSSL_Api otherOsslApi = new OSSL_Api(); |
110 | otherOsslApi.Initialize(m_engine, otherPart, otherPart.LocalId, otherPart.UUID); | 110 | otherOsslApi.Initialize(m_engine, otherPart, null); |
111 | 111 | ||
112 | string notecardName = "appearanceNc"; | 112 | string notecardName = "appearanceNc"; |
113 | osslApi.osOwnerSaveAppearance(notecardName); | 113 | osslApi.osOwnerSaveAppearance(notecardName); |
@@ -151,7 +151,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests | |||
151 | m_scene.AddSceneObject(so); | 151 | m_scene.AddSceneObject(so); |
152 | 152 | ||
153 | OSSL_Api osslApi = new OSSL_Api(); | 153 | OSSL_Api osslApi = new OSSL_Api(); |
154 | osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); | 154 | osslApi.Initialize(m_engine, part, null); |
155 | 155 | ||
156 | string notecardName = "appearanceNc"; | 156 | string notecardName = "appearanceNc"; |
157 | osslApi.osOwnerSaveAppearance(notecardName); | 157 | osslApi.osOwnerSaveAppearance(notecardName); |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs index 7d7bd82..a3f848c 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs | |||
@@ -73,7 +73,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Tests | |||
73 | // to AssemblyResolver.OnAssemblyResolve fails. | 73 | // to AssemblyResolver.OnAssemblyResolve fails. |
74 | xEngineConfig.Set("AppDomainLoading", "false"); | 74 | xEngineConfig.Set("AppDomainLoading", "false"); |
75 | 75 | ||
76 | m_scene = SceneHelpers.SetupScene("My Test", UUID.Random(), 1000, 1000, null, configSource); | 76 | m_scene = new SceneHelpers().SetupScene("My Test", UUID.Random(), 1000, 1000, configSource); |
77 | SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule); | 77 | SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule); |
78 | m_scene.StartScripts(); | 78 | m_scene.StartScripts(); |
79 | } | 79 | } |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 1e0f01f..eeb125e 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -1089,11 +1089,18 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1089 | 1089 | ||
1090 | AppDomain sandbox; | 1090 | AppDomain sandbox; |
1091 | if (m_AppDomainLoading) | 1091 | if (m_AppDomainLoading) |
1092 | { | ||
1092 | sandbox = AppDomain.CreateDomain( | 1093 | sandbox = AppDomain.CreateDomain( |
1093 | m_Scene.RegionInfo.RegionID.ToString(), | 1094 | m_Scene.RegionInfo.RegionID.ToString(), |
1094 | evidence, appSetup); | 1095 | evidence, appSetup); |
1096 | m_AppDomains[appDomain].AssemblyResolve += | ||
1097 | new ResolveEventHandler( | ||
1098 | AssemblyResolver.OnAssemblyResolve); | ||
1099 | } | ||
1095 | else | 1100 | else |
1101 | { | ||
1096 | sandbox = AppDomain.CurrentDomain; | 1102 | sandbox = AppDomain.CurrentDomain; |
1103 | } | ||
1097 | 1104 | ||
1098 | //PolicyLevel sandboxPolicy = PolicyLevel.CreateAppDomainLevel(); | 1105 | //PolicyLevel sandboxPolicy = PolicyLevel.CreateAppDomainLevel(); |
1099 | //AllMembershipCondition sandboxMembershipCondition = new AllMembershipCondition(); | 1106 | //AllMembershipCondition sandboxMembershipCondition = new AllMembershipCondition(); |
@@ -1105,9 +1112,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1105 | 1112 | ||
1106 | m_AppDomains[appDomain] = sandbox; | 1113 | m_AppDomains[appDomain] = sandbox; |
1107 | 1114 | ||
1108 | m_AppDomains[appDomain].AssemblyResolve += | ||
1109 | new ResolveEventHandler( | ||
1110 | AssemblyResolver.OnAssemblyResolve); | ||
1111 | m_DomainScripts[appDomain] = new List<UUID>(); | 1115 | m_DomainScripts[appDomain] = new List<UUID>(); |
1112 | } | 1116 | } |
1113 | catch (Exception e) | 1117 | catch (Exception e) |
@@ -1898,9 +1902,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1898 | // if there already exists a file at that location, it may be locked. | 1902 | // if there already exists a file at that location, it may be locked. |
1899 | m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message); | 1903 | m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message); |
1900 | } | 1904 | } |
1905 | |||
1906 | string textpath = path + ".text"; | ||
1901 | try | 1907 | try |
1902 | { | 1908 | { |
1903 | using (FileStream fs = File.Create(path + ".text")) | 1909 | using (FileStream fs = File.Create(textpath)) |
1904 | { | 1910 | { |
1905 | using (StreamWriter sw = new StreamWriter(fs)) | 1911 | using (StreamWriter sw = new StreamWriter(fs)) |
1906 | { | 1912 | { |
@@ -1913,7 +1919,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1913 | catch (IOException ex) | 1919 | catch (IOException ex) |
1914 | { | 1920 | { |
1915 | // if there already exists a file at that location, it may be locked. | 1921 | // if there already exists a file at that location, it may be locked. |
1916 | m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message); | 1922 | m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", textpath, ex.Message); |
1917 | } | 1923 | } |
1918 | } | 1924 | } |
1919 | } | 1925 | } |
@@ -1962,7 +1968,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1962 | catch (IOException ex) | 1968 | catch (IOException ex) |
1963 | { | 1969 | { |
1964 | // if there already exists a file at that location, it may be locked. | 1970 | // if there already exists a file at that location, it may be locked. |
1965 | m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", statepath, ex.Message); | 1971 | m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", mappath, ex.Message); |
1966 | } | 1972 | } |
1967 | } | 1973 | } |
1968 | 1974 | ||
@@ -1997,45 +2003,59 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1997 | if (!topScripts.ContainsKey(si.LocalID)) | 2003 | if (!topScripts.ContainsKey(si.LocalID)) |
1998 | topScripts[si.RootLocalID] = 0; | 2004 | topScripts[si.RootLocalID] = 0; |
1999 | 2005 | ||
2000 | // long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; | 2006 | topScripts[si.RootLocalID] += CalculateAdjustedExectionTime(si, tickNow); |
2001 | // float framesElapsed = ticksElapsed / (18.1818 * TimeSpan.TicksPerMillisecond); | 2007 | } |
2002 | 2008 | } | |
2003 | // Execution time of the script adjusted by it's measurement period to make scripts started at | ||
2004 | // different times comparable. | ||
2005 | // float adjustedExecutionTime | ||
2006 | // = (float)si.MeasurementPeriodExecutionTime | ||
2007 | // / ((float)(tickNow - si.MeasurementPeriodTickStart) / ScriptInstance.MaxMeasurementPeriod) | ||
2008 | // / TimeSpan.TicksPerMillisecond; | ||
2009 | |||
2010 | long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; | ||
2011 | |||
2012 | // Avoid divide by zerp | ||
2013 | if (ticksElapsed == 0) | ||
2014 | ticksElapsed = 1; | ||
2015 | 2009 | ||
2016 | // Scale execution time to the ideal 55 fps frame time for these reasons. | 2010 | return topScripts; |
2017 | // | 2011 | } |
2018 | // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no | ||
2019 | // 'script execution time per frame', which is the original purpose of this value. | ||
2020 | // | ||
2021 | // 2) Giving the raw execution times is misleading since scripts start at different times, making | ||
2022 | // it impossible to compare scripts. | ||
2023 | // | ||
2024 | // 3) Scaling the raw execution time to the time that the script has been running is better but | ||
2025 | // is still misleading since a script that has just been rezzed may appear to have been running | ||
2026 | // for much longer. | ||
2027 | // | ||
2028 | // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect | ||
2029 | // since the figure does not represent actual execution time and very hard running scripts will | ||
2030 | // never exceed 18ms (though this is a very high number for script execution so is a warning sign). | ||
2031 | float adjustedExecutionTime | ||
2032 | = ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f; | ||
2033 | 2012 | ||
2034 | topScripts[si.RootLocalID] += adjustedExecutionTime; | 2013 | public float GetScriptExecutionTime(List<UUID> itemIDs) |
2014 | { | ||
2015 | if (itemIDs == null|| itemIDs.Count == 0) | ||
2016 | { | ||
2017 | return 0.0f; | ||
2018 | } | ||
2019 | float time = 0.0f; | ||
2020 | long tickNow = Util.EnvironmentTickCount(); | ||
2021 | IScriptInstance si; | ||
2022 | // Calculate the time for all scripts that this engine is executing | ||
2023 | // Ignore any others | ||
2024 | foreach (UUID id in itemIDs) | ||
2025 | { | ||
2026 | si = GetInstance(id); | ||
2027 | if (si != null && si.Running) | ||
2028 | { | ||
2029 | time += CalculateAdjustedExectionTime(si, tickNow); | ||
2035 | } | 2030 | } |
2036 | } | 2031 | } |
2032 | return time; | ||
2033 | } | ||
2037 | 2034 | ||
2038 | return topScripts; | 2035 | private float CalculateAdjustedExectionTime(IScriptInstance si, long tickNow) |
2036 | { | ||
2037 | long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; | ||
2038 | |||
2039 | // Avoid divide by zero | ||
2040 | if (ticksElapsed == 0) | ||
2041 | ticksElapsed = 1; | ||
2042 | |||
2043 | // Scale execution time to the ideal 55 fps frame time for these reasons. | ||
2044 | // | ||
2045 | // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no | ||
2046 | // 'script execution time per frame', which is the original purpose of this value. | ||
2047 | // | ||
2048 | // 2) Giving the raw execution times is misleading since scripts start at different times, making | ||
2049 | // it impossible to compare scripts. | ||
2050 | // | ||
2051 | // 3) Scaling the raw execution time to the time that the script has been running is better but | ||
2052 | // is still misleading since a script that has just been rezzed may appear to have been running | ||
2053 | // for much longer. | ||
2054 | // | ||
2055 | // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect | ||
2056 | // since the figure does not represent actual execution time and very hard running scripts will | ||
2057 | // never exceed 18ms (though this is a very high number for script execution so is a warning sign). | ||
2058 | return ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f; | ||
2039 | } | 2059 | } |
2040 | 2060 | ||
2041 | public void SuspendScript(UUID itemID) | 2061 | public void SuspendScript(UUID itemID) |
diff --git a/OpenSim/Region/UserStatistics/WebStatsModule.cs b/OpenSim/Region/UserStatistics/WebStatsModule.cs index b9ba4bc..faf746f 100644 --- a/OpenSim/Region/UserStatistics/WebStatsModule.cs +++ b/OpenSim/Region/UserStatistics/WebStatsModule.cs | |||
@@ -90,7 +90,7 @@ namespace OpenSim.Region.UserStatistics | |||
90 | 90 | ||
91 | dbConn = new SqliteConnection("URI=file:LocalUserStatistics.db,version=3"); | 91 | dbConn = new SqliteConnection("URI=file:LocalUserStatistics.db,version=3"); |
92 | dbConn.Open(); | 92 | dbConn.Open(); |
93 | CheckAndUpdateDatabase(dbConn); | 93 | CreateTables(dbConn); |
94 | 94 | ||
95 | Prototype_distributor protodep = new Prototype_distributor(); | 95 | Prototype_distributor protodep = new Prototype_distributor(); |
96 | Updater_distributor updatedep = new Updater_distributor(); | 96 | Updater_distributor updatedep = new Updater_distributor(); |
@@ -131,7 +131,7 @@ namespace OpenSim.Region.UserStatistics | |||
131 | } | 131 | } |
132 | } | 132 | } |
133 | 133 | ||
134 | public void ReceiveClassicSimStatsPacket(SimStats stats) | 134 | private void ReceiveClassicSimStatsPacket(SimStats stats) |
135 | { | 135 | { |
136 | if (!enabled) | 136 | if (!enabled) |
137 | { | 137 | { |
@@ -163,7 +163,7 @@ namespace OpenSim.Region.UserStatistics | |||
163 | } | 163 | } |
164 | } | 164 | } |
165 | 165 | ||
166 | public Hashtable HandleUnknownCAPSRequest(Hashtable request) | 166 | private Hashtable HandleUnknownCAPSRequest(Hashtable request) |
167 | { | 167 | { |
168 | //string regpath = request["uri"].ToString(); | 168 | //string regpath = request["uri"].ToString(); |
169 | int response_code = 200; | 169 | int response_code = 200; |
@@ -178,7 +178,7 @@ namespace OpenSim.Region.UserStatistics | |||
178 | return responsedata; | 178 | return responsedata; |
179 | } | 179 | } |
180 | 180 | ||
181 | public Hashtable HandleStatsRequest(Hashtable request) | 181 | private Hashtable HandleStatsRequest(Hashtable request) |
182 | { | 182 | { |
183 | lastHit = System.Environment.TickCount; | 183 | lastHit = System.Environment.TickCount; |
184 | Hashtable responsedata = new Hashtable(); | 184 | Hashtable responsedata = new Hashtable(); |
@@ -237,36 +237,12 @@ namespace OpenSim.Region.UserStatistics | |||
237 | 237 | ||
238 | return responsedata; | 238 | return responsedata; |
239 | } | 239 | } |
240 | |||
241 | public void CheckAndUpdateDatabase(SqliteConnection db) | ||
242 | { | ||
243 | lock (db) | ||
244 | { | ||
245 | // TODO: FIXME: implement stats migrations | ||
246 | const string SQL = @"SELECT * FROM migrations LIMIT 1"; | ||
247 | |||
248 | using (SqliteCommand cmd = new SqliteCommand(SQL, db)) | ||
249 | { | ||
250 | try | ||
251 | { | ||
252 | cmd.ExecuteNonQuery(); | ||
253 | } | ||
254 | catch (SqliteSyntaxException) | ||
255 | { | ||
256 | CreateTables(db); | ||
257 | } | ||
258 | } | ||
259 | } | ||
260 | } | ||
261 | 240 | ||
262 | public void CreateTables(SqliteConnection db) | 241 | private void CreateTables(SqliteConnection db) |
263 | { | 242 | { |
264 | using (SqliteCommand createcmd = new SqliteCommand(SQL_STATS_TABLE_CREATE, db)) | 243 | using (SqliteCommand createcmd = new SqliteCommand(SQL_STATS_TABLE_CREATE, db)) |
265 | { | 244 | { |
266 | createcmd.ExecuteNonQuery(); | 245 | createcmd.ExecuteNonQuery(); |
267 | |||
268 | createcmd.CommandText = SQL_MIGRA_TABLE_CREATE; | ||
269 | createcmd.ExecuteNonQuery(); | ||
270 | } | 246 | } |
271 | } | 247 | } |
272 | 248 | ||
@@ -301,22 +277,23 @@ namespace OpenSim.Region.UserStatistics | |||
301 | get { return true; } | 277 | get { return true; } |
302 | } | 278 | } |
303 | 279 | ||
304 | public void OnRegisterCaps(UUID agentID, Caps caps) | 280 | private void OnRegisterCaps(UUID agentID, Caps caps) |
305 | { | 281 | { |
306 | // m_log.DebugFormat("[WEB STATS MODULE]: OnRegisterCaps: agentID {0} caps {1}", agentID, caps); | 282 | // m_log.DebugFormat("[WEB STATS MODULE]: OnRegisterCaps: agentID {0} caps {1}", agentID, caps); |
307 | 283 | ||
308 | string capsPath = "/CAPS/VS/" + UUID.Random(); | 284 | string capsPath = "/CAPS/VS/" + UUID.Random(); |
309 | caps.RegisterHandler("ViewerStats", | 285 | caps.RegisterHandler( |
310 | new RestStreamHandler("POST", capsPath, | 286 | "ViewerStats", |
311 | delegate(string request, string path, string param, | 287 | new RestStreamHandler( |
312 | IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) | 288 | "POST", |
313 | { | 289 | capsPath, |
314 | return ViewerStatsReport(request, path, param, | 290 | (request, path, param, httpRequest, httpResponse) |
315 | agentID, caps); | 291 | => ViewerStatsReport(request, path, param, agentID, caps), |
316 | })); | 292 | "ViewerStats", |
293 | agentID.ToString())); | ||
317 | } | 294 | } |
318 | 295 | ||
319 | public void OnDeRegisterCaps(UUID agentID, Caps caps) | 296 | private void OnDeRegisterCaps(UUID agentID, Caps caps) |
320 | { | 297 | { |
321 | } | 298 | } |
322 | 299 | ||
@@ -336,7 +313,7 @@ namespace OpenSim.Region.UserStatistics | |||
336 | } | 313 | } |
337 | } | 314 | } |
338 | 315 | ||
339 | public void OnMakeRootAgent(ScenePresence agent) | 316 | private void OnMakeRootAgent(ScenePresence agent) |
340 | { | 317 | { |
341 | UUID regionUUID = GetRegionUUIDFromHandle(agent.RegionHandle); | 318 | UUID regionUUID = GetRegionUUIDFromHandle(agent.RegionHandle); |
342 | 319 | ||
@@ -365,11 +342,11 @@ namespace OpenSim.Region.UserStatistics | |||
365 | } | 342 | } |
366 | } | 343 | } |
367 | 344 | ||
368 | public void OnMakeChildAgent(ScenePresence agent) | 345 | private void OnMakeChildAgent(ScenePresence agent) |
369 | { | 346 | { |
370 | } | 347 | } |
371 | 348 | ||
372 | public void OnClientClosed(UUID agentID, Scene scene) | 349 | private void OnClientClosed(UUID agentID, Scene scene) |
373 | { | 350 | { |
374 | lock (m_sessions) | 351 | lock (m_sessions) |
375 | { | 352 | { |
@@ -380,7 +357,7 @@ namespace OpenSim.Region.UserStatistics | |||
380 | } | 357 | } |
381 | } | 358 | } |
382 | 359 | ||
383 | public string readLogLines(int amount) | 360 | private string readLogLines(int amount) |
384 | { | 361 | { |
385 | Encoding encoding = Encoding.ASCII; | 362 | Encoding encoding = Encoding.ASCII; |
386 | int sizeOfChar = encoding.GetByteCount("\n"); | 363 | int sizeOfChar = encoding.GetByteCount("\n"); |
@@ -418,7 +395,7 @@ namespace OpenSim.Region.UserStatistics | |||
418 | return encoding.GetString(buffer); | 395 | return encoding.GetString(buffer); |
419 | } | 396 | } |
420 | 397 | ||
421 | public UUID GetRegionUUIDFromHandle(ulong regionhandle) | 398 | private UUID GetRegionUUIDFromHandle(ulong regionhandle) |
422 | { | 399 | { |
423 | lock (m_scenes) | 400 | lock (m_scenes) |
424 | { | 401 | { |
@@ -441,17 +418,17 @@ namespace OpenSim.Region.UserStatistics | |||
441 | /// <param name="agentID"></param> | 418 | /// <param name="agentID"></param> |
442 | /// <param name="caps"></param> | 419 | /// <param name="caps"></param> |
443 | /// <returns></returns> | 420 | /// <returns></returns> |
444 | public string ViewerStatsReport(string request, string path, string param, | 421 | private string ViewerStatsReport(string request, string path, string param, |
445 | UUID agentID, Caps caps) | 422 | UUID agentID, Caps caps) |
446 | { | 423 | { |
447 | // m_log.DebugFormat("[WEB STATS MODULE]: Received viewer starts report from {0}", agentID); | 424 | // m_log.DebugFormat("[WEB STATS MODULE]: Received viewer starts report from {0}", agentID); |
448 | 425 | ||
449 | UpdateUserStats(ParseViewerStats(request,agentID), dbConn); | 426 | UpdateUserStats(ParseViewerStats(request, agentID), dbConn); |
450 | 427 | ||
451 | return String.Empty; | 428 | return String.Empty; |
452 | } | 429 | } |
453 | 430 | ||
454 | public UserSessionID ParseViewerStats(string request, UUID agentID) | 431 | private UserSessionID ParseViewerStats(string request, UUID agentID) |
455 | { | 432 | { |
456 | UserSessionID uid = new UserSessionID(); | 433 | UserSessionID uid = new UserSessionID(); |
457 | UserSessionData usd; | 434 | UserSessionData usd; |
@@ -592,14 +569,14 @@ namespace OpenSim.Region.UserStatistics | |||
592 | return uid; | 569 | return uid; |
593 | } | 570 | } |
594 | 571 | ||
595 | public void UpdateUserStats(UserSessionID uid, SqliteConnection db) | 572 | private void UpdateUserStats(UserSessionID uid, SqliteConnection db) |
596 | { | 573 | { |
597 | if (uid.session_id == UUID.Zero) | 574 | if (uid.session_id == UUID.Zero) |
598 | return; | 575 | return; |
599 | 576 | ||
600 | lock (db) | 577 | lock (db) |
601 | { | 578 | { |
602 | using (SqliteCommand updatecmd = new SqliteCommand(SQL_STATS_TABLE_UPDATE, db)) | 579 | using (SqliteCommand updatecmd = new SqliteCommand(SQL_STATS_TABLE_INSERT, db)) |
603 | { | 580 | { |
604 | updatecmd.Parameters.Add(new SqliteParameter(":session_id", uid.session_data.session_id.ToString())); | 581 | updatecmd.Parameters.Add(new SqliteParameter(":session_id", uid.session_data.session_id.ToString())); |
605 | updatecmd.Parameters.Add(new SqliteParameter(":agent_id", uid.session_data.agent_id.ToString())); | 582 | updatecmd.Parameters.Add(new SqliteParameter(":agent_id", uid.session_data.agent_id.ToString())); |
@@ -648,44 +625,26 @@ namespace OpenSim.Region.UserStatistics | |||
648 | updatecmd.Parameters.Add(new SqliteParameter(":f_dropped", uid.session_data.f_dropped)); | 625 | updatecmd.Parameters.Add(new SqliteParameter(":f_dropped", uid.session_data.f_dropped)); |
649 | updatecmd.Parameters.Add(new SqliteParameter(":f_failed_resends", uid.session_data.f_failed_resends)); | 626 | updatecmd.Parameters.Add(new SqliteParameter(":f_failed_resends", uid.session_data.f_failed_resends)); |
650 | updatecmd.Parameters.Add(new SqliteParameter(":f_invalid", uid.session_data.f_invalid)); | 627 | updatecmd.Parameters.Add(new SqliteParameter(":f_invalid", uid.session_data.f_invalid)); |
651 | |||
652 | updatecmd.Parameters.Add(new SqliteParameter(":f_off_circuit", uid.session_data.f_off_circuit)); | 628 | updatecmd.Parameters.Add(new SqliteParameter(":f_off_circuit", uid.session_data.f_off_circuit)); |
653 | updatecmd.Parameters.Add(new SqliteParameter(":f_resent", uid.session_data.f_resent)); | 629 | updatecmd.Parameters.Add(new SqliteParameter(":f_resent", uid.session_data.f_resent)); |
654 | updatecmd.Parameters.Add(new SqliteParameter(":f_send_packet", uid.session_data.f_send_packet)); | 630 | updatecmd.Parameters.Add(new SqliteParameter(":f_send_packet", uid.session_data.f_send_packet)); |
655 | |||
656 | updatecmd.Parameters.Add(new SqliteParameter(":session_key", uid.session_data.session_id.ToString())); | ||
657 | updatecmd.Parameters.Add(new SqliteParameter(":agent_key", uid.session_data.agent_id.ToString())); | ||
658 | updatecmd.Parameters.Add(new SqliteParameter(":region_key", uid.session_data.region_id.ToString())); | ||
659 | 631 | ||
660 | // m_log.DebugFormat("[WEB STATS MODULE]: Database stats update for {0}", uid.session_data.agent_id); | 632 | // StringBuilder parameters = new StringBuilder(); |
661 | 633 | // SqliteParameterCollection spc = updatecmd.Parameters; | |
662 | int result = updatecmd.ExecuteNonQuery(); | 634 | // foreach (SqliteParameter sp in spc) |
663 | 635 | // parameters.AppendFormat("{0}={1},", sp.ParameterName, sp.Value); | |
664 | if (result == 0) | 636 | // |
665 | { | 637 | // m_log.DebugFormat("[WEB STATS MODULE]: Parameters {0}", parameters); |
666 | // m_log.DebugFormat("[WEB STATS MODULE]: Database stats insert for {0}", uid.session_data.agent_id); | ||
667 | 638 | ||
668 | updatecmd.CommandText = SQL_STATS_TABLE_INSERT; | 639 | // m_log.DebugFormat("[WEB STATS MODULE]: Database stats update for {0}", uid.session_data.agent_id); |
669 | 640 | ||
670 | try | 641 | updatecmd.ExecuteNonQuery(); |
671 | { | ||
672 | updatecmd.ExecuteNonQuery(); | ||
673 | } | ||
674 | catch (Exception e) | ||
675 | { | ||
676 | m_log.WarnFormat( | ||
677 | "[WEB STATS MODULE]: failed to write stats for {0}, storage Execution Exception {1}{2}", | ||
678 | uid.session_data.agent_id, e.Message, e.StackTrace); | ||
679 | } | ||
680 | } | ||
681 | } | 642 | } |
682 | } | 643 | } |
683 | } | 644 | } |
684 | 645 | ||
685 | #region SQL | 646 | #region SQL |
686 | private const string SQL_MIGRA_TABLE_CREATE = @"create table migrations(name varchar(100), version int)"; | 647 | private const string SQL_STATS_TABLE_CREATE = @"CREATE TABLE IF NOT EXISTS stats_session_data ( |
687 | |||
688 | private const string SQL_STATS_TABLE_CREATE = @"CREATE TABLE stats_session_data ( | ||
689 | session_id VARCHAR(36) NOT NULL PRIMARY KEY, | 648 | session_id VARCHAR(36) NOT NULL PRIMARY KEY, |
690 | agent_id VARCHAR(36) NOT NULL DEFAULT '', | 649 | agent_id VARCHAR(36) NOT NULL DEFAULT '', |
691 | region_id VARCHAR(36) NOT NULL DEFAULT '', | 650 | region_id VARCHAR(36) NOT NULL DEFAULT '', |
@@ -735,11 +694,11 @@ namespace OpenSim.Region.UserStatistics | |||
735 | f_send_packet INT NOT NULL DEFAULT '0' | 694 | f_send_packet INT NOT NULL DEFAULT '0' |
736 | );"; | 695 | );"; |
737 | 696 | ||
738 | private const string SQL_STATS_TABLE_INSERT = @"INSERT INTO stats_session_data ( | 697 | private const string SQL_STATS_TABLE_INSERT = @"INSERT OR REPLACE INTO stats_session_data ( |
739 | session_id, agent_id, region_id, last_updated, remote_ip, name_f, name_l, avg_agents_in_view, min_agents_in_view, max_agents_in_view, | 698 | session_id, agent_id, region_id, last_updated, remote_ip, name_f, name_l, avg_agents_in_view, min_agents_in_view, max_agents_in_view, |
740 | mode_agents_in_view, avg_fps, min_fps, max_fps, mode_fps, a_language, mem_use, meters_traveled, avg_ping, min_ping, max_ping, mode_ping, | 699 | mode_agents_in_view, avg_fps, min_fps, max_fps, mode_fps, a_language, mem_use, meters_traveled, avg_ping, min_ping, max_ping, mode_ping, |
741 | regions_visited, run_time, avg_sim_fps, min_sim_fps, max_sim_fps, mode_sim_fps, start_time, client_version, s_cpu, s_gpu, s_os, s_ram, | 700 | regions_visited, run_time, avg_sim_fps, min_sim_fps, max_sim_fps, mode_sim_fps, start_time, client_version, s_cpu, s_gpu, s_os, s_ram, |
742 | d_object_kb, d_texture_kb, n_in_kb, n_in_pk, n_out_kb, n_out_pk, f_dropped, f_failed_resends, f_invalid, f_invalid, f_off_circuit, | 701 | d_object_kb, d_texture_kb, d_world_kb, n_in_kb, n_in_pk, n_out_kb, n_out_pk, f_dropped, f_failed_resends, f_invalid, f_off_circuit, |
743 | f_resent, f_send_packet | 702 | f_resent, f_send_packet |
744 | ) | 703 | ) |
745 | VALUES | 704 | VALUES |
@@ -747,62 +706,13 @@ VALUES | |||
747 | :session_id, :agent_id, :region_id, :last_updated, :remote_ip, :name_f, :name_l, :avg_agents_in_view, :min_agents_in_view, :max_agents_in_view, | 706 | :session_id, :agent_id, :region_id, :last_updated, :remote_ip, :name_f, :name_l, :avg_agents_in_view, :min_agents_in_view, :max_agents_in_view, |
748 | :mode_agents_in_view, :avg_fps, :min_fps, :max_fps, :mode_fps, :a_language, :mem_use, :meters_traveled, :avg_ping, :min_ping, :max_ping, :mode_ping, | 707 | :mode_agents_in_view, :avg_fps, :min_fps, :max_fps, :mode_fps, :a_language, :mem_use, :meters_traveled, :avg_ping, :min_ping, :max_ping, :mode_ping, |
749 | :regions_visited, :run_time, :avg_sim_fps, :min_sim_fps, :max_sim_fps, :mode_sim_fps, :start_time, :client_version, :s_cpu, :s_gpu, :s_os, :s_ram, | 708 | :regions_visited, :run_time, :avg_sim_fps, :min_sim_fps, :max_sim_fps, :mode_sim_fps, :start_time, :client_version, :s_cpu, :s_gpu, :s_os, :s_ram, |
750 | :d_object_kb, :d_texture_kb, :n_in_kb, :n_in_pk, :n_out_kb, :n_out_pk, :f_dropped, :f_failed_resends, :f_invalid, :f_invalid, :f_off_circuit, | 709 | :d_object_kb, :d_texture_kb, :d_world_kb, :n_in_kb, :n_in_pk, :n_out_kb, :n_out_pk, :f_dropped, :f_failed_resends, :f_invalid, :f_off_circuit, |
751 | :f_resent, :f_send_packet | 710 | :f_resent, :f_send_packet |
752 | ) | 711 | ) |
753 | "; | 712 | "; |
754 | 713 | ||
755 | private const string SQL_STATS_TABLE_UPDATE = @" | 714 | #endregion |
756 | UPDATE stats_session_data | 715 | |
757 | set session_id=:session_id, | ||
758 | agent_id=:agent_id, | ||
759 | region_id=:region_id, | ||
760 | last_updated=:last_updated, | ||
761 | remote_ip=:remote_ip, | ||
762 | name_f=:name_f, | ||
763 | name_l=:name_l, | ||
764 | avg_agents_in_view=:avg_agents_in_view, | ||
765 | min_agents_in_view=:min_agents_in_view, | ||
766 | max_agents_in_view=:max_agents_in_view, | ||
767 | mode_agents_in_view=:mode_agents_in_view, | ||
768 | avg_fps=:avg_fps, | ||
769 | min_fps=:min_fps, | ||
770 | max_fps=:max_fps, | ||
771 | mode_fps=:mode_fps, | ||
772 | a_language=:a_language, | ||
773 | mem_use=:mem_use, | ||
774 | meters_traveled=:meters_traveled, | ||
775 | avg_ping=:avg_ping, | ||
776 | min_ping=:min_ping, | ||
777 | max_ping=:max_ping, | ||
778 | mode_ping=:mode_ping, | ||
779 | regions_visited=:regions_visited, | ||
780 | run_time=:run_time, | ||
781 | avg_sim_fps=:avg_sim_fps, | ||
782 | min_sim_fps=:min_sim_fps, | ||
783 | max_sim_fps=:max_sim_fps, | ||
784 | mode_sim_fps=:mode_sim_fps, | ||
785 | start_time=:start_time, | ||
786 | client_version=:client_version, | ||
787 | s_cpu=:s_cpu, | ||
788 | s_gpu=:s_gpu, | ||
789 | s_os=:s_os, | ||
790 | s_ram=:s_ram, | ||
791 | d_object_kb=:d_object_kb, | ||
792 | d_texture_kb=:d_texture_kb, | ||
793 | d_world_kb=:d_world_kb, | ||
794 | n_in_kb=:n_in_kb, | ||
795 | n_in_pk=:n_in_pk, | ||
796 | n_out_kb=:n_out_kb, | ||
797 | n_out_pk=:n_out_pk, | ||
798 | f_dropped=:f_dropped, | ||
799 | f_failed_resends=:f_failed_resends, | ||
800 | f_invalid=:f_invalid, | ||
801 | f_off_circuit=:f_off_circuit, | ||
802 | f_resent=:f_resent, | ||
803 | f_send_packet=:f_send_packet | ||
804 | WHERE session_id=:session_key AND agent_id=:agent_key AND region_id=:region_key"; | ||
805 | #endregion | ||
806 | } | 716 | } |
807 | 717 | ||
808 | public static class UserSessionUtil | 718 | public static class UserSessionUtil |
diff --git a/OpenSim/Server/Base/ServerUtils.cs b/OpenSim/Server/Base/ServerUtils.cs index 8effdd2..42c82cf 100644 --- a/OpenSim/Server/Base/ServerUtils.cs +++ b/OpenSim/Server/Base/ServerUtils.cs | |||
@@ -117,7 +117,10 @@ namespace OpenSim.Server.Base | |||
117 | catch (Exception e) | 117 | catch (Exception e) |
118 | { | 118 | { |
119 | if (!(e is System.MissingMethodException)) | 119 | if (!(e is System.MissingMethodException)) |
120 | m_log.ErrorFormat("Error loading plugin from {0}, exception {1}", dllName, e.InnerException); | 120 | { |
121 | m_log.ErrorFormat("Error loading plugin {0} from {1}. Exception: {2}", | ||
122 | interfaceName, dllName, e.InnerException == null ? e.Message : e.InnerException.Message); | ||
123 | } | ||
121 | return null; | 124 | return null; |
122 | } | 125 | } |
123 | 126 | ||
@@ -265,7 +268,7 @@ namespace OpenSim.Server.Base | |||
265 | continue; | 268 | continue; |
266 | 269 | ||
267 | XmlElement elem = parent.OwnerDocument.CreateElement("", | 270 | XmlElement elem = parent.OwnerDocument.CreateElement("", |
268 | kvp.Key, ""); | 271 | XmlConvert.EncodeLocalName(kvp.Key), ""); |
269 | 272 | ||
270 | if (kvp.Value is Dictionary<string, object>) | 273 | if (kvp.Value is Dictionary<string, object>) |
271 | { | 274 | { |
@@ -320,11 +323,11 @@ namespace OpenSim.Server.Base | |||
320 | XmlNode type = part.Attributes.GetNamedItem("type"); | 323 | XmlNode type = part.Attributes.GetNamedItem("type"); |
321 | if (type == null || type.Value != "List") | 324 | if (type == null || type.Value != "List") |
322 | { | 325 | { |
323 | ret[part.Name] = part.InnerText; | 326 | ret[XmlConvert.DecodeName(part.Name)] = part.InnerText; |
324 | } | 327 | } |
325 | else | 328 | else |
326 | { | 329 | { |
327 | ret[part.Name] = ParseElement(part); | 330 | ret[XmlConvert.DecodeName(part.Name)] = ParseElement(part); |
328 | } | 331 | } |
329 | } | 332 | } |
330 | 333 | ||
diff --git a/OpenSim/Server/Handlers/Authentication/OpenIdServerHandler.cs b/OpenSim/Server/Handlers/Authentication/OpenIdServerHandler.cs index dfed761..18cef15 100644 --- a/OpenSim/Server/Handlers/Authentication/OpenIdServerHandler.cs +++ b/OpenSim/Server/Handlers/Authentication/OpenIdServerHandler.cs | |||
@@ -191,6 +191,8 @@ For more information, see <a href='http://openid.net/'>http://openid.net/</a>. | |||
191 | 191 | ||
192 | #endregion HTML | 192 | #endregion HTML |
193 | 193 | ||
194 | public string Name { get { return "OpenId"; } } | ||
195 | public string Description { get { return null; } } | ||
194 | public string ContentType { get { return m_contentType; } } | 196 | public string ContentType { get { return m_contentType; } } |
195 | public string HttpMethod { get { return m_httpMethod; } } | 197 | public string HttpMethod { get { return m_httpMethod; } } |
196 | public string Path { get { return m_path; } } | 198 | public string Path { get { return m_path; } } |
diff --git a/OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs b/OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs index 59420f5..ef9b96f 100644 --- a/OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs +++ b/OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs | |||
@@ -95,7 +95,8 @@ namespace OpenSim.Server.Handlers.Friends | |||
95 | return DeleteFriendString(request); | 95 | return DeleteFriendString(request); |
96 | 96 | ||
97 | } | 97 | } |
98 | m_log.DebugFormat("[FRIENDS HANDLER]: unknown method {0} request {1}", method.Length, method); | 98 | |
99 | m_log.DebugFormat("[FRIENDS HANDLER]: unknown method request {0}", method); | ||
99 | } | 100 | } |
100 | catch (Exception e) | 101 | catch (Exception e) |
101 | { | 102 | { |
@@ -103,7 +104,6 @@ namespace OpenSim.Server.Handlers.Friends | |||
103 | } | 104 | } |
104 | 105 | ||
105 | return FailureResult(); | 106 | return FailureResult(); |
106 | |||
107 | } | 107 | } |
108 | 108 | ||
109 | #region Method-specific handlers | 109 | #region Method-specific handlers |
diff --git a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs index bebf482..91d14cb 100644 --- a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs +++ b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs | |||
@@ -116,7 +116,7 @@ namespace OpenSim.Server.Handlers.Grid | |||
116 | return GetRegionFlags(request); | 116 | return GetRegionFlags(request); |
117 | } | 117 | } |
118 | 118 | ||
119 | m_log.DebugFormat("[GRID HANDLER]: unknown method {0} request {1}", method.Length, method); | 119 | m_log.DebugFormat("[GRID HANDLER]: unknown method request {0}", method); |
120 | } | 120 | } |
121 | catch (Exception e) | 121 | catch (Exception e) |
122 | { | 122 | { |
diff --git a/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs b/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs index 8ef03e7..c2f127c 100644 --- a/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs +++ b/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs | |||
@@ -122,7 +122,8 @@ namespace OpenSim.Server.Handlers.Hypergrid | |||
122 | return GrantRights(request); | 122 | return GrantRights(request); |
123 | */ | 123 | */ |
124 | } | 124 | } |
125 | m_log.DebugFormat("[HGFRIENDS HANDLER]: unknown method {0} request {1}", method.Length, method); | 125 | |
126 | m_log.DebugFormat("[HGFRIENDS HANDLER]: unknown method {0}", method); | ||
126 | } | 127 | } |
127 | catch (Exception e) | 128 | catch (Exception e) |
128 | { | 129 | { |
diff --git a/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs b/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs index 75dd711..4a61969 100644 --- a/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs +++ b/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs | |||
@@ -33,17 +33,24 @@ using System.Xml; | |||
33 | 33 | ||
34 | using Nini.Config; | 34 | using Nini.Config; |
35 | using log4net; | 35 | using log4net; |
36 | using OpenMetaverse; | ||
36 | 37 | ||
38 | using OpenSim.Framework; | ||
37 | using OpenSim.Server.Base; | 39 | using OpenSim.Server.Base; |
38 | using OpenSim.Services.Interfaces; | 40 | using OpenSim.Services.Interfaces; |
39 | using OpenSim.Framework.Servers.HttpServer; | 41 | using OpenSim.Framework.Servers.HttpServer; |
40 | using OpenSim.Server.Handlers.Base; | 42 | using OpenSim.Server.Handlers.Base; |
41 | 43 | ||
44 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | ||
45 | |||
42 | namespace OpenSim.Server.Handlers.MapImage | 46 | namespace OpenSim.Server.Handlers.MapImage |
43 | { | 47 | { |
44 | public class MapAddServiceConnector : ServiceConnector | 48 | public class MapAddServiceConnector : ServiceConnector |
45 | { | 49 | { |
50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
51 | |||
46 | private IMapImageService m_MapService; | 52 | private IMapImageService m_MapService; |
53 | private IGridService m_GridService; | ||
47 | private string m_ConfigName = "MapImageService"; | 54 | private string m_ConfigName = "MapImageService"; |
48 | 55 | ||
49 | public MapAddServiceConnector(IConfigSource config, IHttpServer server, string configName) : | 56 | public MapAddServiceConnector(IConfigSource config, IHttpServer server, string configName) : |
@@ -53,16 +60,27 @@ namespace OpenSim.Server.Handlers.MapImage | |||
53 | if (serverConfig == null) | 60 | if (serverConfig == null) |
54 | throw new Exception(String.Format("No section {0} in config file", m_ConfigName)); | 61 | throw new Exception(String.Format("No section {0} in config file", m_ConfigName)); |
55 | 62 | ||
56 | string gridService = serverConfig.GetString("LocalServiceModule", | 63 | string mapService = serverConfig.GetString("LocalServiceModule", |
57 | String.Empty); | 64 | String.Empty); |
58 | 65 | ||
59 | if (gridService == String.Empty) | 66 | if (mapService == String.Empty) |
60 | throw new Exception("No LocalServiceModule in config file"); | 67 | throw new Exception("No LocalServiceModule in config file"); |
61 | 68 | ||
62 | Object[] args = new Object[] { config }; | 69 | Object[] args = new Object[] { config }; |
63 | m_MapService = ServerUtils.LoadPlugin<IMapImageService>(gridService, args); | 70 | m_MapService = ServerUtils.LoadPlugin<IMapImageService>(mapService, args); |
71 | |||
72 | string gridService = serverConfig.GetString("GridService", String.Empty); | ||
73 | if (gridService != string.Empty) | ||
74 | m_GridService = ServerUtils.LoadPlugin<IGridService>(gridService, args); | ||
75 | |||
76 | if (m_GridService != null) | ||
77 | m_log.InfoFormat("[MAP IMAGE HANDLER]: GridService check is ON"); | ||
78 | else | ||
79 | m_log.InfoFormat("[MAP IMAGE HANDLER]: GridService check is OFF"); | ||
80 | |||
81 | bool proxy = serverConfig.GetBoolean("HasProxy", false); | ||
82 | server.AddStreamHandler(new MapServerPostHandler(m_MapService, m_GridService, proxy)); | ||
64 | 83 | ||
65 | server.AddStreamHandler(new MapServerPostHandler(m_MapService)); | ||
66 | } | 84 | } |
67 | } | 85 | } |
68 | 86 | ||
@@ -70,11 +88,15 @@ namespace OpenSim.Server.Handlers.MapImage | |||
70 | { | 88 | { |
71 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 89 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
72 | private IMapImageService m_MapService; | 90 | private IMapImageService m_MapService; |
91 | private IGridService m_GridService; | ||
92 | bool m_Proxy; | ||
73 | 93 | ||
74 | public MapServerPostHandler(IMapImageService service) : | 94 | public MapServerPostHandler(IMapImageService service, IGridService grid, bool proxy) : |
75 | base("POST", "/map") | 95 | base("POST", "/map") |
76 | { | 96 | { |
77 | m_MapService = service; | 97 | m_MapService = service; |
98 | m_GridService = grid; | ||
99 | m_Proxy = proxy; | ||
78 | } | 100 | } |
79 | 101 | ||
80 | public override byte[] Handle(string path, Stream requestData, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) | 102 | public override byte[] Handle(string path, Stream requestData, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) |
@@ -105,6 +127,27 @@ namespace OpenSim.Server.Handlers.MapImage | |||
105 | // if (request.ContainsKey("TYPE")) | 127 | // if (request.ContainsKey("TYPE")) |
106 | // type = request["TYPE"].ToString(); | 128 | // type = request["TYPE"].ToString(); |
107 | 129 | ||
130 | if (m_GridService != null) | ||
131 | { | ||
132 | System.Net.IPAddress ipAddr = GetCallerIP(httpRequest); | ||
133 | GridRegion r = m_GridService.GetRegionByPosition(UUID.Zero, x * (int)Constants.RegionSize, y * (int)Constants.RegionSize); | ||
134 | if (r != null) | ||
135 | { | ||
136 | if (r.ExternalEndPoint.Address.ToString() != ipAddr.ToString()) | ||
137 | { | ||
138 | m_log.WarnFormat("[MAP IMAGE HANDLER]: IP address {0} may be trying to impersonate region in IP {1}", ipAddr, r.ExternalEndPoint.Address); | ||
139 | return FailureResult("IP address of caller does not match IP address of registered region"); | ||
140 | } | ||
141 | |||
142 | } | ||
143 | else | ||
144 | { | ||
145 | m_log.WarnFormat("[MAP IMAGE HANDLER]: IP address {0} may be rogue. Region not found at coordinates {1}-{2}", | ||
146 | ipAddr, x, y); | ||
147 | return FailureResult("Region not found at given coordinates"); | ||
148 | } | ||
149 | } | ||
150 | |||
108 | byte[] data = Convert.FromBase64String(request["DATA"].ToString()); | 151 | byte[] data = Convert.FromBase64String(request["DATA"].ToString()); |
109 | 152 | ||
110 | string reason = string.Empty; | 153 | string reason = string.Empty; |
@@ -183,5 +226,31 @@ namespace OpenSim.Server.Handlers.MapImage | |||
183 | 226 | ||
184 | return ms.ToArray(); | 227 | return ms.ToArray(); |
185 | } | 228 | } |
229 | |||
230 | private System.Net.IPAddress GetCallerIP(IOSHttpRequest request) | ||
231 | { | ||
232 | if (!m_Proxy) | ||
233 | return request.RemoteIPEndPoint.Address; | ||
234 | |||
235 | // We're behind a proxy | ||
236 | string xff = "X-Forwarded-For"; | ||
237 | string xffValue = request.Headers[xff.ToLower()]; | ||
238 | if (xffValue == null || (xffValue != null && xffValue == string.Empty)) | ||
239 | xffValue = request.Headers[xff]; | ||
240 | |||
241 | if (xffValue == null || (xffValue != null && xffValue == string.Empty)) | ||
242 | { | ||
243 | m_log.WarnFormat("[MAP IMAGE HANDLER]: No XFF header"); | ||
244 | return request.RemoteIPEndPoint.Address; | ||
245 | } | ||
246 | |||
247 | System.Net.IPEndPoint ep = Util.GetClientIPFromXFF(xffValue); | ||
248 | if (ep != null) | ||
249 | return ep.Address; | ||
250 | |||
251 | // Oops | ||
252 | return request.RemoteIPEndPoint.Address; | ||
253 | } | ||
254 | |||
186 | } | 255 | } |
187 | } | 256 | } |
diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs index 8f6fa52..d772c39 100644 --- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs | |||
@@ -149,13 +149,16 @@ namespace OpenSim.Server.Handlers.Simulation | |||
149 | 149 | ||
150 | responsedata["int_response_code"] = HttpStatusCode.OK; | 150 | responsedata["int_response_code"] = HttpStatusCode.OK; |
151 | 151 | ||
152 | OSDMap resp = new OSDMap(2); | 152 | OSDMap resp = new OSDMap(3); |
153 | 153 | ||
154 | resp["success"] = OSD.FromBoolean(result); | 154 | resp["success"] = OSD.FromBoolean(result); |
155 | resp["reason"] = OSD.FromString(reason); | 155 | resp["reason"] = OSD.FromString(reason); |
156 | resp["version"] = OSD.FromString(version); | 156 | resp["version"] = OSD.FromString(version); |
157 | 157 | ||
158 | responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp); | 158 | // We must preserve defaults here, otherwise a false "success" will not be put into the JSON map! |
159 | responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp, true); | ||
160 | |||
161 | // Console.WriteLine("str_response_string [{0}]", responsedata["str_response_string"]); | ||
159 | } | 162 | } |
160 | 163 | ||
161 | protected virtual void DoAgentGet(Hashtable request, Hashtable responsedata, UUID id, UUID regionID) | 164 | protected virtual void DoAgentGet(Hashtable request, Hashtable responsedata, UUID id, UUID regionID) |
@@ -569,7 +572,7 @@ namespace OpenSim.Server.Handlers.Simulation | |||
569 | AgentData agent = new AgentData(); | 572 | AgentData agent = new AgentData(); |
570 | try | 573 | try |
571 | { | 574 | { |
572 | agent.Unpack(args, m_SimulationService.GetScene(destination.RegionHandle)); | 575 | agent.Unpack(args, m_SimulationService.GetScene(destination.RegionID)); |
573 | } | 576 | } |
574 | catch (Exception ex) | 577 | catch (Exception ex) |
575 | { | 578 | { |
@@ -589,7 +592,7 @@ namespace OpenSim.Server.Handlers.Simulation | |||
589 | AgentPosition agent = new AgentPosition(); | 592 | AgentPosition agent = new AgentPosition(); |
590 | try | 593 | try |
591 | { | 594 | { |
592 | agent.Unpack(args, m_SimulationService.GetScene(destination.RegionHandle)); | 595 | agent.Unpack(args, m_SimulationService.GetScene(destination.RegionID)); |
593 | } | 596 | } |
594 | catch (Exception ex) | 597 | catch (Exception ex) |
595 | { | 598 | { |
diff --git a/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs b/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs index f0d8f69..a4d03ba 100644 --- a/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs | |||
@@ -161,7 +161,7 @@ namespace OpenSim.Server.Handlers.Simulation | |||
161 | if (args.ContainsKey("extra") && args["extra"] != null) | 161 | if (args.ContainsKey("extra") && args["extra"] != null) |
162 | extraStr = args["extra"].AsString(); | 162 | extraStr = args["extra"].AsString(); |
163 | 163 | ||
164 | IScene s = m_SimulationService.GetScene(destination.RegionHandle); | 164 | IScene s = m_SimulationService.GetScene(destination.RegionID); |
165 | ISceneObject sog = null; | 165 | ISceneObject sog = null; |
166 | try | 166 | try |
167 | { | 167 | { |
diff --git a/OpenSim/Services/AvatarService/AvatarService.cs b/OpenSim/Services/AvatarService/AvatarService.cs index c59a9e0..423c781 100644 --- a/OpenSim/Services/AvatarService/AvatarService.cs +++ b/OpenSim/Services/AvatarService/AvatarService.cs | |||
@@ -93,7 +93,7 @@ namespace OpenSim.Services.AvatarService | |||
93 | if (kvp.Key.StartsWith("_")) | 93 | if (kvp.Key.StartsWith("_")) |
94 | count++; | 94 | count++; |
95 | 95 | ||
96 | m_log.DebugFormat("[AVATAR SERVICE]: SetAvatar for {0}, attachs={1}", principalID, count); | 96 | // m_log.DebugFormat("[AVATAR SERVICE]: SetAvatar for {0}, attachs={1}", principalID, count); |
97 | m_Database.Delete("PrincipalID", principalID.ToString()); | 97 | m_Database.Delete("PrincipalID", principalID.ToString()); |
98 | 98 | ||
99 | AvatarBaseData av = new AvatarBaseData(); | 99 | AvatarBaseData av = new AvatarBaseData(); |
diff --git a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs b/OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs index 2882906..2882906 100644 --- a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs | |||
diff --git a/OpenSim/Services/Connectors/Authentication/AuthenticationServiceConnector.cs b/OpenSim/Services/Connectors/Authentication/AuthenticationServicesConnector.cs index 2b77154..2b77154 100644 --- a/OpenSim/Services/Connectors/Authentication/AuthenticationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Authentication/AuthenticationServicesConnector.cs | |||
diff --git a/OpenSim/Services/Connectors/Authorization/AuthorizationServiceConnector.cs b/OpenSim/Services/Connectors/Authorization/AuthorizationServicesConnector.cs index 35b7109..35b7109 100644 --- a/OpenSim/Services/Connectors/Authorization/AuthorizationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Authorization/AuthorizationServicesConnector.cs | |||
diff --git a/OpenSim/Services/Connectors/Avatar/AvatarServiceConnector.cs b/OpenSim/Services/Connectors/Avatar/AvatarServicesConnector.cs index ddfca57..ddfca57 100644 --- a/OpenSim/Services/Connectors/Avatar/AvatarServiceConnector.cs +++ b/OpenSim/Services/Connectors/Avatar/AvatarServicesConnector.cs | |||
diff --git a/OpenSim/Services/Connectors/Friends/FriendsServiceConnector.cs b/OpenSim/Services/Connectors/Friends/FriendsServicesConnector.cs index b1dd84e..b1dd84e 100644 --- a/OpenSim/Services/Connectors/Friends/FriendsServiceConnector.cs +++ b/OpenSim/Services/Connectors/Friends/FriendsServicesConnector.cs | |||
diff --git a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs b/OpenSim/Services/Connectors/Grid/GridServicesConnector.cs index 7deaf95..f982cc1 100644 --- a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs +++ b/OpenSim/Services/Connectors/Grid/GridServicesConnector.cs | |||
@@ -116,29 +116,36 @@ namespace OpenSim.Services.Connectors | |||
116 | } | 116 | } |
117 | else if (replyData.ContainsKey("Result")&& (replyData["Result"].ToString().ToLower() == "failure")) | 117 | else if (replyData.ContainsKey("Result")&& (replyData["Result"].ToString().ToLower() == "failure")) |
118 | { | 118 | { |
119 | m_log.DebugFormat("[GRID CONNECTOR]: Registration failed: {0}", replyData["Message"].ToString()); | 119 | m_log.ErrorFormat( |
120 | "[GRID CONNECTOR]: Registration failed: {0} when contacting {1}", replyData["Message"], uri); | ||
121 | |||
120 | return replyData["Message"].ToString(); | 122 | return replyData["Message"].ToString(); |
121 | } | 123 | } |
122 | else if (!replyData.ContainsKey("Result")) | 124 | else if (!replyData.ContainsKey("Result")) |
123 | { | 125 | { |
124 | m_log.DebugFormat("[GRID CONNECTOR]: reply data does not contain result field"); | 126 | m_log.ErrorFormat( |
127 | "[GRID CONNECTOR]: reply data does not contain result field when contacting {0}", uri); | ||
125 | } | 128 | } |
126 | else | 129 | else |
127 | { | 130 | { |
128 | m_log.DebugFormat("[GRID CONNECTOR]: unexpected result {0}", replyData["Result"].ToString()); | 131 | m_log.ErrorFormat( |
129 | return "Unexpected result "+replyData["Result"].ToString(); | 132 | "[GRID CONNECTOR]: unexpected result {0} when contacting {1}", replyData["Result"], uri); |
133 | |||
134 | return "Unexpected result " + replyData["Result"].ToString(); | ||
130 | } | 135 | } |
131 | |||
132 | } | 136 | } |
133 | else | 137 | else |
134 | m_log.DebugFormat("[GRID CONNECTOR]: RegisterRegion received null reply"); | 138 | { |
139 | m_log.ErrorFormat( | ||
140 | "[GRID CONNECTOR]: RegisterRegion received null reply when contacting grid server at {0}", uri); | ||
141 | } | ||
135 | } | 142 | } |
136 | catch (Exception e) | 143 | catch (Exception e) |
137 | { | 144 | { |
138 | m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server at {0}: {1}", uri, e.Message); | 145 | m_log.ErrorFormat("[GRID CONNECTOR]: Exception when contacting grid server at {0}: {1}", uri, e.Message); |
139 | } | 146 | } |
140 | 147 | ||
141 | return "Error communicating with grid service"; | 148 | return string.Format("Error communicating with the grid service at {0}", uri); |
142 | } | 149 | } |
143 | 150 | ||
144 | public bool DeregisterRegion(UUID regionID) | 151 | public bool DeregisterRegion(UUID regionID) |
diff --git a/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs b/OpenSim/Services/Connectors/GridUser/GridUserServicesConnector.cs index 20d7eaf..20d7eaf 100644 --- a/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs +++ b/OpenSim/Services/Connectors/GridUser/GridUserServicesConnector.cs | |||
diff --git a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs index bc0bc54..4cd933c 100644 --- a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs | |||
@@ -154,17 +154,32 @@ namespace OpenSim.Services.Connectors.Hypergrid | |||
154 | 154 | ||
155 | UUID mapTile = m_HGMapImage; | 155 | UUID mapTile = m_HGMapImage; |
156 | string filename = string.Empty; | 156 | string filename = string.Empty; |
157 | Bitmap bitmap = null; | 157 | |
158 | try | 158 | try |
159 | { | 159 | { |
160 | WebClient c = new WebClient(); | 160 | WebClient c = new WebClient(); |
161 | //m_log.Debug("JPEG: " + imageURL); | 161 | //m_log.Debug("JPEG: " + imageURL); |
162 | string name = regionID.ToString(); | 162 | string name = regionID.ToString(); |
163 | filename = Path.Combine(storagePath, name + ".jpg"); | 163 | filename = Path.Combine(storagePath, name + ".jpg"); |
164 | c.DownloadFile(imageURL, filename); | 164 | m_log.DebugFormat("[GATEKEEPER SERVICE CONNECTOR]: Map image at {0}, cached at {1}", imageURL, filename); |
165 | bitmap = new Bitmap(filename); | 165 | if (!File.Exists(filename)) |
166 | //m_log.Debug("Size: " + m.PhysicalDimension.Height + "-" + m.PhysicalDimension.Width); | 166 | { |
167 | byte[] imageData = OpenJPEG.EncodeFromImage(bitmap, true); | 167 | m_log.DebugFormat("[GATEKEEPER SERVICE CONNECTOR]: downloading..."); |
168 | c.DownloadFile(imageURL, filename); | ||
169 | } | ||
170 | else | ||
171 | { | ||
172 | m_log.DebugFormat("[GATEKEEPER SERVICE CONNECTOR]: using cached image"); | ||
173 | } | ||
174 | |||
175 | byte[] imageData = null; | ||
176 | |||
177 | using (Bitmap bitmap = new Bitmap(filename)) | ||
178 | { | ||
179 | //m_log.Debug("Size: " + m.PhysicalDimension.Height + "-" + m.PhysicalDimension.Width); | ||
180 | imageData = OpenJPEG.EncodeFromImage(bitmap, true); | ||
181 | } | ||
182 | |||
168 | AssetBase ass = new AssetBase(UUID.Random(), "region " + name, (sbyte)AssetType.Texture, regionID.ToString()); | 183 | AssetBase ass = new AssetBase(UUID.Random(), "region " + name, (sbyte)AssetType.Texture, regionID.ToString()); |
169 | 184 | ||
170 | // !!! for now | 185 | // !!! for now |
diff --git a/OpenSim/Services/Connectors/Hypergrid/HGFriendsServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/HGFriendsServicesConnector.cs index e984a54..e984a54 100644 --- a/OpenSim/Services/Connectors/Hypergrid/HGFriendsServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/HGFriendsServicesConnector.cs | |||
diff --git a/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/HeloServicesConnector.cs index 5c50936..5c50936 100644 --- a/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/HeloServicesConnector.cs | |||
diff --git a/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs b/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs index 9d96703..9d96703 100644 --- a/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs | |||
diff --git a/OpenSim/Services/Connectors/Land/LandServiceConnector.cs b/OpenSim/Services/Connectors/Land/LandServicesConnector.cs index 833e22a..833e22a 100644 --- a/OpenSim/Services/Connectors/Land/LandServiceConnector.cs +++ b/OpenSim/Services/Connectors/Land/LandServicesConnector.cs | |||
diff --git a/OpenSim/Services/Connectors/MapImage/MapImageServiceConnector.cs b/OpenSim/Services/Connectors/MapImage/MapImageServicesConnector.cs index 30bfb70..30bfb70 100644 --- a/OpenSim/Services/Connectors/MapImage/MapImageServiceConnector.cs +++ b/OpenSim/Services/Connectors/MapImage/MapImageServicesConnector.cs | |||
diff --git a/OpenSim/Services/Connectors/Neighbour/NeighbourServiceConnector.cs b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs index 888b072..888b072 100644 --- a/OpenSim/Services/Connectors/Neighbour/NeighbourServiceConnector.cs +++ b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs | |||
diff --git a/OpenSim/Services/Connectors/Presence/PresenceServiceConnector.cs b/OpenSim/Services/Connectors/Presence/PresenceServicesConnector.cs index 378aab6..378aab6 100644 --- a/OpenSim/Services/Connectors/Presence/PresenceServiceConnector.cs +++ b/OpenSim/Services/Connectors/Presence/PresenceServicesConnector.cs | |||
diff --git a/OpenSim/Services/Connectors/Simulation/SimulationDataService.cs b/OpenSim/Services/Connectors/Simulation/SimulationDataService.cs index 620bb10..6db830b 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationDataService.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationDataService.cs | |||
@@ -149,6 +149,21 @@ namespace OpenSim.Services.Connectors | |||
149 | m_database.RemoveRegionWindlightSettings(regionID); | 149 | m_database.RemoveRegionWindlightSettings(regionID); |
150 | } | 150 | } |
151 | 151 | ||
152 | public string LoadRegionEnvironmentSettings(UUID regionUUID) | ||
153 | { | ||
154 | return m_database.LoadRegionEnvironmentSettings(regionUUID); | ||
155 | } | ||
156 | |||
157 | public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings) | ||
158 | { | ||
159 | m_database.StoreRegionEnvironmentSettings(regionUUID, settings); | ||
160 | } | ||
161 | |||
162 | public void RemoveRegionEnvironmentSettings(UUID regionUUID) | ||
163 | { | ||
164 | m_database.RemoveRegionEnvironmentSettings(regionUUID); | ||
165 | } | ||
166 | |||
152 | public UUID[] GetObjectIDs(UUID regionID) | 167 | public UUID[] GetObjectIDs(UUID regionID) |
153 | { | 168 | { |
154 | return m_database.GetObjectIDs(regionID); | 169 | return m_database.GetObjectIDs(regionID); |
diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index 5037543..cd93386 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs | |||
@@ -62,7 +62,7 @@ namespace OpenSim.Services.Connectors.Simulation | |||
62 | //m_Region = region; | 62 | //m_Region = region; |
63 | } | 63 | } |
64 | 64 | ||
65 | public IScene GetScene(ulong regionHandle) | 65 | public IScene GetScene(UUID regionId) |
66 | { | 66 | { |
67 | return null; | 67 | return null; |
68 | } | 68 | } |
@@ -320,29 +320,40 @@ namespace OpenSim.Services.Connectors.Simulation | |||
320 | { | 320 | { |
321 | OSDMap data = (OSDMap)result["_Result"]; | 321 | OSDMap data = (OSDMap)result["_Result"]; |
322 | 322 | ||
323 | // FIXME: If there is a _Result map then it's the success key here that indicates the true success | ||
324 | // or failure, not the sibling result node. | ||
325 | success = data["success"]; | ||
326 | |||
323 | reason = data["reason"].AsString(); | 327 | reason = data["reason"].AsString(); |
324 | if (data["version"] != null && data["version"].AsString() != string.Empty) | 328 | if (data["version"] != null && data["version"].AsString() != string.Empty) |
325 | version = data["version"].AsString(); | 329 | version = data["version"].AsString(); |
326 | 330 | ||
327 | m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess to {0} returned {1} version {2} ({3})", uri, success, version, data["version"].AsString()); | 331 | m_log.DebugFormat( |
332 | "[REMOTE SIMULATION CONNECTOR]: QueryAccess to {0} returned {1}, reason {2}, version {3} ({4})", | ||
333 | uri, success, reason, version, data["version"].AsString()); | ||
328 | } | 334 | } |
329 | 335 | ||
330 | if (!success) | 336 | if (!success) |
331 | { | 337 | { |
332 | if (result.ContainsKey("Message")) | 338 | // If we don't check this then OpenSimulator 0.7.3.1 and some period before will never see the |
339 | // actual failure message | ||
340 | if (!result.ContainsKey("_Result")) | ||
333 | { | 341 | { |
334 | string message = result["Message"].AsString(); | 342 | if (result.ContainsKey("Message")) |
335 | if (message == "Service request failed: [MethodNotAllowed] MethodNotAllowed") // Old style region | ||
336 | { | 343 | { |
337 | m_log.Info("[REMOTE SIMULATION CONNECTOR]: The above web util error was caused by a TP to a sim that doesn't support QUERYACCESS and can be ignored"); | 344 | string message = result["Message"].AsString(); |
338 | return true; | 345 | if (message == "Service request failed: [MethodNotAllowed] MethodNotAllowed") // Old style region |
346 | { | ||
347 | m_log.Info("[REMOTE SIMULATION CONNECTOR]: The above web util error was caused by a TP to a sim that doesn't support QUERYACCESS and can be ignored"); | ||
348 | return true; | ||
349 | } | ||
350 | |||
351 | reason = result["Message"]; | ||
352 | } | ||
353 | else | ||
354 | { | ||
355 | reason = "Communications failure"; | ||
339 | } | 356 | } |
340 | |||
341 | reason = result["Message"]; | ||
342 | } | ||
343 | else | ||
344 | { | ||
345 | reason = "Communications failure"; | ||
346 | } | 357 | } |
347 | 358 | ||
348 | return false; | 359 | return false; |
@@ -356,7 +367,7 @@ namespace OpenSim.Services.Connectors.Simulation | |||
356 | } | 367 | } |
357 | catch (Exception e) | 368 | catch (Exception e) |
358 | { | 369 | { |
359 | m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] QueryAcess failed with exception; {0}",e.ToString()); | 370 | m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] QueryAcesss failed with exception; {0}",e.ToString()); |
360 | } | 371 | } |
361 | 372 | ||
362 | return false; | 373 | return false; |
diff --git a/OpenSim/Services/Connectors/UserAccounts/UserAccountServiceConnector.cs b/OpenSim/Services/Connectors/UserAccounts/UserAccountServicesConnector.cs index 5731e2f..5731e2f 100644 --- a/OpenSim/Services/Connectors/UserAccounts/UserAccountServiceConnector.cs +++ b/OpenSim/Services/Connectors/UserAccounts/UserAccountServicesConnector.cs | |||
diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs index 3dc87bc..8a60ca5 100644 --- a/OpenSim/Services/GridService/GridService.cs +++ b/OpenSim/Services/GridService/GridService.cs | |||
@@ -509,19 +509,21 @@ namespace OpenSim.Services.GridService | |||
509 | return; | 509 | return; |
510 | } | 510 | } |
511 | 511 | ||
512 | MainConsole.Instance.Output("Region Name Region UUID"); | ||
513 | MainConsole.Instance.Output("Location URI"); | ||
514 | MainConsole.Instance.Output("Owner ID Flags"); | ||
515 | MainConsole.Instance.Output("-------------------------------------------------------------------------------"); | ||
516 | foreach (RegionData r in regions) | 512 | foreach (RegionData r in regions) |
517 | { | 513 | { |
518 | OpenSim.Data.RegionFlags flags = (OpenSim.Data.RegionFlags)Convert.ToInt32(r.Data["flags"]); | 514 | OpenSim.Data.RegionFlags flags = (OpenSim.Data.RegionFlags)Convert.ToInt32(r.Data["flags"]); |
519 | MainConsole.Instance.Output(String.Format("{0,-20} {1}\n{2,-20} {3}\n{4,-39} {5}\n\n", | 515 | |
520 | r.RegionName, r.RegionID, | 516 | ConsoleDisplayList dispList = new ConsoleDisplayList(); |
521 | String.Format("{0},{1}", r.posX / Constants.RegionSize, r.posY / Constants.RegionSize), | 517 | dispList.AddRow("Region Name", r.RegionName); |
522 | r.Data["serverURI"], | 518 | dispList.AddRow("Region ID", r.RegionID); |
523 | r.Data["owner_uuid"], flags)); | 519 | dispList.AddRow("Location", string.Format("{0},{1}", r.coordX, r.coordY)); |
520 | dispList.AddRow("URI", r.Data["serverURI"]); | ||
521 | dispList.AddRow("Owner ID", r.Data["owner_uuid"]); | ||
522 | dispList.AddRow("Flags", flags); | ||
523 | |||
524 | MainConsole.Instance.Output(dispList.ToString()); | ||
524 | } | 525 | } |
526 | |||
525 | return; | 527 | return; |
526 | } | 528 | } |
527 | 529 | ||
diff --git a/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs b/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs index b6ec558..53fbea6 100644 --- a/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs +++ b/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs | |||
@@ -107,9 +107,8 @@ namespace OpenSim.Services.HypergridService | |||
107 | public override List<InventoryFolderBase> GetInventorySkeleton(UUID principalID) | 107 | public override List<InventoryFolderBase> GetInventorySkeleton(UUID principalID) |
108 | { | 108 | { |
109 | XInventoryFolder suitcase = GetSuitcaseXFolder(principalID); | 109 | XInventoryFolder suitcase = GetSuitcaseXFolder(principalID); |
110 | XInventoryFolder root = GetRootXFolder(principalID); | ||
111 | 110 | ||
112 | List<XInventoryFolder> tree = GetFolderTree(suitcase.folderID); | 111 | List<XInventoryFolder> tree = GetFolderTree(principalID, suitcase.folderID); |
113 | if (tree == null || (tree != null && tree.Count == 0)) | 112 | if (tree == null || (tree != null && tree.Count == 0)) |
114 | return null; | 113 | return null; |
115 | 114 | ||
@@ -119,7 +118,7 @@ namespace OpenSim.Services.HypergridService | |||
119 | folders.Add(ConvertToOpenSim(x)); | 118 | folders.Add(ConvertToOpenSim(x)); |
120 | } | 119 | } |
121 | 120 | ||
122 | SetAsRootFolder(suitcase, root); | 121 | SetAsNormalFolder(suitcase); |
123 | folders.Add(ConvertToOpenSim(suitcase)); | 122 | folders.Add(ConvertToOpenSim(suitcase)); |
124 | 123 | ||
125 | return folders; | 124 | return folders; |
@@ -134,12 +133,11 @@ namespace OpenSim.Services.HypergridService | |||
134 | userInventory.Items = new List<InventoryItemBase>(); | 133 | userInventory.Items = new List<InventoryItemBase>(); |
135 | 134 | ||
136 | XInventoryFolder suitcase = GetSuitcaseXFolder(userID); | 135 | XInventoryFolder suitcase = GetSuitcaseXFolder(userID); |
137 | XInventoryFolder root = GetRootXFolder(userID); | ||
138 | 136 | ||
139 | List<XInventoryFolder> tree = GetFolderTree(suitcase.folderID); | 137 | List<XInventoryFolder> tree = GetFolderTree(userID, suitcase.folderID); |
140 | if (tree == null || (tree != null && tree.Count == 0)) | 138 | if (tree == null || (tree != null && tree.Count == 0)) |
141 | { | 139 | { |
142 | SetAsRootFolder(suitcase, root); | 140 | SetAsNormalFolder(suitcase); |
143 | userInventory.Folders.Add(ConvertToOpenSim(suitcase)); | 141 | userInventory.Folders.Add(ConvertToOpenSim(suitcase)); |
144 | return userInventory; | 142 | return userInventory; |
145 | } | 143 | } |
@@ -164,7 +162,7 @@ namespace OpenSim.Services.HypergridService | |||
164 | userInventory.Items.AddRange(items); | 162 | userInventory.Items.AddRange(items); |
165 | } | 163 | } |
166 | 164 | ||
167 | SetAsRootFolder(suitcase, root); | 165 | SetAsNormalFolder(suitcase); |
168 | userInventory.Folders.Add(ConvertToOpenSim(suitcase)); | 166 | userInventory.Folders.Add(ConvertToOpenSim(suitcase)); |
169 | 167 | ||
170 | m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: GetUserInventory for user {0} returning {1} folders and {2} items", | 168 | m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: GetUserInventory for user {0} returning {1} folders and {2} items", |
@@ -175,14 +173,13 @@ namespace OpenSim.Services.HypergridService | |||
175 | public override InventoryFolderBase GetRootFolder(UUID principalID) | 173 | public override InventoryFolderBase GetRootFolder(UUID principalID) |
176 | { | 174 | { |
177 | m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: GetRootFolder for {0}", principalID); | 175 | m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: GetRootFolder for {0}", principalID); |
178 | if (m_Database == null) | ||
179 | m_log.ErrorFormat("[XXX]: m_Database is NULL!"); | ||
180 | 176 | ||
181 | // Let's find out the local root folder | 177 | // Let's find out the local root folder |
182 | XInventoryFolder root = GetRootXFolder(principalID); ; | 178 | XInventoryFolder root = GetRootXFolder(principalID); ; |
183 | if (root == null) | 179 | if (root == null) |
184 | { | 180 | { |
185 | m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: Unable to retrieve local root folder for user {0}", principalID); | 181 | m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: Unable to retrieve local root folder for user {0}", principalID); |
182 | return null; | ||
186 | } | 183 | } |
187 | 184 | ||
188 | // Warp! Root folder for travelers is the suitcase folder | 185 | // Warp! Root folder for travelers is the suitcase folder |
@@ -202,7 +199,7 @@ namespace OpenSim.Services.HypergridService | |||
202 | CreateSystemFolders(principalID, suitcase.folderID); | 199 | CreateSystemFolders(principalID, suitcase.folderID); |
203 | } | 200 | } |
204 | 201 | ||
205 | SetAsRootFolder(suitcase, root); | 202 | SetAsNormalFolder(suitcase); |
206 | 203 | ||
207 | return ConvertToOpenSim(suitcase); | 204 | return ConvertToOpenSim(suitcase); |
208 | } | 205 | } |
@@ -271,9 +268,8 @@ namespace OpenSim.Services.HypergridService | |||
271 | public override InventoryCollection GetFolderContent(UUID principalID, UUID folderID) | 268 | public override InventoryCollection GetFolderContent(UUID principalID, UUID folderID) |
272 | { | 269 | { |
273 | InventoryCollection coll = null; | 270 | InventoryCollection coll = null; |
274 | XInventoryFolder suitcase = GetSuitcaseXFolder(principalID); | ||
275 | 271 | ||
276 | if (!IsWithinSuitcaseTree(folderID, suitcase)) | 272 | if (!IsWithinSuitcaseTree(principalID, folderID)) |
277 | return new InventoryCollection(); | 273 | return new InventoryCollection(); |
278 | 274 | ||
279 | coll = base.GetFolderContent(principalID, folderID); | 275 | coll = base.GetFolderContent(principalID, folderID); |
@@ -290,9 +286,7 @@ namespace OpenSim.Services.HypergridService | |||
290 | { | 286 | { |
291 | // Let's do a bit of sanity checking, more than the base service does | 287 | // Let's do a bit of sanity checking, more than the base service does |
292 | // make sure the given folder exists under the suitcase tree of this user | 288 | // make sure the given folder exists under the suitcase tree of this user |
293 | XInventoryFolder suitcase = GetSuitcaseXFolder(principalID); | 289 | if (!IsWithinSuitcaseTree(principalID, folderID)) |
294 | |||
295 | if (!IsWithinSuitcaseTree(folderID, suitcase)) | ||
296 | return new List<InventoryItemBase>(); | 290 | return new List<InventoryItemBase>(); |
297 | 291 | ||
298 | return base.GetFolderItems(principalID, folderID); | 292 | return base.GetFolderItems(principalID, folderID); |
@@ -303,21 +297,27 @@ namespace OpenSim.Services.HypergridService | |||
303 | m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: AddFolder {0} {1}", folder.Name, folder.ParentID); | 297 | m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: AddFolder {0} {1}", folder.Name, folder.ParentID); |
304 | // Let's do a bit of sanity checking, more than the base service does | 298 | // Let's do a bit of sanity checking, more than the base service does |
305 | // make sure the given folder's parent folder exists under the suitcase tree of this user | 299 | // make sure the given folder's parent folder exists under the suitcase tree of this user |
306 | XInventoryFolder suitcase = GetSuitcaseXFolder(folder.Owner); | ||
307 | 300 | ||
308 | if (!IsWithinSuitcaseTree(folder.ParentID, suitcase)) | 301 | if (!IsWithinSuitcaseTree(folder.Owner, folder.ParentID)) |
309 | return false; | 302 | return false; |
310 | 303 | ||
311 | // OK, it's legit | 304 | // OK, it's legit |
312 | return base.AddFolder(folder); | 305 | if (base.AddFolder(folder)) |
306 | { | ||
307 | List<XInventoryFolder> tree; | ||
308 | if (m_SuitcaseTrees.TryGetValue(folder.Owner, out tree)) | ||
309 | tree.Add(ConvertFromOpenSim(folder)); | ||
310 | |||
311 | return true; | ||
312 | } | ||
313 | |||
314 | return false; | ||
313 | } | 315 | } |
314 | 316 | ||
315 | public override bool UpdateFolder(InventoryFolderBase folder) | 317 | public override bool UpdateFolder(InventoryFolderBase folder) |
316 | { | 318 | { |
317 | XInventoryFolder suitcase = GetSuitcaseXFolder(folder.Owner); | ||
318 | |||
319 | m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: Update folder {0}, version {1}", folder.ID, folder.Version); | 319 | m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: Update folder {0}, version {1}", folder.ID, folder.Version); |
320 | if (!IsWithinSuitcaseTree(folder.ID, suitcase)) | 320 | if (!IsWithinSuitcaseTree(folder.Owner, folder.ID)) |
321 | { | 321 | { |
322 | m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: folder {0} not within Suitcase tree", folder.Name); | 322 | m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: folder {0} not within Suitcase tree", folder.Name); |
323 | return false; | 323 | return false; |
@@ -329,9 +329,8 @@ namespace OpenSim.Services.HypergridService | |||
329 | 329 | ||
330 | public override bool MoveFolder(InventoryFolderBase folder) | 330 | public override bool MoveFolder(InventoryFolderBase folder) |
331 | { | 331 | { |
332 | XInventoryFolder suitcase = GetSuitcaseXFolder(folder.Owner); | 332 | if (!IsWithinSuitcaseTree(folder.Owner, folder.ID) || |
333 | 333 | !IsWithinSuitcaseTree(folder.Owner, folder.ParentID)) | |
334 | if (!IsWithinSuitcaseTree(folder.ID, suitcase) || !IsWithinSuitcaseTree(folder.ParentID, suitcase)) | ||
335 | return false; | 334 | return false; |
336 | 335 | ||
337 | return base.MoveFolder(folder); | 336 | return base.MoveFolder(folder); |
@@ -353,9 +352,7 @@ namespace OpenSim.Services.HypergridService | |||
353 | { | 352 | { |
354 | // Let's do a bit of sanity checking, more than the base service does | 353 | // Let's do a bit of sanity checking, more than the base service does |
355 | // make sure the given folder's parent folder exists under the suitcase tree of this user | 354 | // make sure the given folder's parent folder exists under the suitcase tree of this user |
356 | XInventoryFolder suitcase = GetSuitcaseXFolder(item.Owner); | 355 | if (!IsWithinSuitcaseTree(item.Owner, item.Folder)) |
357 | |||
358 | if (!IsWithinSuitcaseTree(item.Folder, suitcase)) | ||
359 | return false; | 356 | return false; |
360 | 357 | ||
361 | // OK, it's legit | 358 | // OK, it's legit |
@@ -365,9 +362,7 @@ namespace OpenSim.Services.HypergridService | |||
365 | 362 | ||
366 | public override bool UpdateItem(InventoryItemBase item) | 363 | public override bool UpdateItem(InventoryItemBase item) |
367 | { | 364 | { |
368 | XInventoryFolder suitcase = GetSuitcaseXFolder(item.Owner); | 365 | if (!IsWithinSuitcaseTree(item.Owner, item.Folder)) |
369 | |||
370 | if (!IsWithinSuitcaseTree(item.Folder, suitcase)) | ||
371 | return false; | 366 | return false; |
372 | 367 | ||
373 | return base.UpdateItem(item); | 368 | return base.UpdateItem(item); |
@@ -377,9 +372,7 @@ namespace OpenSim.Services.HypergridService | |||
377 | { | 372 | { |
378 | // Principal is b0rked. *sigh* | 373 | // Principal is b0rked. *sigh* |
379 | 374 | ||
380 | XInventoryFolder suitcase = GetSuitcaseXFolder(items[0].Owner); | 375 | if (!IsWithinSuitcaseTree(items[0].Owner, items[0].Folder)) |
381 | |||
382 | if (!IsWithinSuitcaseTree(items[0].Folder, suitcase)) | ||
383 | return false; | 376 | return false; |
384 | 377 | ||
385 | return base.MoveItems(principalID, items); | 378 | return base.MoveItems(principalID, items); |
@@ -400,15 +393,8 @@ namespace OpenSim.Services.HypergridService | |||
400 | item.Name, item.ID, item.Folder); | 393 | item.Name, item.ID, item.Folder); |
401 | return null; | 394 | return null; |
402 | } | 395 | } |
403 | XInventoryFolder suitcase = GetSuitcaseXFolder(it.Owner); | ||
404 | if (suitcase == null) | ||
405 | { | ||
406 | m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: Root or Suitcase are null for user {0}", | ||
407 | it.Owner); | ||
408 | return null; | ||
409 | } | ||
410 | 396 | ||
411 | if (!IsWithinSuitcaseTree(it.Folder, suitcase)) | 397 | if (!IsWithinSuitcaseTree(it.Owner, it.Folder)) |
412 | { | 398 | { |
413 | m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: Item {0} (folder {1}) is not within Suitcase", | 399 | m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: Item {0} (folder {1}) is not within Suitcase", |
414 | it.Name, it.Folder); | 400 | it.Name, it.Folder); |
@@ -431,9 +417,7 @@ namespace OpenSim.Services.HypergridService | |||
431 | 417 | ||
432 | if (f != null) | 418 | if (f != null) |
433 | { | 419 | { |
434 | XInventoryFolder suitcase = GetSuitcaseXFolder(f.Owner); | 420 | if (!IsWithinSuitcaseTree(f.Owner, f.ID)) |
435 | |||
436 | if (!IsWithinSuitcaseTree(f.ID, suitcase)) | ||
437 | return null; | 421 | return null; |
438 | } | 422 | } |
439 | 423 | ||
@@ -481,22 +465,37 @@ namespace OpenSim.Services.HypergridService | |||
481 | 465 | ||
482 | if (folders != null && folders.Length > 0) | 466 | if (folders != null && folders.Length > 0) |
483 | return folders[0]; | 467 | return folders[0]; |
468 | |||
469 | // check to see if we have the old Suitcase folder | ||
470 | folders = m_Database.GetFolders( | ||
471 | new string[] { "agentID", "folderName", "parentFolderID" }, | ||
472 | new string[] { principalID.ToString(), "My Suitcase", UUID.Zero.ToString() }); | ||
473 | if (folders != null && folders.Length > 0) | ||
474 | { | ||
475 | // Move it to under the root folder | ||
476 | XInventoryFolder root = GetRootXFolder(principalID); | ||
477 | folders[0].parentFolderID = root.folderID; | ||
478 | folders[0].type = 100; | ||
479 | m_Database.StoreFolder(folders[0]); | ||
480 | return folders[0]; | ||
481 | } | ||
482 | |||
484 | return null; | 483 | return null; |
485 | } | 484 | } |
486 | 485 | ||
487 | private void SetAsRootFolder(XInventoryFolder suitcase, XInventoryFolder root) | 486 | private void SetAsNormalFolder(XInventoryFolder suitcase) |
488 | { | 487 | { |
489 | suitcase.type = (short)AssetType.Folder; | 488 | suitcase.type = (short)AssetType.Folder; |
490 | } | 489 | } |
491 | 490 | ||
492 | private List<XInventoryFolder> GetFolderTree(UUID folder) | 491 | private List<XInventoryFolder> GetFolderTree(UUID principalID, UUID folder) |
493 | { | 492 | { |
494 | List<XInventoryFolder> t = null; | 493 | List<XInventoryFolder> t = null; |
495 | if (m_SuitcaseTrees.TryGetValue(folder, out t)) | 494 | if (m_SuitcaseTrees.TryGetValue(principalID, out t)) |
496 | return t; | 495 | return t; |
497 | 496 | ||
498 | t = GetFolderTreeRecursive(folder); | 497 | t = GetFolderTreeRecursive(folder); |
499 | m_SuitcaseTrees.AddOrUpdate(folder, t, 120); | 498 | m_SuitcaseTrees.AddOrUpdate(principalID, t, 5*60); // 5minutes |
500 | return t; | 499 | return t; |
501 | } | 500 | } |
502 | 501 | ||
@@ -528,11 +527,18 @@ namespace OpenSim.Services.HypergridService | |||
528 | /// <param name="root"></param> | 527 | /// <param name="root"></param> |
529 | /// <param name="suitcase"></param> | 528 | /// <param name="suitcase"></param> |
530 | /// <returns></returns> | 529 | /// <returns></returns> |
531 | private bool IsWithinSuitcaseTree(UUID folderID, XInventoryFolder suitcase) | 530 | private bool IsWithinSuitcaseTree(UUID principalID, UUID folderID) |
532 | { | 531 | { |
532 | XInventoryFolder suitcase = GetSuitcaseXFolder(principalID); | ||
533 | if (suitcase == null) | ||
534 | { | ||
535 | m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: User {0} does not have a Suitcase folder", principalID); | ||
536 | return false; | ||
537 | } | ||
538 | |||
533 | List<XInventoryFolder> tree = new List<XInventoryFolder>(); | 539 | List<XInventoryFolder> tree = new List<XInventoryFolder>(); |
534 | tree.Add(suitcase); // Warp! the tree is the real root folder plus the children of the suitcase folder | 540 | tree.Add(suitcase); // Warp! the tree is the real root folder plus the children of the suitcase folder |
535 | tree.AddRange(GetFolderTree(suitcase.folderID)); | 541 | tree.AddRange(GetFolderTree(principalID, suitcase.folderID)); |
536 | XInventoryFolder f = tree.Find(delegate(XInventoryFolder fl) | 542 | XInventoryFolder f = tree.Find(delegate(XInventoryFolder fl) |
537 | { | 543 | { |
538 | if (fl.folderID == folderID) return true; | 544 | if (fl.folderID == folderID) return true; |
diff --git a/OpenSim/Services/Interfaces/ISimulationService.cs b/OpenSim/Services/Interfaces/ISimulationService.cs index 7940256..d9f242b 100644 --- a/OpenSim/Services/Interfaces/ISimulationService.cs +++ b/OpenSim/Services/Interfaces/ISimulationService.cs | |||
@@ -35,7 +35,17 @@ namespace OpenSim.Services.Interfaces | |||
35 | { | 35 | { |
36 | public interface ISimulationService | 36 | public interface ISimulationService |
37 | { | 37 | { |
38 | IScene GetScene(ulong regionHandle); | 38 | /// <summary> |
39 | /// Retrieve the scene with the given region ID. | ||
40 | /// </summary> | ||
41 | /// <param name='regionId'> | ||
42 | /// Region identifier. | ||
43 | /// </param> | ||
44 | /// <returns> | ||
45 | /// The scene. | ||
46 | /// </returns> | ||
47 | IScene GetScene(UUID regionId); | ||
48 | |||
39 | ISimulationService GetInnerService(); | 49 | ISimulationService GetInnerService(); |
40 | 50 | ||
41 | #region Agents | 51 | #region Agents |
diff --git a/OpenSim/Services/InventoryService/XInventoryService.cs b/OpenSim/Services/InventoryService/XInventoryService.cs index 0e7a358..7518b86 100644 --- a/OpenSim/Services/InventoryService/XInventoryService.cs +++ b/OpenSim/Services/InventoryService/XInventoryService.cs | |||
@@ -52,6 +52,7 @@ namespace OpenSim.Services.InventoryService | |||
52 | : this(config, "InventoryService") | 52 | : this(config, "InventoryService") |
53 | { | 53 | { |
54 | } | 54 | } |
55 | |||
55 | public XInventoryService(IConfigSource config, string configName) : base(config) | 56 | public XInventoryService(IConfigSource config, string configName) : base(config) |
56 | { | 57 | { |
57 | if (configName != string.Empty) | 58 | if (configName != string.Empty) |
@@ -301,46 +302,62 @@ namespace OpenSim.Services.InventoryService | |||
301 | 302 | ||
302 | public virtual bool AddFolder(InventoryFolderBase folder) | 303 | public virtual bool AddFolder(InventoryFolderBase folder) |
303 | { | 304 | { |
304 | //m_log.DebugFormat("[XINVENTORY]: Add folder {0} type {1} in parent {2}", folder.Name, folder.Type, folder.ParentID); | 305 | // m_log.DebugFormat("[XINVENTORY]: Add folder {0} type {1} in parent {2}", folder.Name, folder.Type, folder.ParentID); |
306 | |||
305 | InventoryFolderBase check = GetFolder(folder); | 307 | InventoryFolderBase check = GetFolder(folder); |
306 | if (check != null) | 308 | if (check != null) |
307 | return false; | 309 | return false; |
308 | 310 | ||
309 | if (folder.Type == (short)AssetType.Folder || folder.Type == (short)AssetType.Unknown || | 311 | if (folder.Type == (short)AssetType.Folder |
310 | GetFolderForType(folder.Owner, (AssetType)(folder.Type)) == null) | 312 | || folder.Type == (short)AssetType.Unknown |
313 | || folder.Type == (short)AssetType.OutfitFolder | ||
314 | || GetFolderForType(folder.Owner, (AssetType)(folder.Type)) == null) | ||
311 | { | 315 | { |
312 | XInventoryFolder xFolder = ConvertFromOpenSim(folder); | 316 | XInventoryFolder xFolder = ConvertFromOpenSim(folder); |
313 | return m_Database.StoreFolder(xFolder); | 317 | return m_Database.StoreFolder(xFolder); |
314 | } | 318 | } |
315 | else | 319 | else |
316 | m_log.DebugFormat("[XINVENTORY]: Folder {0} of type {1} already exists", folder.Name, folder.Type); | 320 | { |
321 | m_log.WarnFormat( | ||
322 | "[XINVENTORY]: Folder of type {0} already exists when tried to add {1} to {2} for {3}", | ||
323 | folder.Type, folder.Name, folder.ParentID, folder.Owner); | ||
324 | } | ||
317 | 325 | ||
318 | return false; | 326 | return false; |
319 | } | 327 | } |
320 | 328 | ||
321 | public virtual bool UpdateFolder(InventoryFolderBase folder) | 329 | public virtual bool UpdateFolder(InventoryFolderBase folder) |
322 | { | 330 | { |
323 | //m_log.DebugFormat("[XINVENTORY]: Update folder {0} {1} ({2})", folder.Name, folder.Type, folder.ID); | 331 | // m_log.DebugFormat("[XINVENTORY]: Update folder {0} {1} ({2})", folder.Name, folder.Type, folder.ID); |
332 | |||
324 | XInventoryFolder xFolder = ConvertFromOpenSim(folder); | 333 | XInventoryFolder xFolder = ConvertFromOpenSim(folder); |
325 | InventoryFolderBase check = GetFolder(folder); | 334 | InventoryFolderBase check = GetFolder(folder); |
335 | |||
326 | if (check == null) | 336 | if (check == null) |
327 | return AddFolder(folder); | 337 | return AddFolder(folder); |
328 | 338 | ||
329 | if (check.Type != -1 || xFolder.type != -1) | 339 | if ((check.Type != (short)AssetType.Unknown || xFolder.type != (short)AssetType.Unknown) |
340 | && (check.Type != (short)AssetType.OutfitFolder || xFolder.type != (short)AssetType.OutfitFolder)) | ||
330 | { | 341 | { |
331 | if (xFolder.version < check.Version) | 342 | if (xFolder.version < check.Version) |
332 | { | 343 | { |
333 | //m_log.DebugFormat("[XINVENTORY]: {0} < {1} can't do", xFolder.version, check.Version); | 344 | // m_log.DebugFormat("[XINVENTORY]: {0} < {1} can't do", xFolder.version, check.Version); |
334 | return false; | 345 | return false; |
335 | } | 346 | } |
347 | |||
336 | check.Version = (ushort)xFolder.version; | 348 | check.Version = (ushort)xFolder.version; |
337 | xFolder = ConvertFromOpenSim(check); | 349 | xFolder = ConvertFromOpenSim(check); |
338 | //m_log.DebugFormat("[XINVENTORY]: Storing {0} {1} {2}", xFolder.folderName, xFolder.version, xFolder.type); | 350 | |
351 | // m_log.DebugFormat( | ||
352 | // "[XINVENTORY]: Storing version only update to system folder {0} {1} {2}", | ||
353 | // xFolder.folderName, xFolder.version, xFolder.type); | ||
354 | |||
339 | return m_Database.StoreFolder(xFolder); | 355 | return m_Database.StoreFolder(xFolder); |
340 | } | 356 | } |
341 | 357 | ||
342 | if (xFolder.version < check.Version) | 358 | if (xFolder.version < check.Version) |
343 | xFolder.version = check.Version; | 359 | xFolder.version = check.Version; |
360 | |||
344 | xFolder.folderID = check.ID; | 361 | xFolder.folderID = check.ID; |
345 | 362 | ||
346 | return m_Database.StoreFolder(xFolder); | 363 | return m_Database.StoreFolder(xFolder); |
@@ -364,6 +381,11 @@ namespace OpenSim.Services.InventoryService | |||
364 | // | 381 | // |
365 | public virtual bool DeleteFolders(UUID principalID, List<UUID> folderIDs) | 382 | public virtual bool DeleteFolders(UUID principalID, List<UUID> folderIDs) |
366 | { | 383 | { |
384 | return DeleteFolders(principalID, folderIDs, true); | ||
385 | } | ||
386 | |||
387 | public virtual bool DeleteFolders(UUID principalID, List<UUID> folderIDs, bool onlyIfTrash) | ||
388 | { | ||
367 | if (!m_AllowDelete) | 389 | if (!m_AllowDelete) |
368 | return false; | 390 | return false; |
369 | 391 | ||
@@ -371,11 +393,12 @@ namespace OpenSim.Services.InventoryService | |||
371 | // | 393 | // |
372 | foreach (UUID id in folderIDs) | 394 | foreach (UUID id in folderIDs) |
373 | { | 395 | { |
374 | if (!ParentIsTrash(id)) | 396 | if (onlyIfTrash && !ParentIsTrash(id)) |
375 | continue; | 397 | continue; |
398 | //m_log.InfoFormat("[XINVENTORY SERVICE]: Delete folder {0}", id); | ||
376 | InventoryFolderBase f = new InventoryFolderBase(); | 399 | InventoryFolderBase f = new InventoryFolderBase(); |
377 | f.ID = id; | 400 | f.ID = id; |
378 | PurgeFolder(f); | 401 | PurgeFolder(f, onlyIfTrash); |
379 | m_Database.DeleteFolders("folderID", id.ToString()); | 402 | m_Database.DeleteFolders("folderID", id.ToString()); |
380 | } | 403 | } |
381 | 404 | ||
@@ -384,10 +407,15 @@ namespace OpenSim.Services.InventoryService | |||
384 | 407 | ||
385 | public virtual bool PurgeFolder(InventoryFolderBase folder) | 408 | public virtual bool PurgeFolder(InventoryFolderBase folder) |
386 | { | 409 | { |
410 | return PurgeFolder(folder, true); | ||
411 | } | ||
412 | |||
413 | public virtual bool PurgeFolder(InventoryFolderBase folder, bool onlyIfTrash) | ||
414 | { | ||
387 | if (!m_AllowDelete) | 415 | if (!m_AllowDelete) |
388 | return false; | 416 | return false; |
389 | 417 | ||
390 | if (!ParentIsTrash(folder.ID)) | 418 | if (onlyIfTrash && !ParentIsTrash(folder.ID)) |
391 | return false; | 419 | return false; |
392 | 420 | ||
393 | XInventoryFolder[] subFolders = m_Database.GetFolders( | 421 | XInventoryFolder[] subFolders = m_Database.GetFolders( |
@@ -396,7 +424,7 @@ namespace OpenSim.Services.InventoryService | |||
396 | 424 | ||
397 | foreach (XInventoryFolder x in subFolders) | 425 | foreach (XInventoryFolder x in subFolders) |
398 | { | 426 | { |
399 | PurgeFolder(ConvertToOpenSim(x)); | 427 | PurgeFolder(ConvertToOpenSim(x), onlyIfTrash); |
400 | m_Database.DeleteFolders("folderID", x.folderID.ToString()); | 428 | m_Database.DeleteFolders("folderID", x.folderID.ToString()); |
401 | } | 429 | } |
402 | 430 | ||
@@ -408,14 +436,13 @@ namespace OpenSim.Services.InventoryService | |||
408 | public virtual bool AddItem(InventoryItemBase item) | 436 | public virtual bool AddItem(InventoryItemBase item) |
409 | { | 437 | { |
410 | // m_log.DebugFormat( | 438 | // m_log.DebugFormat( |
411 | // "[XINVENTORY SERVICE]: Adding item {0} to folder {1} for {2}", item.ID, item.Folder, item.Owner); | 439 | // "[XINVENTORY SERVICE]: Adding item {0} {1} to folder {2} for {3}", item.Name, item.ID, item.Folder, item.Owner); |
412 | 440 | ||
413 | return m_Database.StoreItem(ConvertFromOpenSim(item)); | 441 | return m_Database.StoreItem(ConvertFromOpenSim(item)); |
414 | } | 442 | } |
415 | 443 | ||
416 | public virtual bool UpdateItem(InventoryItemBase item) | 444 | public virtual bool UpdateItem(InventoryItemBase item) |
417 | { | 445 | { |
418 | // throw new Exception("urrgh"); | ||
419 | if (!m_AllowDelete) | 446 | if (!m_AllowDelete) |
420 | if (item.AssetType == (sbyte)AssetType.Link || item.AssetType == (sbyte)AssetType.LinkFolder) | 447 | if (item.AssetType == (sbyte)AssetType.Link || item.AssetType == (sbyte)AssetType.LinkFolder) |
421 | return false; | 448 | return false; |
diff --git a/OpenSim/Services/LLLoginService/LLLoginResponse.cs b/OpenSim/Services/LLLoginService/LLLoginResponse.cs index 079bcb1..a4b3cbd 100644 --- a/OpenSim/Services/LLLoginService/LLLoginResponse.cs +++ b/OpenSim/Services/LLLoginService/LLLoginResponse.cs | |||
@@ -231,7 +231,8 @@ namespace OpenSim.Services.LLLoginService | |||
231 | public LLLoginResponse(UserAccount account, AgentCircuitData aCircuit, GridUserInfo pinfo, | 231 | public LLLoginResponse(UserAccount account, AgentCircuitData aCircuit, GridUserInfo pinfo, |
232 | GridRegion destination, List<InventoryFolderBase> invSkel, FriendInfo[] friendsList, ILibraryService libService, | 232 | GridRegion destination, List<InventoryFolderBase> invSkel, FriendInfo[] friendsList, ILibraryService libService, |
233 | string where, string startlocation, Vector3 position, Vector3 lookAt, List<InventoryItemBase> gestures, string message, | 233 | string where, string startlocation, Vector3 position, Vector3 lookAt, List<InventoryItemBase> gestures, string message, |
234 | GridRegion home, IPEndPoint clientIP, string mapTileURL, string profileURL, string openIDURL, string searchURL, string currency) | 234 | GridRegion home, IPEndPoint clientIP, string mapTileURL, string profileURL, string openIDURL, string searchURL, string currency, |
235 | string DSTZone) | ||
235 | : this() | 236 | : this() |
236 | { | 237 | { |
237 | FillOutInventoryData(invSkel, libService); | 238 | FillOutInventoryData(invSkel, libService); |
@@ -260,7 +261,45 @@ namespace OpenSim.Services.LLLoginService | |||
260 | FillOutRegionData(destination); | 261 | FillOutRegionData(destination); |
261 | 262 | ||
262 | FillOutSeedCap(aCircuit, destination, clientIP); | 263 | FillOutSeedCap(aCircuit, destination, clientIP); |
263 | 264 | ||
265 | switch (DSTZone) | ||
266 | { | ||
267 | case "none": | ||
268 | DST = "N"; | ||
269 | break; | ||
270 | case "local": | ||
271 | DST = TimeZone.CurrentTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; | ||
272 | break; | ||
273 | default: | ||
274 | TimeZoneInfo dstTimeZone = null; | ||
275 | string[] tzList = DSTZone.Split(';'); | ||
276 | |||
277 | foreach (string tzName in tzList) | ||
278 | { | ||
279 | try | ||
280 | { | ||
281 | dstTimeZone = TimeZoneInfo.FindSystemTimeZoneById(tzName); | ||
282 | } | ||
283 | catch | ||
284 | { | ||
285 | continue; | ||
286 | } | ||
287 | break; | ||
288 | } | ||
289 | |||
290 | if (dstTimeZone == null) | ||
291 | { | ||
292 | m_log.WarnFormat( | ||
293 | "[LLOGIN RESPONSE]: No valid timezone found for DST in {0}, falling back to system time.", tzList); | ||
294 | DST = TimeZone.CurrentTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; | ||
295 | } | ||
296 | else | ||
297 | { | ||
298 | DST = dstTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; | ||
299 | } | ||
300 | |||
301 | break; | ||
302 | } | ||
264 | } | 303 | } |
265 | 304 | ||
266 | private void FillOutInventoryData(List<InventoryFolderBase> invSkel, ILibraryService libService) | 305 | private void FillOutInventoryData(List<InventoryFolderBase> invSkel, ILibraryService libService) |
@@ -355,7 +394,31 @@ namespace OpenSim.Services.LLLoginService | |||
355 | 394 | ||
356 | private void SetDefaultValues() | 395 | private void SetDefaultValues() |
357 | { | 396 | { |
358 | DST = TimeZone.CurrentTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; | 397 | TimeZoneInfo gridTimeZone; |
398 | |||
399 | // Disabled for now pending making timezone a config value, which can at some point have a default of | ||
400 | // a ; separated list of possible timezones. | ||
401 | // The problem here is that US/Pacific (or even the Olsen America/Los_Angeles) is not universal across | ||
402 | // windows, mac and various distributions of linux, introducing another element of consistency. | ||
403 | // The server operator needs to be able to control this setting | ||
404 | // try | ||
405 | // { | ||
406 | // // First try to fetch DST from Pacific Standard Time, because this is | ||
407 | // // the one expected by the viewer. "US/Pacific" is the string to search | ||
408 | // // on linux and mac, and should work also on Windows (to confirm) | ||
409 | // gridTimeZone = TimeZoneInfo.FindSystemTimeZoneById("US/Pacific"); | ||
410 | // } | ||
411 | // catch (Exception e) | ||
412 | // { | ||
413 | // m_log.WarnFormat( | ||
414 | // "[TIMEZONE]: {0} Falling back to system time. System time should be set to Pacific Standard Time to provide the expected time", | ||
415 | // e.Message); | ||
416 | |||
417 | gridTimeZone = TimeZoneInfo.Local; | ||
418 | // } | ||
419 | |||
420 | DST = gridTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; | ||
421 | |||
359 | StipendSinceLogin = "N"; | 422 | StipendSinceLogin = "N"; |
360 | Gendered = "Y"; | 423 | Gendered = "Y"; |
361 | EverLoggedIn = "Y"; | 424 | EverLoggedIn = "Y"; |
diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs index 891c452..06e05a9 100644 --- a/OpenSim/Services/LLLoginService/LLLoginService.cs +++ b/OpenSim/Services/LLLoginService/LLLoginService.cs | |||
@@ -82,6 +82,8 @@ namespace OpenSim.Services.LLLoginService | |||
82 | protected string m_AllowedClients; | 82 | protected string m_AllowedClients; |
83 | protected string m_DeniedClients; | 83 | protected string m_DeniedClients; |
84 | 84 | ||
85 | protected string m_DSTZone; | ||
86 | |||
85 | IConfig m_LoginServerConfig; | 87 | IConfig m_LoginServerConfig; |
86 | // IConfig m_ClientsConfig; | 88 | // IConfig m_ClientsConfig; |
87 | 89 | ||
@@ -118,6 +120,8 @@ namespace OpenSim.Services.LLLoginService | |||
118 | m_AllowedClients = m_LoginServerConfig.GetString("AllowedClients", string.Empty); | 120 | m_AllowedClients = m_LoginServerConfig.GetString("AllowedClients", string.Empty); |
119 | m_DeniedClients = m_LoginServerConfig.GetString("DeniedClients", string.Empty); | 121 | m_DeniedClients = m_LoginServerConfig.GetString("DeniedClients", string.Empty); |
120 | 122 | ||
123 | m_DSTZone = m_LoginServerConfig.GetString("DSTZone", "America/Los_Angeles;Pacific Standard Time"); | ||
124 | |||
121 | // Clean up some of these vars | 125 | // Clean up some of these vars |
122 | if (m_MapTileURL != String.Empty) | 126 | if (m_MapTileURL != String.Empty) |
123 | { | 127 | { |
@@ -241,6 +245,7 @@ namespace OpenSim.Services.LLLoginService | |||
241 | 245 | ||
242 | m_log.InfoFormat("[LLOGIN SERVICE]: Login request for {0} {1} at {2} using viewer {3}, channel {4}, IP {5}, Mac {6}, Id0 {7}", | 246 | m_log.InfoFormat("[LLOGIN SERVICE]: Login request for {0} {1} at {2} using viewer {3}, channel {4}, IP {5}, Mac {6}, Id0 {7}", |
243 | firstName, lastName, startLocation, clientVersion, channel, clientIP.Address.ToString(), mac, id0); | 247 | firstName, lastName, startLocation, clientVersion, channel, clientIP.Address.ToString(), mac, id0); |
248 | |||
244 | try | 249 | try |
245 | { | 250 | { |
246 | // | 251 | // |
@@ -423,8 +428,11 @@ namespace OpenSim.Services.LLLoginService | |||
423 | // | 428 | // |
424 | // Finally, fill out the response and return it | 429 | // Finally, fill out the response and return it |
425 | // | 430 | // |
426 | LLLoginResponse response = new LLLoginResponse(account, aCircuit, guinfo, destination, inventorySkel, friendsList, m_LibraryService, | 431 | LLLoginResponse response |
427 | where, startLocation, position, lookAt, gestures, m_WelcomeMessage, home, clientIP, m_MapTileURL, m_ProfileURL, m_OpenIDURL, m_SearchURL, m_Currency); | 432 | = new LLLoginResponse( |
433 | account, aCircuit, guinfo, destination, inventorySkel, friendsList, m_LibraryService, | ||
434 | where, startLocation, position, lookAt, gestures, m_WelcomeMessage, home, clientIP, | ||
435 | m_MapTileURL, m_ProfileURL, m_OpenIDURL, m_SearchURL, m_Currency, m_DSTZone); | ||
428 | 436 | ||
429 | m_log.DebugFormat("[LLOGIN SERVICE]: All clear. Sending login response to client."); | 437 | m_log.DebugFormat("[LLOGIN SERVICE]: All clear. Sending login response to client."); |
430 | return response; | 438 | return response; |
@@ -438,7 +446,10 @@ namespace OpenSim.Services.LLLoginService | |||
438 | } | 446 | } |
439 | } | 447 | } |
440 | 448 | ||
441 | protected GridRegion FindDestination(UserAccount account, UUID scopeID, GridUserInfo pinfo, UUID sessionID, string startLocation, GridRegion home, out GridRegion gatekeeper, out string where, out Vector3 position, out Vector3 lookAt, out TeleportFlags flags) | 449 | protected GridRegion FindDestination( |
450 | UserAccount account, UUID scopeID, GridUserInfo pinfo, UUID sessionID, string startLocation, | ||
451 | GridRegion home, out GridRegion gatekeeper, | ||
452 | out string where, out Vector3 position, out Vector3 lookAt, out TeleportFlags flags) | ||
442 | { | 453 | { |
443 | flags = TeleportFlags.ViaLogin; | 454 | flags = TeleportFlags.ViaLogin; |
444 | 455 | ||
diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs index 318758d..239afc0 100644 --- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs | |||
@@ -58,57 +58,74 @@ namespace OpenSim.Tests.Common | |||
58 | /// </summary> | 58 | /// </summary> |
59 | public class SceneHelpers | 59 | public class SceneHelpers |
60 | { | 60 | { |
61 | public static TestScene SetupScene() | 61 | /// <summary> |
62 | /// We need a scene manager so that test clients can retrieve a scene when performing teleport tests. | ||
63 | /// </summary> | ||
64 | public SceneManager SceneManager { get; private set; } | ||
65 | |||
66 | private AgentCircuitManager m_acm = new AgentCircuitManager(); | ||
67 | private ISimulationDataService m_simDataService | ||
68 | = OpenSim.Server.Base.ServerUtils.LoadPlugin<ISimulationDataService>("OpenSim.Tests.Common.dll", null); | ||
69 | private IEstateDataService m_estateDataService = null; | ||
70 | |||
71 | private LocalAssetServicesConnector m_assetService; | ||
72 | private LocalAuthenticationServicesConnector m_authenticationService; | ||
73 | private LocalInventoryServicesConnector m_inventoryService; | ||
74 | private LocalGridServicesConnector m_gridService; | ||
75 | private LocalUserAccountServicesConnector m_userAccountService; | ||
76 | private LocalPresenceServicesConnector m_presenceService; | ||
77 | |||
78 | private CoreAssetCache m_cache; | ||
79 | |||
80 | public SceneHelpers() : this(null) {} | ||
81 | |||
82 | public SceneHelpers(CoreAssetCache cache) | ||
62 | { | 83 | { |
63 | return SetupScene(null); | 84 | SceneManager = new SceneManager(); |
85 | |||
86 | m_assetService = StartAssetService(cache); | ||
87 | m_authenticationService = StartAuthenticationService(); | ||
88 | m_inventoryService = StartInventoryService(); | ||
89 | m_gridService = StartGridService(); | ||
90 | m_userAccountService = StartUserAccountService(); | ||
91 | m_presenceService = StartPresenceService(); | ||
92 | |||
93 | m_inventoryService.PostInitialise(); | ||
94 | m_assetService.PostInitialise(); | ||
95 | m_userAccountService.PostInitialise(); | ||
96 | m_presenceService.PostInitialise(); | ||
97 | |||
98 | m_cache = cache; | ||
64 | } | 99 | } |
65 | 100 | ||
66 | /// <summary> | 101 | /// <summary> |
67 | /// Set up a test scene | 102 | /// Set up a test scene |
68 | /// </summary> | 103 | /// </summary> |
69 | /// <remarks> | 104 | /// <remarks> |
70 | /// Automatically starts service threads, as would the normal runtime. | 105 | /// Automatically starts services, as would the normal runtime. |
71 | /// </remarks> | 106 | /// </remarks> |
72 | /// <returns></returns> | 107 | /// <returns></returns> |
73 | public static TestScene SetupScene(CoreAssetCache cache) | 108 | public TestScene SetupScene() |
74 | { | 109 | { |
75 | return SetupScene("Unit test region", UUID.Random(), 1000, 1000, cache); | 110 | return SetupScene("Unit test region", UUID.Random(), 1000, 1000); |
76 | } | 111 | } |
77 | 112 | ||
78 | public static TestScene SetupScene(string name, UUID id, uint x, uint y) | 113 | public TestScene SetupScene(string name, UUID id, uint x, uint y) |
79 | { | 114 | { |
80 | return SetupScene(name, id, x, y, null); | 115 | return SetupScene(name, id, x, y, new IniConfigSource()); |
81 | } | 116 | } |
82 | 117 | ||
83 | /// <summary> | 118 | /// <summary> |
84 | /// Set up a scene. If it's more then one scene, use the same CommunicationsManager to link regions | 119 | /// Set up a scene. |
85 | /// or a different, to get a brand new scene with new shared region modules. | ||
86 | /// </summary> | 120 | /// </summary> |
87 | /// <param name="name">Name of the region</param> | 121 | /// <param name="name">Name of the region</param> |
88 | /// <param name="id">ID of the region</param> | 122 | /// <param name="id">ID of the region</param> |
89 | /// <param name="x">X co-ordinate of the region</param> | 123 | /// <param name="x">X co-ordinate of the region</param> |
90 | /// <param name="y">Y co-ordinate of the region</param> | 124 | /// <param name="y">Y co-ordinate of the region</param> |
91 | /// <param name="cache"></param> | ||
92 | /// <returns></returns> | ||
93 | public static TestScene SetupScene( | ||
94 | string name, UUID id, uint x, uint y, CoreAssetCache cache) | ||
95 | { | ||
96 | return SetupScene(name, id, x, y, cache, new IniConfigSource()); | ||
97 | } | ||
98 | |||
99 | /// <summary> | ||
100 | /// Set up a scene. If it's more then one scene, use the same CommunicationsManager to link regions | ||
101 | /// or a different, to get a brand new scene with new shared region modules. | ||
102 | /// </summary> | ||
103 | /// <param name="name">Name of the region</param> | ||
104 | /// <param name="id">ID of the region</param> | ||
105 | /// <param name="x">X co-ordinate of the region</param> | ||
106 | /// <param name="y">Y co-ordinate of the region</param> | ||
107 | /// <param name="cache"></param> | ||
108 | /// <param name="configSource"></param> | 125 | /// <param name="configSource"></param> |
109 | /// <returns></returns> | 126 | /// <returns></returns> |
110 | public static TestScene SetupScene( | 127 | public TestScene SetupScene( |
111 | string name, UUID id, uint x, uint y, CoreAssetCache cache, IConfigSource configSource) | 128 | string name, UUID id, uint x, uint y, IConfigSource configSource) |
112 | { | 129 | { |
113 | Console.WriteLine("Setting up test scene {0}", name); | 130 | Console.WriteLine("Setting up test scene {0}", name); |
114 | 131 | ||
@@ -119,30 +136,47 @@ namespace OpenSim.Tests.Common | |||
119 | regInfo.RegionName = name; | 136 | regInfo.RegionName = name; |
120 | regInfo.RegionID = id; | 137 | regInfo.RegionID = id; |
121 | 138 | ||
122 | AgentCircuitManager acm = new AgentCircuitManager(); | ||
123 | SceneCommunicationService scs = new SceneCommunicationService(); | 139 | SceneCommunicationService scs = new SceneCommunicationService(); |
124 | 140 | ||
125 | ISimulationDataService simDataService = OpenSim.Server.Base.ServerUtils.LoadPlugin<ISimulationDataService>("OpenSim.Tests.Common.dll", null); | ||
126 | IEstateDataService estateDataService = null; | ||
127 | |||
128 | TestScene testScene = new TestScene( | 141 | TestScene testScene = new TestScene( |
129 | regInfo, acm, scs, simDataService, estateDataService, null, false, configSource, null); | 142 | regInfo, m_acm, scs, m_simDataService, m_estateDataService, null, false, configSource, null); |
130 | 143 | ||
131 | IRegionModule godsModule = new GodsModule(); | 144 | IRegionModule godsModule = new GodsModule(); |
132 | godsModule.Initialise(testScene, new IniConfigSource()); | 145 | godsModule.Initialise(testScene, new IniConfigSource()); |
133 | testScene.AddModule(godsModule.Name, godsModule); | 146 | testScene.AddModule(godsModule.Name, godsModule); |
134 | 147 | ||
135 | LocalAssetServicesConnector assetService = StartAssetService(testScene, cache); | 148 | // Add scene to services |
136 | StartAuthenticationService(testScene); | 149 | m_assetService.AddRegion(testScene); |
137 | LocalInventoryServicesConnector inventoryService = StartInventoryService(testScene); | 150 | |
138 | StartGridService(testScene); | 151 | if (m_cache != null) |
139 | LocalUserAccountServicesConnector userAccountService = StartUserAccountService(testScene); | 152 | { |
140 | LocalPresenceServicesConnector presenceService = StartPresenceService(testScene); | 153 | m_cache.AddRegion(testScene); |
141 | 154 | m_cache.RegionLoaded(testScene); | |
142 | inventoryService.PostInitialise(); | 155 | testScene.AddRegionModule(m_cache.Name, m_cache); |
143 | assetService.PostInitialise(); | 156 | } |
144 | userAccountService.PostInitialise(); | 157 | |
145 | presenceService.PostInitialise(); | 158 | m_assetService.RegionLoaded(testScene); |
159 | testScene.AddRegionModule(m_assetService.Name, m_assetService); | ||
160 | |||
161 | m_authenticationService.AddRegion(testScene); | ||
162 | m_authenticationService.RegionLoaded(testScene); | ||
163 | testScene.AddRegionModule(m_authenticationService.Name, m_authenticationService); | ||
164 | |||
165 | m_inventoryService.AddRegion(testScene); | ||
166 | m_inventoryService.RegionLoaded(testScene); | ||
167 | testScene.AddRegionModule(m_inventoryService.Name, m_inventoryService); | ||
168 | |||
169 | m_gridService.AddRegion(testScene); | ||
170 | m_gridService.RegionLoaded(testScene); | ||
171 | testScene.AddRegionModule(m_gridService.Name, m_gridService); | ||
172 | |||
173 | m_userAccountService.AddRegion(testScene); | ||
174 | m_userAccountService.RegionLoaded(testScene); | ||
175 | testScene.AddRegionModule(m_userAccountService.Name, m_userAccountService); | ||
176 | |||
177 | m_presenceService.AddRegion(testScene); | ||
178 | m_presenceService.RegionLoaded(testScene); | ||
179 | testScene.AddRegionModule(m_presenceService.Name, m_presenceService); | ||
146 | 180 | ||
147 | testScene.RegionInfo.EstateSettings.EstateOwner = UUID.Random(); | 181 | testScene.RegionInfo.EstateSettings.EstateOwner = UUID.Random(); |
148 | testScene.SetModuleInterfaces(); | 182 | testScene.SetModuleInterfaces(); |
@@ -153,28 +187,28 @@ namespace OpenSim.Tests.Common | |||
153 | PhysicsPluginManager physicsPluginManager = new PhysicsPluginManager(); | 187 | PhysicsPluginManager physicsPluginManager = new PhysicsPluginManager(); |
154 | physicsPluginManager.LoadPluginsFromAssembly("Physics/OpenSim.Region.Physics.BasicPhysicsPlugin.dll"); | 188 | physicsPluginManager.LoadPluginsFromAssembly("Physics/OpenSim.Region.Physics.BasicPhysicsPlugin.dll"); |
155 | testScene.PhysicsScene | 189 | testScene.PhysicsScene |
156 | = physicsPluginManager.GetPhysicsScene("basicphysics", "ZeroMesher", new IniConfigSource(), "test"); | 190 | = physicsPluginManager.GetPhysicsScene("basicphysics", "ZeroMesher", new IniConfigSource(), "test"); |
157 | 191 | ||
158 | testScene.RegionInfo.EstateSettings = new EstateSettings(); | 192 | testScene.RegionInfo.EstateSettings = new EstateSettings(); |
159 | testScene.LoginsDisabled = false; | 193 | testScene.LoginsDisabled = false; |
160 | testScene.RegisterRegionWithGrid(); | 194 | testScene.RegisterRegionWithGrid(); |
161 | 195 | ||
196 | SceneManager.Add(testScene); | ||
197 | |||
162 | return testScene; | 198 | return testScene; |
163 | } | 199 | } |
164 | 200 | ||
165 | private static LocalAssetServicesConnector StartAssetService(Scene testScene, CoreAssetCache cache) | 201 | private static LocalAssetServicesConnector StartAssetService(CoreAssetCache cache) |
166 | { | 202 | { |
167 | LocalAssetServicesConnector assetService = new LocalAssetServicesConnector(); | ||
168 | IConfigSource config = new IniConfigSource(); | 203 | IConfigSource config = new IniConfigSource(); |
169 | |||
170 | config.AddConfig("Modules"); | 204 | config.AddConfig("Modules"); |
171 | config.Configs["Modules"].Set("AssetServices", "LocalAssetServicesConnector"); | 205 | config.Configs["Modules"].Set("AssetServices", "LocalAssetServicesConnector"); |
172 | config.AddConfig("AssetService"); | 206 | config.AddConfig("AssetService"); |
173 | config.Configs["AssetService"].Set("LocalServiceModule", "OpenSim.Services.AssetService.dll:AssetService"); | 207 | config.Configs["AssetService"].Set("LocalServiceModule", "OpenSim.Services.AssetService.dll:AssetService"); |
174 | config.Configs["AssetService"].Set("StorageProvider", "OpenSim.Tests.Common.dll"); | 208 | config.Configs["AssetService"].Set("StorageProvider", "OpenSim.Tests.Common.dll"); |
175 | 209 | ||
210 | LocalAssetServicesConnector assetService = new LocalAssetServicesConnector(); | ||
176 | assetService.Initialise(config); | 211 | assetService.Initialise(config); |
177 | assetService.AddRegion(testScene); | ||
178 | 212 | ||
179 | if (cache != null) | 213 | if (cache != null) |
180 | { | 214 | { |
@@ -184,56 +218,43 @@ namespace OpenSim.Tests.Common | |||
184 | cacheConfig.AddConfig("AssetCache"); | 218 | cacheConfig.AddConfig("AssetCache"); |
185 | 219 | ||
186 | cache.Initialise(cacheConfig); | 220 | cache.Initialise(cacheConfig); |
187 | cache.AddRegion(testScene); | ||
188 | cache.RegionLoaded(testScene); | ||
189 | testScene.AddRegionModule(cache.Name, cache); | ||
190 | } | 221 | } |
191 | |||
192 | assetService.RegionLoaded(testScene); | ||
193 | testScene.AddRegionModule(assetService.Name, assetService); | ||
194 | 222 | ||
195 | return assetService; | 223 | return assetService; |
196 | } | 224 | } |
197 | 225 | ||
198 | private static void StartAuthenticationService(Scene testScene) | 226 | private static LocalAuthenticationServicesConnector StartAuthenticationService() |
199 | { | 227 | { |
200 | ISharedRegionModule service = new LocalAuthenticationServicesConnector(); | ||
201 | IConfigSource config = new IniConfigSource(); | 228 | IConfigSource config = new IniConfigSource(); |
202 | |||
203 | config.AddConfig("Modules"); | 229 | config.AddConfig("Modules"); |
204 | config.AddConfig("AuthenticationService"); | 230 | config.AddConfig("AuthenticationService"); |
205 | config.Configs["Modules"].Set("AuthenticationServices", "LocalAuthenticationServicesConnector"); | 231 | config.Configs["Modules"].Set("AuthenticationServices", "LocalAuthenticationServicesConnector"); |
206 | config.Configs["AuthenticationService"].Set( | 232 | config.Configs["AuthenticationService"].Set( |
207 | "LocalServiceModule", "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"); | 233 | "LocalServiceModule", "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"); |
208 | config.Configs["AuthenticationService"].Set("StorageProvider", "OpenSim.Data.Null.dll"); | 234 | config.Configs["AuthenticationService"].Set("StorageProvider", "OpenSim.Data.Null.dll"); |
209 | 235 | ||
236 | LocalAuthenticationServicesConnector service = new LocalAuthenticationServicesConnector(); | ||
210 | service.Initialise(config); | 237 | service.Initialise(config); |
211 | service.AddRegion(testScene); | 238 | |
212 | service.RegionLoaded(testScene); | 239 | return service; |
213 | testScene.AddRegionModule(service.Name, service); | ||
214 | //m_authenticationService = service; | ||
215 | } | 240 | } |
216 | 241 | ||
217 | private static LocalInventoryServicesConnector StartInventoryService(Scene testScene) | 242 | private static LocalInventoryServicesConnector StartInventoryService() |
218 | { | 243 | { |
219 | LocalInventoryServicesConnector inventoryService = new LocalInventoryServicesConnector(); | ||
220 | |||
221 | IConfigSource config = new IniConfigSource(); | 244 | IConfigSource config = new IniConfigSource(); |
222 | config.AddConfig("Modules"); | 245 | config.AddConfig("Modules"); |
223 | config.AddConfig("InventoryService"); | 246 | config.AddConfig("InventoryService"); |
224 | config.Configs["Modules"].Set("InventoryServices", "LocalInventoryServicesConnector"); | 247 | config.Configs["Modules"].Set("InventoryServices", "LocalInventoryServicesConnector"); |
225 | config.Configs["InventoryService"].Set("LocalServiceModule", "OpenSim.Services.InventoryService.dll:InventoryService"); | 248 | config.Configs["InventoryService"].Set("LocalServiceModule", "OpenSim.Services.InventoryService.dll:InventoryService"); |
226 | config.Configs["InventoryService"].Set("StorageProvider", "OpenSim.Tests.Common.dll"); | 249 | config.Configs["InventoryService"].Set("StorageProvider", "OpenSim.Tests.Common.dll"); |
227 | 250 | ||
251 | LocalInventoryServicesConnector inventoryService = new LocalInventoryServicesConnector(); | ||
228 | inventoryService.Initialise(config); | 252 | inventoryService.Initialise(config); |
229 | inventoryService.AddRegion(testScene); | ||
230 | inventoryService.RegionLoaded(testScene); | ||
231 | testScene.AddRegionModule(inventoryService.Name, inventoryService); | ||
232 | 253 | ||
233 | return inventoryService; | 254 | return inventoryService; |
234 | } | 255 | } |
235 | 256 | ||
236 | private static LocalGridServicesConnector StartGridService(Scene testScene) | 257 | private static LocalGridServicesConnector StartGridService() |
237 | { | 258 | { |
238 | IConfigSource config = new IniConfigSource(); | 259 | IConfigSource config = new IniConfigSource(); |
239 | config.AddConfig("Modules"); | 260 | config.AddConfig("Modules"); |
@@ -245,8 +266,6 @@ namespace OpenSim.Tests.Common | |||
245 | 266 | ||
246 | LocalGridServicesConnector gridService = new LocalGridServicesConnector(); | 267 | LocalGridServicesConnector gridService = new LocalGridServicesConnector(); |
247 | gridService.Initialise(config); | 268 | gridService.Initialise(config); |
248 | gridService.AddRegion(testScene); | ||
249 | gridService.RegionLoaded(testScene); | ||
250 | 269 | ||
251 | return gridService; | 270 | return gridService; |
252 | } | 271 | } |
@@ -256,7 +275,7 @@ namespace OpenSim.Tests.Common | |||
256 | /// </summary> | 275 | /// </summary> |
257 | /// <param name="testScene"></param> | 276 | /// <param name="testScene"></param> |
258 | /// <returns></returns> | 277 | /// <returns></returns> |
259 | private static LocalUserAccountServicesConnector StartUserAccountService(Scene testScene) | 278 | private static LocalUserAccountServicesConnector StartUserAccountService() |
260 | { | 279 | { |
261 | IConfigSource config = new IniConfigSource(); | 280 | IConfigSource config = new IniConfigSource(); |
262 | config.AddConfig("Modules"); | 281 | config.AddConfig("Modules"); |
@@ -268,10 +287,6 @@ namespace OpenSim.Tests.Common | |||
268 | 287 | ||
269 | LocalUserAccountServicesConnector userAccountService = new LocalUserAccountServicesConnector(); | 288 | LocalUserAccountServicesConnector userAccountService = new LocalUserAccountServicesConnector(); |
270 | userAccountService.Initialise(config); | 289 | userAccountService.Initialise(config); |
271 | |||
272 | userAccountService.AddRegion(testScene); | ||
273 | userAccountService.RegionLoaded(testScene); | ||
274 | testScene.AddRegionModule(userAccountService.Name, userAccountService); | ||
275 | 290 | ||
276 | return userAccountService; | 291 | return userAccountService; |
277 | } | 292 | } |
@@ -280,7 +295,7 @@ namespace OpenSim.Tests.Common | |||
280 | /// Start a presence service | 295 | /// Start a presence service |
281 | /// </summary> | 296 | /// </summary> |
282 | /// <param name="testScene"></param> | 297 | /// <param name="testScene"></param> |
283 | private static LocalPresenceServicesConnector StartPresenceService(Scene testScene) | 298 | private static LocalPresenceServicesConnector StartPresenceService() |
284 | { | 299 | { |
285 | IConfigSource config = new IniConfigSource(); | 300 | IConfigSource config = new IniConfigSource(); |
286 | config.AddConfig("Modules"); | 301 | config.AddConfig("Modules"); |
@@ -292,10 +307,6 @@ namespace OpenSim.Tests.Common | |||
292 | 307 | ||
293 | LocalPresenceServicesConnector presenceService = new LocalPresenceServicesConnector(); | 308 | LocalPresenceServicesConnector presenceService = new LocalPresenceServicesConnector(); |
294 | presenceService.Initialise(config); | 309 | presenceService.Initialise(config); |
295 | |||
296 | presenceService.AddRegion(testScene); | ||
297 | presenceService.RegionLoaded(testScene); | ||
298 | testScene.AddRegionModule(presenceService.Name, presenceService); | ||
299 | 310 | ||
300 | return presenceService; | 311 | return presenceService; |
301 | } | 312 | } |
@@ -313,19 +324,52 @@ namespace OpenSim.Tests.Common | |||
313 | /// <summary> | 324 | /// <summary> |
314 | /// Setup modules for a scene. | 325 | /// Setup modules for a scene. |
315 | /// </summary> | 326 | /// </summary> |
316 | /// <param name="scene"></param> | 327 | /// <remarks> |
328 | /// If called directly, then all the modules must be shared modules. | ||
329 | /// </remarks> | ||
330 | /// <param name="scenes"></param> | ||
317 | /// <param name="config"></param> | 331 | /// <param name="config"></param> |
318 | /// <param name="modules"></param> | 332 | /// <param name="modules"></param> |
319 | public static void SetupSceneModules(Scene scene, IConfigSource config, params object[] modules) | 333 | public static void SetupSceneModules(Scene scene, IConfigSource config, params object[] modules) |
320 | { | 334 | { |
335 | SetupSceneModules(new Scene[] { scene }, config, modules); | ||
336 | } | ||
337 | |||
338 | /// <summary> | ||
339 | /// Setup modules for a scene using their default settings. | ||
340 | /// </summary> | ||
341 | /// <param name="scenes"></param> | ||
342 | /// <param name="modules"></param> | ||
343 | public static void SetupSceneModules(Scene[] scenes, params object[] modules) | ||
344 | { | ||
345 | SetupSceneModules(scenes, new IniConfigSource(), modules); | ||
346 | } | ||
347 | |||
348 | /// <summary> | ||
349 | /// Setup modules for scenes. | ||
350 | /// </summary> | ||
351 | /// <remarks> | ||
352 | /// If called directly, then all the modules must be shared modules. | ||
353 | /// </remarks> | ||
354 | /// <param name="scenes"></param> | ||
355 | /// <param name="config"></param> | ||
356 | /// <param name="modules"></param> | ||
357 | public static void SetupSceneModules(Scene[] scenes, IConfigSource config, params object[] modules) | ||
358 | { | ||
321 | List<IRegionModuleBase> newModules = new List<IRegionModuleBase>(); | 359 | List<IRegionModuleBase> newModules = new List<IRegionModuleBase>(); |
322 | foreach (object module in modules) | 360 | foreach (object module in modules) |
323 | { | 361 | { |
362 | // Console.WriteLine("MODULE RAW {0}", module); | ||
324 | if (module is IRegionModule) | 363 | if (module is IRegionModule) |
325 | { | 364 | { |
326 | IRegionModule m = (IRegionModule)module; | 365 | IRegionModule m = (IRegionModule)module; |
327 | m.Initialise(scene, config); | 366 | |
328 | scene.AddModule(m.Name, m); | 367 | foreach (Scene scene in scenes) |
368 | { | ||
369 | m.Initialise(scene, config); | ||
370 | scene.AddModule(m.Name, m); | ||
371 | } | ||
372 | |||
329 | m.PostInitialise(); | 373 | m.PostInitialise(); |
330 | } | 374 | } |
331 | else if (module is IRegionModuleBase) | 375 | else if (module is IRegionModuleBase) |
@@ -333,6 +377,7 @@ namespace OpenSim.Tests.Common | |||
333 | // for the new system, everything has to be initialised first, | 377 | // for the new system, everything has to be initialised first, |
334 | // shared modules have to be post-initialised, then all get an AddRegion with the scene | 378 | // shared modules have to be post-initialised, then all get an AddRegion with the scene |
335 | IRegionModuleBase m = (IRegionModuleBase)module; | 379 | IRegionModuleBase m = (IRegionModuleBase)module; |
380 | // Console.WriteLine("MODULE {0}", m.Name); | ||
336 | m.Initialise(config); | 381 | m.Initialise(config); |
337 | newModules.Add(m); | 382 | newModules.Add(m); |
338 | } | 383 | } |
@@ -345,15 +390,19 @@ namespace OpenSim.Tests.Common | |||
345 | 390 | ||
346 | foreach (IRegionModuleBase module in newModules) | 391 | foreach (IRegionModuleBase module in newModules) |
347 | { | 392 | { |
348 | module.AddRegion(scene); | 393 | foreach (Scene scene in scenes) |
349 | scene.AddRegionModule(module.Name, module); | 394 | { |
395 | module.AddRegion(scene); | ||
396 | scene.AddRegionModule(module.Name, module); | ||
397 | } | ||
350 | } | 398 | } |
351 | 399 | ||
352 | // RegionLoaded is fired after all modules have been appropriately added to all scenes | 400 | // RegionLoaded is fired after all modules have been appropriately added to all scenes |
353 | foreach (IRegionModuleBase module in newModules) | 401 | foreach (IRegionModuleBase module in newModules) |
354 | module.RegionLoaded(scene); | 402 | foreach (Scene scene in scenes) |
403 | module.RegionLoaded(scene); | ||
355 | 404 | ||
356 | scene.SetModuleInterfaces(); | 405 | foreach (Scene scene in scenes) { scene.SetModuleInterfaces(); } |
357 | } | 406 | } |
358 | 407 | ||
359 | /// <summary> | 408 | /// <summary> |
@@ -388,6 +437,10 @@ namespace OpenSim.Tests.Common | |||
388 | /// <summary> | 437 | /// <summary> |
389 | /// Add a root agent where the details of the agent connection (apart from the id) are unimportant for the test | 438 | /// Add a root agent where the details of the agent connection (apart from the id) are unimportant for the test |
390 | /// </summary> | 439 | /// </summary> |
440 | /// <remarks> | ||
441 | /// This can be used for tests where there is only one region or where there are multiple non-neighbour regions | ||
442 | /// and teleport doesn't take place. | ||
443 | /// </remarks> | ||
391 | /// <param name="scene"></param> | 444 | /// <param name="scene"></param> |
392 | /// <param name="agentId"></param> | 445 | /// <param name="agentId"></param> |
393 | /// <returns></returns> | 446 | /// <returns></returns> |
@@ -397,6 +450,18 @@ namespace OpenSim.Tests.Common | |||
397 | } | 450 | } |
398 | 451 | ||
399 | /// <summary> | 452 | /// <summary> |
453 | /// Add a root agent where the details of the agent connection (apart from the id) are unimportant for the test | ||
454 | /// </summary> | ||
455 | /// <param name="scene"></param> | ||
456 | /// <param name="agentId"></param> | ||
457 | /// <param name="sceneManager"></param> | ||
458 | /// <returns></returns> | ||
459 | public static ScenePresence AddScenePresence(Scene scene, UUID agentId, SceneManager sceneManager) | ||
460 | { | ||
461 | return AddScenePresence(scene, GenerateAgentData(agentId), sceneManager); | ||
462 | } | ||
463 | |||
464 | /// <summary> | ||
400 | /// Add a root agent. | 465 | /// Add a root agent. |
401 | /// </summary> | 466 | /// </summary> |
402 | /// <remarks> | 467 | /// <remarks> |
@@ -416,6 +481,30 @@ namespace OpenSim.Tests.Common | |||
416 | /// <returns></returns> | 481 | /// <returns></returns> |
417 | public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData) | 482 | public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData) |
418 | { | 483 | { |
484 | return AddScenePresence(scene, agentData, null); | ||
485 | } | ||
486 | |||
487 | /// <summary> | ||
488 | /// Add a root agent. | ||
489 | /// </summary> | ||
490 | /// <remarks> | ||
491 | /// This function | ||
492 | /// | ||
493 | /// 1) Tells the scene that an agent is coming. Normally, the login service (local if standalone, from the | ||
494 | /// userserver if grid) would give initial login data back to the client and separately tell the scene that the | ||
495 | /// agent was coming. | ||
496 | /// | ||
497 | /// 2) Connects the agent with the scene | ||
498 | /// | ||
499 | /// This function performs actions equivalent with notifying the scene that an agent is | ||
500 | /// coming and then actually connecting the agent to the scene. The one step missed out is the very first | ||
501 | /// </remarks> | ||
502 | /// <param name="scene"></param> | ||
503 | /// <param name="agentData"></param> | ||
504 | /// <param name="sceneManager"></param> | ||
505 | /// <returns></returns> | ||
506 | public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData, SceneManager sceneManager) | ||
507 | { | ||
419 | // We emulate the proper login sequence here by doing things in four stages | 508 | // We emulate the proper login sequence here by doing things in four stages |
420 | 509 | ||
421 | // Stage 0: login | 510 | // Stage 0: login |
@@ -425,7 +514,7 @@ namespace OpenSim.Tests.Common | |||
425 | lpsc.m_PresenceService.LoginAgent(agentData.AgentID.ToString(), agentData.SessionID, agentData.SecureSessionID); | 514 | lpsc.m_PresenceService.LoginAgent(agentData.AgentID.ToString(), agentData.SessionID, agentData.SecureSessionID); |
426 | 515 | ||
427 | // Stages 1 & 2 | 516 | // Stages 1 & 2 |
428 | ScenePresence sp = IntroduceClientToScene(scene, agentData, TeleportFlags.ViaLogin); | 517 | ScenePresence sp = IntroduceClientToScene(scene, sceneManager, agentData, TeleportFlags.ViaLogin); |
429 | 518 | ||
430 | // Stage 3: Complete the entrance into the region. This converts the child agent into a root agent. | 519 | // Stage 3: Complete the entrance into the region. This converts the child agent into a root agent. |
431 | sp.CompleteMovement(sp.ControllingClient, true); | 520 | sp.CompleteMovement(sp.ControllingClient, true); |
@@ -433,7 +522,20 @@ namespace OpenSim.Tests.Common | |||
433 | return sp; | 522 | return sp; |
434 | } | 523 | } |
435 | 524 | ||
436 | private static ScenePresence IntroduceClientToScene(Scene scene, AgentCircuitData agentData, TeleportFlags tf) | 525 | /// <summary> |
526 | /// Introduce an agent into the scene by adding a new client. | ||
527 | /// </summary> | ||
528 | /// <returns>The scene presence added</returns> | ||
529 | /// <param name='sceneManager'> | ||
530 | /// Scene manager. Can be null if there is only one region in the test or multiple regions that are not | ||
531 | /// neighbours and where no teleporting takes place. | ||
532 | /// </param> | ||
533 | /// <param name='scene'></param> | ||
534 | /// <param name='sceneManager></param> | ||
535 | /// <param name='agentData'></param> | ||
536 | /// <param name='tf'></param> | ||
537 | private static ScenePresence IntroduceClientToScene( | ||
538 | Scene scene, SceneManager sceneManager, AgentCircuitData agentData, TeleportFlags tf) | ||
437 | { | 539 | { |
438 | string reason; | 540 | string reason; |
439 | 541 | ||
@@ -442,7 +544,7 @@ namespace OpenSim.Tests.Common | |||
442 | Console.WriteLine("NewUserConnection failed: " + reason); | 544 | Console.WriteLine("NewUserConnection failed: " + reason); |
443 | 545 | ||
444 | // Stage 2: add the new client as a child agent to the scene | 546 | // Stage 2: add the new client as a child agent to the scene |
445 | TestClient client = new TestClient(agentData, scene); | 547 | TestClient client = new TestClient(agentData, scene, sceneManager); |
446 | scene.AddNewClient(client, PresenceType.User); | 548 | scene.AddNewClient(client, PresenceType.User); |
447 | 549 | ||
448 | return scene.GetScenePresence(agentData.AgentID); | 550 | return scene.GetScenePresence(agentData.AgentID); |
@@ -454,7 +556,7 @@ namespace OpenSim.Tests.Common | |||
454 | acd.child = true; | 556 | acd.child = true; |
455 | 557 | ||
456 | // XXX: ViaLogin may not be correct for child agents | 558 | // XXX: ViaLogin may not be correct for child agents |
457 | return IntroduceClientToScene(scene, acd, TeleportFlags.ViaLogin); | 559 | return IntroduceClientToScene(scene, null, acd, TeleportFlags.ViaLogin); |
458 | } | 560 | } |
459 | 561 | ||
460 | /// <summary> | 562 | /// <summary> |
@@ -464,7 +566,7 @@ namespace OpenSim.Tests.Common | |||
464 | /// <returns></returns> | 566 | /// <returns></returns> |
465 | public static SceneObjectPart AddSceneObject(Scene scene) | 567 | public static SceneObjectPart AddSceneObject(Scene scene) |
466 | { | 568 | { |
467 | return AddSceneObject(scene, "Test Object"); | 569 | return AddSceneObject(scene, "Test Object", UUID.Zero); |
468 | } | 570 | } |
469 | 571 | ||
470 | /// <summary> | 572 | /// <summary> |
@@ -472,10 +574,11 @@ namespace OpenSim.Tests.Common | |||
472 | /// </summary> | 574 | /// </summary> |
473 | /// <param name="scene"></param> | 575 | /// <param name="scene"></param> |
474 | /// <param name="name"></param> | 576 | /// <param name="name"></param> |
577 | /// <param name="ownerId"></param> | ||
475 | /// <returns></returns> | 578 | /// <returns></returns> |
476 | public static SceneObjectPart AddSceneObject(Scene scene, string name) | 579 | public static SceneObjectPart AddSceneObject(Scene scene, string name, UUID ownerId) |
477 | { | 580 | { |
478 | SceneObjectPart part = CreateSceneObjectPart(name, UUID.Random(), UUID.Zero); | 581 | SceneObjectPart part = CreateSceneObjectPart(name, UUID.Random(), ownerId); |
479 | 582 | ||
480 | //part.UpdatePrimFlags(false, false, true); | 583 | //part.UpdatePrimFlags(false, false, true); |
481 | //part.ObjectFlags |= (uint)PrimFlags.Phantom; | 584 | //part.ObjectFlags |= (uint)PrimFlags.Phantom; |
@@ -522,7 +625,7 @@ namespace OpenSim.Tests.Common | |||
522 | /// <param name="ownerId"></param> | 625 | /// <param name="ownerId"></param> |
523 | /// <param name="partNamePrefix"> | 626 | /// <param name="partNamePrefix"> |
524 | /// The prefix to be given to part names. This will be suffixed with "Part<part no>" | 627 | /// The prefix to be given to part names. This will be suffixed with "Part<part no>" |
525 | /// (e.g. mynamePart0 for the root part) | 628 | /// (e.g. mynamePart1 for the root part) |
526 | /// </param> | 629 | /// </param> |
527 | /// <param name="uuidTail"> | 630 | /// <param name="uuidTail"> |
528 | /// The hexadecimal last part of the UUID for parts created. A UUID of the form "00000000-0000-0000-0000-{0:XD12}" | 631 | /// The hexadecimal last part of the UUID for parts created. A UUID of the form "00000000-0000-0000-0000-{0:XD12}" |
@@ -535,14 +638,14 @@ namespace OpenSim.Tests.Common | |||
535 | 638 | ||
536 | SceneObjectGroup sog | 639 | SceneObjectGroup sog |
537 | = new SceneObjectGroup( | 640 | = new SceneObjectGroup( |
538 | CreateSceneObjectPart(string.Format("{0}Part0", partNamePrefix), new UUID(rawSogId), ownerId)); | 641 | CreateSceneObjectPart(string.Format("{0}Part1", partNamePrefix), new UUID(rawSogId), ownerId)); |
539 | 642 | ||
540 | if (parts > 1) | 643 | if (parts > 1) |
541 | for (int i = 1; i < parts; i++) | 644 | for (int i = 2; i <= parts; i++) |
542 | sog.AddPart( | 645 | sog.AddPart( |
543 | CreateSceneObjectPart( | 646 | CreateSceneObjectPart( |
544 | string.Format("{0}Part{1}", partNamePrefix, i), | 647 | string.Format("{0}Part{1}", partNamePrefix, i), |
545 | new UUID(string.Format("00000000-0000-0000-0000-{0:X12}", uuidTail + i)), | 648 | new UUID(string.Format("00000000-0000-0000-0000-{0:X12}", uuidTail + i - 1)), |
546 | ownerId)); | 649 | ownerId)); |
547 | 650 | ||
548 | return sog; | 651 | return sog; |
diff --git a/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs b/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs index 38fbbe3..3f99a39 100644 --- a/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs +++ b/OpenSim/Tests/Common/Mock/MockRegionDataPlugin.cs | |||
@@ -113,6 +113,21 @@ namespace OpenSim.Data.Null | |||
113 | m_store.StoreRegionWindlightSettings(wl); | 113 | m_store.StoreRegionWindlightSettings(wl); |
114 | } | 114 | } |
115 | 115 | ||
116 | public string LoadRegionEnvironmentSettings(UUID regionUUID) | ||
117 | { | ||
118 | return m_store.LoadRegionEnvironmentSettings(regionUUID); | ||
119 | } | ||
120 | |||
121 | public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings) | ||
122 | { | ||
123 | m_store.StoreRegionEnvironmentSettings(regionUUID, settings); | ||
124 | } | ||
125 | |||
126 | public void RemoveRegionEnvironmentSettings(UUID regionUUID) | ||
127 | { | ||
128 | m_store.RemoveRegionEnvironmentSettings(regionUUID); | ||
129 | } | ||
130 | |||
116 | public UUID[] GetObjectIDs(UUID regionID) | 131 | public UUID[] GetObjectIDs(UUID regionID) |
117 | { | 132 | { |
118 | return new UUID[0]; | 133 | return new UUID[0]; |
@@ -163,7 +178,25 @@ namespace OpenSim.Data.Null | |||
163 | { | 178 | { |
164 | //This connector doesn't support the windlight module yet | 179 | //This connector doesn't support the windlight module yet |
165 | } | 180 | } |
166 | 181 | ||
182 | #region Environment Settings | ||
183 | public string LoadRegionEnvironmentSettings(UUID regionUUID) | ||
184 | { | ||
185 | //This connector doesn't support the Environment module yet | ||
186 | return string.Empty; | ||
187 | } | ||
188 | |||
189 | public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings) | ||
190 | { | ||
191 | //This connector doesn't support the Environment module yet | ||
192 | } | ||
193 | |||
194 | public void RemoveRegionEnvironmentSettings(UUID regionUUID) | ||
195 | { | ||
196 | //This connector doesn't support the Environment module yet | ||
197 | } | ||
198 | #endregion | ||
199 | |||
167 | public RegionSettings LoadRegionSettings(UUID regionUUID) | 200 | public RegionSettings LoadRegionSettings(UUID regionUUID) |
168 | { | 201 | { |
169 | RegionSettings rs = null; | 202 | RegionSettings rs = null; |
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs index b2c824c..8cea476f 100644 --- a/OpenSim/Tests/Common/Mock/TestClient.cs +++ b/OpenSim/Tests/Common/Mock/TestClient.cs | |||
@@ -46,12 +46,10 @@ namespace OpenSim.Tests.Common.Mock | |||
46 | 46 | ||
47 | EventWaitHandle wh = new EventWaitHandle (false, EventResetMode.AutoReset, "Crossing"); | 47 | EventWaitHandle wh = new EventWaitHandle (false, EventResetMode.AutoReset, "Crossing"); |
48 | 48 | ||
49 | // TODO: This is a really nasty (and temporary) means of telling the test client which scene to invoke setup | ||
50 | // methods on when a teleport is requested | ||
51 | public Scene TeleportTargetScene; | ||
52 | private TestClient TeleportSceneClient; | 49 | private TestClient TeleportSceneClient; |
53 | 50 | ||
54 | private Scene m_scene; | 51 | private Scene m_scene; |
52 | private SceneManager m_sceneManager; | ||
55 | 53 | ||
56 | // Properties so that we can get at received data for test purposes | 54 | // Properties so that we can get at received data for test purposes |
57 | public List<UUID> ReceivedOfflineNotifications { get; private set; } | 55 | public List<UUID> ReceivedOfflineNotifications { get; private set; } |
@@ -435,15 +433,29 @@ namespace OpenSim.Tests.Common.Mock | |||
435 | /// <summary> | 433 | /// <summary> |
436 | /// Constructor | 434 | /// Constructor |
437 | /// </summary> | 435 | /// </summary> |
436 | /// <remarks> | ||
437 | /// Can be used for a test where there is only one region or where there are multiple regions that are not | ||
438 | /// neighbours and where no teleporting takes place. In other situations, the constructor that takes in a | ||
439 | /// scene manager should be used. | ||
440 | /// </remarks> | ||
438 | /// <param name="agentData"></param> | 441 | /// <param name="agentData"></param> |
439 | /// <param name="scene"></param> | 442 | /// <param name="scene"></param> |
440 | public TestClient(AgentCircuitData agentData, Scene scene) | 443 | public TestClient(AgentCircuitData agentData, Scene scene) : this(agentData, scene, null) {} |
444 | |||
445 | /// <summary> | ||
446 | /// Constructor | ||
447 | /// </summary> | ||
448 | /// <param name="agentData"></param> | ||
449 | /// <param name="scene"></param> | ||
450 | /// <param name="sceneManager"></param> | ||
451 | public TestClient(AgentCircuitData agentData, Scene scene, SceneManager sceneManager) | ||
441 | { | 452 | { |
442 | m_agentId = agentData.AgentID; | 453 | m_agentId = agentData.AgentID; |
443 | m_firstName = agentData.firstname; | 454 | m_firstName = agentData.firstname; |
444 | m_lastName = agentData.lastname; | 455 | m_lastName = agentData.lastname; |
445 | m_circuitCode = agentData.circuitcode; | 456 | m_circuitCode = agentData.circuitcode; |
446 | m_scene = scene; | 457 | m_scene = scene; |
458 | m_sceneManager = sceneManager; | ||
447 | SessionId = agentData.SessionID; | 459 | SessionId = agentData.SessionID; |
448 | SecureSessionId = agentData.SecureSessionID; | 460 | SecureSessionId = agentData.SecureSessionID; |
449 | CapsSeedUrl = agentData.CapsPath; | 461 | CapsSeedUrl = agentData.CapsPath; |
@@ -593,8 +605,16 @@ namespace OpenSim.Tests.Common.Mock | |||
593 | AgentCircuitData newAgent = RequestClientInfo(); | 605 | AgentCircuitData newAgent = RequestClientInfo(); |
594 | 606 | ||
595 | // Stage 2: add the new client as a child agent to the scene | 607 | // Stage 2: add the new client as a child agent to the scene |
596 | TeleportSceneClient = new TestClient(newAgent, TeleportTargetScene); | 608 | uint x, y; |
597 | TeleportTargetScene.AddNewClient(TeleportSceneClient, PresenceType.User); | 609 | Utils.LongToUInts(neighbourHandle, out x, out y); |
610 | x /= Constants.RegionSize; | ||
611 | y /= Constants.RegionSize; | ||
612 | |||
613 | Scene neighbourScene; | ||
614 | m_sceneManager.TryGetScene(x, y, out neighbourScene); | ||
615 | |||
616 | TeleportSceneClient = new TestClient(newAgent, neighbourScene, m_sceneManager); | ||
617 | neighbourScene.AddNewClient(TeleportSceneClient, PresenceType.User); | ||
598 | } | 618 | } |
599 | 619 | ||
600 | public virtual void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, | 620 | public virtual void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, |
@@ -604,6 +624,13 @@ namespace OpenSim.Tests.Common.Mock | |||
604 | 624 | ||
605 | CapsSeedUrl = capsURL; | 625 | CapsSeedUrl = capsURL; |
606 | 626 | ||
627 | // We don't do this here so that the source region can complete processing first in a single-threaded | ||
628 | // regression test scenario. The test itself will have to call CompleteTeleportClientSide() after a teleport | ||
629 | // CompleteTeleportClientSide(); | ||
630 | } | ||
631 | |||
632 | public void CompleteTeleportClientSide() | ||
633 | { | ||
607 | TeleportSceneClient.CompleteMovement(); | 634 | TeleportSceneClient.CompleteMovement(); |
608 | //TeleportTargetScene.AgentCrossing(newAgent.AgentID, new Vector3(90, 90, 90), false); | 635 | //TeleportTargetScene.AgentCrossing(newAgent.AgentID, new Vector3(90, 90, 90), false); |
609 | } | 636 | } |
diff --git a/OpenSim/Tests/Common/Mock/TestLandChannel.cs b/OpenSim/Tests/Common/Mock/TestLandChannel.cs index 0e4dfb9..4b4d52d 100644 --- a/OpenSim/Tests/Common/Mock/TestLandChannel.cs +++ b/OpenSim/Tests/Common/Mock/TestLandChannel.cs | |||
@@ -46,6 +46,14 @@ namespace OpenSim.Tests.Common.Mock | |||
46 | { | 46 | { |
47 | m_scene = scene; | 47 | m_scene = scene; |
48 | m_parcels = new List<ILandObject>(); | 48 | m_parcels = new List<ILandObject>(); |
49 | SetupDefaultParcel(); | ||
50 | } | ||
51 | |||
52 | private void SetupDefaultParcel() | ||
53 | { | ||
54 | ILandObject obj = new LandObject(UUID.Zero, false, m_scene); | ||
55 | obj.LandData.Name = "Your Parcel"; | ||
56 | m_parcels.Add(obj); | ||
49 | } | 57 | } |
50 | 58 | ||
51 | public List<ILandObject> ParcelsNearPoint(Vector3 position) | 59 | public List<ILandObject> ParcelsNearPoint(Vector3 position) |
@@ -63,11 +71,7 @@ namespace OpenSim.Tests.Common.Mock | |||
63 | m_parcels.Clear(); | 71 | m_parcels.Clear(); |
64 | 72 | ||
65 | if (setupDefaultParcel) | 73 | if (setupDefaultParcel) |
66 | { | 74 | SetupDefaultParcel(); |
67 | ILandObject obj = new LandObject(UUID.Zero, false, m_scene); | ||
68 | obj.LandData.Name = "Your Parcel"; | ||
69 | m_parcels.Add(obj); | ||
70 | } | ||
71 | } | 75 | } |
72 | 76 | ||
73 | protected ILandObject GetNoLand() | 77 | protected ILandObject GetNoLand() |
@@ -102,6 +106,5 @@ namespace OpenSim.Tests.Common.Mock | |||
102 | 106 | ||
103 | public void Join(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) {} | 107 | public void Join(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) {} |
104 | public void Subdivide(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) {} | 108 | public void Subdivide(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) {} |
105 | |||
106 | } | 109 | } |
107 | } | 110 | } \ No newline at end of file |
diff --git a/OpenSim/Tests/Common/TestHelpers.cs b/OpenSim/Tests/Common/TestHelpers.cs index ced06de..d38d692 100644 --- a/OpenSim/Tests/Common/TestHelpers.cs +++ b/OpenSim/Tests/Common/TestHelpers.cs | |||
@@ -27,6 +27,8 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Diagnostics; | 29 | using System.Diagnostics; |
30 | using System.IO; | ||
31 | using System.Text; | ||
30 | using NUnit.Framework; | 32 | using NUnit.Framework; |
31 | using OpenMetaverse; | 33 | using OpenMetaverse; |
32 | 34 | ||
@@ -34,6 +36,38 @@ namespace OpenSim.Tests.Common | |||
34 | { | 36 | { |
35 | public class TestHelpers | 37 | public class TestHelpers |
36 | { | 38 | { |
39 | private static Stream EnableLoggingConfigStream | ||
40 | = new MemoryStream( | ||
41 | Encoding.UTF8.GetBytes( | ||
42 | @"<log4net> | ||
43 | <!-- A1 is set to be a ConsoleAppender --> | ||
44 | <appender name=""A1"" type=""log4net.Appender.ConsoleAppender""> | ||
45 | |||
46 | <!-- A1 uses PatternLayout --> | ||
47 | <layout type=""log4net.Layout.PatternLayout""> | ||
48 | <!-- Print the date in ISO 8601 format --> | ||
49 | <!-- <conversionPattern value=""%date [%thread] %-5level %logger %ndc - %message%newline"" /> --> | ||
50 | <conversionPattern value=""%date %message%newline"" /> | ||
51 | </layout> | ||
52 | </appender> | ||
53 | |||
54 | <!-- Set root logger level to DEBUG and its only appender to A1 --> | ||
55 | <root> | ||
56 | <level value=""DEBUG"" /> | ||
57 | <appender-ref ref=""A1"" /> | ||
58 | </root> | ||
59 | </log4net>")); | ||
60 | |||
61 | private static Stream DisableLoggingConfigStream | ||
62 | = new MemoryStream( | ||
63 | Encoding.UTF8.GetBytes( | ||
64 | // "<?xml version=\"1.0\" encoding=\"utf-8\" ?><configuration><log4net><root><level value=\"OFF\"/><appender-ref ref=\"A1\"/></root></log4net></configuration>")); | ||
65 | //"<?xml version=\"1.0\" encoding=\"utf-8\" ?><configuration><log4net><root><level value=\"OFF\"/></root></log4net></configuration>"))); | ||
66 | // "<configuration><log4net><root><level value=\"OFF\"/></root></log4net></configuration>")); | ||
67 | // "<configuration><log4net><root></root></log4net></configuration>"))); | ||
68 | // "<configuration><log4net><root/></log4net></configuration>")); | ||
69 | "<log4net><root/></log4net>")); | ||
70 | |||
37 | public static bool AssertThisDelegateCausesArgumentException(TestDelegate d) | 71 | public static bool AssertThisDelegateCausesArgumentException(TestDelegate d) |
38 | { | 72 | { |
39 | try | 73 | try |
@@ -58,6 +92,25 @@ namespace OpenSim.Tests.Common | |||
58 | Console.WriteLine("===> In Test Method : {0} <===", stackTrace.GetFrame(1).GetMethod().Name); | 92 | Console.WriteLine("===> In Test Method : {0} <===", stackTrace.GetFrame(1).GetMethod().Name); |
59 | } | 93 | } |
60 | 94 | ||
95 | public static void EnableLogging() | ||
96 | { | ||
97 | log4net.Config.XmlConfigurator.Configure(EnableLoggingConfigStream); | ||
98 | } | ||
99 | |||
100 | /// <summary> | ||
101 | /// Disable logging whilst running the tests. | ||
102 | /// </summary> | ||
103 | /// <remarks> | ||
104 | /// Remember, if a regression test throws an exception before completing this will not be invoked if it's at | ||
105 | /// the end of the test. | ||
106 | /// TODO: Always invoke this after every test - probably need to make all test cases inherit from a common | ||
107 | /// TestCase class where this can be done. | ||
108 | /// </remarks> | ||
109 | public static void DisableLogging() | ||
110 | { | ||
111 | log4net.Config.XmlConfigurator.Configure(DisableLoggingConfigStream); | ||
112 | } | ||
113 | |||
61 | /// <summary> | 114 | /// <summary> |
62 | /// Parse tail section into full UUID. | 115 | /// Parse tail section into full UUID. |
63 | /// </summary> | 116 | /// </summary> |
diff --git a/OpenSim/Tests/Torture/NPCTortureTests.cs b/OpenSim/Tests/Torture/NPCTortureTests.cs index 0224505..731df68 100644 --- a/OpenSim/Tests/Torture/NPCTortureTests.cs +++ b/OpenSim/Tests/Torture/NPCTortureTests.cs | |||
@@ -98,7 +98,7 @@ namespace OpenSim.Tests.Torture | |||
98 | umm = new UserManagementModule(); | 98 | umm = new UserManagementModule(); |
99 | am = new AttachmentsModule(); | 99 | am = new AttachmentsModule(); |
100 | 100 | ||
101 | scene = SceneHelpers.SetupScene(); | 101 | scene = new SceneHelpers().SetupScene(); |
102 | SceneHelpers.SetupSceneModules(scene, config, afm, umm, am, new BasicInventoryAccessModule(), new NPCModule()); | 102 | SceneHelpers.SetupSceneModules(scene, config, afm, umm, am, new BasicInventoryAccessModule(), new NPCModule()); |
103 | } | 103 | } |
104 | 104 | ||
diff --git a/OpenSim/Tests/Torture/ObjectTortureTests.cs b/OpenSim/Tests/Torture/ObjectTortureTests.cs index d0d2199..195d47b 100644 --- a/OpenSim/Tests/Torture/ObjectTortureTests.cs +++ b/OpenSim/Tests/Torture/ObjectTortureTests.cs | |||
@@ -126,7 +126,7 @@ namespace OpenSim.Tests.Torture | |||
126 | // Using a local variable for scene, at least on mono 2.6.7, means that it's much more likely to be garbage | 126 | // Using a local variable for scene, at least on mono 2.6.7, means that it's much more likely to be garbage |
127 | // collected when we teardown this test. If it's done in a member variable, even if that is subsequently | 127 | // collected when we teardown this test. If it's done in a member variable, even if that is subsequently |
128 | // nulled out, the garbage collect can be delayed. | 128 | // nulled out, the garbage collect can be delayed. |
129 | TestScene scene = SceneHelpers.SetupScene(); | 129 | TestScene scene = new SceneHelpers().SetupScene(); |
130 | 130 | ||
131 | // Process process = Process.GetCurrentProcess(); | 131 | // Process process = Process.GetCurrentProcess(); |
132 | // long startProcessMemory = process.PrivateMemorySize64; | 132 | // long startProcessMemory = process.PrivateMemorySize64; |
diff --git a/OpenSim/Tests/Torture/ScriptTortureTests.cs b/OpenSim/Tests/Torture/ScriptTortureTests.cs index 2ef55b3..24f278f 100644 --- a/OpenSim/Tests/Torture/ScriptTortureTests.cs +++ b/OpenSim/Tests/Torture/ScriptTortureTests.cs | |||
@@ -84,7 +84,7 @@ namespace OpenSim.Tests.Torture | |||
84 | // to AssemblyResolver.OnAssemblyResolve fails. | 84 | // to AssemblyResolver.OnAssemblyResolve fails. |
85 | xEngineConfig.Set("AppDomainLoading", "false"); | 85 | xEngineConfig.Set("AppDomainLoading", "false"); |
86 | 86 | ||
87 | m_scene = SceneHelpers.SetupScene("My Test", UUID.Random(), 1000, 1000, null, configSource); | 87 | m_scene = new SceneHelpers().SetupScene("My Test", UUID.Random(), 1000, 1000, configSource); |
88 | SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule); | 88 | SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule); |
89 | 89 | ||
90 | m_scene.EventManager.OnChatFromWorld += OnChatFromWorld; | 90 | m_scene.EventManager.OnChatFromWorld += OnChatFromWorld; |
diff --git a/OpenSim/Tools/pCampBot/Bot.cs b/OpenSim/Tools/pCampBot/Bot.cs index da090dd..daaa3c0 100644 --- a/OpenSim/Tools/pCampBot/Bot.cs +++ b/OpenSim/Tools/pCampBot/Bot.cs | |||
@@ -43,6 +43,14 @@ using Timer = System.Timers.Timer; | |||
43 | 43 | ||
44 | namespace pCampBot | 44 | namespace pCampBot |
45 | { | 45 | { |
46 | public enum ConnectionState | ||
47 | { | ||
48 | Disconnected, | ||
49 | Connecting, | ||
50 | Connected, | ||
51 | Disconnecting | ||
52 | } | ||
53 | |||
46 | public class Bot | 54 | public class Bot |
47 | { | 55 | { |
48 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 56 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
@@ -86,7 +94,7 @@ namespace pCampBot | |||
86 | /// <summary> | 94 | /// <summary> |
87 | /// Is this bot connected to the grid? | 95 | /// Is this bot connected to the grid? |
88 | /// </summary> | 96 | /// </summary> |
89 | public bool IsConnected { get; private set; } | 97 | public ConnectionState ConnectionState { get; private set; } |
90 | 98 | ||
91 | public string FirstName { get; private set; } | 99 | public string FirstName { get; private set; } |
92 | public string LastName { get; private set; } | 100 | public string LastName { get; private set; } |
@@ -130,6 +138,8 @@ namespace pCampBot | |||
130 | BotManager bm, List<IBehaviour> behaviours, | 138 | BotManager bm, List<IBehaviour> behaviours, |
131 | string firstName, string lastName, string password, string loginUri) | 139 | string firstName, string lastName, string password, string loginUri) |
132 | { | 140 | { |
141 | ConnectionState = ConnectionState.Disconnected; | ||
142 | |||
133 | behaviours.ForEach(b => b.Initialize(this)); | 143 | behaviours.ForEach(b => b.Initialize(this)); |
134 | 144 | ||
135 | Client = new GridClient(); | 145 | Client = new GridClient(); |
@@ -157,10 +167,10 @@ namespace pCampBot | |||
157 | Behaviours.ForEach( | 167 | Behaviours.ForEach( |
158 | b => | 168 | b => |
159 | { | 169 | { |
170 | Thread.Sleep(Random.Next(3000, 10000)); | ||
171 | |||
160 | // m_log.DebugFormat("[pCAMPBOT]: For {0} performing action {1}", Name, b.GetType()); | 172 | // m_log.DebugFormat("[pCAMPBOT]: For {0} performing action {1}", Name, b.GetType()); |
161 | b.Action(); | 173 | b.Action(); |
162 | |||
163 | Thread.Sleep(Random.Next(1000, 10000)); | ||
164 | } | 174 | } |
165 | ); | 175 | ); |
166 | } | 176 | } |
@@ -178,6 +188,8 @@ namespace pCampBot | |||
178 | /// </summary> | 188 | /// </summary> |
179 | public void shutdown() | 189 | public void shutdown() |
180 | { | 190 | { |
191 | ConnectionState = ConnectionState.Disconnecting; | ||
192 | |||
181 | if (m_actionThread != null) | 193 | if (m_actionThread != null) |
182 | m_actionThread.Abort(); | 194 | m_actionThread.Abort(); |
183 | 195 | ||
@@ -209,9 +221,11 @@ namespace pCampBot | |||
209 | Client.Network.Disconnected += this.Network_OnDisconnected; | 221 | Client.Network.Disconnected += this.Network_OnDisconnected; |
210 | Client.Objects.ObjectUpdate += Objects_NewPrim; | 222 | Client.Objects.ObjectUpdate += Objects_NewPrim; |
211 | 223 | ||
224 | ConnectionState = ConnectionState.Connecting; | ||
225 | |||
212 | if (Client.Network.Login(FirstName, LastName, Password, "pCampBot", "Your name")) | 226 | if (Client.Network.Login(FirstName, LastName, Password, "pCampBot", "Your name")) |
213 | { | 227 | { |
214 | IsConnected = true; | 228 | ConnectionState = ConnectionState.Connected; |
215 | 229 | ||
216 | Thread.Sleep(Random.Next(1000, 10000)); | 230 | Thread.Sleep(Random.Next(1000, 10000)); |
217 | m_actionThread = new Thread(Action); | 231 | m_actionThread = new Thread(Action); |
@@ -241,6 +255,8 @@ namespace pCampBot | |||
241 | } | 255 | } |
242 | else | 256 | else |
243 | { | 257 | { |
258 | ConnectionState = ConnectionState.Disconnected; | ||
259 | |||
244 | m_log.ErrorFormat( | 260 | m_log.ErrorFormat( |
245 | "{0} {1} cannot login: {2}", FirstName, LastName, Client.Network.LoginMessage); | 261 | "{0} {1} cannot login: {2}", FirstName, LastName, Client.Network.LoginMessage); |
246 | 262 | ||
@@ -439,6 +455,8 @@ namespace pCampBot | |||
439 | 455 | ||
440 | public void Network_OnDisconnected(object sender, DisconnectedEventArgs args) | 456 | public void Network_OnDisconnected(object sender, DisconnectedEventArgs args) |
441 | { | 457 | { |
458 | ConnectionState = ConnectionState.Disconnected; | ||
459 | |||
442 | m_log.DebugFormat( | 460 | m_log.DebugFormat( |
443 | "[BOT]: Bot {0} disconnected reason {1}, message {2}", Name, args.Reason, args.Message); | 461 | "[BOT]: Bot {0} disconnected reason {1}, message {2}", Name, args.Reason, args.Message); |
444 | 462 | ||
@@ -456,13 +474,15 @@ namespace pCampBot | |||
456 | && OnDisconnected != null) | 474 | && OnDisconnected != null) |
457 | // if (OnDisconnected != null) | 475 | // if (OnDisconnected != null) |
458 | { | 476 | { |
459 | IsConnected = false; | ||
460 | OnDisconnected(this, EventType.DISCONNECTED); | 477 | OnDisconnected(this, EventType.DISCONNECTED); |
461 | } | 478 | } |
462 | } | 479 | } |
463 | 480 | ||
464 | public void Objects_NewPrim(object sender, PrimEventArgs args) | 481 | public void Objects_NewPrim(object sender, PrimEventArgs args) |
465 | { | 482 | { |
483 | // if (Name.EndsWith("4")) | ||
484 | // throw new Exception("Aaargh"); | ||
485 | |||
466 | Primitive prim = args.Prim; | 486 | Primitive prim = args.Prim; |
467 | 487 | ||
468 | if (prim != null) | 488 | if (prim != null) |
diff --git a/OpenSim/Tools/pCampBot/BotManager.cs b/OpenSim/Tools/pCampBot/BotManager.cs index 0f501b7..d615b3f 100644 --- a/OpenSim/Tools/pCampBot/BotManager.cs +++ b/OpenSim/Tools/pCampBot/BotManager.cs | |||
@@ -49,6 +49,14 @@ namespace pCampBot | |||
49 | { | 49 | { |
50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
51 | 51 | ||
52 | public const int DefaultLoginDelay = 5000; | ||
53 | |||
54 | /// <summary> | ||
55 | /// Delay between logins of multiple bots. | ||
56 | /// </summary> | ||
57 | /// <remarks>TODO: This value needs to be configurable by a command line argument.</remarks> | ||
58 | public int LoginDelay { get; set; } | ||
59 | |||
52 | /// <summary> | 60 | /// <summary> |
53 | /// Command console | 61 | /// Command console |
54 | /// </summary> | 62 | /// </summary> |
@@ -84,6 +92,8 @@ namespace pCampBot | |||
84 | /// </summary> | 92 | /// </summary> |
85 | public BotManager() | 93 | public BotManager() |
86 | { | 94 | { |
95 | LoginDelay = DefaultLoginDelay; | ||
96 | |||
87 | Rng = new Random(Environment.TickCount); | 97 | Rng = new Random(Environment.TickCount); |
88 | AssetsReceived = new Dictionary<UUID, bool>(); | 98 | AssetsReceived = new Dictionary<UUID, bool>(); |
89 | RegionsKnown = new Dictionary<ulong, GridRegion>(); | 99 | RegionsKnown = new Dictionary<ulong, GridRegion>(); |
@@ -151,28 +161,34 @@ namespace pCampBot | |||
151 | Array.ForEach<string>( | 161 | Array.ForEach<string>( |
152 | cs.GetString("behaviours", "p").Split(new char[] { ',' }), b => behaviourSwitches.Add(b)); | 162 | cs.GetString("behaviours", "p").Split(new char[] { ',' }), b => behaviourSwitches.Add(b)); |
153 | 163 | ||
164 | MainConsole.Instance.OutputFormat( | ||
165 | "[BOT MANAGER]: Starting {0} bots connecting to {1}, named {2} {3}_<n>", | ||
166 | botcount, | ||
167 | loginUri, | ||
168 | firstName, | ||
169 | lastNameStem); | ||
170 | |||
171 | MainConsole.Instance.OutputFormat("[BOT MANAGER]: Delay between logins is {0}ms", LoginDelay); | ||
172 | |||
154 | for (int i = 0; i < botcount; i++) | 173 | for (int i = 0; i < botcount; i++) |
155 | { | 174 | { |
156 | string lastName = string.Format("{0}_{1}", lastNameStem, i); | 175 | string lastName = string.Format("{0}_{1}", lastNameStem, i); |
157 | 176 | ||
177 | // We must give each bot its own list of instantiated behaviours since they store state. | ||
158 | List<IBehaviour> behaviours = new List<IBehaviour>(); | 178 | List<IBehaviour> behaviours = new List<IBehaviour>(); |
159 | 179 | ||
160 | // Hard-coded for now | 180 | // Hard-coded for now |
161 | if (behaviourSwitches.Contains("p")) | 181 | if (behaviourSwitches.Contains("p")) |
162 | behaviours.Add(new PhysicsBehaviour()); | 182 | behaviours.Add(new PhysicsBehaviour()); |
163 | 183 | ||
164 | if (behaviourSwitches.Contains("g")) | 184 | if (behaviourSwitches.Contains("g")) |
165 | behaviours.Add(new GrabbingBehaviour()); | 185 | behaviours.Add(new GrabbingBehaviour()); |
166 | 186 | ||
167 | if (behaviourSwitches.Contains("t")) | 187 | if (behaviourSwitches.Contains("t")) |
168 | behaviours.Add(new TeleportBehaviour()); | 188 | behaviours.Add(new TeleportBehaviour()); |
169 | 189 | ||
170 | if (behaviourSwitches.Contains("c")) | 190 | if (behaviourSwitches.Contains("c")) |
171 | behaviours.Add(new CrossBehaviour()); | 191 | behaviours.Add(new CrossBehaviour()); |
172 | |||
173 | MainConsole.Instance.OutputFormat( | ||
174 | "[BOT MANAGER]: Bot {0} {1} configured for behaviours {2}", | ||
175 | firstName, lastName, string.Join(",", behaviours.ConvertAll<string>(b => b.Name).ToArray())); | ||
176 | 192 | ||
177 | StartBot(this, behaviours, firstName, lastName, password, loginUri); | 193 | StartBot(this, behaviours, firstName, lastName, password, loginUri); |
178 | } | 194 | } |
@@ -211,6 +227,10 @@ namespace pCampBot | |||
211 | BotManager bm, List<IBehaviour> behaviours, | 227 | BotManager bm, List<IBehaviour> behaviours, |
212 | string firstName, string lastName, string password, string loginUri) | 228 | string firstName, string lastName, string password, string loginUri) |
213 | { | 229 | { |
230 | MainConsole.Instance.OutputFormat( | ||
231 | "[BOT MANAGER]: Starting bot {0} {1}, behaviours are {2}", | ||
232 | firstName, lastName, string.Join(",", behaviours.ConvertAll<string>(b => b.Name).ToArray())); | ||
233 | |||
214 | Bot pb = new Bot(bm, behaviours, firstName, lastName, password, loginUri); | 234 | Bot pb = new Bot(bm, behaviours, firstName, lastName, password, loginUri); |
215 | 235 | ||
216 | pb.OnConnected += handlebotEvent; | 236 | pb.OnConnected += handlebotEvent; |
@@ -222,7 +242,11 @@ namespace pCampBot | |||
222 | Thread pbThread = new Thread(pb.startup); | 242 | Thread pbThread = new Thread(pb.startup); |
223 | pbThread.Name = pb.Name; | 243 | pbThread.Name = pb.Name; |
224 | pbThread.IsBackground = true; | 244 | pbThread.IsBackground = true; |
245 | |||
225 | pbThread.Start(); | 246 | pbThread.Start(); |
247 | |||
248 | // Stagger logins | ||
249 | Thread.Sleep(LoginDelay); | ||
226 | } | 250 | } |
227 | 251 | ||
228 | /// <summary> | 252 | /// <summary> |
@@ -242,7 +266,7 @@ namespace pCampBot | |||
242 | 266 | ||
243 | lock (m_lBot) | 267 | lock (m_lBot) |
244 | { | 268 | { |
245 | if (m_lBot.TrueForAll(b => !b.IsConnected)) | 269 | if (m_lBot.TrueForAll(b => b.ConnectionState == ConnectionState.Disconnected)) |
246 | Environment.Exit(0); | 270 | Environment.Exit(0); |
247 | 271 | ||
248 | break; | 272 | break; |
@@ -251,13 +275,21 @@ namespace pCampBot | |||
251 | } | 275 | } |
252 | 276 | ||
253 | /// <summary> | 277 | /// <summary> |
254 | /// Shutting down all bots | 278 | /// Shut down all bots |
255 | /// </summary> | 279 | /// </summary> |
280 | /// <remarks> | ||
281 | /// We launch each shutdown on its own thread so that a slow shutting down bot doesn't hold up all the others. | ||
282 | /// </remarks> | ||
256 | public void doBotShutdown() | 283 | public void doBotShutdown() |
257 | { | 284 | { |
258 | lock (m_lBot) | 285 | lock (m_lBot) |
259 | foreach (Bot pb in m_lBot) | 286 | { |
260 | pb.shutdown(); | 287 | foreach (Bot bot in m_lBot) |
288 | { | ||
289 | Bot thisBot = bot; | ||
290 | Util.FireAndForget(o => thisBot.shutdown()); | ||
291 | } | ||
292 | } | ||
261 | } | 293 | } |
262 | 294 | ||
263 | /// <summary> | 295 | /// <summary> |
@@ -271,11 +303,8 @@ namespace pCampBot | |||
271 | 303 | ||
272 | private void HandleShutdown(string module, string[] cmd) | 304 | private void HandleShutdown(string module, string[] cmd) |
273 | { | 305 | { |
274 | Util.FireAndForget(o => | 306 | m_log.Info("[BOTMANAGER]: Shutting down bots"); |
275 | { | 307 | doBotShutdown(); |
276 | m_log.Warn("[BOTMANAGER]: Shutting down bots"); | ||
277 | doBotShutdown(); | ||
278 | }); | ||
279 | } | 308 | } |
280 | 309 | ||
281 | private void HandleShowRegions(string module, string[] cmd) | 310 | private void HandleShowRegions(string module, string[] cmd) |
@@ -302,9 +331,11 @@ namespace pCampBot | |||
302 | { | 331 | { |
303 | foreach (Bot pb in m_lBot) | 332 | foreach (Bot pb in m_lBot) |
304 | { | 333 | { |
334 | Simulator currentSim = pb.Client.Network.CurrentSim; | ||
335 | |||
305 | MainConsole.Instance.OutputFormat( | 336 | MainConsole.Instance.OutputFormat( |
306 | outputFormat, | 337 | outputFormat, |
307 | pb.Name, pb.Client.Network.CurrentSim.Name, pb.IsConnected ? "Connected" : "Disconnected"); | 338 | pb.Name, currentSim != null ? currentSim.Name : "(none)", pb.ConnectionState); |
308 | } | 339 | } |
309 | } | 340 | } |
310 | } | 341 | } |
diff --git a/OpenSim/Tools/pCampBot/pCampBot.cs b/OpenSim/Tools/pCampBot/pCampBot.cs index ec5ad04..9e82577 100644 --- a/OpenSim/Tools/pCampBot/pCampBot.cs +++ b/OpenSim/Tools/pCampBot/pCampBot.cs | |||
@@ -27,7 +27,9 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Reflection; | 29 | using System.Reflection; |
30 | using System.Threading; | ||
30 | using log4net; | 31 | using log4net; |
32 | using log4net.Config; | ||
31 | using Nini.Config; | 33 | using Nini.Config; |
32 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
33 | using OpenSim.Framework.Console; | 35 | using OpenSim.Framework.Console; |
@@ -51,6 +53,8 @@ namespace pCampBot | |||
51 | [STAThread] | 53 | [STAThread] |
52 | public static void Main(string[] args) | 54 | public static void Main(string[] args) |
53 | { | 55 | { |
56 | XmlConfigurator.Configure(); | ||
57 | |||
54 | IConfig config = ParseConfig(args); | 58 | IConfig config = ParseConfig(args); |
55 | if (config.Get("help") != null || config.Get("loginuri") == null) | 59 | if (config.Get("help") != null || config.Get("loginuri") == null) |
56 | { | 60 | { |
@@ -67,7 +71,9 @@ namespace pCampBot | |||
67 | BotManager bm = new BotManager(); | 71 | BotManager bm = new BotManager(); |
68 | 72 | ||
69 | //startup specified number of bots. 1 is the default | 73 | //startup specified number of bots. 1 is the default |
70 | bm.dobotStartup(botcount, config); | 74 | Thread startBotThread = new Thread(o => bm.dobotStartup(botcount, config)); |
75 | startBotThread.Name = "Initial start bots thread"; | ||
76 | startBotThread.Start(); | ||
71 | 77 | ||
72 | while (true) | 78 | while (true) |
73 | { | 79 | { |