diff --git a/OpenMetaverse.Tests/MessageTests.cs b/OpenMetaverse.Tests/MessageTests.cs index 6268c620..38454030 100644 --- a/OpenMetaverse.Tests/MessageTests.cs +++ b/OpenMetaverse.Tests/MessageTests.cs @@ -1085,16 +1085,61 @@ namespace OpenMetaverse.Tests Assert.AreEqual(s.QueryDataBlocks[i].SimName, t.QueryDataBlocks[i].SimName); Assert.AreEqual(s.QueryDataBlocks[i].SnapShotID, t.QueryDataBlocks[i].SnapShotID); } + } + [Test] + public void DirLandReplyMessage() + { + DirLandReplyMessage s = new DirLandReplyMessage(); + s.AgentID = UUID.Random(); + s.QueryID = UUID.Random(); + s.QueryReplies = new DirLandReplyMessage.QueryReply[2]; + DirLandReplyMessage.QueryReply q1 = new DirLandReplyMessage.QueryReply(); + q1.ActualArea = 1024; + q1.Auction = true; + q1.ForSale = true; + q1.Name = "For Sale Parcel Q1"; + q1.ProductSku = "023"; + q1.SalePrice = 2193; + q1.ParcelID = UUID.Random(); + s.QueryReplies[0] = q1; + DirLandReplyMessage.QueryReply q2 = new DirLandReplyMessage.QueryReply(); + q2.ActualArea = 512; + q2.Auction = true; + q2.ForSale = true; + q2.Name = "For Sale Parcel Q2"; + q2.ProductSku = "023"; + q2.SalePrice = 22193; + q2.ParcelID = UUID.Random(); + s.QueryReplies[1] = q2; + + OSDMap map = s.Serialize(); + + DirLandReplyMessage t = new DirLandReplyMessage(); + t.Deserialize(map); + + Assert.AreEqual(s.AgentID, t.AgentID); + Assert.AreEqual(s.QueryID, t.QueryID); + + for(int i = 0; i < s.QueryReplies.Length; i++) + { + Assert.AreEqual(s.QueryReplies[i].ActualArea, t.QueryReplies[i].ActualArea); + Assert.AreEqual(s.QueryReplies[i].Auction, t.QueryReplies[i].Auction); + Assert.AreEqual(s.QueryReplies[i].ForSale, t.QueryReplies[i].ForSale); + Assert.AreEqual(s.QueryReplies[i].Name, t.QueryReplies[i].Name); + Assert.AreEqual(s.QueryReplies[i].ProductSku, t.QueryReplies[i].ProductSku); + Assert.AreEqual(s.QueryReplies[i].ParcelID, t.QueryReplies[i].ParcelID); + Assert.AreEqual(s.QueryReplies[i].SalePrice, t.QueryReplies[i].SalePrice); + + + } } - - } } diff --git a/OpenMetaverse/Messages/LindenMessages.cs b/OpenMetaverse/Messages/LindenMessages.cs index f89476cf..2b6eb0d6 100644 --- a/OpenMetaverse/Messages/LindenMessages.cs +++ b/OpenMetaverse/Messages/LindenMessages.cs @@ -2386,5 +2386,89 @@ namespace OpenMetaverse.Messages.Linden } } + public class DirLandReplyMessage : IMessage + { + public UUID AgentID; + public UUID QueryID; + + public class QueryReply + { + public int ActualArea; + public bool Auction; + public bool ForSale; + public string Name; + public UUID ParcelID; + public string ProductSku; + public int SalePrice; + } + + + public QueryReply[] QueryReplies; + + public OSDMap Serialize() + { + OSDMap map = new OSDMap(3); + + OSDMap agentMap = new OSDMap(1); + agentMap["AgentID"] = OSD.FromUUID(AgentID); + OSDArray agentDataArray = new OSDArray(1); + agentDataArray.Add(agentMap); + map["AgentData"] = agentDataArray; + + OSDMap queryMap = new OSDMap(1); + queryMap["QueryID"] = OSD.FromUUID(QueryID); + OSDArray queryDataArray = new OSDArray(1); + queryDataArray.Add(queryMap); + map["QueryData"] = queryDataArray; + + OSDArray queryReplyArray = new OSDArray(); + for (int i = 0; i < QueryReplies.Length; i++) + { + OSDMap queryReply = new OSDMap(100); + queryReply["ActualArea"] = OSD.FromInteger(QueryReplies[i].ActualArea); + queryReply["Auction"] = OSD.FromBoolean(QueryReplies[i].Auction); + queryReply["ForSale"] = OSD.FromBoolean(QueryReplies[i].ForSale); + queryReply["Name"] = OSD.FromString(QueryReplies[i].Name); + queryReply["ParcelID"] = OSD.FromUUID(QueryReplies[i].ParcelID); + queryReply["ProductSKU"] = OSD.FromString(QueryReplies[i].ProductSku); + queryReply["SalePrice"] = OSD.FromInteger(QueryReplies[i].SalePrice); + + queryReplyArray.Add(queryReply); + } + map["QueryReplies"] = queryReplyArray; + + return map; + } + + public void Deserialize(OSDMap map) + { + OSDArray agentDataArray = (OSDArray) map["AgentData"]; + OSDMap agentDataMap = (OSDMap)agentDataArray[0]; + AgentID = agentDataMap["AgentID"].AsUUID(); + + OSDArray queryDataArray = (OSDArray) map["QueryData"]; + OSDMap queryDataMap = (OSDMap) queryDataArray[0]; + QueryID = queryDataMap["QueryID"].AsUUID(); + + OSDArray queryRepliesArray = (OSDArray) map["QueryReplies"]; + + QueryReplies = new QueryReply[queryRepliesArray.Count]; + for(int i = 0; i < queryRepliesArray.Count; i++) + { + QueryReply reply = new QueryReply(); + OSDMap replyMap = (OSDMap) queryRepliesArray[i]; + reply.ActualArea = replyMap["ActualArea"].AsInteger(); + reply.Auction = replyMap["Auction"].AsBoolean(); + reply.ForSale = replyMap["ForSale"].AsBoolean(); + reply.Name = replyMap["Name"].AsString(); + reply.ParcelID = replyMap["ParcelID"].AsUUID(); + reply.ProductSku = replyMap["ProductSKU"].AsString(); + reply.SalePrice = replyMap["SalePrice"].AsInteger(); + + QueryReplies[i] = reply; + } + } + } + #endregion } diff --git a/OpenMetaverse/Messages/MessageEventDecoder.cs b/OpenMetaverse/Messages/MessageEventDecoder.cs index 08e2e882..b3db0991 100644 --- a/OpenMetaverse/Messages/MessageEventDecoder.cs +++ b/OpenMetaverse/Messages/MessageEventDecoder.cs @@ -78,6 +78,7 @@ namespace OpenMetaverse.Messages case "TeleportFailed": message = new TeleportFailedMessage(); break; case "PlacesReply": message = new PlacesReplyMessage(); break; case "UpdateAgentInformation": message = new UpdateAgentInformationMessage(); break; + case "DirLandReply": message = new DirLandReplyMessage(); break; //case "ProductInfoRequest": message = new ProductInfoRequestMessage(); break; // Capabilities TODO: