diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs
index 4b69468320..5211157b06 100644
--- a/OpenSim/Framework/WebUtil.cs
+++ b/OpenSim/Framework/WebUtil.cs
@@ -199,14 +199,14 @@ namespace OpenSim.Framework
using (GZipStream comp = new GZipStream(ms, CompressionMode.Compress))
{
comp.Write(buffer, 0, buffer.Length);
- comp.Flush();
-
- ms.Seek(0, SeekOrigin.Begin);
-
- request.ContentLength = ms.Length; //Count bytes to send
- using (Stream requestStream = request.GetRequestStream())
- requestStream.Write(ms.ToArray(), 0, (int)ms.Length);
+ // We need to close the gzip stream before we write it anywhere
+ // because apparently something important related to gzip compression
+ // gets written on the strteam upon Dispose()
}
+ byte[] buf = ms.ToArray();
+ request.ContentLength = buf.Length; //Count bytes to send
+ using (Stream requestStream = request.GetRequestStream())
+ requestStream.Write(buf, 0, (int)buf.Length);
}
}
else
@@ -918,6 +918,10 @@ namespace OpenSim.Framework
public class SynchronousRestObjectRequester
{
+ private static readonly ILog m_log =
+ LogManager.GetLogger(
+ MethodBase.GetCurrentMethod().DeclaringType);
+
///
/// Perform a synchronous REST request.
///
@@ -968,8 +972,9 @@ namespace OpenSim.Framework
requestStream = request.GetRequestStream();
requestStream.Write(buffer.ToArray(), 0, length);
}
- catch (Exception)
+ catch (Exception e)
{
+ m_log.WarnFormat("[SynchronousRestObjectRequester]: exception in sending data to {0}: {1}", requestUrl, e);
return deserial;
}
finally
@@ -983,19 +988,28 @@ namespace OpenSim.Framework
{
using (WebResponse resp = request.GetResponse())
{
- if (resp.ContentLength > 0)
+ if (resp.ContentLength != 0)
{
Stream respStream = resp.GetResponseStream();
XmlSerializer deserializer = new XmlSerializer(typeof(TResponse));
deserial = (TResponse)deserializer.Deserialize(respStream);
respStream.Close();
}
+ else
+ m_log.WarnFormat("[SynchronousRestObjectRequester]: Oops! no content found in response stream from {0} {1}", requestUrl, verb);
+
}
}
catch (System.InvalidOperationException)
{
// This is what happens when there is invalid XML
+ m_log.WarnFormat("[SynchronousRestObjectRequester]: Invalid XML {0} {1}", requestUrl, typeof(TResponse).ToString());
}
+ catch (Exception e)
+ {
+ m_log.WarnFormat("[SynchronousRestObjectRequester]: Exception on response from {0} {1}", requestUrl, e);
+ }
+
return deserial;
}
}
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index de40abd123..7564907c59 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -1630,14 +1630,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
currentPacket.ItemData[itemsSent % MAX_ITEMS_PER_PACKET] = CreateItemDataBlock(items[itemsSent++]);
else
{
+// m_log.DebugFormat(
+// "[LLCLIENTVIEW]: Sending inventory folder details packet to {0} for folder {1}", Name, folderID);
OutPacket(currentPacket, ThrottleOutPacketType.Asset, false);
currentPacket = null;
}
-
}
if (currentPacket != null)
+ {
+// m_log.DebugFormat(
+// "[LLCLIENTVIEW]: Sending inventory folder details packet to {0} for folder {1}", Name, folderID);
OutPacket(currentPacket, ThrottleOutPacketType.Asset, false);
+ }
}
private InventoryDescendentsPacket.FolderDataBlock CreateFolderDataBlock(InventoryFolderBase folder)
diff --git a/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs b/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
index a0ccdc7276..5ab334ffaf 100644
--- a/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
+++ b/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
@@ -62,8 +62,8 @@ namespace OpenSim.Region.CoreModules.Hypergrid
{
List mapBlocks = new List();
List regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID,
- (minX - 4) * (int)Constants.RegionSize, (maxX + 4) * (int)Constants.RegionSize,
- (minY - 4) * (int)Constants.RegionSize, (maxY + 4) * (int)Constants.RegionSize);
+ minX * (int)Constants.RegionSize, maxX * (int)Constants.RegionSize,
+ minY * (int)Constants.RegionSize, maxY * (int)Constants.RegionSize);
foreach (GridRegion r in regions)
{
@@ -76,7 +76,7 @@ namespace OpenSim.Region.CoreModules.Hypergrid
FillInMap(mapBlocks, minX, minY, maxX, maxY);
//
- remoteClient.SendMapBlock(mapBlocks, flag);
+ remoteClient.SendMapBlock(mapBlocks, 0);
}
@@ -93,7 +93,7 @@ namespace OpenSim.Region.CoreModules.Hypergrid
mblock.X = (ushort)x;
mblock.Y = (ushort)y;
mblock.Name = "";
- mblock.Access = 254; // not here???
+ mblock.Access = 254; // means 'simulator is offline'. We need this because the viewer ignores 255's
mblock.MapImageId = UUID.Zero;
mapBlocks.Add(mblock);
}
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
index fe919b7bf2..cd40c5d477 100644
--- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
+++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
@@ -820,7 +820,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
MapBlockData block = new MapBlockData();
block.X = (ushort)minX;
block.Y = (ushort)minY;
- block.Access = 254; // == not there
+ block.Access = 254; // means 'simulator is offline'
response.Add(block);
}
remoteClient.SendMapBlock(response, 0);
@@ -846,7 +846,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
MapBlockFromGridRegion(block, r);
mapBlocks.Add(block);
}
- remoteClient.SendMapBlock(mapBlocks, flag);
+ remoteClient.SendMapBlock(mapBlocks, 0);
}
protected void MapBlockFromGridRegion(MapBlockData block, GridRegion r)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index dfb58460c2..1c30a35722 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -907,11 +907,29 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ ///
+ /// Link an inventory item to an existing item.
+ ///
+ ///
+ /// The linkee item id is placed in the asset id slot. This appears to be what the viewer expects when
+ /// it receives inventory information.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ /// /param>
+ ///
private void HandleLinkInventoryItem(IClientAPI remoteClient, UUID transActionID, UUID folderID,
uint callbackID, string description, string name,
sbyte invType, sbyte type, UUID olditemID)
{
- m_log.DebugFormat("[AGENT INVENTORY]: Received request to create inventory item link {0} in folder {1} pointing to {2}", name, folderID, olditemID);
+ m_log.DebugFormat(
+ "[AGENT INVENTORY]: Received request from {0} to create inventory item link {1} in folder {2} pointing to {3}",
+ remoteClient.Name, name, folderID, olditemID);
if (!Permissions.CanCreateUserInventory(invType, remoteClient.AgentId))
return;
@@ -919,7 +937,20 @@ namespace OpenSim.Region.Framework.Scenes
ScenePresence presence;
if (TryGetScenePresence(remoteClient.AgentId, out presence))
{
-// byte[] data = null;
+ bool linkAlreadyExists = false;
+ List existingItems = InventoryService.GetFolderItems(remoteClient.AgentId, folderID);
+ foreach (InventoryItemBase item in existingItems)
+ if (item.AssetID == olditemID)
+ linkAlreadyExists = true;
+
+ if (linkAlreadyExists)
+ {
+ m_log.WarnFormat(
+ "[AGENT INVENTORY]: Ignoring request from {0} to create item link {1} in folder {2} pointing to {3} since a link already exists",
+ remoteClient.Name, name, folderID, olditemID);
+
+ return;
+ }
AssetBase asset = new AssetBase();
asset.FullID = olditemID;
@@ -1370,11 +1401,28 @@ namespace OpenSim.Region.Framework.Scenes
InventoryFolderBase containingFolder = new InventoryFolderBase(folder.ID, client.AgentId);
containingFolder = InventoryService.GetFolder(containingFolder);
- //m_log.DebugFormat("[AGENT INVENTORY]: Sending inventory folder contents ({0} nodes) for \"{1}\" to {2} {3}",
- // contents.Folders.Count + contents.Items.Count, containingFolder.Name, client.FirstName, client.LastName);
+// m_log.DebugFormat("[AGENT INVENTORY]: Sending inventory folder contents ({0} nodes) for \"{1}\" to {2} {3}",
+// contents.Folders.Count + contents.Items.Count, containingFolder.Name, client.FirstName, client.LastName);
if (containingFolder != null && containingFolder != null)
+ {
+ // If the folder requested contains links, then we need to send those folders first, otherwise the links
+ // will be broken in the viewer.
+ HashSet linkedItemFolderIdsToSend = new HashSet();
+ foreach (InventoryItemBase item in contents.Items)
+ {
+ if (item.AssetType == (int)AssetType.Link)
+ {
+ InventoryItemBase linkedItem = InventoryService.GetItem(new InventoryItemBase(item.AssetID));
+ linkedItemFolderIdsToSend.Add(linkedItem.Folder);
+ }
+ }
+
+ foreach (UUID linkedItemFolderId in linkedItemFolderIdsToSend)
+ SendInventoryUpdate(client, new InventoryFolderBase(linkedItemFolderId), false, true);
+
client.SendInventoryFolderDetails(client.AgentId, folder.ID, contents.Items, contents.Folders, containingFolder.Version, fetchFolders, fetchItems);
+ }
}
///
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
index ab567fbcb0..e2d7208ff7 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
@@ -499,6 +499,10 @@ namespace OpenSim.Region.Framework.Scenes
public void HandleFetchInventoryDescendents(IClientAPI remoteClient, UUID folderID, UUID ownerID,
bool fetchFolders, bool fetchItems, int sortOrder)
{
+// m_log.DebugFormat(
+// "[USER INVENTORY]: HandleFetchInventoryDescendents() for {0}, folder={1}, fetchFolders={2}, fetchItems={3}, sortOrder={4}",
+// remoteClient.Name, folderID, fetchFolders, fetchItems, sortOrder);
+
if (folderID == UUID.Zero)
return;
diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
index 9f581cab0a..9935e3ceac 100644
--- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
+++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
@@ -306,6 +306,7 @@ namespace OpenSim.Server.Handlers.Simulation
StreamReader reader = new StreamReader(inputStream, encoding);
string requestBody = reader.ReadToEnd();
+ reader.Close();
keysvals.Add("body", requestBody);
httpResponse.StatusCode = 200;
@@ -492,6 +493,7 @@ namespace OpenSim.Server.Handlers.Simulation
StreamReader reader = new StreamReader(inputStream, encoding);
string requestBody = reader.ReadToEnd();
+ reader.Close();
keysvals.Add("body", requestBody);
httpResponse.StatusCode = 200;
diff --git a/bin/OpenSim.exe.config b/bin/OpenSim.exe.config
index eece04092f..4a49fc5631 100755
--- a/bin/OpenSim.exe.config
+++ b/bin/OpenSim.exe.config
@@ -14,7 +14,7 @@
-
+