public GridInstantMessage[] GetOfflineMessages(UUID PrincipalID)
        {
            OSDMap map = new OSDMap();

            map["PrincipalID"] = PrincipalID;
            map["Method"] = "getofflinemessages";

            List<GridInstantMessage> Messages = new List<GridInstantMessage>();
            try
            {
                List<string> urls =
                    m_registry.RequestModuleInterface<IConfigurationService>().FindValueOf(PrincipalID.ToString(),
                                                                                           "RemoteServerURI");
                foreach (string url in urls)
                {
                    OSDMap result = WebUtils.PostToService(url + "osd", map, true, false);
                    OSDArray array = (OSDArray) OSDParser.DeserializeJson(result["_RawResult"]);
                    foreach (OSD o in array)
                    {
                        GridInstantMessage message = new GridInstantMessage();
                        message.FromOSD((OSDMap) o);
                        Messages.Add(message);
                    }
                }
                return Messages.ToArray();
            }
            catch (Exception e)
            {
                MainConsole.Instance.DebugFormat("[AuroraRemoteOfflineMessagesConnector]: Exception when contacting server: {0}", e);
            }
            return Messages.ToArray();
        }
 public GridInstantMessage[] GetOfflineMessages(UUID PrincipalID)
 {
     List<GridInstantMessage> Messages = new List<GridInstantMessage>();
     Dictionary<string, OSDMap> Maps = new Dictionary<string, OSDMap>();
     foreach (string m_ServerURI in m_ServerURIs)
     {
         if (SimianUtils.GetGenericEntries(PrincipalID, "OfflineMessages", m_ServerURI, out Maps))
         {
             GridInstantMessage baseMessage = new GridInstantMessage();
             foreach (OSDMap map in Maps.Values)
             {
                 baseMessage.FromOSD(map);
                 Messages.Add(baseMessage);
             }
         }
     }
     return Messages.ToArray();
 }
 protected OSDMap OnMessageReceived(OSDMap message)
 {
     if (!message.ContainsKey("Method"))
         return null;
     if (message["Method"] == "FriendGrantRights")
     {
         UUID Requester = message["Requester"].AsUUID();
         UUID Target = message["Target"].AsUUID();
         int MyFlags = message["MyFlags"].AsInteger();
         int Rights = message["Rights"].AsInteger();
         LocalGrantRights(Requester, Target, MyFlags, Rights);
     }
     else if (message["Method"] == "FriendTerminated")
     {
         UUID Requester = message["Requester"].AsUUID();
         UUID ExFriend = message["ExFriend"].AsUUID();
         LocalFriendshipTerminated(ExFriend, Requester);
     }
     else if (message["Method"] == "FriendshipOffered")
     {
         //UUID Requester = message["Requester"].AsUUID();
         UUID Friend = message["Friend"].AsUUID();
         GridInstantMessage im = new GridInstantMessage();
         im.FromOSD((OSDMap) message["Message"]);
         LocalFriendshipOffered(Friend, im);
     }
     else if (message["Method"] == "FriendshipDenied")
     {
         UUID Requester = message["Requester"].AsUUID();
         string ClientName = message["ClientName"].AsString();
         UUID FriendID = message["FriendID"].AsUUID();
         LocalFriendshipDenied(Requester, ClientName, FriendID);
     }
     else if (message["Method"] == "FriendshipApproved")
     {
         UUID Requester = message["Requester"].AsUUID();
         string ClientName = message["ClientName"].AsString();
         UUID FriendID = message["FriendID"].AsUUID();
         LocalFriendshipApproved(Requester, ClientName, null, FriendID);
     }
     return null;
 }
        /// <summary>
        ///   Process a XMLRPC Grid Instant Message
        /// </summary>
        /// <param name = "request">XMLRPC parameters
        /// </param>
        /// <param name="remoteClient"> </param>
        /// <returns>Nothing much</returns>
        protected virtual XmlRpcResponse processXMLRPCGridInstantMessage(XmlRpcRequest request, IPEndPoint remoteClient)
        {
            bool successful = false;
            GridInstantMessage gim = new GridInstantMessage();
            Hashtable requestData = (Hashtable) request.Params[0];

            if (requestData.ContainsKey("message"))
            {
                try
                {
                    //Deserialize it
                    gim.FromOSD((OSDMap) OSDParser.DeserializeJson(requestData["message"].ToString()));
                }
                catch
                {
                    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 = 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;
                    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)
                        {
                        }

                        try
                        {
                            pos_x = (uint) Convert.ToInt32((string) requestData["position_x"]);
                        }
                        catch (ArgumentException)
                        {
                        }
                        catch (FormatException)
                        {
                        }
                        catch (OverflowException)
                        {
                        }
                        try
                        {
                            pos_y = (uint) Convert.ToInt32((string) requestData["position_y"]);
                        }
                        catch (ArgumentException)
                        {
                        }
                        catch (FormatException)
                        {
                        }
                        catch (OverflowException)
                        {
                        }
                        try
                        {
                            pos_z = (uint) Convert.ToInt32((string) requestData["position_z"]);
                        }
                        catch (ArgumentException)
                        {
                        }
                        catch (FormatException)
                        {
                        }
                        catch (OverflowException)
                        {
                        }

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

                        string requestData3 = (string) requestData["binary_bucket"];
                        binaryBucket = string.IsNullOrEmpty(requestData3) ? new byte[0] : Convert.FromBase64String(requestData3);

                        // Create a New GridInstantMessageObject the the data
                        gim.fromAgentID = fromAgentID;
                        gim.fromAgentName = fromAgentName;
                        gim.fromGroup = fromGroup;
                        gim.imSessionID = imSessionID;
                        gim.RegionID = UUID.Zero; // RegionID.Guid;
                        gim.timestamp = timestamp;
                        gim.toAgentID = toAgentID;
                        gim.message = message;
                        gim.dialog = dialog;
                        gim.offline = 0;
                        gim.ParentEstateID = ParentEstateID;
                        gim.Position = Position;
                        gim.binaryBucket = binaryBucket;
                    }
                }

                if (gim.dialog == (byte) InstantMessageDialog.GodLikeRequestTeleport)
                    gim.dialog = (byte) InstantMessageDialog.RequestTeleport;

                // Trigger the Instant message in the scene.
                foreach (IScene scene in m_Scenes)
                {
                    IScenePresence user;
                    if (scene.TryGetScenePresence(gim.toAgentID, out user))
                    {
                        if (!user.IsChildAgent)
                        {
                            scene.EventManager.TriggerIncomingInstantMessage(gim);
                            successful = true;
                        }
                    }
                }
                if (!successful)
                {
                    // If the message can't be delivered to an agent, it
                    // is likely to be a group IM. On a group IM, the
                    // imSessionID = toAgentID = group id. Raise the
                    // unhandled IM event to give the groups module
                    // a chance to pick it up. We raise that in a random
                    // scene, since the groups module is shared.
                    //
                    m_Scenes[0].EventManager.TriggerUnhandledInstantMessage(gim);
                }
            }

            //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;
        }
        public byte[] AddOfflineMessage(OSDMap request)
        {
            GridInstantMessage message = new GridInstantMessage();
            message.FromOSD(request);
            OSDMap map = new OSDMap();
            map["Result"] = OfflineMessagesConnector.AddOfflineMessage(message);

            string xmlString = OSDParser.SerializeJsonString(map);
            UTF8Encoding encoding = new UTF8Encoding();
            return encoding.GetBytes(xmlString);
        }