aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs2
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs7
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Assets/NewFileAgentInventoryVariablePriceModule.cs7
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs27
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs4
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs29
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs562
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs9
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs2
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs18
-rw-r--r--OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs18
-rw-r--r--OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs3
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs99
-rw-r--r--OpenSim/Region/Physics/Meshing/SculptMap.cs13
-rw-r--r--OpenSim/Services/FreeswitchService/FreeswitchService.cs29
-rw-r--r--OpenSim/Services/FreeswitchService/FreeswitchServiceBase.cs2
-rw-r--r--bin/OpenSim.ini.example42
-rw-r--r--bin/OpenSimDefaults.ini10
-rw-r--r--bin/Robust.HG.ini.example42
-rw-r--r--bin/Robust.ini.example38
-rw-r--r--bin/config-include/StandaloneCommon.ini.example18
21 files changed, 588 insertions, 393 deletions
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
index ccec9b7..ba89e21 100644
--- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
@@ -430,7 +430,7 @@ namespace OpenSim.Framework.Servers.HttpServer
430 string path = request.RawUrl; 430 string path = request.RawUrl;
431 string handlerKey = GetHandlerKey(request.HttpMethod, path); 431 string handlerKey = GetHandlerKey(request.HttpMethod, path);
432 432
433 //m_log.DebugFormat("[BASE HTTP SERVER]: Handling {0} request for {1}", request.HttpMethod, path); 433// m_log.DebugFormat("[BASE HTTP SERVER]: Handling {0} request for {1}", request.HttpMethod, path);
434 434
435 if (TryGetStreamHandler(handlerKey, out requestHandler)) 435 if (TryGetStreamHandler(handlerKey, out requestHandler))
436 { 436 {
diff --git a/OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs b/OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs
index d2278bc..deec444 100644
--- a/OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs
@@ -66,12 +66,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Assets
66 66
67 public void Initialise(IConfigSource source) 67 public void Initialise(IConfigSource source)
68 { 68 {
69 IConfig startupConfig = source.Configs["Startup"]; 69 IConfig meshConfig = source.Configs["Mesh"];
70 if (startupConfig == null) 70 if (meshConfig == null)
71 return; 71 return;
72 72
73 if (!startupConfig.GetBoolean("ColladaMesh",true)) 73 m_enabled = meshConfig.GetBoolean("ColladaMesh", true);
74 m_enabled = false;
75 } 74 }
76 75
77 public void AddRegion(Scene pScene) 76 public void AddRegion(Scene pScene)
diff --git a/OpenSim/Region/CoreModules/Avatar/Assets/NewFileAgentInventoryVariablePriceModule.cs b/OpenSim/Region/CoreModules/Avatar/Assets/NewFileAgentInventoryVariablePriceModule.cs
index fb07cc9..d651cb2 100644
--- a/OpenSim/Region/CoreModules/Avatar/Assets/NewFileAgentInventoryVariablePriceModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Assets/NewFileAgentInventoryVariablePriceModule.cs
@@ -68,12 +68,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Assets
68 68
69 public void Initialise(IConfigSource source) 69 public void Initialise(IConfigSource source)
70 { 70 {
71 IConfig startupConfig = source.Configs["Startup"]; 71 IConfig meshConfig = source.Configs["Mesh"];
72 if (startupConfig == null) 72 if (meshConfig == null)
73 return; 73 return;
74 74
75 if (!startupConfig.GetBoolean("ColladaMesh",true)) 75 m_enabled = meshConfig.GetBoolean("ColladaMesh", true);
76 m_enabled = false;
77 } 76 }
78 77
79 public void AddRegion(Scene pScene) 78 public void AddRegion(Scene pScene)
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
index 2fff533..a19bbfd 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
@@ -77,7 +77,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
77 /// </value> 77 /// </value>
78 private Stream m_loadStream; 78 private Stream m_loadStream;
79 79
80 protected bool m_controlFileLoaded; 80 /// <summary>
81 /// Has the control file been loaded for this archive?
82 /// </summary>
83 public bool ControlFileLoaded { get; private set; }
84
85 /// <summary>
86 /// Do we want to enforce the check. IAR versions before 0.2 and 1.1 do not guarantee this order, so we can't
87 /// enforce.
88 /// </summary>
89 public bool EnforceControlFileCheck { get; private set; }
90
81 protected bool m_assetsLoaded; 91 protected bool m_assetsLoaded;
82 protected bool m_inventoryNodesLoaded; 92 protected bool m_inventoryNodesLoaded;
83 93
@@ -126,6 +136,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
126 m_userInfo = userInfo; 136 m_userInfo = userInfo;
127 m_invPath = invPath; 137 m_invPath = invPath;
128 m_loadStream = loadStream; 138 m_loadStream = loadStream;
139
140 // FIXME: Do not perform this check since older versions of OpenSim do save the control file after other things
141 // (I thought they weren't). We will need to bump the version number and perform this check on all
142 // subsequent IAR versions only
143 ControlFileLoaded = true;
129 } 144 }
130 145
131 /// <summary> 146 /// <summary>
@@ -517,7 +532,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
517 /// </summary> 532 /// </summary>
518 /// <param name="path"></param> 533 /// <param name="path"></param>
519 /// <param name="data"></param> 534 /// <param name="data"></param>
520 protected void LoadControlFile(string path, byte[] data) 535 public void LoadControlFile(string path, byte[] data)
521 { 536 {
522 XDocument doc = XDocument.Parse(Encoding.ASCII.GetString(data)); 537 XDocument doc = XDocument.Parse(Encoding.ASCII.GetString(data));
523 XElement archiveElement = doc.Element("archive"); 538 XElement archiveElement = doc.Element("archive");
@@ -533,7 +548,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
533 majorVersion, MAX_MAJOR_VERSION)); 548 majorVersion, MAX_MAJOR_VERSION));
534 } 549 }
535 550
536 m_controlFileLoaded = true; 551 ControlFileLoaded = true;
537 m_log.InfoFormat("[INVENTORY ARCHIVER]: Loading IAR with version {0}", version); 552 m_log.InfoFormat("[INVENTORY ARCHIVER]: Loading IAR with version {0}", version);
538 } 553 }
539 554
@@ -545,7 +560,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
545 /// <param name="data"></param> 560 /// <param name="data"></param>
546 protected void LoadInventoryFile(string path, TarArchiveReader.TarEntryType entryType, byte[] data) 561 protected void LoadInventoryFile(string path, TarArchiveReader.TarEntryType entryType, byte[] data)
547 { 562 {
548 if (!m_controlFileLoaded) 563 if (!ControlFileLoaded)
549 throw new Exception( 564 throw new Exception(
550 string.Format( 565 string.Format(
551 "The IAR you are trying to load does not list {0} before {1}. Aborting load", 566 "The IAR you are trying to load does not list {0} before {1}. Aborting load",
@@ -592,7 +607,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
592 /// <param name="data"></param> 607 /// <param name="data"></param>
593 protected void LoadAssetFile(string path, byte[] data) 608 protected void LoadAssetFile(string path, byte[] data)
594 { 609 {
595 if (!m_controlFileLoaded) 610 if (!ControlFileLoaded)
596 throw new Exception( 611 throw new Exception(
597 string.Format( 612 string.Format(
598 "The IAR you are trying to load does not list {0} before {1}. Aborting load", 613 "The IAR you are trying to load does not list {0} before {1}. Aborting load",
@@ -617,4 +632,4 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
617 m_assetsLoaded = true; 632 m_assetsLoaded = true;
618 } 633 }
619 } 634 }
620} \ No newline at end of file 635}
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
index 5e5f6c0..dd16bfe 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
@@ -388,12 +388,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
388 if (options.ContainsKey("profile")) 388 if (options.ContainsKey("profile"))
389 { 389 {
390 majorVersion = 1; 390 majorVersion = 1;
391 minorVersion = 0; 391 minorVersion = 1;
392 } 392 }
393 else 393 else
394 { 394 {
395 majorVersion = 0; 395 majorVersion = 0;
396 minorVersion = 1; 396 minorVersion = 2;
397 } 397 }
398 398
399 m_log.InfoFormat("[INVENTORY ARCHIVER]: Creating version {0}.{1} IAR", majorVersion, minorVersion); 399 m_log.InfoFormat("[INVENTORY ARCHIVER]: Creating version {0}.{1} IAR", majorVersion, minorVersion);
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs
index d03f6da..52232a0 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs
@@ -94,7 +94,34 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
94 94
95 Assert.That(coaObjects[1].UUID, Is.EqualTo(UUID.Parse("00000000-0000-0000-0000-000000000140"))); 95 Assert.That(coaObjects[1].UUID, Is.EqualTo(UUID.Parse("00000000-0000-0000-0000-000000000140")));
96 Assert.That(coaObjects[1].AbsolutePosition, Is.EqualTo(new Vector3(25, 50, 75))); 96 Assert.That(coaObjects[1].AbsolutePosition, Is.EqualTo(new Vector3(25, 50, 75)));
97 } 97 }
98
99 /// <summary>
100 /// Test that the IAR has the required files in the right order.
101 /// </summary>
102 /// <remarks>
103 /// At the moment, the only thing that matters is that the control file is the very first one.
104 /// </remarks>
105 [Test]
106 public void TestOrder()
107 {
108 TestHelper.InMethod();
109// log4net.Config.XmlConfigurator.Configure();
110
111 MemoryStream archiveReadStream = new MemoryStream(m_iarStreamBytes);
112 TarArchiveReader tar = new TarArchiveReader(archiveReadStream);
113 string filePath;
114 TarArchiveReader.TarEntryType tarEntryType;
115
116 byte[] data = tar.ReadEntry(out filePath, out tarEntryType);
117 Assert.That(filePath, Is.EqualTo(ArchiveConstants.CONTROL_FILE_PATH));
118
119 InventoryArchiveReadRequest iarr
120 = new InventoryArchiveReadRequest(null, null, null, (Stream)null, false);
121 iarr.LoadControlFile(filePath, data);
122
123 Assert.That(iarr.ControlFileLoaded, Is.True);
124 }
98 125
99 /// <summary> 126 /// <summary>
100 /// Test saving a single inventory item to a V0.1 OpenSim Inventory Archive 127 /// Test saving a single inventory item to a V0.1 OpenSim Inventory Archive
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index 6d40e12..a165bbd 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -213,19 +213,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
213 213
214 return UUID.Zero; 214 return UUID.Zero;
215 } 215 }
216 216
217 /// <summary> 217 public virtual UUID CopyToInventory(DeRezAction action, UUID folderID,
218 /// Delete a scene object from a scene and place in the given avatar's inventory.
219 /// Returns the UUID of the newly created asset.
220 /// </summary>
221 /// <param name="action"></param>
222 /// <param name="folderID"></param>
223 /// <param name="objectGroup"></param>
224 /// <param name="remoteClient"> </param>
225 public virtual UUID DeleteToInventory(DeRezAction action, UUID folderID,
226 List<SceneObjectGroup> objectGroups, IClientAPI remoteClient) 218 List<SceneObjectGroup> objectGroups, IClientAPI remoteClient)
227 { 219 {
228 Dictionary<UUID, List<SceneObjectGroup>> deletes = new Dictionary<UUID, List<SceneObjectGroup>>(); 220 Dictionary<UUID, List<SceneObjectGroup>> bundlesToCopy = new Dictionary<UUID, List<SceneObjectGroup>>();
229 221
230 if (CoalesceMultipleObjectsToInventory) 222 if (CoalesceMultipleObjectsToInventory)
231 { 223 {
@@ -234,10 +226,10 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
234 // reasons. 226 // reasons.
235 foreach (SceneObjectGroup g in objectGroups) 227 foreach (SceneObjectGroup g in objectGroups)
236 { 228 {
237 if (!deletes.ContainsKey(g.OwnerID)) 229 if (!bundlesToCopy.ContainsKey(g.OwnerID))
238 deletes[g.OwnerID] = new List<SceneObjectGroup>(); 230 bundlesToCopy[g.OwnerID] = new List<SceneObjectGroup>();
239 231
240 deletes[g.OwnerID].Add(g); 232 bundlesToCopy[g.OwnerID].Add(g);
241 } 233 }
242 } 234 }
243 else 235 else
@@ -247,7 +239,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
247 { 239 {
248 List<SceneObjectGroup> bundle = new List<SceneObjectGroup>(); 240 List<SceneObjectGroup> bundle = new List<SceneObjectGroup>();
249 bundle.Add(g); 241 bundle.Add(g);
250 deletes[g.UUID] = bundle; 242 bundlesToCopy[g.UUID] = bundle;
251 } 243 }
252 } 244 }
253 245
@@ -257,328 +249,348 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
257 249
258 // Each iteration is really a separate asset being created, 250 // Each iteration is really a separate asset being created,
259 // with distinct destinations as well. 251 // with distinct destinations as well.
260 foreach (List<SceneObjectGroup> objlist in deletes.Values) 252 foreach (List<SceneObjectGroup> bundle in bundlesToCopy.Values)
253 assetID = CopyBundleToInventory(action, folderID, bundle, remoteClient);
254
255 return assetID;
256 }
257
258 /// <summary>
259 /// Copy a bundle of objects to inventory. If there is only one object, then this will create an object
260 /// item. If there are multiple objects then these will be saved as a single coalesced item.
261 /// </summary>
262 /// <param name="action"></param>
263 /// <param name="folderID"></param>
264 /// <param name="objlist"></param>
265 /// <param name="remoteClient"></param>
266 /// <returns></returns>
267 protected UUID CopyBundleToInventory(
268 DeRezAction action, UUID folderID, List<SceneObjectGroup> objlist, IClientAPI remoteClient)
269 {
270 UUID assetID = UUID.Zero;
271
272 CoalescedSceneObjects coa = new CoalescedSceneObjects(UUID.Zero);
273 Dictionary<UUID, Vector3> originalPositions = new Dictionary<UUID, Vector3>();
274
275 Dictionary<UUID, string> xmlStrings =
276 new Dictionary<UUID, string>();
277
278 foreach (SceneObjectGroup objectGroup in objlist)
261 { 279 {
262 Dictionary<UUID, string> xmlStrings = 280 Vector3 inventoryStoredPosition = new Vector3
263 new Dictionary<UUID, string>(); 281 (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize)
282 ? 250
283 : objectGroup.AbsolutePosition.X)
284 ,
285 (objectGroup.AbsolutePosition.Y > (int)Constants.RegionSize)
286 ? 250
287 : objectGroup.AbsolutePosition.Y,
288 objectGroup.AbsolutePosition.Z);
289
290 Vector3 originalPosition = objectGroup.AbsolutePosition;
291
292 // Restore attachment data after trip through the sim
293 if (objectGroup.RootPart.AttachPoint > 0)
294 inventoryStoredPosition = objectGroup.RootPart.AttachOffset;
295 objectGroup.RootPart.Shape.State = objectGroup.RootPart.AttachPoint;
296
297 objectGroup.AbsolutePosition = inventoryStoredPosition;
298
299 // Make sure all bits but the ones we want are clear
300 // on take.
301 // This will be applied to the current perms, so
302 // it will do what we want.
303 objectGroup.RootPart.NextOwnerMask &=
304 ((uint)PermissionMask.Copy |
305 (uint)PermissionMask.Transfer |
306 (uint)PermissionMask.Modify);
307 objectGroup.RootPart.NextOwnerMask |=
308 (uint)PermissionMask.Move;
309
310 string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(objectGroup);
311
312 objectGroup.AbsolutePosition = originalPosition;
313
314 xmlStrings[objectGroup.UUID] = sceneObjectXml;
315 }
264 316
265 foreach (SceneObjectGroup objectGroup in objlist) 317 string itemXml;
266 {
267 Vector3 inventoryStoredPosition = new Vector3
268 (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize)
269 ? 250
270 : objectGroup.AbsolutePosition.X)
271 ,
272 (objectGroup.AbsolutePosition.Y > (int)Constants.RegionSize)
273 ? 250
274 : objectGroup.AbsolutePosition.Y,
275 objectGroup.AbsolutePosition.Z);
276
277 Vector3 originalPosition = objectGroup.AbsolutePosition;
278
279 // Restore attachment data after trip through the sim
280 if (objectGroup.RootPart.AttachPoint > 0)
281 inventoryStoredPosition = objectGroup.RootPart.AttachOffset;
282 objectGroup.RootPart.Shape.State = objectGroup.RootPart.AttachPoint;
283
284 objectGroup.AbsolutePosition = inventoryStoredPosition;
285
286 // Make sure all bits but the ones we want are clear
287 // on take.
288 // This will be applied to the current perms, so
289 // it will do what we want.
290 objectGroup.RootPart.NextOwnerMask &=
291 ((uint)PermissionMask.Copy |
292 (uint)PermissionMask.Transfer |
293 (uint)PermissionMask.Modify);
294 objectGroup.RootPart.NextOwnerMask |=
295 (uint)PermissionMask.Move;
296 318
297 string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(objectGroup); 319 if (objlist.Count > 1)
320 {
321 float minX, minY, minZ;
322 float maxX, maxY, maxZ;
323
324 Vector3[] offsets = Scene.GetCombinedBoundingBox(objlist,
325 out minX, out maxX, out minY, out maxY,
326 out minZ, out maxZ);
298 327
299 objectGroup.AbsolutePosition = originalPosition; 328 // CreateWrapper
329 XmlDocument itemDoc = new XmlDocument();
330 XmlElement root = itemDoc.CreateElement("", "CoalescedObject", "");
331 itemDoc.AppendChild(root);
300 332
301 xmlStrings[objectGroup.UUID] = sceneObjectXml; 333 // Embed the offsets into the group XML
334 for ( int i = 0 ; i < objlist.Count ; i++ )
335 {
336 XmlDocument doc = new XmlDocument();
337 SceneObjectGroup g = objlist[i];
338 doc.LoadXml(xmlStrings[g.UUID]);
339 XmlElement e = (XmlElement)doc.SelectSingleNode("/SceneObjectGroup");
340 e.SetAttribute("offsetx", offsets[i].X.ToString());
341 e.SetAttribute("offsety", offsets[i].Y.ToString());
342 e.SetAttribute("offsetz", offsets[i].Z.ToString());
343
344 XmlNode objectNode = itemDoc.ImportNode(e, true);
345 root.AppendChild(objectNode);
302 } 346 }
303 347
304 string itemXml; 348 float sizeX = maxX - minX;
349 float sizeY = maxY - minY;
350 float sizeZ = maxZ - minZ;
305 351
306 if (objlist.Count > 1) 352 root.SetAttribute("x", sizeX.ToString());
307 { 353 root.SetAttribute("y", sizeY.ToString());
308 float minX, minY, minZ; 354 root.SetAttribute("z", sizeZ.ToString());
309 float maxX, maxY, maxZ;
310 355
311 Vector3[] offsets = Scene.GetCombinedBoundingBox(objlist, 356 itemXml = itemDoc.InnerXml;
312 out minX, out maxX, out minY, out maxY, 357 }
313 out minZ, out maxZ); 358 else
359 {
360 itemXml = xmlStrings[objlist[0].UUID];
361 }
314 362
315 // CreateWrapper 363 // Get the user info of the item destination
316 XmlDocument itemDoc = new XmlDocument(); 364 //
317 XmlElement root = itemDoc.CreateElement("", "CoalescedObject", ""); 365 UUID userID = UUID.Zero;
318 itemDoc.AppendChild(root);
319 366
320 // Embed the offsets into the group XML 367 if (action == DeRezAction.Take || action == DeRezAction.TakeCopy ||
321 for ( int i = 0 ; i < objlist.Count ; i++ ) 368 action == DeRezAction.SaveToExistingUserInventoryItem)
322 { 369 {
323 XmlDocument doc = new XmlDocument(); 370 // Take or take copy require a taker
324 SceneObjectGroup g = objlist[i]; 371 // Saving changes requires a local user
325 doc.LoadXml(xmlStrings[g.UUID]); 372 //
326 XmlElement e = (XmlElement)doc.SelectSingleNode("/SceneObjectGroup"); 373 if (remoteClient == null)
327 e.SetAttribute("offsetx", offsets[i].X.ToString()); 374 return UUID.Zero;
328 e.SetAttribute("offsety", offsets[i].Y.ToString());
329 e.SetAttribute("offsetz", offsets[i].Z.ToString());
330
331 XmlNode objectNode = itemDoc.ImportNode(e, true);
332 root.AppendChild(objectNode);
333 }
334 375
335 float sizeX = maxX - minX; 376 userID = remoteClient.AgentId;
336 float sizeY = maxY - minY; 377 }
337 float sizeZ = maxZ - minZ; 378 else
379 {
380 // All returns / deletes go to the object owner
381 //
338 382
339 root.SetAttribute("x", sizeX.ToString()); 383 userID = objlist[0].RootPart.OwnerID;
340 root.SetAttribute("y", sizeY.ToString()); 384 }
341 root.SetAttribute("z", sizeZ.ToString());
342 385
343 itemXml = itemDoc.InnerXml; 386 if (userID == UUID.Zero) // Can't proceed
344 } 387 {
345 else 388 return UUID.Zero;
346 { 389 }
347 itemXml = xmlStrings[objlist[0].UUID];
348 }
349 390
350 // Get the user info of the item destination 391 // If we're returning someone's item, it goes back to the
351 // 392 // owner's Lost And Found folder.
352 UUID userID = UUID.Zero; 393 // Delete is treated like return in this case
394 // Deleting your own items makes them go to trash
395 //
353 396
354 if (action == DeRezAction.Take || action == DeRezAction.TakeCopy || 397 InventoryFolderBase folder = null;
355 action == DeRezAction.SaveToExistingUserInventoryItem) 398 InventoryItemBase item = null;
356 {
357 // Take or take copy require a taker
358 // Saving changes requires a local user
359 //
360 if (remoteClient == null)
361 return UUID.Zero;
362 399
363 userID = remoteClient.AgentId; 400 if (DeRezAction.SaveToExistingUserInventoryItem == action)
364 } 401 {
365 else 402 item = new InventoryItemBase(objlist[0].RootPart.FromUserInventoryItemID, userID);
366 { 403 item = m_Scene.InventoryService.GetItem(item);
367 // All returns / deletes go to the object owner
368 //
369 404
370 userID = objlist[0].RootPart.OwnerID; 405 //item = userInfo.RootFolder.FindItem(
371 } 406 // objectGroup.RootPart.FromUserInventoryItemID);
372 407
373 if (userID == UUID.Zero) // Can't proceed 408 if (null == item)
374 { 409 {
410 m_log.DebugFormat(
411 "[AGENT INVENTORY]: Object {0} {1} scheduled for save to inventory has already been deleted.",
412 objlist[0].Name, objlist[0].UUID);
375 return UUID.Zero; 413 return UUID.Zero;
376 } 414 }
377 415 }
378 // If we're returning someone's item, it goes back to the 416 else
379 // owner's Lost And Found folder. 417 {
380 // Delete is treated like return in this case 418 // Folder magic
381 // Deleting your own items makes them go to trash
382 // 419 //
383 420 if (action == DeRezAction.Delete)
384 InventoryFolderBase folder = null;
385 InventoryItemBase item = null;
386
387 if (DeRezAction.SaveToExistingUserInventoryItem == action)
388 { 421 {
389 item = new InventoryItemBase(objlist[0].RootPart.FromUserInventoryItemID, userID); 422 // Deleting someone else's item
390 item = m_Scene.InventoryService.GetItem(item); 423 //
391 424 if (remoteClient == null ||
392 //item = userInfo.RootFolder.FindItem( 425 objlist[0].OwnerID != remoteClient.AgentId)
393 // objectGroup.RootPart.FromUserInventoryItemID); 426 {
394 427
395 if (null == item) 428 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
429 }
430 else
396 { 431 {
397 m_log.DebugFormat( 432 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder);
398 "[AGENT INVENTORY]: Object {0} {1} scheduled for save to inventory has already been deleted.",
399 objlist[0].Name, objlist[0].UUID);
400 return UUID.Zero;
401 } 433 }
402 } 434 }
403 else 435 else if (action == DeRezAction.Return)
404 { 436 {
405 // Folder magic 437
438 // Dump to lost + found unconditionally
406 // 439 //
440 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
441 }
442
443 if (folderID == UUID.Zero && folder == null)
444 {
407 if (action == DeRezAction.Delete) 445 if (action == DeRezAction.Delete)
408 { 446 {
409 // Deleting someone else's item 447 // Deletes go to trash by default
410 // 448 //
449 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder);
450 }
451 else
452 {
411 if (remoteClient == null || 453 if (remoteClient == null ||
412 objlist[0].OwnerID != remoteClient.AgentId) 454 objlist[0].OwnerID != remoteClient.AgentId)
413 { 455 {
414 456 // Taking copy of another person's item. Take to
415 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); 457 // Objects folder.
458 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.Object);
416 } 459 }
417 else 460 else
418 { 461 {
419 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder); 462 // Catch all. Use lost & found
420 }
421 }
422 else if (action == DeRezAction.Return)
423 {
424
425 // Dump to lost + found unconditionally
426 //
427 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
428 }
429
430 if (folderID == UUID.Zero && folder == null)
431 {
432 if (action == DeRezAction.Delete)
433 {
434 // Deletes go to trash by default
435 // 463 //
436 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder);
437 }
438 else
439 {
440 if (remoteClient == null ||
441 objlist[0].OwnerID != remoteClient.AgentId)
442 {
443 // Taking copy of another person's item. Take to
444 // Objects folder.
445 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.Object);
446 }
447 else
448 {
449 // Catch all. Use lost & found
450 //
451 464
452 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); 465 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
453 }
454 } 466 }
455 } 467 }
468 }
456 469
457 // Override and put into where it came from, if it came 470 // Override and put into where it came from, if it came
458 // from anywhere in inventory 471 // from anywhere in inventory
459 // 472 //
460 if (action == DeRezAction.Take || action == DeRezAction.TakeCopy) 473 if (action == DeRezAction.Take || action == DeRezAction.TakeCopy)
474 {
475 if (objlist[0].RootPart.FromFolderID != UUID.Zero && objlist[0].OwnerID == remoteClient.AgentId)
461 { 476 {
462 if (objlist[0].RootPart.FromFolderID != UUID.Zero && objlist[0].OwnerID == remoteClient.AgentId) 477 InventoryFolderBase f = new InventoryFolderBase(objlist[0].RootPart.FromFolderID, userID);
463 { 478 folder = m_Scene.InventoryService.GetFolder(f);
464 InventoryFolderBase f = new InventoryFolderBase(objlist[0].RootPart.FromFolderID, userID);
465 folder = m_Scene.InventoryService.GetFolder(f);
466 }
467 } 479 }
480 }
468 481
469 if (folder == null) // None of the above 482 if (folder == null) // None of the above
470 { 483 {
471 folder = new InventoryFolderBase(folderID); 484 folder = new InventoryFolderBase(folderID);
472
473 if (folder == null) // Nowhere to put it
474 {
475 return UUID.Zero;
476 }
477 }
478 485
479 item = new InventoryItemBase(); 486 if (folder == null) // Nowhere to put it
480 // Can't know creator is the same, so null it in inventory
481 if (objlist.Count > 1)
482 { 487 {
483 item.CreatorId = UUID.Zero.ToString(); 488 return UUID.Zero;
484 item.CreatorData = String.Empty;
485 }
486 else
487 {
488 item.CreatorId = objlist[0].RootPart.CreatorID.ToString();
489 item.CreatorData = objlist[0].RootPart.CreatorData;
490 }
491 item.ID = UUID.Random();
492 item.InvType = (int)InventoryType.Object;
493 item.Folder = folder.ID;
494 item.Owner = userID;
495 if (objlist.Count > 1)
496 {
497 item.Flags = (uint)InventoryItemFlags.ObjectHasMultipleItems;
498 }
499 else
500 {
501 item.SaleType = objlist[0].RootPart.ObjectSaleType;
502 item.SalePrice = objlist[0].RootPart.SalePrice;
503 } 489 }
504 } 490 }
505 491
506 AssetBase asset = CreateAsset( 492 item = new InventoryItemBase();
507 objlist[0].GetPartName(objlist[0].RootPart.LocalId), 493 // Can't know creator is the same, so null it in inventory
508 objlist[0].GetPartDescription(objlist[0].RootPart.LocalId), 494 if (objlist.Count > 1)
509 (sbyte)AssetType.Object,
510 Utils.StringToBytes(itemXml),
511 objlist[0].OwnerID.ToString());
512 m_Scene.AssetService.Store(asset);
513 assetID = asset.FullID;
514
515 if (DeRezAction.SaveToExistingUserInventoryItem == action)
516 { 495 {
517 item.AssetID = asset.FullID; 496 item.CreatorId = UUID.Zero.ToString();
518 m_Scene.InventoryService.UpdateItem(item); 497 item.CreatorData = String.Empty;
519 } 498 }
520 else 499 else
521 { 500 {
522 item.AssetID = asset.FullID; 501 item.CreatorId = objlist[0].RootPart.CreatorID.ToString();
502 item.CreatorData = objlist[0].RootPart.CreatorData;
503 }
504 item.ID = UUID.Random();
505 item.InvType = (int)InventoryType.Object;
506 item.Folder = folder.ID;
507 item.Owner = userID;
508 if (objlist.Count > 1)
509 {
510 item.Flags = (uint)InventoryItemFlags.ObjectHasMultipleItems;
511 }
512 else
513 {
514 item.SaleType = objlist[0].RootPart.ObjectSaleType;
515 item.SalePrice = objlist[0].RootPart.SalePrice;
516 }
517 }
523 518
524 uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move) | 7; 519 AssetBase asset = CreateAsset(
525 foreach (SceneObjectGroup grp in objlist) 520 objlist[0].GetPartName(objlist[0].RootPart.LocalId),
526 effectivePerms &= grp.GetEffectivePermissions(); 521 objlist[0].GetPartDescription(objlist[0].RootPart.LocalId),
527 effectivePerms |= (uint)PermissionMask.Move; 522 (sbyte)AssetType.Object,
523 Utils.StringToBytes(itemXml),
524 objlist[0].OwnerID.ToString());
525 m_Scene.AssetService.Store(asset);
526 assetID = asset.FullID;
528 527
529 if (remoteClient != null && (remoteClient.AgentId != objlist[0].RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions()) 528 if (DeRezAction.SaveToExistingUserInventoryItem == action)
530 { 529 {
531 uint perms = effectivePerms; 530 item.AssetID = asset.FullID;
532 uint nextPerms = (perms & 7) << 13; 531 m_Scene.InventoryService.UpdateItem(item);
533 if ((nextPerms & (uint)PermissionMask.Copy) == 0) 532 }
534 perms &= ~(uint)PermissionMask.Copy; 533 else
535 if ((nextPerms & (uint)PermissionMask.Transfer) == 0) 534 {
536 perms &= ~(uint)PermissionMask.Transfer; 535 item.AssetID = asset.FullID;
537 if ((nextPerms & (uint)PermissionMask.Modify) == 0)
538 perms &= ~(uint)PermissionMask.Modify;
539
540 item.BasePermissions = perms & objlist[0].RootPart.NextOwnerMask;
541 item.CurrentPermissions = item.BasePermissions;
542 item.NextPermissions = perms & objlist[0].RootPart.NextOwnerMask;
543 item.EveryOnePermissions = objlist[0].RootPart.EveryoneMask & objlist[0].RootPart.NextOwnerMask;
544 item.GroupPermissions = objlist[0].RootPart.GroupMask & objlist[0].RootPart.NextOwnerMask;
545
546 item.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm;
547 }
548 else
549 {
550 item.BasePermissions = effectivePerms;
551 item.CurrentPermissions = effectivePerms;
552 item.NextPermissions = objlist[0].RootPart.NextOwnerMask & effectivePerms;
553 item.EveryOnePermissions = objlist[0].RootPart.EveryoneMask & effectivePerms;
554 item.GroupPermissions = objlist[0].RootPart.GroupMask & effectivePerms;
555
556 item.CurrentPermissions &=
557 ((uint)PermissionMask.Copy |
558 (uint)PermissionMask.Transfer |
559 (uint)PermissionMask.Modify |
560 (uint)PermissionMask.Move |
561 7); // Preserve folded permissions
562 }
563 536
564 item.CreationDate = Util.UnixTimeSinceEpoch(); 537 uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move) | 7;
565 item.Description = asset.Description; 538 foreach (SceneObjectGroup grp in objlist)
566 item.Name = asset.Name; 539 effectivePerms &= grp.GetEffectivePermissions();
567 item.AssetType = asset.Type; 540 effectivePerms |= (uint)PermissionMask.Move;
568 541
569 m_Scene.AddInventoryItem(item); 542 if (remoteClient != null && (remoteClient.AgentId != objlist[0].RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions())
543 {
544 uint perms = effectivePerms;
545 uint nextPerms = (perms & 7) << 13;
546 if ((nextPerms & (uint)PermissionMask.Copy) == 0)
547 perms &= ~(uint)PermissionMask.Copy;
548 if ((nextPerms & (uint)PermissionMask.Transfer) == 0)
549 perms &= ~(uint)PermissionMask.Transfer;
550 if ((nextPerms & (uint)PermissionMask.Modify) == 0)
551 perms &= ~(uint)PermissionMask.Modify;
552
553 item.BasePermissions = perms & objlist[0].RootPart.NextOwnerMask;
554 item.CurrentPermissions = item.BasePermissions;
555 item.NextPermissions = perms & objlist[0].RootPart.NextOwnerMask;
556 item.EveryOnePermissions = objlist[0].RootPart.EveryoneMask & objlist[0].RootPart.NextOwnerMask;
557 item.GroupPermissions = objlist[0].RootPart.GroupMask & objlist[0].RootPart.NextOwnerMask;
558
559 item.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm;
560 }
561 else
562 {
563 item.BasePermissions = effectivePerms;
564 item.CurrentPermissions = effectivePerms;
565 item.NextPermissions = objlist[0].RootPart.NextOwnerMask & effectivePerms;
566 item.EveryOnePermissions = objlist[0].RootPart.EveryoneMask & effectivePerms;
567 item.GroupPermissions = objlist[0].RootPart.GroupMask & effectivePerms;
570 568
571 if (remoteClient != null && item.Owner == remoteClient.AgentId) 569 item.CurrentPermissions &=
572 { 570 ((uint)PermissionMask.Copy |
573 remoteClient.SendInventoryItemCreateUpdate(item, 0); 571 (uint)PermissionMask.Transfer |
574 } 572 (uint)PermissionMask.Modify |
575 else 573 (uint)PermissionMask.Move |
574 7); // Preserve folded permissions
575 }
576
577 item.CreationDate = Util.UnixTimeSinceEpoch();
578 item.Description = asset.Description;
579 item.Name = asset.Name;
580 item.AssetType = asset.Type;
581
582 m_Scene.AddInventoryItem(item);
583
584 if (remoteClient != null && item.Owner == remoteClient.AgentId)
585 {
586 remoteClient.SendInventoryItemCreateUpdate(item, 0);
587 }
588 else
589 {
590 ScenePresence notifyUser = m_Scene.GetScenePresence(item.Owner);
591 if (notifyUser != null)
576 { 592 {
577 ScenePresence notifyUser = m_Scene.GetScenePresence(item.Owner); 593 notifyUser.ControllingClient.SendInventoryItemCreateUpdate(item, 0);
578 if (notifyUser != null)
579 {
580 notifyUser.ControllingClient.SendInventoryItemCreateUpdate(item, 0);
581 }
582 } 594 }
583 } 595 }
584 } 596 }
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
index b1dec4c..930a117 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
@@ -57,6 +57,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver
57 /// bumps here should be compatible. 57 /// bumps here should be compatible.
58 /// </summary> 58 /// </summary>
59 public static int MAX_MAJOR_VERSION = 1; 59 public static int MAX_MAJOR_VERSION = 1;
60
61 /// <summary>
62 /// Has the control file been loaded for this archive?
63 /// </summary>
64 public bool ControlFileLoaded { get; private set; }
60 65
61 protected Scene m_scene; 66 protected Scene m_scene;
62 protected Stream m_loadStream; 67 protected Stream m_loadStream;
@@ -545,7 +550,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
545 /// </summary> 550 /// </summary>
546 /// <param name="path"></param> 551 /// <param name="path"></param>
547 /// <param name="data"></param> 552 /// <param name="data"></param>
548 protected void LoadControlFile(string path, byte[] data) 553 public void LoadControlFile(string path, byte[] data)
549 { 554 {
550 XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable()); 555 XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable());
551 XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None); 556 XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None);
@@ -591,6 +596,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver
591 } 596 }
592 597
593 currentRegionSettings.Save(); 598 currentRegionSettings.Save();
599
600 ControlFileLoaded = true;
594 } 601 }
595 } 602 }
596} \ No newline at end of file 603} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs
index f2d487e..597b780 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs
@@ -206,7 +206,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
206 /// <returns></returns> 206 /// <returns></returns>
207 public static string CreateControlFile(Dictionary<string, object> options) 207 public static string CreateControlFile(Dictionary<string, object> options)
208 { 208 {
209 int majorVersion = MAX_MAJOR_VERSION, minorVersion = 5; 209 int majorVersion = MAX_MAJOR_VERSION, minorVersion = 6;
210// 210//
211// if (options.ContainsKey("version")) 211// if (options.ContainsKey("version"))
212// { 212// {
diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs
index e2760a2..2307c8e 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs
@@ -171,7 +171,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests
171 MemoryStream archiveReadStream = new MemoryStream(archive); 171 MemoryStream archiveReadStream = new MemoryStream(archive);
172 TarArchiveReader tar = new TarArchiveReader(archiveReadStream); 172 TarArchiveReader tar = new TarArchiveReader(archiveReadStream);
173 173
174 bool gotControlFile = false;
175 bool gotNcAssetFile = false; 174 bool gotNcAssetFile = false;
176 175
177 string expectedNcAssetFileName = string.Format("{0}_{1}", ncAssetUuid, "notecard.txt"); 176 string expectedNcAssetFileName = string.Format("{0}_{1}", ncAssetUuid, "notecard.txt");
@@ -182,15 +181,19 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests
182 expectedPaths.Add(ArchiveHelpers.CreateObjectPath(sog2)); 181 expectedPaths.Add(ArchiveHelpers.CreateObjectPath(sog2));
183 182
184 string filePath; 183 string filePath;
185 TarArchiveReader.TarEntryType tarEntryType; 184 TarArchiveReader.TarEntryType tarEntryType;
186 185
186 byte[] data = tar.ReadEntry(out filePath, out tarEntryType);
187 Assert.That(filePath, Is.EqualTo(ArchiveConstants.CONTROL_FILE_PATH));
188
189 ArchiveReadRequest arr = new ArchiveReadRequest(m_scene, (Stream)null, false, false, Guid.Empty);
190 arr.LoadControlFile(filePath, data);
191
192 Assert.That(arr.ControlFileLoaded, Is.True);
193
187 while (tar.ReadEntry(out filePath, out tarEntryType) != null) 194 while (tar.ReadEntry(out filePath, out tarEntryType) != null)
188 { 195 {
189 if (ArchiveConstants.CONTROL_FILE_PATH == filePath) 196 if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH))
190 {
191 gotControlFile = true;
192 }
193 else if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH))
194 { 197 {
195 string fileName = filePath.Remove(0, ArchiveConstants.ASSETS_PATH.Length); 198 string fileName = filePath.Remove(0, ArchiveConstants.ASSETS_PATH.Length);
196 199
@@ -203,7 +206,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests
203 } 206 }
204 } 207 }
205 208
206 Assert.That(gotControlFile, Is.True, "No control file in archive");
207 Assert.That(gotNcAssetFile, Is.True, "No notecard asset file in archive"); 209 Assert.That(gotNcAssetFile, Is.True, "No notecard asset file in archive");
208 Assert.That(foundPaths, Is.EquivalentTo(expectedPaths)); 210 Assert.That(foundPaths, Is.EquivalentTo(expectedPaths));
209 211
diff --git a/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs b/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs
index 05fc2ad..305975e 100644
--- a/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs
@@ -38,7 +38,23 @@ namespace OpenSim.Region.Framework.Interfaces
38 public interface IInventoryAccessModule 38 public interface IInventoryAccessModule
39 { 39 {
40 UUID CapsUpdateInventoryItemAsset(IClientAPI remoteClient, UUID itemID, byte[] data); 40 UUID CapsUpdateInventoryItemAsset(IClientAPI remoteClient, UUID itemID, byte[] data);
41 UUID DeleteToInventory(DeRezAction action, UUID folderID, List<SceneObjectGroup> objectGroups, IClientAPI remoteClient); 41
42 /// <summary>
43 /// Copy objects to a user's inventory.
44 /// </summary>
45 /// <remarks>
46 /// Is it left to the caller to delete them from the scene if required.
47 /// </remarks>
48 /// <param name="action"></param>
49 /// <param name="folderID"></param>
50 /// <param name="objectGroups"></param>
51 /// <param name="remoteClient"></param>
52 /// <returns>
53 /// Returns the UUID of the newly created item asset (not the item itself).
54 /// FIXME: This is not very useful. It would be far more useful to return a list of items instead.
55 /// </returns>
56 UUID CopyToInventory(DeRezAction action, UUID folderID, List<SceneObjectGroup> objectGroups, IClientAPI remoteClient);
57
42 SceneObjectGroup RezObject(IClientAPI remoteClient, UUID itemID, Vector3 RayEnd, Vector3 RayStart, 58 SceneObjectGroup RezObject(IClientAPI remoteClient, UUID itemID, Vector3 RayEnd, Vector3 RayStart,
43 UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, 59 UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection,
44 bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment); 60 bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment);
diff --git a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
index a8d24fd..088839d 100644
--- a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
+++ b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
@@ -150,7 +150,8 @@ namespace OpenSim.Region.Framework.Scenes
150 { 150 {
151 IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>(); 151 IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
152 if (invAccess != null) 152 if (invAccess != null)
153 invAccess.DeleteToInventory(x.action, x.folderID, x.objectGroups, x.remoteClient); 153 invAccess.CopyToInventory(x.action, x.folderID, x.objectGroups, x.remoteClient);
154
154 if (x.permissionToDelete) 155 if (x.permissionToDelete)
155 { 156 {
156 foreach (SceneObjectGroup g in x.objectGroups) 157 foreach (SceneObjectGroup g in x.objectGroups)
diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
index 0e679a9..b59f6e1 100644
--- a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
@@ -118,7 +118,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
118 118
119 if (serviceDll == String.Empty) 119 if (serviceDll == String.Empty)
120 { 120 {
121 m_log.Error("[FreeSwitchVoice]: No LocalServiceModule named in section FreeSwitchVoice"); 121 m_log.Error("[FreeSwitchVoice]: No LocalServiceModule named in section FreeSwitchVoice. Not starting.");
122 return; 122 return;
123 } 123 }
124 124
@@ -143,8 +143,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
143 if (String.IsNullOrEmpty(m_freeSwitchRealm) || 143 if (String.IsNullOrEmpty(m_freeSwitchRealm) ||
144 String.IsNullOrEmpty(m_freeSwitchAPIPrefix)) 144 String.IsNullOrEmpty(m_freeSwitchAPIPrefix))
145 { 145 {
146 m_log.Error("[FreeSwitchVoice] plugin mis-configured"); 146 m_log.Error("[FreeSwitchVoice]: Freeswitch service mis-configured. Not starting.");
147 m_log.Info("[FreeSwitchVoice] plugin disabled: incomplete configuration");
148 return; 147 return;
149 } 148 }
150 149
@@ -164,24 +163,24 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
164 // String.Format("{0}/viv_get_prelogin.php", m_freeSwitchAPIPrefix), FreeSwitchSLVoiceGetPreloginHTTPHandler); 163 // String.Format("{0}/viv_get_prelogin.php", m_freeSwitchAPIPrefix), FreeSwitchSLVoiceGetPreloginHTTPHandler);
165 // MainServer.Instance.AddStreamHandler(h); 164 // MainServer.Instance.AddStreamHandler(h);
166 165
167
168
169 MainServer.Instance.AddHTTPHandler(String.Format("{0}/viv_signin.php", m_freeSwitchAPIPrefix), 166 MainServer.Instance.AddHTTPHandler(String.Format("{0}/viv_signin.php", m_freeSwitchAPIPrefix),
170 FreeSwitchSLVoiceSigninHTTPHandler); 167 FreeSwitchSLVoiceSigninHTTPHandler);
171 168
172 MainServer.Instance.AddHTTPHandler(String.Format("{0}/viv_buddy.php", m_freeSwitchAPIPrefix), 169 MainServer.Instance.AddHTTPHandler(String.Format("{0}/viv_buddy.php", m_freeSwitchAPIPrefix),
173 FreeSwitchSLVoiceBuddyHTTPHandler); 170 FreeSwitchSLVoiceBuddyHTTPHandler);
171
172 MainServer.Instance.AddHTTPHandler(String.Format("{0}/viv_watcher.php", m_freeSwitchAPIPrefix),
173 FreeSwitchSLVoiceWatcherHTTPHandler);
174 174
175 m_log.InfoFormat("[FreeSwitchVoice] using FreeSwitch server {0}", m_freeSwitchRealm); 175 m_log.InfoFormat("[FreeSwitchVoice]: using FreeSwitch server {0}", m_freeSwitchRealm);
176 176
177 m_Enabled = true; 177 m_Enabled = true;
178 178
179 m_log.Info("[FreeSwitchVoice] plugin enabled"); 179 m_log.Info("[FreeSwitchVoice]: plugin enabled");
180 } 180 }
181 catch (Exception e) 181 catch (Exception e)
182 { 182 {
183 m_log.ErrorFormat("[FreeSwitchVoice] plugin initialization failed: {0}", e.Message); 183 m_log.ErrorFormat("[FreeSwitchVoice]: plugin initialization failed: {0} {1}", e.Message, e.StackTrace);
184 m_log.DebugFormat("[FreeSwitchVoice] plugin initialization failed: {0}", e.ToString());
185 return; 184 return;
186 } 185 }
187 186
@@ -240,7 +239,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
240 { 239 {
241 if (m_Enabled) 240 if (m_Enabled)
242 { 241 {
243 m_log.Info("[FreeSwitchVoice] registering IVoiceModule with the scene"); 242 m_log.Info("[FreeSwitchVoice]: registering IVoiceModule with the scene");
244 243
245 // register the voice interface for this module, so the script engine can call us 244 // register the voice interface for this module, so the script engine can call us
246 scene.RegisterModuleInterface<IVoiceModule>(this); 245 scene.RegisterModuleInterface<IVoiceModule>(this);
@@ -302,7 +301,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
302 // </summary> 301 // </summary>
303 public void OnRegisterCaps(Scene scene, UUID agentID, Caps caps) 302 public void OnRegisterCaps(Scene scene, UUID agentID, Caps caps)
304 { 303 {
305 m_log.DebugFormat("[FreeSwitchVoice] OnRegisterCaps: agentID {0} caps {1}", agentID, caps); 304 m_log.DebugFormat(
305 "[FreeSwitchVoice]: OnRegisterCaps() called with agentID {0} caps {1} in scene {2}",
306 agentID, caps, scene.RegionInfo.RegionName);
306 307
307 string capsBase = "/CAPS/" + caps.CapsObjectPath; 308 string capsBase = "/CAPS/" + caps.CapsObjectPath;
308 caps.RegisterHandler("ProvisionVoiceAccountRequest", 309 caps.RegisterHandler("ProvisionVoiceAccountRequest",
@@ -344,6 +345,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
344 public string ProvisionVoiceAccountRequest(Scene scene, string request, string path, string param, 345 public string ProvisionVoiceAccountRequest(Scene scene, string request, string path, string param,
345 UUID agentID, Caps caps) 346 UUID agentID, Caps caps)
346 { 347 {
348 m_log.DebugFormat(
349 "[FreeSwitchVoice][PROVISIONVOICE]: ProvisionVoiceAccountRequest() request: {0}, path: {1}, param: {2}", request, path, param);
350
347 ScenePresence avatar = scene.GetScenePresence(agentID); 351 ScenePresence avatar = scene.GetScenePresence(agentID);
348 if (avatar == null) 352 if (avatar == null)
349 { 353 {
@@ -357,9 +361,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
357 361
358 try 362 try
359 { 363 {
360 //m_log.DebugFormat("[FreeSwitchVoice][PROVISIONVOICE]: request: {0}, path: {1}, param: {2}",
361 // request, path, param);
362
363 //XmlElement resp; 364 //XmlElement resp;
364 string agentname = "x" + Convert.ToBase64String(agentID.GetBytes()); 365 string agentname = "x" + Convert.ToBase64String(agentID.GetBytes());
365 string password = "1234";//temp hack//new UUID(Guid.NewGuid()).ToString().Replace('-','Z').Substring(0,16); 366 string password = "1234";//temp hack//new UUID(Guid.NewGuid()).ToString().Replace('-','Z').Substring(0,16);
@@ -416,6 +417,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
416 public string ParcelVoiceInfoRequest(Scene scene, string request, string path, string param, 417 public string ParcelVoiceInfoRequest(Scene scene, string request, string path, string param,
417 UUID agentID, Caps caps) 418 UUID agentID, Caps caps)
418 { 419 {
420// m_log.DebugFormat(
421// "[FreeSwitchVoice][PARCELVOICE]: ParcelVoiceInfoRequest() on {0} for {1}",
422// scene.RegionInfo.RegionName, agentID);
423
419 ScenePresence avatar = scene.GetScenePresence(agentID); 424 ScenePresence avatar = scene.GetScenePresence(agentID);
420 string avatarName = avatar.Name; 425 string avatarName = avatar.Name;
421 426
@@ -502,6 +507,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
502 507
503 m_log.DebugFormat("[FreeSwitchVoice][CHATSESSION]: avatar \"{0}\": request: {1}, path: {2}, param: {3}", 508 m_log.DebugFormat("[FreeSwitchVoice][CHATSESSION]: avatar \"{0}\": request: {1}, path: {2}, param: {3}",
504 avatarName, request, path, param); 509 avatarName, request, path, param);
510
505 return "<llsd>true</llsd>"; 511 return "<llsd>true</llsd>";
506 } 512 }
507 513
@@ -555,7 +561,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
555 return response; 561 return response;
556 } 562 }
557 563
558
559 public Hashtable FreeSwitchSLVoiceGetPreloginHTTPHandler(Hashtable request) 564 public Hashtable FreeSwitchSLVoiceGetPreloginHTTPHandler(Hashtable request)
560 { 565 {
561// m_log.Debug("[FreeSwitchVoice] FreeSwitchSLVoiceGetPreloginHTTPHandler called"); 566// m_log.Debug("[FreeSwitchVoice] FreeSwitchSLVoiceGetPreloginHTTPHandler called");
@@ -592,6 +597,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
592 597
593 public Hashtable FreeSwitchSLVoiceBuddyHTTPHandler(Hashtable request) 598 public Hashtable FreeSwitchSLVoiceBuddyHTTPHandler(Hashtable request)
594 { 599 {
600 m_log.Debug("[FreeSwitchVoice]: FreeSwitchSLVoiceBuddyHTTPHandler called");
601
595 Hashtable response = new Hashtable(); 602 Hashtable response = new Hashtable();
596 response["int_response_code"] = 200; 603 response["int_response_code"] = 200;
597 response["str_response_string"] = string.Empty; 604 response["str_response_string"] = string.Empty;
@@ -650,18 +657,61 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
650 <bdy_status>A</bdy_status> 657 <bdy_status>A</bdy_status>
651 <modified_ts>{3}</modified_ts> 658 <modified_ts>{3}</modified_ts>
652 <b2g_group_id></b2g_group_id> 659 <b2g_group_id></b2g_group_id>
653 </level3>", ids[i],i,m_freeSwitchRealm,dt)); 660 </level3>", ids[i], i ,m_freeSwitchRealm, dt));
654 } 661 }
655 662
656 resp.Append("</buddies><groups></groups></body></level0></response>"); 663 resp.Append("</buddies><groups></groups></body></level0></response>");
657 664
658 response["str_response_string"] = resp.ToString(); 665 response["str_response_string"] = resp.ToString();
659// Regex normalizeEndLines = new Regex(@"\r\n", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.Multiline); 666// Regex normalizeEndLines = new Regex(@"(\r\n|\n)", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.Multiline);
660 667//
661 //m_log.DebugFormat("[FREESWITCH]: {0}", normalizeEndLines.Replace((string)response["str_response_string"],"")); 668// m_log.DebugFormat(
669// "[FREESWITCH]: FreeSwitchSLVoiceBuddyHTTPHandler() response {0}",
670// normalizeEndLines.Replace((string)response["str_response_string"],""));
671
662 return response; 672 return response;
663 } 673 }
664 674
675 public Hashtable FreeSwitchSLVoiceWatcherHTTPHandler(Hashtable request)
676 {
677 m_log.Debug("[FreeSwitchVoice]: FreeSwitchSLVoiceWatcherHTTPHandler called");
678
679 Hashtable response = new Hashtable();
680 response["int_response_code"] = 200;
681 response["content-type"] = "text/xml";
682
683 Hashtable requestBody = ParseRequestBody((string)request["body"]);
684
685 string auth_token = (string)requestBody["auth_token"];
686 //string[] auth_tokenvals = auth_token.Split(':');
687 //string username = auth_tokenvals[0];
688
689 StringBuilder resp = new StringBuilder();
690 resp.Append("<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?><response xmlns=\"http://www.vivox.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation= \"/xsd/buddy_list.xsd\">");
691
692 // FIXME: This is enough of a response to stop viewer 2 complaining about a login failure and get voice to work. If we don't
693 // give an OK response, then viewer 2 engages in an continuous viv_signin.php, viv_buddy.php, viv_watcher.php loop
694 // Viewer 1 appeared happy to ignore the lack of reply and still works with this reply.
695 //
696 // However, really we need to fill in whatever watcher data should be here (whatever that is).
697 resp.Append(string.Format(@"<level0>
698 <status>OK</status>
699 <cookie_name>lib_session</cookie_name>
700 <cookie>{0}</cookie>
701 <auth_token>{0}</auth_token>
702 <body/></level0></response>", auth_token));
703
704 response["str_response_string"] = resp.ToString();
705
706// Regex normalizeEndLines = new Regex(@"(\r\n|\n)", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.Multiline);
707//
708// m_log.DebugFormat(
709// "[FREESWITCH]: FreeSwitchSLVoiceWatcherHTTPHandler() response {0}",
710// normalizeEndLines.Replace((string)response["str_response_string"],""));
711
712 return response;
713 }
714
665 public Hashtable FreeSwitchSLVoiceSigninHTTPHandler(Hashtable request) 715 public Hashtable FreeSwitchSLVoiceSigninHTTPHandler(Hashtable request)
666 { 716 {
667 //m_log.Debug("[FreeSwitchVoice] FreeSwitchSLVoiceSigninHTTPHandler called"); 717 //m_log.Debug("[FreeSwitchVoice] FreeSwitchSLVoiceSigninHTTPHandler called");
@@ -709,7 +759,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
709 </level0> 759 </level0>
710 </response>", userid, pos, avatarName); 760 </response>", userid, pos, avatarName);
711 761
712 response["int_response_code"] = 200; 762 response["int_response_code"] = 200;
763
764// m_log.DebugFormat("[FreeSwitchVoice]: Sending FreeSwitchSLVoiceSigninHTTPHandler response");
765
713 return response; 766 return response;
714 } 767 }
715 768
@@ -795,16 +848,18 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
795 response["keepalive"] = false; 848 response["keepalive"] = false;
796 response["int_response_code"] = 500; 849 response["int_response_code"] = 500;
797 850
798 Hashtable requestBody = ParseRequestBody((string) request["body"]); 851 Hashtable requestBody = ParseRequestBody((string)request["body"]);
799 852
800 string section = (string) requestBody["section"]; 853 string section = (string) requestBody["section"];
854
855 m_log.DebugFormat("[FreeSwitchVoice]: Received request for config section {0}", section);
801 856
802 if (section == "directory") 857 if (section == "directory")
803 response = m_FreeswitchService.HandleDirectoryRequest(requestBody); 858 response = m_FreeswitchService.HandleDirectoryRequest(requestBody);
804 else if (section == "dialplan") 859 else if (section == "dialplan")
805 response = m_FreeswitchService.HandleDialplanRequest(requestBody); 860 response = m_FreeswitchService.HandleDialplanRequest(requestBody);
806 else 861 else
807 m_log.WarnFormat("[FreeSwitchVoice]: section was {0}", section); 862 m_log.WarnFormat("[FreeSwitchVoice]: Unknown section {0} was requested.", section);
808 863
809 return response; 864 return response;
810 } 865 }
diff --git a/OpenSim/Region/Physics/Meshing/SculptMap.cs b/OpenSim/Region/Physics/Meshing/SculptMap.cs
index d2d71de..740424e 100644
--- a/OpenSim/Region/Physics/Meshing/SculptMap.cs
+++ b/OpenSim/Region/Physics/Meshing/SculptMap.cs
@@ -62,6 +62,8 @@ namespace PrimMesher
62 62
63 bool needsScaling = false; 63 bool needsScaling = false;
64 64
65 bool smallMap = bmW * bmH <= lod * lod;
66
65 width = bmW; 67 width = bmW;
66 height = bmH; 68 height = bmH;
67 while (width * height > numLodPixels) 69 while (width * height > numLodPixels)
@@ -104,9 +106,14 @@ namespace PrimMesher
104 { 106 {
105 for (int x = 0; x <= width; x++) 107 for (int x = 0; x <= width; x++)
106 { 108 {
107 int bmY = y < height ? y * 2 : y * 2 - 1; 109 Color c;
108 int bmX = x < width ? x * 2 : x * 2 - 1; 110
109 Color c = bm.GetPixel(bmX, bmY); 111 if (smallMap)
112 c = bm.GetPixel(x < width ? x : x - 1,
113 y < height ? y : y - 1);
114 else
115 c = bm.GetPixel(x < width ? x * 2 : x * 2 - 1,
116 y < height ? y * 2 : y * 2 - 1);
110 117
111 redBytes[byteNdx] = c.R; 118 redBytes[byteNdx] = c.R;
112 greenBytes[byteNdx] = c.G; 119 greenBytes[byteNdx] = c.G;
diff --git a/OpenSim/Services/FreeswitchService/FreeswitchService.cs b/OpenSim/Services/FreeswitchService/FreeswitchService.cs
index fe6f5cd..1ec89da 100644
--- a/OpenSim/Services/FreeswitchService/FreeswitchService.cs
+++ b/OpenSim/Services/FreeswitchService/FreeswitchService.cs
@@ -50,13 +50,13 @@ namespace OpenSim.Services.FreeswitchService
50 50
51 public Hashtable HandleDialplanRequest(Hashtable request) 51 public Hashtable HandleDialplanRequest(Hashtable request)
52 { 52 {
53 m_log.DebugFormat("[FreeSwitchVoice] HandleDialplanRequest called with {0}",request.ToString()); 53 m_log.DebugFormat("[FreeSwitchVoice]: HandleDialplanRequest called with {0}",request.ToString());
54 54
55 Hashtable response = new Hashtable(); 55 Hashtable response = new Hashtable();
56 56
57 foreach (DictionaryEntry item in request) 57 foreach (DictionaryEntry item in request)
58 { 58 {
59 m_log.InfoFormat("[FreeSwitchDirectory] requestBody item {0} {1}",item.Key, item.Value); 59 m_log.InfoFormat("[FreeSwitchDirectory]: requestBody item {0} {1}",item.Key, item.Value);
60 } 60 }
61 61
62 string requestcontext = (string) request["Hunt-Context"]; 62 string requestcontext = (string) request["Hunt-Context"];
@@ -66,7 +66,7 @@ namespace OpenSim.Services.FreeswitchService
66 66
67 if (m_freeSwitchContext != String.Empty && m_freeSwitchContext != requestcontext) 67 if (m_freeSwitchContext != String.Empty && m_freeSwitchContext != requestcontext)
68 { 68 {
69 m_log.Debug("[FreeSwitchDirectory] returning empty as it's for another context"); 69 m_log.Debug("[FreeSwitchDirectory]: returning empty as it's for another context");
70 response["str_response_string"] = ""; 70 response["str_response_string"] = "";
71 } 71 }
72 else 72 else
@@ -116,13 +116,16 @@ namespace OpenSim.Services.FreeswitchService
116 { 116 {
117 Hashtable response = new Hashtable(); 117 Hashtable response = new Hashtable();
118 string domain = (string) request["domain"]; 118 string domain = (string) request["domain"];
119 if (domain != m_freeSwitchRealm) { 119 if (domain != m_freeSwitchRealm)
120 {
120 response["content_type"] = "text/xml"; 121 response["content_type"] = "text/xml";
121 response["keepalive"] = false; 122 response["keepalive"] = false;
122 response["int_response_code"] = 200; 123 response["int_response_code"] = 200;
123 response["str_response_string"] = ""; 124 response["str_response_string"] = "";
124 } else { 125 }
125 m_log.DebugFormat("[FreeSwitchDirectory] HandleDirectoryRequest called with {0}",request.ToString()); 126 else
127 {
128// m_log.DebugFormat("[FreeSwitchDirectory]: HandleDirectoryRequest called with {0}",request.ToString());
126 129
127 // information in the request we might be interested in 130 // information in the request we might be interested in
128 131
@@ -145,7 +148,7 @@ namespace OpenSim.Services.FreeswitchService
145 148
146 foreach (DictionaryEntry item in request) 149 foreach (DictionaryEntry item in request)
147 { 150 {
148 m_log.InfoFormat("[FreeSwitchDirectory] requestBody item {0} {1}", item.Key, item.Value); 151 m_log.DebugFormat("[FreeSwitchDirectory]: requestBody item {0} {1}", item.Key, item.Value);
149 } 152 }
150 153
151 string eventCallingFunction = (string) request["Event-Calling-Function"]; 154 string eventCallingFunction = (string) request["Event-Calling-Function"];
@@ -173,7 +176,7 @@ namespace OpenSim.Services.FreeswitchService
173 } 176 }
174 else 177 else
175 { 178 {
176 m_log.ErrorFormat("[FreeSwitchVoice] HandleDirectoryRequest unknown sip_auth_method {0}",sipAuthMethod); 179 m_log.ErrorFormat("[FreeSwitchVoice]: HandleDirectoryRequest unknown sip_auth_method {0}",sipAuthMethod);
177 response["int_response_code"] = 404; 180 response["int_response_code"] = 404;
178 response["content_type"] = "text/xml"; 181 response["content_type"] = "text/xml";
179 response["str_response_string"] = ""; 182 response["str_response_string"] = "";
@@ -205,7 +208,7 @@ namespace OpenSim.Services.FreeswitchService
205 } 208 }
206 else 209 else
207 { 210 {
208 m_log.ErrorFormat("[FreeSwitchVoice] HandleDirectoryRequest unknown Event-Calling-Function {0}",eventCallingFunction); 211 m_log.ErrorFormat("[FreeSwitchVoice]: HandleDirectoryRequest unknown Event-Calling-Function {0}",eventCallingFunction);
209 response["int_response_code"] = 404; 212 response["int_response_code"] = 404;
210 response["keepalive"] = false; 213 response["keepalive"] = false;
211 response["content_type"] = "text/xml"; 214 response["content_type"] = "text/xml";
@@ -217,7 +220,7 @@ namespace OpenSim.Services.FreeswitchService
217 220
218 private Hashtable HandleRegister(string Context, string Realm, Hashtable request) 221 private Hashtable HandleRegister(string Context, string Realm, Hashtable request)
219 { 222 {
220 m_log.Info("[FreeSwitchDirectory] HandleRegister called"); 223 m_log.Info("[FreeSwitchDirectory]: HandleRegister called");
221 224
222 // TODO the password we return needs to match that sent in the request, this is hard coded for now 225 // TODO the password we return needs to match that sent in the request, this is hard coded for now
223 string password = "1234"; 226 string password = "1234";
@@ -254,7 +257,7 @@ namespace OpenSim.Services.FreeswitchService
254 257
255 private Hashtable HandleInvite(string Context, string Realm, Hashtable request) 258 private Hashtable HandleInvite(string Context, string Realm, Hashtable request)
256 { 259 {
257 m_log.Info("[FreeSwitchDirectory] HandleInvite called"); 260 m_log.Info("[FreeSwitchDirectory]: HandleInvite called");
258 261
259 // TODO the password we return needs to match that sent in the request, this is hard coded for now 262 // TODO the password we return needs to match that sent in the request, this is hard coded for now
260 string password = "1234"; 263 string password = "1234";
@@ -301,7 +304,7 @@ namespace OpenSim.Services.FreeswitchService
301 304
302 private Hashtable HandleLocateUser(String Realm, Hashtable request) 305 private Hashtable HandleLocateUser(String Realm, Hashtable request)
303 { 306 {
304 m_log.Info("[FreeSwitchDirectory] HandleLocateUser called"); 307 m_log.Info("[FreeSwitchDirectory]: HandleLocateUser called");
305 308
306 // TODO the password we return needs to match that sent in the request, this is hard coded for now 309 // TODO the password we return needs to match that sent in the request, this is hard coded for now
307 string domain = (string) request["domain"]; 310 string domain = (string) request["domain"];
@@ -335,7 +338,7 @@ namespace OpenSim.Services.FreeswitchService
335 338
336 private Hashtable HandleConfigSofia(string Context, string Realm, Hashtable request) 339 private Hashtable HandleConfigSofia(string Context, string Realm, Hashtable request)
337 { 340 {
338 m_log.Info("[FreeSwitchDirectory] HandleConfigSofia called"); 341 m_log.Info("[FreeSwitchDirectory]: HandleConfigSofia called.");
339 342
340 // TODO the password we return needs to match that sent in the request, this is hard coded for now 343 // TODO the password we return needs to match that sent in the request, this is hard coded for now
341 string domain = (string) request["domain"]; 344 string domain = (string) request["domain"];
diff --git a/OpenSim/Services/FreeswitchService/FreeswitchServiceBase.cs b/OpenSim/Services/FreeswitchService/FreeswitchServiceBase.cs
index ebbb1b0..25c18b6 100644
--- a/OpenSim/Services/FreeswitchService/FreeswitchServiceBase.cs
+++ b/OpenSim/Services/FreeswitchService/FreeswitchServiceBase.cs
@@ -64,7 +64,7 @@ namespace OpenSim.Services.FreeswitchService
64 m_freeSwitchDefaultWellKnownIP = freeswitchConfig.GetString("ServerAddress", String.Empty); 64 m_freeSwitchDefaultWellKnownIP = freeswitchConfig.GetString("ServerAddress", String.Empty);
65 if (m_freeSwitchDefaultWellKnownIP == String.Empty) 65 if (m_freeSwitchDefaultWellKnownIP == String.Empty)
66 { 66 {
67 m_log.Error("[FREESWITCH]: No FreeswitchServerAddress given, can't continue"); 67 m_log.Error("[FREESWITCH]: No ServerAddress given, cannot start service.");
68 return; 68 return;
69 } 69 }
70 70
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example
index c05c3de..fbaa590 100644
--- a/bin/OpenSim.ini.example
+++ b/bin/OpenSim.ini.example
@@ -621,10 +621,11 @@
621 621
622 ;; You need to load a local service for a standalone, and a remote service 622 ;; You need to load a local service for a standalone, and a remote service
623 ;; for a grid region. Use one of the lines below, as appropriate 623 ;; for a grid region. Use one of the lines below, as appropriate
624 ;; If you're using Freeswitch on a standalone then you will also need to configure the [FreeswitchService] section
624 ; LocalServiceModule = OpenSim.Services.FreeswitchService.dll:FreeswitchService 625 ; LocalServiceModule = OpenSim.Services.FreeswitchService.dll:FreeswitchService
625 ; LocalServiceModule = OpenSim.Services.Connectors.dll:RemoteFreeswitchConnector 626 ; LocalServiceModule = OpenSim.Services.Connectors.dll:RemoteFreeswitchConnector
626 627
627 ;; If using a remote module, specify the server URL 628 ;; If using a remote connector, specify the server URL
628 ; FreeswitchServiceURL = http://my.grid.server:8003/fsapi 629 ; FreeswitchServiceURL = http://my.grid.server:8003/fsapi
629 630
630 631
@@ -632,20 +633,37 @@
632 ;; !!!!!!!!!!!!!!!!!!!!!!!!!!! 633 ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!
633 ;; !!!!!!STANDALONE ONLY!!!!!! 634 ;; !!!!!!STANDALONE ONLY!!!!!!
634 ;; !!!!!!!!!!!!!!!!!!!!!!!!!!! 635 ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!
635 ;; IP of your FS server 636 ;; The IP address of your FreeSWITCH server. The common case is for this to be the same as the server running the OpenSim standalone
636 ;ServerAddress = 85.25.142.92 637 ;; This has to be set for the FreeSWITCH service to work
638 ;ServerAddress = 127.0.0.1
637 639
638 ;; All other options are - well - optional 640 ;; The following configuration parameters are optional
639 ; Realm = "127.0.0.1" 641
640 ; SIPProxy = "127.0.0.1:5060" 642 ;; By default, this is the same as the ServerAddress
641 ; EchoServer = "127.0.0.1" 643 ; Realm = 127.0.0.1
642 ; EchoPort = 50505 644
643 ; AttemptSTUN = "false" 645 ;; By default, this is the same as the ServerAddress on port 5060
646 ; SIPProxy = 127.0.0.1:5060
647
648 ;; Default is 5000ms
644 ; DefaultTimeout = 5000 649 ; DefaultTimeout = 5000
645 ; Context = "default"
646 ; UserName = "freeswitch"
647 ; Password = "password"
648 650
651 ;; The dial plan context. Default is "default"
652 ; Context = default
653
654 ;; Currently unused
655 ; UserName = freeswitch
656
657 ;; Currently unused
658 ; Password = password
659
660 ;; The following parameters are for STUN = Simple Traversal of UDP through NATs
661 ;; See http://wiki.freeswitch.org/wiki/NAT_Traversal
662 ;; stun.freeswitch.org is not guaranteed to be running so use it in
663 ;; production at your own risk
664 ; EchoServer = 127.0.0.1
665 ; EchoPort = 50505
666 ; AttemptSTUN = false
649 667
650[Groups] 668[Groups]
651 ;# {Enabled} {} {Enable groups?} {true false} false 669 ;# {Enabled} {} {Enable groups?} {true false} false
diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini
index 252ab8b..61eaf14 100644
--- a/bin/OpenSimDefaults.ini
+++ b/bin/OpenSimDefaults.ini
@@ -155,10 +155,6 @@
155 ; it may cause unexpected physics problems. 155 ; it may cause unexpected physics problems.
156 ;UseMeshiesPhysicsMesh = false 156 ;UseMeshiesPhysicsMesh = false
157 157
158 ; enable / disable Collada mesh support
159 ; default is true
160 ; ColladaMesh = true
161
162 ; Choose one of the physics engines below 158 ; Choose one of the physics engines below
163 ; OpenDynamicsEngine is by some distance the most developed physics engine 159 ; OpenDynamicsEngine is by some distance the most developed physics engine
164 ; basicphysics effectively does not model physics at all, making all objects phantom 160 ; basicphysics effectively does not model physics at all, making all objects phantom
@@ -460,6 +456,12 @@
460 CoalesceMultipleObjectsToInventory = true 456 CoalesceMultipleObjectsToInventory = true
461 457
462 458
459[Mesh]
460 ; enable / disable Collada mesh support
461 ; default is true
462 ColladaMesh = true
463
464
463[ODEPhysicsSettings] 465[ODEPhysicsSettings]
464 ;## 466 ;##
465 ;## World Settings 467 ;## World Settings
diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example
index f12a143..ced2857 100644
--- a/bin/Robust.HG.ini.example
+++ b/bin/Robust.HG.ini.example
@@ -85,19 +85,41 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003
85; * This is the configuration for the freeswitch server in grid mode 85; * This is the configuration for the freeswitch server in grid mode
86[FreeswitchService] 86[FreeswitchService]
87 LocalServiceModule = "OpenSim.Services.FreeswitchService.dll:FreeswitchService" 87 LocalServiceModule = "OpenSim.Services.FreeswitchService.dll:FreeswitchService"
88 ;; IP of your FS server 88
89 ;; The IP address of your FreeSWITCH server.
89 ; ServerAddress = 127.0.0.1 90 ; ServerAddress = 127.0.0.1
90 91
91 ;; All other options are - well - optional 92 ;; The following configuration parameters are optional
92 ; Realm = "127.0.0.1" 93
93 ; SIPProxy = "127.0.0.1:5060" 94 ;; By default, this is the same as the ServerAddress
94 ; EchoServer = "127.0.0.1" 95 ; Realm = 127.0.0.1
95 ; EchoPort = 50505 96
96 ; AttemptSTUN = "false" 97 ;; By default, this is the same as the ServerAddress on port 5060
98 ; SIPProxy = 127.0.0.1:5060
99
100 ;; Default is 5000ms
97 ; DefaultTimeout = 5000 101 ; DefaultTimeout = 5000
98 ; Context = "default" 102
99 ; UserName = "freeswitch" 103 ;; The dial plan context. Default is "default"
100 ; Password = "password" 104 ; Context = default
105
106 ;; Currently unused
107 ; UserName = freeswitch
108
109 ;; Currently unused
110 ; Password = password
111
112 ;; The following parameters are for STUN = Simple Traversal of UDP through NATs
113 ;; See http://wiki.freeswitch.org/wiki/NAT_Traversal
114 ;; stun.freeswitch.org is not guaranteed to be running so use it in
115 ;; production at your own risk
116 ; EchoServer = 127.0.0.1
117 ; EchoPort = 50505
118 ; AttemptSTUN = false
119
120 LocalServiceModule = "OpenSim.Services.FreeswitchService.dll:FreeswitchService"
121 ;; IP of your FS server
122 ; ServerAddress = 127.0.0.1
101 123
102; * This is the new style authentication service. Currently, only MySQL 124; * This is the new style authentication service. Currently, only MySQL
103; * is implemented. 125; * is implemented.
diff --git a/bin/Robust.ini.example b/bin/Robust.ini.example
index 7c13076..4d16236 100644
--- a/bin/Robust.ini.example
+++ b/bin/Robust.ini.example
@@ -69,19 +69,37 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003
69; * This is the configuration for the freeswitch server in grid mode 69; * This is the configuration for the freeswitch server in grid mode
70[FreeswitchService] 70[FreeswitchService]
71 LocalServiceModule = "OpenSim.Services.FreeswitchService.dll:FreeswitchService" 71 LocalServiceModule = "OpenSim.Services.FreeswitchService.dll:FreeswitchService"
72 ;; IP of your FS server 72
73 ;; The IP address of your FreeSWITCH server.
73 ; ServerAddress = 127.0.0.1 74 ; ServerAddress = 127.0.0.1
74 75
75 ;; All other options are - well - optional 76 ;; The following configuration parameters are optional
76 ; Realm = "127.0.0.1" 77
77 ; SIPProxy = "127.0.0.1:5060" 78 ;; By default, this is the same as the ServerAddress
78 ; EchoServer = "127.0.0.1" 79 ; Realm = 127.0.0.1
79 ; EchoPort = 50505 80
80 ; AttemptSTUN = "false" 81 ;; By default, this is the same as the ServerAddress on port 5060
82 ; SIPProxy = 127.0.0.1:5060
83
84 ;; Default is 5000ms
81 ; DefaultTimeout = 5000 85 ; DefaultTimeout = 5000
82 ; Context = "default" 86
83 ; UserName = "freeswitch" 87 ;; The dial plan context. Default is "default"
84 ; Password = "password" 88 ; Context = default
89
90 ;; Currently unused
91 ; UserName = freeswitch
92
93 ;; Currently unused
94 ; Password = password
95
96 ;; The following parameters are for STUN = Simple Traversal of UDP through NATs
97 ;; See http://wiki.freeswitch.org/wiki/NAT_Traversal
98 ;; stun.freeswitch.org is not guaranteed to be running so use it in
99 ;; production at your own risk
100 ; EchoServer = 127.0.0.1
101 ; EchoPort = 50505
102 ; AttemptSTUN = false
85 103
86; * This is the new style authentication service. Currently, only MySQL 104; * This is the new style authentication service. Currently, only MySQL
87; * is implemented. 105; * is implemented.
diff --git a/bin/config-include/StandaloneCommon.ini.example b/bin/config-include/StandaloneCommon.ini.example
index d6f15bb..dcebd63 100644
--- a/bin/config-include/StandaloneCommon.ini.example
+++ b/bin/config-include/StandaloneCommon.ini.example
@@ -28,10 +28,10 @@
28 28
29[HGInventoryAccessModule] 29[HGInventoryAccessModule]
30 ProfileServerURI = "http://127.0.0.1:9000/profiles" 30 ProfileServerURI = "http://127.0.0.1:9000/profiles"
31 ;; If you want to protect your assets from being copied by foreign visitors
32 ;; uncomment the next line. You may want to do this on sims that have licensed content.
33 ; OutboundPermission = False
34 31
32 ;; If you want to protect your assets from being copied by foreign visitors
33 ;; uncomment the next line. You may want to do this on sims that have licensed content.
34 ; OutboundPermission = False
35 35
36[Modules] 36[Modules]
37 ;; Choose 0 or 1 cache modules, and the corresponding config file, if it exists. 37 ;; Choose 0 or 1 cache modules, and the corresponding config file, if it exists.
@@ -45,16 +45,9 @@
45 AssetCaching = "CenomeMemoryAssetCache" 45 AssetCaching = "CenomeMemoryAssetCache"
46 Include-CenomeCache = "config-include/CenomeCache.ini" 46 Include-CenomeCache = "config-include/CenomeCache.ini"
47 47
48 ;; Enable this to use Freeswitch on a standalone
49 ;FreeswitchServiceInConnector = True
50
51 ;; Authorization is not on by default, as it depends on external php 48 ;; Authorization is not on by default, as it depends on external php
52 ;AuthorizationServices = "LocalAuthorizationServicesConnector" 49 ;AuthorizationServices = "LocalAuthorizationServicesConnector"
53 50
54[FreeswitchService]
55 ;; Configuration for the freeswitch service goes here
56 LocalServiceModule = "OpenSim.Services.FreeswitchService.dll:FreeswitchService"
57
58[GridService] 51[GridService]
59 ;; For in-memory region storage (default) 52 ;; For in-memory region storage (default)
60 StorageProvider = "OpenSim.Data.Null.dll:NullRegionData" 53 StorageProvider = "OpenSim.Data.Null.dll:NullRegionData"
@@ -74,9 +67,8 @@
74 Region_Welcome_Area = "DefaultRegion, FallbackRegion" 67 Region_Welcome_Area = "DefaultRegion, FallbackRegion"
75 68
76 ; === HG ONLY === 69 ; === HG ONLY ===
77 ;; change this to the address of your simulator 70 ;; change this to the address of your simulator
78 Gatekeeper="http://127.0.0.1:9000" 71 Gatekeeper="http://127.0.0.1:9000"
79
80 72
81[LibraryModule] 73[LibraryModule]
82 ; Set this if you want to change the name of the OpenSim Library 74 ; Set this if you want to change the name of the OpenSim Library