From 5ea4faa6f209fd5c6a48cc704c595fb029b790f2 Mon Sep 17 00:00:00 2001 From: Charles Krinke Date: Tue, 21 Apr 2009 20:44:17 +0000 Subject: Thank you kindly, MCortez, for a patch that: * Refactors the xmlrpc calls to a single location to make it easier to debug and include alternative xmlrpc call mechanisms * Includes an alternative xmlrpc call mechanism that sets HTTP Keep-Alive to false which solves nearly all System.Net exceptions on some windows environments --- .../Avatar/XmlRpcGroups/XmlRpcGroupData.cs | 513 ++++++++------------- .../Avatar/XmlRpcGroups/XmlRpcGroupsMessaging.cs | 3 + .../Avatar/XmlRpcGroups/XmlRpcGroupsModule.cs | 31 +- 3 files changed, 217 insertions(+), 330 deletions(-) (limited to 'OpenSim/Region/OptionalModules') diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupData.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupData.cs index eff76cf..3a728da 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupData.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupData.cs @@ -50,13 +50,24 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private string m_serviceURL = "http://osflotsam.org/xmlrpc.php"; + private string m_serviceURL = string.Empty; public const GroupPowers m_DefaultEveryonePowers = GroupPowers.AllowSetHome | GroupPowers.Accountable | GroupPowers.JoinChat | GroupPowers.AllowVoiceChat | GroupPowers.ReceiveNotices | GroupPowers.StartProposal | GroupPowers.VoteOnProposal; - public XmlRpcGroupDataProvider(string serviceURL) + private bool m_disableKeepAlive = false; + + public XmlRpcGroupDataProvider(string serviceURL, bool disableKeepAlive) { - m_serviceURL = serviceURL; + m_serviceURL = serviceURL.Trim().ToLower(); + m_disableKeepAlive = disableKeepAlive; + + if ((serviceURL == null) + || (serviceURL == string.Empty) + ) + { + throw new Exception("Please specify a valid ServiceURL for XmlRpcGroupDataProvider in OpenSim.ini, [Groups], XmlRpcServiceURL"); + } + } /// @@ -131,15 +142,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.createGroup", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 3000); - Hashtable respData = (Hashtable)resp.Value; + + Hashtable respData = XmlRpcCall("groups.createGroup", param); if (respData.Contains("error")) { - LogRespDataToConsoleError(respData); + // UUID is not nullable + + return UUID.Zero; } return UUID.Parse((string)respData["GroupID"]); @@ -157,16 +167,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups param["AllowPublish"] = allowPublish == true ? 1 : 0; param["MaturePublish"] = maturePublish == true ? 1 : 0; - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.updateGroup", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 3000); - Hashtable respData = (Hashtable)resp.Value; - - if (respData.Contains("error")) - { - LogRespDataToConsoleError(respData); - } + XmlRpcCall("groups.updateGroup", param); } public void AddGroupRole(UUID groupID, UUID roleID, string name, string description, string title, ulong powers) @@ -179,16 +180,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups param["Title"] = title; param["Powers"] = powers.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.addRoleToGroup", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 3000); - Hashtable respData = (Hashtable)resp.Value; - - if (respData.Contains("error")) - { - LogRespDataToConsoleError(respData); - } + XmlRpcCall("groups.addRoleToGroup", param); } public void RemoveGroupRole(UUID groupID, UUID roleID) @@ -197,16 +189,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups param["GroupID"] = groupID.ToString(); param["RoleID"] = roleID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.removeRoleFromGroup", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 3000); - Hashtable respData = (Hashtable)resp.Value; + XmlRpcCall("groups.removeRoleFromGroup", param); - if (respData.Contains("error")) - { - LogRespDataToConsoleError(respData); - } } public void UpdateGroupRole(UUID groupID, UUID roleID, string name, string description, string title, ulong powers) @@ -228,16 +212,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups } param["Powers"] = powers.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.updateGroupRole", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 3000); - Hashtable respData = (Hashtable)resp.Value; - - if (respData.Contains("error")) - { - LogRespDataToConsoleError(respData); - } + XmlRpcCall("groups.updateGroupRole", param); } public GroupRecord GetGroupRecord(UUID GroupID, string GroupName) @@ -253,18 +228,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups } - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.getGroup", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 3000); - Hashtable respData = (Hashtable)resp.Value; + Hashtable respData = XmlRpcCall("groups.getGroup", param); if (respData.Contains("error")) { - if ((string)respData["error"] != "Group Not Found") - { - LogRespDataToConsoleError(respData); - } return null; } @@ -278,18 +245,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups param["GroupID"] = GroupID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.getGroup", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 3000); - Hashtable respData = (Hashtable)resp.Value; + Hashtable respData = XmlRpcCall("groups.getGroup", param); if (respData.Contains("error")) { - if ((string)respData["error"] != "Group Not Found") - { - LogRespDataToConsoleError(respData); - } + // GroupProfileData is not nullable return new GroupProfileData(); } @@ -333,40 +293,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups { GroupRecord group = new GroupRecord(); - m_log.Debug("GroupID"); group.GroupID = UUID.Parse((string)groupProfile["GroupID"]); - - m_log.Debug("Name"); group.GroupName = groupProfile["Name"].ToString(); - - m_log.Debug("Charter"); if (groupProfile["Charter"] != null) { group.Charter = (string)groupProfile["Charter"]; } - - m_log.Debug("ShowInList"); group.ShowInList = ((string)groupProfile["ShowInList"]) == "1"; - - m_log.Debug("InsigniaID"); group.GroupPicture = UUID.Parse((string)groupProfile["InsigniaID"]); - - m_log.Debug("MembershipFee"); group.MembershipFee = int.Parse((string)groupProfile["MembershipFee"]); - - m_log.Debug("OpenEnrollment"); group.OpenEnrollment = ((string)groupProfile["OpenEnrollment"]) == "1"; - - m_log.Debug("AllowPublish"); group.AllowPublish = ((string)groupProfile["AllowPublish"]) == "1"; - - m_log.Debug("MaturePublish"); group.MaturePublish = ((string)groupProfile["MaturePublish"]) == "1"; - - m_log.Debug("FounderID"); group.FounderID = UUID.Parse((string)groupProfile["FounderID"]); - - m_log.Debug("OwnerRoleID"); group.OwnerRoleID = UUID.Parse((string)groupProfile["OwnerRoleID"]); return group; @@ -379,17 +318,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups param["AgentID"] = AgentID.ToString(); param["GroupID"] = GroupID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.setAgentActiveGroup", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 3000); - Hashtable respData = (Hashtable)resp.Value; - - if (respData.Contains("error")) - { - LogRespDataToConsoleError(respData); - } - + XmlRpcCall("groups.setAgentActiveGroup", param); } public void SetAgentActiveGroupRole(UUID AgentID, UUID GroupID, UUID RoleID) @@ -399,17 +328,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups param["GroupID"] = GroupID.ToString(); param["SelectedRoleID"] = RoleID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.setAgentGroupInfo", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 3000); - Hashtable respData = (Hashtable)resp.Value; - - if (respData.Contains("error")) - { - LogRespDataToConsoleError(respData); - } - + XmlRpcCall("groups.setAgentGroupInfo", param); } public void SetAgentGroupInfo(UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile) @@ -420,16 +339,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups param["AcceptNotices"] = AcceptNotices ? "1" : "0"; param["ListInProfile"] = ListInProfile ? "1" : "0"; - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.setAgentGroupInfo", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 3000); - Hashtable respData = (Hashtable)resp.Value; + XmlRpcCall("groups.setAgentGroupInfo", param); - if (respData.Contains("error")) - { - LogRespDataToConsoleError(respData); - } } public void AddAgentToGroupInvite(UUID inviteID, UUID groupID, UUID roleID, UUID agentID) @@ -440,20 +351,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups param["RoleID"] = roleID.ToString(); param["GroupID"] = groupID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.addAgentToGroupInvite", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 3000); - Hashtable respData = (Hashtable)resp.Value; - - if (respData.Contains("error")) - { - if (respData["error"] != "Duplicate group invite requested") - { - LogRespDataToConsoleError(respData); - } - } - + XmlRpcCall("groups.addAgentToGroupInvite", param); } @@ -462,17 +360,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups Hashtable param = new Hashtable(); param["InviteID"] = inviteID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.getAgentToGroupInvite", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 3000); - Hashtable respData = (Hashtable)resp.Value; - + Hashtable respData = XmlRpcCall("groups.getAgentToGroupInvite", param); if (respData.Contains("error")) { - LogRespDataToConsoleError(respData); - return null; } @@ -490,16 +381,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups Hashtable param = new Hashtable(); param["InviteID"] = inviteID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.removeAgentToGroupInvite", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 3000); - Hashtable respData = (Hashtable)resp.Value; - - if (respData.Contains("error")) - { - LogRespDataToConsoleError(respData); - } + XmlRpcCall("groups.removeAgentToGroupInvite", param); } public void AddAgentToGroup(UUID AgentID, UUID GroupID, UUID RoleID) @@ -509,16 +391,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups param["GroupID"] = GroupID.ToString(); param["RoleID"] = RoleID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.addAgentToGroup", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 3000); - Hashtable respData = (Hashtable)resp.Value; - - if (respData.Contains("error")) - { - LogRespDataToConsoleError(respData); - } + XmlRpcCall("groups.addAgentToGroup", param); } public void RemoveAgentFromGroup(UUID AgentID, UUID GroupID) @@ -527,16 +400,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups param["AgentID"] = AgentID.ToString(); param["GroupID"] = GroupID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.removeAgentFromGroup", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 3000); - Hashtable respData = (Hashtable)resp.Value; + XmlRpcCall("groups.removeAgentFromGroup", param); - if (respData.Contains("error")) - { - LogRespDataToConsoleError(respData); - } } public void AddAgentToGroupRole(UUID AgentID, UUID GroupID, UUID RoleID) @@ -546,16 +411,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups param["GroupID"] = GroupID.ToString(); param["RoleID"] = RoleID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.addAgentToGroupRole", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 3000); - Hashtable respData = (Hashtable)resp.Value; - - if (respData.Contains("error")) - { - LogRespDataToConsoleError(respData); - } + XmlRpcCall("groups.addAgentToGroupRole", param); } public void RemoveAgentFromGroupRole(UUID AgentID, UUID GroupID, UUID RoleID) @@ -565,16 +421,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups param["GroupID"] = GroupID.ToString(); param["RoleID"] = RoleID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.removeAgentFromGroupRole", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 3000); - Hashtable respData = (Hashtable)resp.Value; - - if (respData.Contains("error")) - { - LogRespDataToConsoleError(respData); - } + XmlRpcCall("groups.removeAgentFromGroupRole", param); } @@ -583,22 +430,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups Hashtable param = new Hashtable(); param["Search"] = search; - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.findGroups", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 10000); - Hashtable respData = (Hashtable)resp.Value; + Hashtable respData = XmlRpcCall("groups.findGroups", param); List findings = new List(); - if (respData.Contains("error")) - { - if (respData["error"].ToString() != "No groups found.") - { - LogRespDataToConsoleError(respData); - } - } - else + if (!respData.Contains("error")) { Hashtable results = (Hashtable)respData["results"]; foreach (Hashtable groupFind in results.Values) @@ -622,18 +458,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups param["AgentID"] = AgentID.ToString(); param["GroupID"] = GroupID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.getAgentGroupMembership", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 10000); - Hashtable respData = (Hashtable)resp.Value; + Hashtable respData = XmlRpcCall("groups.getAgentGroupMembership", param); if (respData.Contains("error")) { - if ((string)respData["error"] != "None Found") - { - LogRespDataToConsoleError(respData); - } return null; } @@ -647,74 +475,27 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups Hashtable param = new Hashtable(); param["AgentID"] = AgentID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.getAgentActiveMembership", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 10000); - Hashtable respData = (Hashtable)resp.Value; + Hashtable respData = XmlRpcCall("groups.getAgentActiveMembership", param); if (respData.Contains("error")) { - if (respData["error"].ToString() == "No Active Group Specified") - { return null; } - LogRespDataToConsoleError(respData); - return null; - } - try - { - GroupMembershipData data = HashTableToGroupMembershipData(respData); - return data; - } - catch (System.Exception e) - { - LogRespDataToConsoleError(respData); - throw e; - } - } - - private void LogRespDataToConsoleError(Hashtable respData) - { - m_log.Error("[GROUPDATA] Error:"); - - foreach (string key in respData.Keys) - { - m_log.ErrorFormat("[GROUPDATA] Key: {0}", key); - - object o = respData[key]; - - string[] lines = respData[key].ToString().Split(new char[] { '\n' }); - foreach (string line in lines) - { - m_log.ErrorFormat("[GROUPDATA] {0}", line); + return HashTableToGroupMembershipData(respData); } - } - } public List GetAgentGroupMemberships(UUID AgentID) { Hashtable param = new Hashtable(); param["AgentID"] = AgentID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.getAgentGroupMemberships", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 10000); - Hashtable respData = (Hashtable)resp.Value; + Hashtable respData = XmlRpcCall("groups.getAgentGroupMemberships", param); List memberships = new List(); - if (respData.Contains("error")) - { - if (respData["error"].ToString() != "No Memberships") - { - LogRespDataToConsoleError(respData); - } - } - else + if (!respData.Contains("error")) { foreach (object membership in respData.Values) { @@ -730,20 +511,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups param["AgentID"] = AgentID.ToString(); param["GroupID"] = GroupID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.getAgentRoles", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 10000); - Hashtable respData = (Hashtable)resp.Value; + Hashtable respData = XmlRpcCall("groups.getAgentRoles", param); List Roles = new List(); if (respData.Contains("error")) { - if ((string)respData["error"] != "None found") - { - LogRespDataToConsoleError(respData); - } return Roles; } @@ -769,19 +542,15 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups Hashtable param = new Hashtable(); param["GroupID"] = GroupID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.getGroupRoles", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 10000); - Hashtable respData = (Hashtable)resp.Value; + Hashtable respData = XmlRpcCall("groups.getGroupRoles", param); + + List Roles = new List(); if (respData.Contains("error")) { - LogRespDataToConsoleError(respData); - return null; + return Roles; } - List Roles = new List(); foreach (Hashtable role in respData.Values) { GroupRolesData data = new GroupRolesData(); @@ -819,7 +588,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups data.Active = data.GroupID.Equals(ActiveGroup); data.AllowPublish = ((string)respData["AllowPublish"] == "1"); + if (respData["Charter"] != null) + { data.Charter = (string)respData["Charter"]; + } data.FounderID = new UUID((string)respData["FounderID"]); data.GroupID = new UUID((string)respData["GroupID"]); data.GroupName = (string)respData["GroupName"]; @@ -836,19 +608,15 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups Hashtable param = new Hashtable(); param["GroupID"] = GroupID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.getGroupMembers", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 10000); - Hashtable respData = (Hashtable)resp.Value; + Hashtable respData = XmlRpcCall("groups.getGroupMembers", param); + + List members = new List(); if (respData.Contains("error")) { - LogRespDataToConsoleError(respData); - return null; + return members; } - List members = new List(); foreach (Hashtable membership in respData.Values) { GroupMembersData data = new GroupMembersData(); @@ -873,19 +641,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups Hashtable param = new Hashtable(); param["GroupID"] = GroupID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.getGroupRoleMembers", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 10000); - Hashtable respData = (Hashtable)resp.Value; - - if (respData.Contains("error")) - { - LogRespDataToConsoleError(respData); - return null; - } + Hashtable respData = XmlRpcCall("groups.getGroupRoleMembers", param); List members = new List(); + + if (!respData.Contains("error")) + { foreach (Hashtable membership in respData.Values) { GroupRoleMembersData data = new GroupRoleMembersData(); @@ -895,7 +656,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups members.Add(data); } - + } return members; } @@ -904,22 +665,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups Hashtable param = new Hashtable(); param["GroupID"] = GroupID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.getGroupNotices", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 10000); - Hashtable respData = (Hashtable)resp.Value; + Hashtable respData = XmlRpcCall("groups.getGroupNotices", param); List values = new List(); - if (respData.Contains("error")) - { - if ((string)respData["error"] != "No Notices") - { - LogRespDataToConsoleError(respData); - } - } - else + if (!respData.Contains("error")) { foreach (Hashtable value in respData.Values) { @@ -942,22 +692,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups Hashtable param = new Hashtable(); param["NoticeID"] = noticeID.ToString(); - IList parameters = new ArrayList(); - parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.getGroupNotice", parameters); - XmlRpcResponse resp = req.Send(m_serviceURL, 10000); - Hashtable respData = (Hashtable)resp.Value; - + Hashtable respData = XmlRpcCall("groups.getGroupNotice", param); - if (respData.Contains("error")) + if (!respData.Contains("error")) { - if ((string)respData["error"] != "Group Notice Not Found") - { - LogRespDataToConsoleError(respData); return null; } - } GroupNoticeInfo data = new GroupNoticeInfo(); data.GroupID = UUID.Parse((string)respData["GroupID"]); @@ -990,20 +731,78 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups param["BinaryBucket"] = binBucket; param["TimeStamp"] = ((uint)Util.UnixTimeSinceEpoch()).ToString(); + XmlRpcCall("groups.addGroupNotice", param); + } + + private Hashtable XmlRpcCall(string function, Hashtable param) + { IList parameters = new ArrayList(); parameters.Add(param); - XmlRpcRequest req = new XmlRpcRequest("groups.addGroupNotice", parameters); + + XmlRpcRequest req; + if (!m_disableKeepAlive) + { + req = new XmlRpcRequest(function, parameters); + } + else + { + // This seems to solve a major problem on some windows servers + req = new NoKeepAliveXmlRpcRequest(function, parameters); + } + XmlRpcResponse resp = req.Send(m_serviceURL, 10000); - Hashtable respData = (Hashtable)resp.Value; - List values = new List(); + if( resp.Value is Hashtable ) + { + Hashtable respData = (Hashtable)resp.Value; + if (respData.Contains("error") && !respData.Contains("succeed")) + { + LogRespDataToConsoleError(respData); + } - if (respData.Contains("error")) + return respData; + } + + m_log.ErrorFormat("[XmlRpcGroupData] The XmlRpc server returned a {1} instead of a hashtable for {0}", function, resp.Value.GetType().ToString()); + + if (resp.Value is ArrayList) { - LogRespDataToConsoleError(respData); + ArrayList al = (ArrayList)resp.Value; + m_log.ErrorFormat("[XmlRpcGroupData] Contains {0} elements", al.Count); + + foreach (object o in al) + { + m_log.ErrorFormat("[XmlRpcGroupData] {0} :: {1}", o.GetType().ToString(), o.ToString()); + } } + else + { + m_log.ErrorFormat("[XmlRpcGroupData] Function returned: {0}", resp.Value.ToString()); + } + + Hashtable error = new Hashtable(); + error.Add("error", "invalid return value"); + return error; + } + + private void LogRespDataToConsoleError(Hashtable respData) + { + m_log.Error("[GROUPDATA] Error:"); + + foreach (string key in respData.Keys) + { + m_log.ErrorFormat("[GROUPDATA] Key: {0}", key); + + object o = respData[key]; + + string[] lines = respData[key].ToString().Split(new char[] { '\n' }); + foreach (string line in lines) + { + m_log.ErrorFormat("[GROUPDATA] {0}", line); } + } + } } @@ -1015,3 +814,61 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups public byte[] BinaryBucket = new byte[0]; } } + +namespace Nwc.XmlRpc +{ + using System; + using System.Collections; + using System.IO; + using System.Xml; + using System.Net; + using System.Text; + using System.Reflection; + + /// Class supporting the request side of an XML-RPC transaction. + public class NoKeepAliveXmlRpcRequest : XmlRpcRequest + { + private Encoding _encoding = new ASCIIEncoding(); + private XmlRpcRequestSerializer _serializer = new XmlRpcRequestSerializer(); + private XmlRpcResponseDeserializer _deserializer = new XmlRpcResponseDeserializer(); + + /// Instantiate an XmlRpcRequest for a specified method and parameters. + /// String designating the object.method on the server the request + /// should be directed to. + /// ArrayList of XML-RPC type parameters to invoke the request with. + public NoKeepAliveXmlRpcRequest(String methodName, IList parameters) + { + MethodName = methodName; + _params = parameters; + } + + /// Send the request to the server. + /// String The url of the XML-RPC server. + /// XmlRpcResponse The response generated. + public XmlRpcResponse Send(String url) + { + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + if (request == null) + throw new XmlRpcException(XmlRpcErrorCodes.TRANSPORT_ERROR, + XmlRpcErrorCodes.TRANSPORT_ERROR_MSG + ": Could not create request with " + url); + request.Method = "POST"; + request.ContentType = "text/xml"; + request.AllowWriteStreamBuffering = true; + request.KeepAlive = false; + + Stream stream = request.GetRequestStream(); + XmlTextWriter xml = new XmlTextWriter(stream, _encoding); + _serializer.Serialize(xml, this); + xml.Flush(); + xml.Close(); + + HttpWebResponse response = (HttpWebResponse)request.GetResponse(); + StreamReader input = new StreamReader(response.GetResponseStream()); + + XmlRpcResponse resp = (XmlRpcResponse)_deserializer.Deserialize(input); + input.Close(); + response.Close(); + return resp; + } + } +} diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsMessaging.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsMessaging.cs index 10561a6..34af325 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsMessaging.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsMessaging.cs @@ -212,6 +212,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups // Incoming message from a group if ((msg.dialog == (byte)InstantMessageDialog.SessionSend) && (msg.fromGroup == true)) { + if (m_debugEnabled) m_log.InfoFormat("[GROUPS-MESSAGING] OnGridInstantMessage from group session {0} going to agent {1}", msg.fromAgentID, msg.toAgentID); + if (m_ActiveClients.ContainsKey(msg.toAgentID)) { UUID GroupID = new UUID(msg.fromAgentID); @@ -220,6 +222,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups GroupRecord GroupInfo = m_GroupsModule.GetGroupRecord(GroupID); if (GroupInfo != null) { + // TODO: Check to see if already a member of session, if so, do not send chatterbox, just forward message if (m_debugEnabled) m_log.InfoFormat("[GROUPS-MESSAGING] Sending chatterbox invite instant message"); diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsModule.cs index a6f9ea1..ec26dff 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsModule.cs @@ -53,14 +53,21 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups public class XmlRpcGroupsModule : INonSharedRegionModule, IGroupsModule { /// - /// To use this module, you must specify the following in your OpenSim.ini + /// ; To use this module, you must specify the following in your OpenSim.ini /// [GROUPS] /// Enabled = true /// Module = XmlRpcGroups + /// XmlRpcServiceURL = http://osflotsam.org/xmlrpc.php /// XmlRpcMessagingEnabled = true /// XmlRpcNoticesEnabled = true /// XmlRpcDebugEnabled = true /// + /// ; Disables HTTP Keep-Alive for Groups Module HTTP Requests, work around for + /// ; a problem discovered on some Windows based region servers. Only disable + /// ; if you see a large number (dozens) of the following Exceptions: + /// ; System.Net.WebException: The request was aborted: The request was canceled. + /// + /// XmlRpcDisableKeepAlive = false /// private static readonly ILog m_log = @@ -113,7 +120,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups } string ServiceURL = groupsConfig.GetString("XmlRpcServiceURL", m_defaultXmlRpcServiceURL); - m_groupData = new XmlRpcGroupDataProvider(ServiceURL); + bool DisableKeepAlive = groupsConfig.GetBoolean("XmlRpcDisableKeepAlive", false); + + m_groupData = new XmlRpcGroupDataProvider(ServiceURL, DisableKeepAlive); m_log.InfoFormat("[GROUPS]: XmlRpc Service URL set to: {0}", ServiceURL); m_GroupNoticesEnabled = groupsConfig.GetBoolean("XmlRpcNoticesEnabled", true); @@ -496,6 +505,24 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups // Trigger the above event handler OnInstantMessage(null, msg); + + + // If a message from a group arrives here, it may need to be forwarded to a local client + if (msg.fromGroup == true) + { + switch( msg.dialog ) + { + case (byte)InstantMessageDialog.GroupInvitation: + case (byte)InstantMessageDialog.GroupNotice: + UUID toAgentID = new UUID(msg.toAgentID); + if (m_ActiveClients.ContainsKey(toAgentID)) + { + m_ActiveClients[toAgentID].SendInstantMessage(msg); + } + break; + } + } + } -- cgit v1.1