From dc80c2afb338570f8f7d79491fd731bebaf643f4 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Tue, 4 Dec 2012 08:08:34 -0800 Subject: Improvement in HGInstantMessageService: account for the existence of an offline IM service. --- .../HypergridService/HGInstantMessageService.cs | 35 +++++-- OpenSim/Services/Interfaces/IOfflineIMService.cs | 115 +++++++++++++++++++++ 2 files changed, 140 insertions(+), 10 deletions(-) create mode 100644 OpenSim/Services/Interfaces/IOfflineIMService.cs diff --git a/OpenSim/Services/HypergridService/HGInstantMessageService.cs b/OpenSim/Services/HypergridService/HGInstantMessageService.cs index 0c9cfd3..e8d7cca 100644 --- a/OpenSim/Services/HypergridService/HGInstantMessageService.cs +++ b/OpenSim/Services/HypergridService/HGInstantMessageService.cs @@ -61,13 +61,13 @@ namespace OpenSim.Services.HypergridService protected static IGridService m_GridService; protected static IPresenceService m_PresenceService; protected static IUserAgentService m_UserAgentService; + protected static IOfflineIMService m_OfflineIMService; protected static IInstantMessageSimConnector m_IMSimConnector; protected static Dictionary m_UserLocationMap = new Dictionary(); private static ExpiringCache m_RegionCache; - private static string m_RestURL; private static bool m_ForwardOfflineGroupMessages; private static bool m_InGatekeeper; @@ -111,9 +111,14 @@ namespace OpenSim.Services.HypergridService return; } - m_RestURL = cnf.GetString("OfflineMessageURL", string.Empty); m_ForwardOfflineGroupMessages = cnf.GetBoolean("ForwardOfflineGroupMessages", false); + if (m_InGatekeeper) + { + string offlineIMService = cnf.GetString("OfflineIMService", string.Empty); + if (offlineIMService != string.Empty) + m_OfflineIMService = ServerUtils.LoadPlugin(offlineIMService, args); + } } } @@ -329,18 +334,28 @@ namespace OpenSim.Services.HypergridService private bool UndeliveredMessage(GridInstantMessage im) { - if (m_RestURL != string.Empty && (im.offline != 0) - && (!im.fromGroup || (im.fromGroup && m_ForwardOfflineGroupMessages))) - { -// m_log.DebugFormat("[HG IM SERVICE]: Message saved"); + if (m_OfflineIMService == null) + return false; - return SynchronousRestObjectRequester.MakeRequest( - "POST", m_RestURL + "/SaveMessage/", im); - } - else + if (im.dialog != (byte)InstantMessageDialog.MessageFromObject && + im.dialog != (byte)InstantMessageDialog.MessageFromAgent && + im.dialog != (byte)InstantMessageDialog.GroupNotice && + im.dialog != (byte)InstantMessageDialog.GroupInvitation && + im.dialog != (byte)InstantMessageDialog.InventoryOffered) { return false; } + + if (!m_ForwardOfflineGroupMessages) + { + if (im.dialog == (byte)InstantMessageDialog.GroupNotice || + im.dialog == (byte)InstantMessageDialog.GroupInvitation) + return false; + } + +// m_log.DebugFormat("[HG IM SERVICE]: Message saved"); + string reason = string.Empty; + return m_OfflineIMService.StoreMessage(im, out reason); } } } \ No newline at end of file diff --git a/OpenSim/Services/Interfaces/IOfflineIMService.cs b/OpenSim/Services/Interfaces/IOfflineIMService.cs new file mode 100644 index 0000000..2848967 --- /dev/null +++ b/OpenSim/Services/Interfaces/IOfflineIMService.cs @@ -0,0 +1,115 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +using System; +using System.Collections.Generic; + +using OpenSim.Framework; +using OpenMetaverse; + +namespace OpenSim.Services.Interfaces +{ + public interface IOfflineIMService + { + List GetMessages(UUID principalID); + bool StoreMessage(GridInstantMessage im, out string reason); + } + + public class OfflineIMDataUtils + { + public static GridInstantMessage GridInstantMessage(Dictionary dict) + { + GridInstantMessage im = new GridInstantMessage(); + + if (dict.ContainsKey("BinaryBucket") && dict["BinaryBucket"] != null) + im.binaryBucket = OpenMetaverse.Utils.HexStringToBytes(dict["BinaryBucket"].ToString(), true); + + if (dict.ContainsKey("Dialog") && dict["Dialog"] != null) + im.dialog = byte.Parse(dict["Dialog"].ToString()); + + if (dict.ContainsKey("FromAgentID") && dict["FromAgentID"] != null) + im.fromAgentID = new Guid(dict["FromAgentID"].ToString()); + + if (dict.ContainsKey("FromAgentName") && dict["FromAgentName"] != null) + im.fromAgentName = dict["FromAgentName"].ToString(); + else + im.fromAgentName = string.Empty; + + if (dict.ContainsKey("FromGroup") && dict["FromGroup"] != null) + im.fromGroup = bool.Parse(dict["FromGroup"].ToString()); + + if (dict.ContainsKey("SessionID") && dict["SessionID"] != null) + im.imSessionID = new Guid(dict["SessionID"].ToString()); + + if (dict.ContainsKey("Message") && dict["Message"] != null) + im.message = dict["Message"].ToString(); + else + im.message = string.Empty; + + if (dict.ContainsKey("Offline") && dict["Offline"] != null) + im.offline = byte.Parse(dict["Offline"].ToString()); + + if (dict.ContainsKey("EstateID") && dict["EstateID"] != null) + im.ParentEstateID = UInt32.Parse(dict["EstateID"].ToString()); + + if (dict.ContainsKey("Position") && dict["Position"] != null) + im.Position = Vector3.Parse(dict["Position"].ToString()); + + if (dict.ContainsKey("RegionID") && dict["RegionID"] != null) + im.RegionID = new Guid(dict["RegionID"].ToString()); + + if (dict.ContainsKey("Timestamp") && dict["Timestamp"] != null) + im.timestamp = UInt32.Parse(dict["Timestamp"].ToString()); + + if (dict.ContainsKey("ToAgentID") && dict["ToAgentID"] != null) + im.toAgentID = new Guid(dict["ToAgentID"].ToString()); + + return im; + } + + public static Dictionary GridInstantMessage(GridInstantMessage im) + { + Dictionary dict = new Dictionary(); + + dict["BinaryBucket"] = OpenMetaverse.Utils.BytesToHexString(im.binaryBucket, im.binaryBucket.Length, null); + dict["Dialog"] = im.dialog.ToString(); + dict["FromAgentID"] = im.fromAgentID.ToString(); + dict["FromAgentName"] = im.fromAgentName == null ? string.Empty : im.fromAgentName; + dict["FromGroup"] = im.fromGroup.ToString(); + dict["SessionID"] = im.imSessionID.ToString(); + dict["Message"] = im.message == null ? string.Empty : im.message; + dict["Offline"] = im.offline.ToString(); + dict["EstateID"] = im.ParentEstateID.ToString(); + dict["Position"] = im.Position.ToString(); + dict["RegionID"] = im.RegionID.ToString(); + dict["Timestamp"] = im.timestamp.ToString(); + dict["ToAgentID"] = im.toAgentID.ToString(); + + return dict; + } + + } +} -- cgit v1.1