@@ -562,74 +562,97 @@ public virtual SceneObjectGroup CreateObjectFromInventory(IClientAPI remoteClien
XmlDocument doc;
InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
item = m_scene.InventoryService.GetItem(item);
return CreateObjectFromInventory(item, remoteClient, itemID, out doc);
UUID itemId = UUID.Zero;

// If we have permission to copy then link the rezzed object back to the user inventory
// item that it came from. This allows us to enable 'save object to inventory'
if (!m_scene.Permissions.BypassPermissions())
{
if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == (uint)PermissionMask.Copy)
{
itemId = item.ID;
}
}
else
{
// Brave new fullperm world
//
itemId = item.ID;
}
return CreateObjectFromInventory(remoteClient, itemId, item.AssetID, out doc);
}

public virtual SceneObjectGroup CreateObjectFromInventory(IClientAPI remoteClient, UUID itemID, UUID assetID)
{
XmlDocument doc;
return CreateObjectFromInventory(remoteClient, itemID, assetID, out doc);
}

protected virtual SceneObjectGroup CreateObjectFromInventory(InventoryItemBase item, IClientAPI remoteClient, UUID itemID, out XmlDocument doc)
{
if (item != null)
{
item.Owner = remoteClient.AgentId;
AssetBase rezAsset = m_scene.AssetService.Get(item.AssetID.ToString());
UUID itemId = UUID.Zero;

if (rezAsset != null)
// If we have permission to copy then link the rezzed object back to the user inventory
// item that it came from. This allows us to enable 'save object to inventory'
if (!m_scene.Permissions.BypassPermissions())
{
if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == (uint)PermissionMask.Copy)
{
UUID itemId = UUID.Zero;
itemId = item.ID;
}
}
else
{
// Brave new fullperm world
//
itemId = item.ID;
}
return CreateObjectFromInventory(remoteClient, itemId, item.AssetID, out doc);
}

// If we have permission to copy then link the rezzed object back to the user inventory
// item that it came from. This allows us to enable 'save object to inventory'
if (!m_scene.Permissions.BypassPermissions())
{
if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == (uint)PermissionMask.Copy)
{
itemId = item.ID;
}
}
else
{
// Brave new fullperm world
//
itemId = item.ID;
}
protected virtual SceneObjectGroup CreateObjectFromInventory(IClientAPI remoteClient, UUID itemID, UUID assetID, out XmlDocument doc)
{
AssetBase rezAsset = m_scene.AssetService.Get(assetID.ToString());

string xmlData = Utils.BytesToString(rezAsset.Data);
doc = new XmlDocument();
try
{
doc.LoadXml(xmlData);
}
catch
{
return null;
}
if (rezAsset != null)
{
string xmlData = Utils.BytesToString(rezAsset.Data);
doc = new XmlDocument();
try
{
doc.LoadXml(xmlData);
}
catch
{
return null;
}

if (doc.FirstChild.OuterXml.StartsWith("<groups>") ||
(doc.FirstChild.NextSibling != null &&
doc.FirstChild.NextSibling.OuterXml.StartsWith ("<groups>")))
{
//We don't do multiple objects here
return null;
}
string xml = "";
if (doc.FirstChild.NodeType == XmlNodeType.XmlDeclaration)
{
if (doc.FirstChild.NextSibling != null) xml = doc.FirstChild.NextSibling.OuterXml;
}
else
xml = doc.FirstChild.OuterXml;
SceneObjectGroup group
= SceneObjectSerializer.FromOriginalXmlFormat(itemId, xml, m_scene);
if (group == null)
return null;

group.IsDeleted = false;
group.m_isLoaded = true;
foreach (SceneObjectPart part in group.ChildrenList)
{
part.IsLoading = false;
}
return group;
if (doc.FirstChild.OuterXml.StartsWith("<groups>") ||
(doc.FirstChild.NextSibling != null &&
doc.FirstChild.NextSibling.OuterXml.StartsWith("<groups>")))
{
//We don't do multiple objects here
return null;
}
string xml = "";
if (doc.FirstChild.NodeType == XmlNodeType.XmlDeclaration)
{
if (doc.FirstChild.NextSibling != null) xml = doc.FirstChild.NextSibling.OuterXml;
}
else
xml = doc.FirstChild.OuterXml;
SceneObjectGroup group
= SceneObjectSerializer.FromOriginalXmlFormat(itemID, xml, m_scene);
if (group == null)
return null;

group.IsDeleted = false;
group.m_isLoaded = true;
foreach (SceneObjectPart part in group.ChildrenList)
{
part.IsLoading = false;
}
return group;
}
doc = null;
return null;
@@ -444,6 +444,11 @@ public virtual bool StoreItem(InventoryItemBase item)
});
}

public virtual bool UpdateAssetIDForItem(UUID itemID, UUID assetID)
{
return GD.Update(m_itemsrealm, new object[1] { assetID }, new string[1] { "assetID" }, new string[1] { "inventoryID" }, new object[1] { itemID });
}

