diff --git a/OpenMetaverse/Login.cs b/OpenMetaverse/Login.cs
index ace96565..1df21b08 100644
--- a/OpenMetaverse/Login.cs
+++ b/OpenMetaverse/Login.cs
@@ -203,126 +203,7 @@ namespace OpenMetaverse
// ???
}
#endregion
- /*
- public struct XMLLoginMethodResponse
- {
- public string login;
- public string message;
-
- #region Login Failure
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public string reason;
- #endregion
-
- #region Login Success
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- [XmlRpcMember("inventory-skeleton")]
- public InventorySkeletonEntry[] inventory_skeleton;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public string session_id;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- [XmlRpcMember("inventory-root")]
- public InventoryRootEntry[] inventory_root;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public EventNotificationEntry[] event_notifications;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public CategoryEntry[] event_categories;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public string secure_session_id;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public string start_location;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public string first_name;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public string last_name;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public int region_x;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public int region_y;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- [XmlRpcMember("global-textures")]
- public GlobalTextureEntry[] global_textures;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public string home;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- [XmlRpcMember("inventory-lib-owner")]
- public InventoryLibraryOwnerEntry[] inventory_lib_owner;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- [XmlRpcMember("inventory-lib-root")]
- public InventoryRootEntry[] inventory_lib_root;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- [XmlRpcMember("inventory-skel-lib")]
- public InventorySkeletonEntry[] inventory_skel_lib;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public CategoryEntry[] classified_categories;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- [XmlRpcMember("login-flags")]
- public LoginFlagsEntry[] login_flags;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public string agent_access;
-
- [XmlRpcMember("buddy-list")]
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public BuddyListEntry[] buddy_list;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public int circuit_code;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public int sim_port;
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public GestureEntry[] gestures;
- [XmlRpcMember("ui-config")]
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public UIConfigEntry[] ui_config;
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public string sim_ip;
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public string look_at;
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public string agent_id;
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public int seconds_since_epoch;
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public string seed_capability;
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- [XmlRpcMember("initial-outfit")]
- public OutfitEntry[] initial_outfit;
- #endregion
-
- #region Redirection
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public string next_method;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public string next_url;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public string[] next_options;
-
- [XmlRpcMissingMapping(MappingAction.Ignore)]
- public string next_duration;
- #endregion
- }
- */
+
///
///
///
@@ -585,6 +466,225 @@ namespace OpenMetaverse
}
+ public void ToXmlRpc(XmlWriter writer)
+ {
+ writer.WriteStartElement("methodResponse");
+ {
+ writer.WriteStartElement("params");
+ writer.WriteStartElement("param");
+ writer.WriteStartElement("value");
+ writer.WriteStartElement("struct");
+ {
+ if (Success)
+ {
+ // session_id
+ WriteXmlRpcStringMember(writer, false, "session_id", SessionID.ToString());
+
+ // ui-config
+ WriteXmlRpcArrayStart(writer, "ui-config");
+ WriteXmlRpcStringMember(writer, true, "allow_first_life", "Y");
+ WriteXmlRpcArrayEnd(writer);
+
+ // inventory-lib-owner
+ WriteXmlRpcArrayStart(writer, "inventory-lib-owner");
+ WriteXmlRpcStringMember(writer, true, "agent_id", LibraryOwner.ToString());
+ WriteXmlRpcArrayEnd(writer);
+
+ // start_location
+ WriteXmlRpcStringMember(writer, false, "start_location", StartLocation);
+
+ // seconds_since_epoch
+ WriteXmlRpcIntMember(writer, false, "seconds_since_epoch", (uint)SecondsSinceEpoch);
+
+ // event_categories (TODO)
+ WriteXmlRpcArrayStart(writer, "event_categories");
+ WriteXmlRpcCategory(writer, "Default Event Category", 20);
+ WriteXmlRpcArrayEnd(writer);
+
+ // tutorial_setting (TODO)
+ WriteXmlRpcArrayStart(writer, "tutorial_setting");
+ WriteXmlRpcTutorialSetting(writer, "http://127.0.0.1/tutorial/");
+ WriteXmlRpcArrayEnd(writer);
+
+ // classified_categories (TODO)
+ WriteXmlRpcArrayStart(writer, "classified_categories");
+ WriteXmlRpcCategory(writer, "Default Classified Category", 1);
+ WriteXmlRpcArrayEnd(writer);
+
+ // inventory-root
+ WriteXmlRpcArrayStart(writer, "inventory-root");
+ WriteXmlRpcStringMember(writer, true, "folder_id", InventoryRoot.ToString());
+ WriteXmlRpcArrayEnd(writer);
+
+ // sim_port
+ WriteXmlRpcIntMember(writer, false, "sim_port", (uint)SimPort);
+
+ // agent_id
+ WriteXmlRpcStringMember(writer, false, "agent_id", AgentID.ToString());
+
+ // agent_access
+ WriteXmlRpcStringMember(writer, false, "agent_access", AgentAccess);
+
+ // inventory-skeleton
+ WriteXmlRpcArrayStart(writer, "inventory-skeleton");
+ if (InventorySkeleton != null)
+ {
+ for (int i = 0; i < InventorySkeleton.Length; i++)
+ {
+ WriteXmlRpcInventoryItem(writer, InventorySkeleton[i].name, UUID.Parse(InventorySkeleton[i].parent_id),
+ (uint)InventorySkeleton[i].version, (uint)InventorySkeleton[i].type_default, UUID.Parse(InventorySkeleton[i].folder_id));
+ }
+ }
+ else
+ {
+ WriteXmlRpcInventoryItem(writer, "Inventory", UUID.Zero, 1, (uint)AssetType.Folder, UUID.Parse(InventoryRoot[0].folder_id));
+ }
+ WriteXmlRpcArrayEnd(writer);
+
+ // buddy-list
+ WriteXmlRpcArrayStart(writer, "buddy-list");
+ if (BuddyList != null)
+ {
+ for (int i = 0; i < BuddyList.Length; i++)
+ {
+ WriteXmlRpcBuddy(writer, (uint)BuddyList[i].buddy_rights_given,
+ (uint)BuddyList[i].buddy_rights_has, UUID.Parse(BuddyList[i].buddy_id));
+ }
+ }
+ else
+ {
+ //WriteXmlRpcBuddy(writer, 0, 0, UUID.Random());
+ }
+ WriteXmlRpcArrayEnd(writer);
+
+ // first_name
+ WriteXmlRpcStringMember(writer, false, "first_name", FirstName);
+
+ // global-textures
+ WriteXmlRpcArrayStart(writer, "global-textures");
+ writer.WriteStartElement("value");
+ writer.WriteStartElement("struct");
+ {
+ WriteXmlRpcStringMember(writer, false, "sun_texture_id", "cce0f112-878f-4586-a2e2-a8f104bba271");
+ WriteXmlRpcStringMember(writer, false, "cloud_texture_id", "fc4b9f0b-d008-45c6-96a4-01dd947ac621");
+ WriteXmlRpcStringMember(writer, false, "moon_texture_id", "d07f6eed-b96a-47cd-b51d-400ad4a1c428");
+ }
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ WriteXmlRpcArrayEnd(writer);
+
+ // inventory-skel-lib
+ WriteXmlRpcArrayStart(writer, "inventory-skel-lib");
+ if (LibrarySkeleton != null)
+ {
+ for (int i = 0; i < LibrarySkeleton.Length; i++)
+ {
+ WriteXmlRpcInventoryItem(writer, LibrarySkeleton[i].name, UUID.Parse(LibrarySkeleton[i].parent_id),
+ (uint)LibrarySkeleton[i].version, (uint)LibrarySkeleton[i].type_default, UUID.Parse(LibrarySkeleton[i].folder_id));
+ }
+ }
+ else
+ {
+ WriteXmlRpcInventoryItem(writer, "Library", UUID.Zero, 1, (uint)AssetType.Folder, UUID.Parse(LibraryRoot[0].folder_id));
+ }
+ WriteXmlRpcArrayEnd(writer);
+
+ // seed_capability
+ WriteXmlRpcStringMember(writer, false, "seed_capability", SeedCapability);
+
+ // gestures
+ WriteXmlRpcArrayStart(writer, "gestures");
+ WriteXmlRpcGesture(writer, UUID.Random(), UUID.Random());
+ WriteXmlRpcArrayEnd(writer);
+
+ // sim_ip
+ WriteXmlRpcStringMember(writer, false, "sim_ip", SimIP.ToString());
+
+ // inventory-lib-root
+ WriteXmlRpcArrayStart(writer, "inventory-lib-root");
+ WriteXmlRpcStringMember(writer, true, "folder_id", LibraryRoot.ToString());
+ WriteXmlRpcArrayEnd(writer);
+
+ // login-flags
+ WriteXmlRpcArrayStart(writer, "login-flags");
+ writer.WriteStartElement("value");
+ writer.WriteStartElement("struct");
+ {
+ WriteXmlRpcStringMember(writer, false, "gendered", "Y");
+ WriteXmlRpcStringMember(writer, false, "stipend_since_login", "N");
+ WriteXmlRpcStringMember(writer, false, "ever_logged_in", "Y");
+ if (DateTime.Now.IsDaylightSavingTime())
+ WriteXmlRpcStringMember(writer, false, "daylight_savings", "Y");
+ else
+ WriteXmlRpcStringMember(writer, false, "daylight_savings", "N");
+ }
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ WriteXmlRpcArrayEnd(writer);
+
+ // inventory_host
+ WriteXmlRpcStringMember(writer, false, "inventory_host", IPAddress.Loopback.ToString());
+
+ // home
+ OSDArray homeRegionHandle = new OSDArray(2);
+ uint homeRegionX, homeRegionY;
+ Utils.LongToUInts(HomeRegion, out homeRegionX, out homeRegionY);
+ homeRegionHandle.Add(OSD.FromReal((double)homeRegionX));
+ homeRegionHandle.Add(OSD.FromReal((double)homeRegionY));
+
+ OSDMap home = new OSDMap(3);
+ home["region_handle"] = homeRegionHandle;
+ home["position"] = OSD.FromVector3(HomePosition);
+ home["look_at"] = OSD.FromVector3(HomeLookAt);
+
+ WriteXmlRpcStringMember(writer, false, "home", OSDParser.SerializeLLSDNotation(home));
+
+ // message
+ WriteXmlRpcStringMember(writer, false, "message", Message);
+
+ // look_at
+ WriteXmlRpcStringMember(writer, false, "look_at", LookAt);
+
+ // login
+ WriteXmlRpcStringMember(writer, false, "login", "true");
+
+ // event_notifications
+ WriteXmlRpcArrayStart(writer, "event_notifications");
+ WriteXmlRpcArrayEnd(writer);
+
+ // secure_session_id
+ WriteXmlRpcStringMember(writer, false, "secure_session_id", SecureSessionID.ToString());
+
+ // region_x
+ WriteXmlRpcIntMember(writer, false, "region_x", (uint)RegionX);
+
+ // last_name
+ WriteXmlRpcStringMember(writer, false, "last_name", LastName);
+
+ // region_y
+ WriteXmlRpcIntMember(writer, false, "region_y", (uint)RegionY);
+
+ // circuit_code
+ WriteXmlRpcIntMember(writer, false, "circuit_code", (uint)CircuitCode);
+
+ // initial-outfit
+ WriteXmlRpcArrayStart(writer, "initial-outfit");
+ WriteXmlRpcArrayEnd(writer);
+ }
+ else
+ {
+ // Login failure
+ }
+ }
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ }
+ writer.WriteEndElement();
+ writer.Close();
+ }
+
#region Parsing Helpers
public static uint ParseUInt(string key, OSDMap reply)
@@ -708,6 +808,161 @@ namespace OpenMetaverse
#endregion Parsing Helpers
+
+ #region XmlRpc Serializing Helpers
+
+ public static void WriteXmlRpcStringMember(XmlWriter writer, bool wrapWithValueStruct, string name, string value)
+ {
+ if (wrapWithValueStruct)
+ {
+ writer.WriteStartElement("value");
+ writer.WriteStartElement("struct");
+ }
+ writer.WriteStartElement("member");
+ {
+ writer.WriteElementString("name", name);
+ writer.WriteStartElement("value");
+ {
+ writer.WriteElementString("string", value);
+ }
+ writer.WriteEndElement();
+ }
+ writer.WriteEndElement();
+ if (wrapWithValueStruct)
+ {
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ }
+ }
+
+ public static void WriteXmlRpcIntMember(XmlWriter writer, bool wrapWithValueStruct, string name, uint value)
+ {
+ if (wrapWithValueStruct)
+ {
+ writer.WriteStartElement("value");
+ writer.WriteStartElement("struct");
+ }
+ writer.WriteStartElement("member");
+ {
+ writer.WriteElementString("name", name);
+ writer.WriteStartElement("value");
+ {
+ writer.WriteElementString("i4", value.ToString());
+ }
+ writer.WriteEndElement();
+ }
+ writer.WriteEndElement();
+ if (wrapWithValueStruct)
+ {
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ }
+ }
+
+ public static void WriteXmlRpcArrayStart(XmlWriter writer, string name)
+ {
+ writer.WriteStartElement("member");
+ writer.WriteElementString("name", name);
+ writer.WriteStartElement("value");
+ writer.WriteStartElement("array");
+ writer.WriteStartElement("data");
+ }
+
+ public static void WriteXmlRpcArrayEnd(XmlWriter writer)
+ {
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ }
+
+ public static void WriteXmlRpcEmptyValueStruct(XmlWriter writer)
+ {
+ writer.WriteStartElement("value");
+ writer.WriteStartElement("struct");
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ }
+
+ public static void WriteXmlRpcCategory(XmlWriter writer, string name, uint id)
+ {
+ writer.WriteStartElement("value");
+ writer.WriteStartElement("struct");
+ {
+ WriteXmlRpcStringMember(writer, false, "category_name", name);
+ WriteXmlRpcIntMember(writer, false, "category_id", id);
+ }
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ }
+
+ public static void WriteXmlRpcInventoryItem(XmlWriter writer, string name, UUID parentID,
+ uint version, uint typeDefault, UUID folderID)
+ {
+ writer.WriteStartElement("value");
+ writer.WriteStartElement("struct");
+ {
+ WriteXmlRpcStringMember(writer, false, "name", name);
+ WriteXmlRpcStringMember(writer, false, "parent_id", parentID.ToString());
+ WriteXmlRpcIntMember(writer, false, "version", version);
+ WriteXmlRpcIntMember(writer, false, "type_default", typeDefault);
+ WriteXmlRpcStringMember(writer, false, "folder_id", folderID.ToString());
+ }
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ }
+
+ public static void WriteXmlRpcBuddy(XmlWriter writer, uint rightsHas, uint rightsGiven, UUID buddyID)
+ {
+ writer.WriteStartElement("value");
+ writer.WriteStartElement("struct");
+ {
+ WriteXmlRpcIntMember(writer, false, "buddy_rights_has", rightsHas);
+ WriteXmlRpcIntMember(writer, false, "buddy_rights_given", rightsGiven);
+ WriteXmlRpcStringMember(writer, false, "buddy_id", buddyID.ToString());
+ }
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ }
+
+ public static void WriteXmlRpcGesture(XmlWriter writer, UUID assetID, UUID itemID)
+ {
+ writer.WriteStartElement("value");
+ writer.WriteStartElement("struct");
+ {
+ WriteXmlRpcStringMember(writer, false, "asset_id", assetID.ToString());
+ WriteXmlRpcStringMember(writer, false, "item_id", itemID.ToString());
+ }
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ }
+
+ public static void WriteXmlRpcTutorialSetting(XmlWriter writer, string url)
+ {
+ writer.WriteStartElement("value");
+ writer.WriteStartElement("struct");
+ {
+ WriteXmlRpcStringMember(writer, false, "tutorial_url", url);
+ }
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+
+ writer.WriteStartElement("value");
+ writer.WriteStartElement("struct");
+ {
+ writer.WriteStartElement("member");
+ {
+ writer.WriteElementString("name", "use_tutorial");
+ writer.WriteStartElement("value");
+ writer.WriteEndElement();
+ }
+ writer.WriteEndElement();
+ }
+ writer.WriteEndElement();
+ writer.WriteEndElement();
+ }
+
+ #endregion XmlRpc Serializing Helpers
}
#endregion Structs
@@ -813,6 +1068,19 @@ namespace OpenMetaverse
string userAgent, string userVersion)
{
List options = new List();
+ options.Add("inventory-root");
+ options.Add("inventory-skeleton");
+ options.Add("inventory-lib-root");
+ options.Add("inventory-lib-owner");
+ options.Add("inventory-skel-lib");
+ options.Add("gestures");
+ options.Add("event_categories");
+ options.Add("event_notifications");
+ options.Add("classified_categories");
+ options.Add("buddy-list");
+ options.Add("ui-config");
+ options.Add("login-flags");
+ options.Add("global-textures");
LoginParams loginParams = new LoginParams();
diff --git a/Programs/examples/TestClient/TestClient.cs b/Programs/examples/TestClient/TestClient.cs
index 26a82c00..294a60b1 100644
--- a/Programs/examples/TestClient/TestClient.cs
+++ b/Programs/examples/TestClient/TestClient.cs
@@ -138,7 +138,6 @@ namespace OpenMetaverse.TestClient
AgentDataUpdatePacket p = (AgentDataUpdatePacket)packet;
if (p.AgentData.AgentID == sim.Client.Self.AgentID)
{
- Console.WriteLine("Got the group ID for " + sim.Client.ToString() + ", requesting group members...");
GroupID = p.AgentData.ActiveGroupID;
sim.Client.Groups.RequestGroupMembers(GroupID);
@@ -147,7 +146,6 @@ namespace OpenMetaverse.TestClient
private void GroupMembersHandler(Dictionary members)
{
- Console.WriteLine("Got " + members.Count + " group members.");
GroupMembers = members;
}