clockwerk-opensim – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 vero 1 /*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27 using System;
28 using System.Collections.Generic;
29 using System.IO;
30 using System.Reflection;
31 using System.Threading;
32  
33 using OpenSim.Framework;
34 using OpenSim.Framework.Console;
35 using OpenSim.Framework.Monitoring;
36 using OpenSim.Region.ClientStack.LindenUDP;
37 using OpenSim.Region.Framework;
38 using OpenSim.Region.Framework.Interfaces;
39 using OpenSim.Region.Framework.Scenes;
40 using OpenSim.Services.Interfaces;
41 using OpenSim.Services.Connectors.Hypergrid;
42  
43 using OpenMetaverse;
44 using OpenMetaverse.Packets;
45 using log4net;
46 using Nini.Config;
47 using Mono.Addins;
48  
49 using DirFindFlags = OpenMetaverse.DirectoryManager.DirFindFlags;
50  
51 namespace OpenSim.Region.CoreModules.Framework.Search
52 {
53 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "BasicSearchModule")]
54 public class BasicSearchModule : ISharedRegionModule
55 {
56 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
57  
58 protected bool m_Enabled;
59 protected List<Scene> m_Scenes = new List<Scene>();
60  
61 private IGroupsModule m_GroupsService = null;
62  
63 #region ISharedRegionModule
64  
65 public void Initialise(IConfigSource config)
66 {
67 string umanmod = config.Configs["Modules"].GetString("SearchModule", Name);
68 if (umanmod == Name)
69 {
70 m_Enabled = true;
71 m_log.DebugFormat("[BASIC SEARCH MODULE]: {0} is enabled", Name);
72 }
73 }
74  
75 public bool IsSharedModule
76 {
77 get { return true; }
78 }
79  
80 public virtual string Name
81 {
82 get { return "BasicSearchModule"; }
83 }
84  
85 public Type ReplaceableInterface
86 {
87 get { return null; }
88 }
89  
90 public void AddRegion(Scene scene)
91 {
92 if (m_Enabled)
93 {
94 m_Scenes.Add(scene);
95  
96 scene.EventManager.OnMakeRootAgent += new Action<ScenePresence>(EventManager_OnMakeRootAgent);
97 scene.EventManager.OnMakeChildAgent += new EventManager.OnMakeChildAgentDelegate(EventManager_OnMakeChildAgent);
98 }
99 }
100  
101 public void RemoveRegion(Scene scene)
102 {
103 if (m_Enabled)
104 {
105 m_Scenes.Remove(scene);
106  
107 scene.EventManager.OnMakeRootAgent -= new Action<ScenePresence>(EventManager_OnMakeRootAgent);
108 scene.EventManager.OnMakeChildAgent -= new EventManager.OnMakeChildAgentDelegate(EventManager_OnMakeChildAgent);
109 }
110 }
111  
112 public void RegionLoaded(Scene s)
113 {
114 if (!m_Enabled)
115 return;
116  
117 if (m_GroupsService == null)
118 {
119 m_GroupsService = s.RequestModuleInterface<IGroupsModule>();
120  
121 // No Groups Service Connector, then group search won't work...
122 if (m_GroupsService == null)
123 m_log.Warn("[BASIC SEARCH MODULE]: Could not get IGroupsModule");
124 }
125 }
126  
127 public void PostInitialise()
128 {
129 }
130  
131 public void Close()
132 {
133 m_Scenes.Clear();
134 }
135  
136 #endregion ISharedRegionModule
137  
138  
139 #region Event Handlers
140  
141 void EventManager_OnMakeRootAgent(ScenePresence sp)
142 {
143 sp.ControllingClient.OnDirFindQuery += OnDirFindQuery;
144 }
145  
146 void EventManager_OnMakeChildAgent(ScenePresence sp)
147 {
148 sp.ControllingClient.OnDirFindQuery -= OnDirFindQuery;
149 }
150  
151 void OnDirFindQuery(IClientAPI remoteClient, UUID queryID, string queryText, uint queryFlags, int queryStart)
152 {
153 queryText = queryText.Trim();
154  
155 if (((DirFindFlags)queryFlags & DirFindFlags.People) == DirFindFlags.People)
156 {
157 if (string.IsNullOrEmpty(queryText))
158 remoteClient.SendDirPeopleReply(queryID, new DirPeopleReplyData[0]);
159  
160 List<UserAccount> accounts = m_Scenes[0].UserAccountService.GetUserAccounts(m_Scenes[0].RegionInfo.ScopeID, queryText);
161 DirPeopleReplyData[] hits = new DirPeopleReplyData[accounts.Count];
162 int i = 0;
163 foreach (UserAccount acc in accounts)
164 {
165 DirPeopleReplyData d = new DirPeopleReplyData();
166 d.agentID = acc.PrincipalID;
167 d.firstName = acc.FirstName;
168 d.lastName = acc.LastName;
169 d.online = false;
170  
171 hits[i++] = d;
172 }
173  
174 // TODO: This currently ignores pretty much all the query flags including Mature and sort order
175 remoteClient.SendDirPeopleReply(queryID, hits);
176 }
177 else if (((DirFindFlags)queryFlags & DirFindFlags.Groups) == DirFindFlags.Groups)
178 {
179 if (m_GroupsService == null)
180 {
181 m_log.Warn("[BASIC SEARCH MODULE]: Groups service is not available. Unable to search groups.");
182 remoteClient.SendAlertMessage("Groups search is not enabled");
183 return;
184 }
185  
186 if (string.IsNullOrEmpty(queryText))
187 remoteClient.SendDirGroupsReply(queryID, new DirGroupsReplyData[0]);
188  
189 // TODO: This currently ignores pretty much all the query flags including Mature and sort order
190 remoteClient.SendDirGroupsReply(queryID, m_GroupsService.FindGroups(remoteClient, queryText).ToArray());
191 }
192  
193 }
194  
195 #endregion Event Handlers
196  
197 }
198  
199 }