public virtual bool DeleteFolders(string field, string val, bool safe)
{
if (safe)
@@ -54,7 +54,7 @@ public interface IAttachmentsModule
/// <param name = "updateinventoryStatus">
/// <returns>The scene object that was attached. Null if the scene object could not be found</returns>
ISceneEntity RezSingleAttachmentFromInventory(
IClientAPI remoteClient, UUID itemID, int AttachmentPt);
IClientAPI remoteClient, UUID itemID, UUID assetID, int AttachmentPt);

/// <summary>
/// Detach the given item to the ground.
@@ -47,6 +47,14 @@ public interface IInventoryAccessModule
/// <returns></returns>
SceneObjectGroup CreateObjectFromInventory(IClientAPI remoteClient, UUID itemID);

/// <summary>
/// Create a SceneObjectGroup representation of an asset xml of the given item
/// </summary>
/// <param name = "remoteClient"></param>
/// <param name = "itemID"></param>
/// <returns></returns>
SceneObjectGroup CreateObjectFromInventory(IClientAPI remoteClient, UUID itemID, UUID assetID);

/// <summary>
/// Rez an object from inventory and add it to the scene
/// </summary>
@@ -206,7 +206,7 @@ public byte[] HandleFetchLibDescendents(string request, UUID AgentID)
{
//MainConsole.Instance.DebugFormat("[InventoryCAPS]: Received FetchLibDescendents request for {0}", AgentID);

OSDMap map = (OSDMap) OSDParser.DeserializeLLSDXml(Utils.StringToBytes(request));
OSDMap map = (OSDMap) OSDParser.DeserializeLLSDXml(request);

OSDArray foldersrequested = (OSDArray) map["folders"];

@@ -229,7 +229,7 @@ public byte[] HandleFetchInventory(string request, UUID AgentID)
{
//MainConsole.Instance.DebugFormat("[InventoryCAPS]: Received FetchInventory request for {0}", AgentID);

OSDMap requestmap = (OSDMap) OSDParser.DeserializeLLSDXml(Utils.StringToBytes(request));
OSDMap requestmap = (OSDMap) OSDParser.DeserializeLLSDXml(request);

OSDArray foldersrequested = (OSDArray) requestmap["items"];

@@ -274,7 +274,7 @@ public byte[] HandleFetchLib(string request, UUID AgentID)
{
//MainConsole.Instance.DebugFormat("[InventoryCAPS]: Received FetchLib request for {0}", AgentID);

OSDMap requestmap = (OSDMap) OSDParser.DeserializeLLSDXml(Utils.StringToBytes(request));
OSDMap requestmap = (OSDMap) OSDParser.DeserializeLLSDXml(request);

OSDArray foldersrequested = (OSDArray) requestmap["items"];

@@ -183,6 +183,11 @@ public InventoryFolderBase GetRootFolder(UUID userID)
return null;
}

public virtual bool UpdateAssetIDForItem(UUID itemID, UUID assetID)
{
return false;
}

/// <summary>
/// Gets the user folder for the given folder-type
/// </summary>
@@ -130,24 +130,24 @@ public Hashtable MapRequest (Hashtable request)
List<GridRegion> badRegions = new List<GridRegion> ();
foreach (GridRegion r in regions)
{
AssetBase texAsset = m_registry.RequestModuleInterface<IAssetService> ().Get (r.TerrainImage.ToString ());
AssetBase texAsset = m_registry.RequestModuleInterface<IAssetService> ().Get (r.TerrainMapImage.ToString ());

if (texAsset != null)
textures.Add (texAsset);
{
textures.Add(texAsset);
Image image;
ManagedImage mImage;
if ((OpenJPEG.DecodeToImage(texAsset.Data, out mImage, out image)) && image != null)
bitImages.Add(image);
else
badRegions.Add(r);
}
else
badRegions.Add (r);
badRegions.Add(r);
}
foreach (GridRegion r in badRegions)
regions.Remove (r);

foreach (AssetBase asset in textures)
{
Image image;
ManagedImage mImage;
if ((OpenJPEG.DecodeToImage (asset.Data, out mImage, out image)) && image != null)
bitImages.Add (image);
}

const int SizeOfImage = 256;

Bitmap mapTexture = new Bitmap (SizeOfImage, SizeOfImage);
@@ -761,6 +761,16 @@ public virtual bool UpdateItem(InventoryItemBase item)
return m_Database.StoreItem(item);
}

[CanBeReflected(ThreatLevel = OpenSim.Services.Interfaces.ThreatLevel.Low)]
public virtual bool UpdateAssetIDForItem(UUID itemID, UUID assetID)
{
object remoteValue = DoRemote(itemID, assetID);
if (remoteValue != null || m_doRemoteOnly)
return remoteValue == null ? false : (bool)remoteValue;

return m_Database.UpdateAssetIDForItem(itemID, assetID);
}

[CanBeReflected(ThreatLevel = OpenSim.Services.Interfaces.ThreatLevel.Low)]
public virtual bool MoveItems(UUID principalID, List<InventoryItemBase> items)
{