Resolve error where an unknown asset type would cause the fetch inventory descendents cap to fail.

Introduced just a few commits ago in 0688861
iar_mods
Justin Clark-Casey (justincc) 2011-11-25 23:43:57 +00:00
parent 676d32974a
commit 5b4fe23f7f
2 changed files with 44 additions and 44 deletions

View File

@ -42,7 +42,6 @@ using Caps = OpenSim.Framework.Capabilities.Caps;
namespace OpenSim.Capabilities.Handlers namespace OpenSim.Capabilities.Handlers
{ {
public class WebFetchInvDescHandler public class WebFetchInvDescHandler
{ {
private static readonly ILog m_log = private static readonly ILog m_log =
@ -60,39 +59,40 @@ namespace OpenSim.Capabilities.Handlers
public string FetchInventoryDescendentsRequest(string request, string path, string param, OSHttpRequest httpRequest, OSHttpResponse httpResponse) public string FetchInventoryDescendentsRequest(string request, string path, string param, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
{ {
// m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Received request");
// nasty temporary hack here, the linden client falsely
// identifies the uuid 00000000-0000-0000-0000-000000000000
// as a string which breaks us
//
// correctly mark it as a uuid
//
request = request.Replace("<string>00000000-0000-0000-0000-000000000000</string>", "<uuid>00000000-0000-0000-0000-000000000000</uuid>");
// another hack <integer>1</integer> results in a
// System.ArgumentException: Object type System.Int32 cannot
// be converted to target type: System.Boolean
//
request = request.Replace("<key>fetch_folders</key><integer>0</integer>", "<key>fetch_folders</key><boolean>0</boolean>");
request = request.Replace("<key>fetch_folders</key><integer>1</integer>", "<key>fetch_folders</key><boolean>1</boolean>");
Hashtable hash = new Hashtable();
try
{
hash = (Hashtable)LLSD.LLSDDeserialize(Utils.StringToBytes(request));
}
catch (LLSD.LLSDParseException pe)
{
m_log.Error("[AGENT INVENTORY]: Fetch error: " + pe.Message);
m_log.Error("Request: " + request.ToString());
}
ArrayList foldersrequested = (ArrayList)hash["folders"];
string response = "";
lock (m_fetchLock) lock (m_fetchLock)
{ {
// m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Received request {0}", request);
// nasty temporary hack here, the linden client falsely
// identifies the uuid 00000000-0000-0000-0000-000000000000
// as a string which breaks us
//
// correctly mark it as a uuid
//
request = request.Replace("<string>00000000-0000-0000-0000-000000000000</string>", "<uuid>00000000-0000-0000-0000-000000000000</uuid>");
// another hack <integer>1</integer> results in a
// System.ArgumentException: Object type System.Int32 cannot
// be converted to target type: System.Boolean
//
request = request.Replace("<key>fetch_folders</key><integer>0</integer>", "<key>fetch_folders</key><boolean>0</boolean>");
request = request.Replace("<key>fetch_folders</key><integer>1</integer>", "<key>fetch_folders</key><boolean>1</boolean>");
Hashtable hash = new Hashtable();
try
{
hash = (Hashtable)LLSD.LLSDDeserialize(Utils.StringToBytes(request));
}
catch (LLSD.LLSDParseException e)
{
m_log.ErrorFormat("[WEB FETCH INV DESC HANDLER]: Fetch error: {0}{1}" + e.Message, e.StackTrace);
m_log.Error("Request: " + request);
}
ArrayList foldersrequested = (ArrayList)hash["folders"];
string response = "";
for (int i = 0; i < foldersrequested.Count; i++) for (int i = 0; i < foldersrequested.Count; i++)
{ {
string inventoryitemstr = ""; string inventoryitemstr = "";
@ -106,7 +106,7 @@ namespace OpenSim.Capabilities.Handlers
} }
catch (Exception e) catch (Exception e)
{ {
m_log.Debug("[CAPS]: caught exception doing OSD deserialize" + e); m_log.Debug("[WEB FETCH INV DESC HANDLER]: caught exception doing OSD deserialize" + e);
} }
LLSDInventoryDescendents reply = FetchInventoryReply(llsdRequest); LLSDInventoryDescendents reply = FetchInventoryReply(llsdRequest);
@ -130,12 +130,12 @@ namespace OpenSim.Capabilities.Handlers
response = "<llsd><map><key>folders</key><array>" + response + "</array></map></llsd>"; response = "<llsd><map><key>folders</key><array>" + response + "</array></map></llsd>";
} }
//m_log.DebugFormat("[CAPS]: Replying to CAPS fetch inventory request with following xml"); // m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Replying to CAPS fetch inventory request");
//m_log.Debug("[CAPS] "+response); //m_log.Debug("[WEB FETCH INV DESC HANDLER] "+response);
return response;
} }
return response;
} }
/// <summary> /// <summary>
@ -184,8 +184,9 @@ namespace OpenSim.Capabilities.Handlers
return reply; return reply;
} }
public InventoryCollection Fetch(UUID agentID, UUID folderID, UUID ownerID, public InventoryCollection Fetch(
bool fetchFolders, bool fetchItems, int sortOrder, out int version) UUID agentID, UUID folderID, UUID ownerID,
bool fetchFolders, bool fetchItems, int sortOrder, out int version)
{ {
m_log.DebugFormat( m_log.DebugFormat(
"[WEB FETCH INV DESC HANDLER]: Fetching folders ({0}), items ({1}) from {2} for agent {3}", "[WEB FETCH INV DESC HANDLER]: Fetching folders ({0}), items ({1}) from {2} for agent {3}",
@ -194,6 +195,7 @@ namespace OpenSim.Capabilities.Handlers
version = 0; version = 0;
InventoryFolderImpl fold; InventoryFolderImpl fold;
if (m_LibraryService != null && m_LibraryService.LibraryRootFolder != null && agentID == m_LibraryService.LibraryRootFolder.Owner) if (m_LibraryService != null && m_LibraryService.LibraryRootFolder != null && agentID == m_LibraryService.LibraryRootFolder.Owner)
{
if ((fold = m_LibraryService.LibraryRootFolder.FindFolder(folderID)) != null) if ((fold = m_LibraryService.LibraryRootFolder.FindFolder(folderID)) != null)
{ {
InventoryCollection ret = new InventoryCollection(); InventoryCollection ret = new InventoryCollection();
@ -202,6 +204,7 @@ namespace OpenSim.Capabilities.Handlers
return ret; return ret;
} }
}
InventoryCollection contents = new InventoryCollection(); InventoryCollection contents = new InventoryCollection();
@ -236,7 +239,7 @@ namespace OpenSim.Capabilities.Handlers
llsdFolder.parent_id = invFolder.ParentID; llsdFolder.parent_id = invFolder.ParentID;
llsdFolder.name = invFolder.Name; llsdFolder.name = invFolder.Name;
if (!Enum.IsDefined(typeof(AssetType), invFolder.Type)) if (invFolder.Type == (short)AssetType.Unknown || !Enum.IsDefined(typeof(AssetType), (sbyte)invFolder.Type))
llsdFolder.type = "-1"; llsdFolder.type = "-1";
else else
llsdFolder.type = Utils.AssetTypeToString((AssetType)invFolder.Type); llsdFolder.type = Utils.AssetTypeToString((AssetType)invFolder.Type);

View File

@ -48,8 +48,7 @@ namespace OpenSim.Region.ClientStack.Linden
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
public class WebFetchInvDescModule : INonSharedRegionModule public class WebFetchInvDescModule : INonSharedRegionModule
{ {
private static readonly ILog m_log = // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private Scene m_scene; private Scene m_scene;
@ -120,8 +119,6 @@ namespace OpenSim.Region.ClientStack.Linden
private void RegisterCaps(UUID agentID, Caps caps) private void RegisterCaps(UUID agentID, Caps caps)
{ {
UUID capID = UUID.Random();
if (m_webFetchInventoryDescendentsUrl != "") if (m_webFetchInventoryDescendentsUrl != "")
RegisterFetchCap(agentID, caps, "WebFetchInventoryDescendents", m_webFetchInventoryDescendentsUrl); RegisterFetchCap(agentID, caps, "WebFetchInventoryDescendents", m_webFetchInventoryDescendentsUrl);
else if (m_fetchInventoryDescendents2Url != "") else if (m_fetchInventoryDescendents2Url != "")