Aurora.Addon.HyperGrid.InstantMessageServerConnector.ProcessInstantMessage C# (CSharp) Method

ProcessInstantMessage() protected method

protected ProcessInstantMessage ( Nwc.XmlRpc.XmlRpcRequest request, IPEndPoint remoteClient ) : Nwc.XmlRpc.XmlRpcResponse
request Nwc.XmlRpc.XmlRpcRequest
remoteClient System.Net.IPEndPoint
return Nwc.XmlRpc.XmlRpcResponse
        protected virtual XmlRpcResponse ProcessInstantMessage(XmlRpcRequest request, IPEndPoint remoteClient)
        {
            bool successful = false;

            try
            {
                // various rational defaults
                UUID fromAgentID = UUID.Zero;
                UUID toAgentID = UUID.Zero;
                UUID imSessionID = UUID.Zero;
                uint timestamp = 0;
                string fromAgentName = "";
                string message = "";
                byte dialog = (byte)0;
                bool fromGroup = false;
                byte offline = (byte)0;
                uint ParentEstateID = 0;
                Vector3 Position = Vector3.Zero;
                UUID RegionID = UUID.Zero;
                byte[] binaryBucket = new byte[0];

                float pos_x = 0;
                float pos_y = 0;
                float pos_z = 0;
                //MainConsole.Instance.Info("Processing IM");

                Hashtable requestData = (Hashtable)request.Params[0];
                // Check if it's got all the data
                if (requestData.ContainsKey ("from_agent_id")
                        && requestData.ContainsKey ("to_agent_id") && requestData.ContainsKey ("im_session_id")
                        && requestData.ContainsKey ("timestamp") && requestData.ContainsKey ("from_agent_name")
                        && requestData.ContainsKey ("message") && requestData.ContainsKey ("dialog")
                        && requestData.ContainsKey ("from_group")
                        && requestData.ContainsKey ("offline") && requestData.ContainsKey ("parent_estate_id")
                        && requestData.ContainsKey ("position_x") && requestData.ContainsKey ("position_y")
                        && requestData.ContainsKey ("position_z") && requestData.ContainsKey ("region_id")
                        && requestData.ContainsKey ("binary_bucket"))
                {
                    // Do the easy way of validating the UUIDs
                    UUID.TryParse ((string)requestData["from_agent_id"], out fromAgentID);
                    UUID.TryParse ((string)requestData["to_agent_id"], out toAgentID);
                    UUID.TryParse ((string)requestData["im_session_id"], out imSessionID);
                    UUID.TryParse ((string)requestData["region_id"], out RegionID);
                    try
                    {
                        timestamp = (uint)Convert.ToInt32 ((string)requestData["timestamp"]);
                    }
                    catch (ArgumentException)
                    {
                    }
                    catch (FormatException)
                    {
                    }
                    catch (OverflowException)
                    {
                    }

                    fromAgentName = (string)requestData["from_agent_name"];
                    message = (string)requestData["message"];
                    if (message == null)
                        message = string.Empty;

                    // Bytes don't transfer well over XMLRPC, so, we Base64 Encode them.
                    string requestData1 = (string)requestData["dialog"];
                    if (string.IsNullOrEmpty (requestData1))
                    {
                        dialog = 0;
                    }
                    else
                    {
                        byte[] dialogdata = Convert.FromBase64String (requestData1);
                        dialog = dialogdata[0];
                    }

                    if ((string)requestData["from_group"] == "TRUE")
                        fromGroup = true;

                    string requestData2 = (string)requestData["offline"];
                    if (String.IsNullOrEmpty (requestData2))
                    {
                        offline = 0;
                    }
                    else
                    {
                        byte[] offlinedata = Convert.FromBase64String (requestData2);
                        offline = offlinedata[0];
                    }

                    try
                    {
                        ParentEstateID = (uint)Convert.ToInt32 ((string)requestData["parent_estate_id"]);
                    }
                    catch (ArgumentException)
                    {
                    }
                    catch (FormatException)
                    {
                    }
                    catch (OverflowException)
                    {
                    }

                    float.TryParse ((string)requestData["position_x"], out pos_x);
                    float.TryParse ((string)requestData["position_y"], out pos_y);
                    float.TryParse ((string)requestData["position_z"], out pos_z);

                    Position = new Vector3 (pos_x, pos_y, pos_z);

                    string requestData3 = (string)requestData["binary_bucket"];
                    if (string.IsNullOrEmpty (requestData3))
                    {
                        binaryBucket = new byte[0];
                    }
                    else
                    {
                        binaryBucket = Convert.FromBase64String (requestData3);
                    }

                    // Create a New GridInstantMessageObject the the data
                    GridInstantMessage gim = new GridInstantMessage ();
                    gim.fromAgentID = fromAgentID;
                    gim.fromAgentName = fromAgentName;
                    gim.fromGroup = fromGroup;
                    gim.imSessionID = imSessionID;
                    gim.RegionID = RegionID;
                    gim.timestamp = timestamp;
                    gim.toAgentID = toAgentID;
                    gim.message = message;
                    gim.dialog = dialog;
                    gim.offline = offline;
                    gim.ParentEstateID = ParentEstateID;
                    gim.Position = Position;
                    gim.binaryBucket = binaryBucket;

                    successful = SendIM (gim);
                }
            }
            catch (Exception e)
            {
                MainConsole.Instance.Error ("[INSTANT MESSAGE]: Caught unexpected exception:", e);
                successful = false;
            }

            //Send response back to region calling if it was successful
            // calling region uses this to know when to look up a user's location again.
            XmlRpcResponse resp = new XmlRpcResponse ();
            Hashtable respdata = new Hashtable ();
            if (successful)
                respdata["success"] = "TRUE";
            else
                respdata["success"] = "FALSE";
            resp.Value = respdata;

            return resp;
        }