aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Services
diff options
context:
space:
mode:
authorDan Lake2012-02-01 16:25:35 -0800
committerDan Lake2012-02-01 16:25:35 -0800
commitc10193c72b1f029a958f04d2f5d7ee384e693aaa (patch)
tree052ec7e973c15b158310511197affad14eb9c64f /OpenSim/Services
parentTrigger event when prims are scheduled for an update. This gives modules earl... (diff)
parentSmall optimization to last commit (diff)
downloadopensim-SC-c10193c72b1f029a958f04d2f5d7ee384e693aaa.zip
opensim-SC-c10193c72b1f029a958f04d2f5d7ee384e693aaa.tar.gz
opensim-SC-c10193c72b1f029a958f04d2f5d7ee384e693aaa.tar.bz2
opensim-SC-c10193c72b1f029a958f04d2f5d7ee384e693aaa.tar.xz
Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
Diffstat (limited to 'OpenSim/Services')
-rw-r--r--OpenSim/Services/AssetService/AssetService.cs124
-rw-r--r--OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs45
-rw-r--r--OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs60
-rw-r--r--OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs2
-rw-r--r--OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs4
-rw-r--r--OpenSim/Services/HypergridService/HGAssetService.cs11
-rw-r--r--OpenSim/Services/HypergridService/HGInventoryService.cs20
-rw-r--r--OpenSim/Services/Interfaces/IGridService.cs9
-rw-r--r--OpenSim/Services/Interfaces/IGridUserService.cs3
-rw-r--r--OpenSim/Services/UserAccountService/GridUserService.cs12
10 files changed, 110 insertions, 180 deletions
diff --git a/OpenSim/Services/AssetService/AssetService.cs b/OpenSim/Services/AssetService/AssetService.cs
index b3af8e3..4f4cbf6 100644
--- a/OpenSim/Services/AssetService/AssetService.cs
+++ b/OpenSim/Services/AssetService/AssetService.cs
@@ -32,7 +32,6 @@ using System.Reflection;
32using Nini.Config; 32using Nini.Config;
33using log4net; 33using log4net;
34using OpenSim.Framework; 34using OpenSim.Framework;
35using OpenSim.Framework.Console;
36using OpenSim.Data; 35using OpenSim.Data;
37using OpenSim.Services.Interfaces; 36using OpenSim.Services.Interfaces;
38using OpenMetaverse; 37using OpenMetaverse;
@@ -53,23 +52,6 @@ namespace OpenSim.Services.AssetService
53 { 52 {
54 m_RootInstance = this; 53 m_RootInstance = this;
55 54
56 MainConsole.Instance.Commands.AddCommand("kfs", false,
57 "show digest",
58 "show digest <ID>",
59 "Show asset digest", HandleShowDigest);
60
61 MainConsole.Instance.Commands.AddCommand("kfs", false,
62 "delete asset",
63 "delete asset <ID>",
64 "Delete asset from database", HandleDeleteAsset);
65
66 MainConsole.Instance.Commands.AddCommand("kfs", false,
67 "dump asset",
68 "dump asset <ID>",
69 "Dump asset to a file",
70 "The filename is the same as the ID given.",
71 HandleDumpAsset);
72
73 if (m_AssetLoader != null) 55 if (m_AssetLoader != null)
74 { 56 {
75 IConfig assetConfig = config.Configs["AssetService"]; 57 IConfig assetConfig = config.Configs["AssetService"];
@@ -218,111 +200,11 @@ namespace OpenSim.Services.AssetService
218 return m_Database.Delete(id); 200 return m_Database.Delete(id);
219 } 201 }
220 else 202 else
221 m_log.DebugFormat("[ASSET SERVICE]: Request to delete asset {0}, but flags are not Maptile", id);
222
223 return false;
224 }
225
226 void HandleDumpAsset(string module, string[] args)
227 {
228 if (args.Length < 3)
229 {
230 MainConsole.Instance.Output("Usage is dump asset <ID>");
231 return;
232 }
233
234 string rawAssetId = args[2];
235 UUID assetId;
236
237 if (!UUID.TryParse(rawAssetId, out assetId))
238 {
239 MainConsole.Instance.OutputFormat("ERROR: {0} is not a valid ID format", rawAssetId);
240 return;
241 }
242
243 AssetBase asset = m_Database.GetAsset(assetId);
244 if (asset == null)
245 {
246 MainConsole.Instance.OutputFormat("ERROR: No asset found with ID {0}", assetId);
247 return;
248 }
249
250 string fileName = rawAssetId;
251
252 using (FileStream fs = new FileStream(fileName, FileMode.CreateNew))
253 {
254 using (BinaryWriter bw = new BinaryWriter(fs))
255 {
256 bw.Write(asset.Data);
257 }
258 }
259
260 MainConsole.Instance.OutputFormat("Asset dumped to file {0}", fileName);
261 }
262
263 void HandleShowDigest(string module, string[] args)
264 {
265 if (args.Length < 3)
266 {
267 MainConsole.Instance.Output("Syntax: show digest <ID>");
268 return;
269 }
270
271 AssetBase asset = Get(args[2]);
272
273 if (asset == null || asset.Data.Length == 0)
274 {
275 MainConsole.Instance.Output("Asset not found");
276 return;
277 }
278
279 int i;
280
281 MainConsole.Instance.OutputFormat("Name: {0}", asset.Name);
282 MainConsole.Instance.OutputFormat("Description: {0}", asset.Description);
283 MainConsole.Instance.OutputFormat("Type: {0} (type number = {1})", (AssetType)asset.Type, asset.Type);
284 MainConsole.Instance.OutputFormat("Content-type: {0}", asset.Metadata.ContentType);
285 MainConsole.Instance.OutputFormat("Flags: {0}", asset.Metadata.Flags);
286
287 for (i = 0 ; i < 5 ; i++)
288 { 203 {
289 int off = i * 16; 204 m_log.DebugFormat("[ASSET SERVICE]: Request to delete asset {0}, but flags are not Maptile", id);
290 if (asset.Data.Length <= off)
291 break;
292 int len = 16;
293 if (asset.Data.Length < off + len)
294 len = asset.Data.Length - off;
295
296 byte[] line = new byte[len];
297 Array.Copy(asset.Data, off, line, 0, len);
298
299 string text = BitConverter.ToString(line);
300 MainConsole.Instance.Output(String.Format("{0:x4}: {1}", off, text));
301 }
302 }
303
304 void HandleDeleteAsset(string module, string[] args)
305 {
306 if (args.Length < 3)
307 {
308 MainConsole.Instance.Output("Syntax: delete asset <ID>");
309 return;
310 }
311
312 AssetBase asset = Get(args[2]);
313
314 if (asset == null || asset.Data.Length == 0)
315 {
316 MainConsole.Instance.Output("Asset not found");
317 return;
318 } 205 }
319 206
320 Delete(args[2]); 207 return false;
321
322 //MainConsole.Instance.Output("Asset deleted");
323 // TODO: Implement this
324
325 MainConsole.Instance.Output("Asset deletion not supported by database");
326 } 208 }
327 } 209 }
328} 210} \ No newline at end of file
diff --git a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs b/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs
index d7b2ff8..e4c3eaf 100644
--- a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs
@@ -86,11 +86,8 @@ namespace OpenSim.Services.Connectors
86 m_log.Error("[ASSET CONNECTOR]: No Server URI named in section AssetService"); 86 m_log.Error("[ASSET CONNECTOR]: No Server URI named in section AssetService");
87 throw new Exception("Asset connector init error"); 87 throw new Exception("Asset connector init error");
88 } 88 }
89 m_ServerURI = serviceURI;
90 89
91 MainConsole.Instance.Commands.AddCommand("asset", false, "dump asset", 90 m_ServerURI = serviceURI;
92 "dump asset <id> <file>",
93 "dump one cached asset", HandleDumpAsset);
94 } 91 }
95 92
96 protected void SetCache(IImprovedAssetCache cache) 93 protected void SetCache(IImprovedAssetCache cache)
@@ -328,43 +325,5 @@ namespace OpenSim.Services.Connectors
328 } 325 }
329 return false; 326 return false;
330 } 327 }
331
332 private void HandleDumpAsset(string module, string[] args)
333 {
334 if (args.Length != 4)
335 {
336 MainConsole.Instance.Output("Syntax: dump asset <id> <file>");
337 return;
338 }
339
340 UUID assetID;
341
342 if (!UUID.TryParse(args[2], out assetID))
343 {
344 MainConsole.Instance.Output("Invalid asset ID");
345 return;
346 }
347
348 if (m_Cache == null)
349 {
350 MainConsole.Instance.Output("Instance uses no cache");
351 return;
352 }
353
354 AssetBase asset = m_Cache.Get(assetID.ToString());
355
356 if (asset == null)
357 {
358 MainConsole.Instance.Output("Asset not found in cache");
359 return;
360 }
361
362 string fileName = args[3];
363
364 FileStream fs = File.Create(fileName);
365 fs.Write(asset.Data, 0, asset.Data.Length);
366
367 fs.Close();
368 }
369 } 328 }
370} 329} \ No newline at end of file
diff --git a/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs b/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs
index 738cc06..aa98b5d 100644
--- a/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs
+++ b/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs
@@ -223,5 +223,65 @@ namespace OpenSim.Services.Connectors
223 223
224 } 224 }
225 225
226 public GridUserInfo[] GetGridUserInfo(string[] userIDs)
227 {
228 Dictionary<string, object> sendData = new Dictionary<string, object>();
229 //sendData["SCOPEID"] = scopeID.ToString();
230 sendData["VERSIONMIN"] = ProtocolVersions.ClientProtocolVersionMin.ToString();
231 sendData["VERSIONMAX"] = ProtocolVersions.ClientProtocolVersionMax.ToString();
232 sendData["METHOD"] = "getgriduserinfos";
233
234 sendData["AgentIDs"] = new List<string>(userIDs);
235
236 string reply = string.Empty;
237 string reqString = ServerUtils.BuildQueryString(sendData);
238 //m_log.DebugFormat("[PRESENCE CONNECTOR]: queryString = {0}", reqString);
239 try
240 {
241 reply = SynchronousRestFormsRequester.MakeRequest("POST",
242 m_ServerURI + "/griduser",
243 reqString);
244 if (reply == null || (reply != null && reply == string.Empty))
245 {
246 m_log.DebugFormat("[GRID USER CONNECTOR]: GetGridUserInfo received null or empty reply");
247 return null;
248 }
249 }
250 catch (Exception e)
251 {
252 m_log.DebugFormat("[GRID USER CONNECTOR]: Exception when contacting grid user server: {0}", e.Message);
253 }
254
255 List<GridUserInfo> rinfos = new List<GridUserInfo>();
256
257 Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
258
259 if (replyData != null)
260 {
261 if (replyData.ContainsKey("result") &&
262 (replyData["result"].ToString() == "null" || replyData["result"].ToString() == "Failure"))
263 {
264 return new GridUserInfo[0];
265 }
266
267 Dictionary<string, object>.ValueCollection pinfosList = replyData.Values;
268 //m_log.DebugFormat("[PRESENCE CONNECTOR]: GetAgents returned {0} elements", pinfosList.Count);
269 foreach (object griduser in pinfosList)
270 {
271 if (griduser is Dictionary<string, object>)
272 {
273 GridUserInfo pinfo = new GridUserInfo((Dictionary<string, object>)griduser);
274 rinfos.Add(pinfo);
275 }
276 else
277 m_log.DebugFormat("[GRID USER CONNECTOR]: GetGridUserInfo received invalid response type {0}",
278 griduser.GetType());
279 }
280 }
281 else
282 m_log.DebugFormat("[GRID USER CONNECTOR]: GetGridUserInfo received null response");
283
284 return rinfos.ToArray();
285 }
226 } 286 }
227} 287}
diff --git a/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs
index c030bca..5c50936 100644
--- a/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs
@@ -66,7 +66,7 @@ namespace OpenSim.Services.Connectors
66 m_ServerURI = m_ServerURI.TrimEnd('/') + "/helo/"; 66 m_ServerURI = m_ServerURI.TrimEnd('/') + "/helo/";
67 } 67 }
68 } 68 }
69 catch (UriFormatException e) 69 catch (UriFormatException)
70 { 70 {
71 m_log.WarnFormat("[HELO SERVICE]: Malformed URL {0}", serverURI); 71 m_log.WarnFormat("[HELO SERVICE]: Malformed URL {0}", serverURI);
72 } 72 }
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs
index 678f738..ca1b64f 100644
--- a/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs
+++ b/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs
@@ -472,6 +472,10 @@ namespace OpenSim.Services.Connectors.SimianGrid
472 return false; 472 return false;
473 } 473 }
474 474
475 public GridUserInfo[] GetGridUserInfo(string[] userIDs)
476 {
477 return new GridUserInfo[0];
478 }
475 #endregion Helpers 479 #endregion Helpers
476 } 480 }
477} 481}
diff --git a/OpenSim/Services/HypergridService/HGAssetService.cs b/OpenSim/Services/HypergridService/HGAssetService.cs
index e518329..22e233a 100644
--- a/OpenSim/Services/HypergridService/HGAssetService.cs
+++ b/OpenSim/Services/HypergridService/HGAssetService.cs
@@ -53,7 +53,7 @@ namespace OpenSim.Services.HypergridService
53 LogManager.GetLogger( 53 LogManager.GetLogger(
54 MethodBase.GetCurrentMethod().DeclaringType); 54 MethodBase.GetCurrentMethod().DeclaringType);
55 55
56 private string m_ProfileServiceURL; 56 private string m_HomeURL;
57 private IUserAccountService m_UserAccountService; 57 private IUserAccountService m_UserAccountService;
58 58
59 private UserAccountCache m_Cache; 59 private UserAccountCache m_Cache;
@@ -74,7 +74,10 @@ namespace OpenSim.Services.HypergridService
74 if (m_UserAccountService == null) 74 if (m_UserAccountService == null)
75 throw new Exception(String.Format("Unable to create UserAccountService from {0}", userAccountsDll)); 75 throw new Exception(String.Format("Unable to create UserAccountService from {0}", userAccountsDll));
76 76
77 m_ProfileServiceURL = assetConfig.GetString("ProfileServerURI", string.Empty); 77 // legacy configuration [obsolete]
78 m_HomeURL = assetConfig.GetString("ProfileServerURI", string.Empty);
79 // Preferred
80 m_HomeURL = assetConfig.GetString("HomeURI", m_HomeURL);
78 81
79 m_Cache = UserAccountCache.CreateUserAccountCache(m_UserAccountService); 82 m_Cache = UserAccountCache.CreateUserAccountCache(m_UserAccountService);
80 } 83 }
@@ -134,13 +137,13 @@ namespace OpenSim.Services.HypergridService
134 137
135 UserAccount creator = m_Cache.GetUser(meta.CreatorID); 138 UserAccount creator = m_Cache.GetUser(meta.CreatorID);
136 if (creator != null) 139 if (creator != null)
137 meta.CreatorID = m_ProfileServiceURL + "/" + meta.CreatorID + ";" + creator.FirstName + " " + creator.LastName; 140 meta.CreatorID = meta.CreatorID + ";" + m_HomeURL + "/" + creator.FirstName + " " + creator.LastName;
138 } 141 }
139 142
140 protected byte[] AdjustIdentifiers(byte[] data) 143 protected byte[] AdjustIdentifiers(byte[] data)
141 { 144 {
142 string xml = Utils.BytesToString(data); 145 string xml = Utils.BytesToString(data);
143 return Utils.StringToBytes(ExternalRepresentationUtils.RewriteSOP(xml, m_ProfileServiceURL, m_Cache, UUID.Zero)); 146 return Utils.StringToBytes(ExternalRepresentationUtils.RewriteSOP(xml, m_HomeURL, m_Cache, UUID.Zero));
144 } 147 }
145 148
146 } 149 }
diff --git a/OpenSim/Services/HypergridService/HGInventoryService.cs b/OpenSim/Services/HypergridService/HGInventoryService.cs
index 4eb61ba..41d5a7a 100644
--- a/OpenSim/Services/HypergridService/HGInventoryService.cs
+++ b/OpenSim/Services/HypergridService/HGInventoryService.cs
@@ -55,7 +55,7 @@ namespace OpenSim.Services.HypergridService
55 55
56 protected new IXInventoryData m_Database; 56 protected new IXInventoryData m_Database;
57 57
58 private string m_ProfileServiceURL; 58 private string m_HomeURL;
59 private IUserAccountService m_UserAccountService; 59 private IUserAccountService m_UserAccountService;
60 60
61 private UserAccountCache m_Cache; 61 private UserAccountCache m_Cache;
@@ -100,7 +100,10 @@ namespace OpenSim.Services.HypergridService
100 if (m_UserAccountService == null) 100 if (m_UserAccountService == null)
101 throw new Exception(String.Format("Unable to create UserAccountService from {0}", userAccountsDll)); 101 throw new Exception(String.Format("Unable to create UserAccountService from {0}", userAccountsDll));
102 102
103 m_ProfileServiceURL = invConfig.GetString("ProfileServerURI", string.Empty); 103 // legacy configuration [obsolete]
104 m_HomeURL = invConfig.GetString("ProfileServerURI", string.Empty);
105 // Preferred
106 m_HomeURL = invConfig.GetString("HomeURI", m_HomeURL);
104 107
105 m_Cache = UserAccountCache.CreateUserAccountCache(m_UserAccountService); 108 m_Cache = UserAccountCache.CreateUserAccountCache(m_UserAccountService);
106 } 109 }
@@ -316,13 +319,14 @@ namespace OpenSim.Services.HypergridService
316 public override InventoryItemBase GetItem(InventoryItemBase item) 319 public override InventoryItemBase GetItem(InventoryItemBase item)
317 { 320 {
318 InventoryItemBase it = base.GetItem(item); 321 InventoryItemBase it = base.GetItem(item);
322 if (it != null)
323 {
324 UserAccount user = m_Cache.GetUser(it.CreatorId);
319 325
320 UserAccount user = m_Cache.GetUser(it.CreatorId); 326 // Adjust the creator data
321 327 if (user != null && it != null && (it.CreatorData == null || it.CreatorData == string.Empty))
322 // Adjust the creator data 328 it.CreatorData = m_HomeURL + ";" + user.FirstName + " " + user.LastName;
323 if (user != null && it != null && (it.CreatorData == null || it.CreatorData == string.Empty)) 329 }
324 it.CreatorData = m_ProfileServiceURL + "/" + it.CreatorId + ";" + user.FirstName + " " + user.LastName;
325
326 return it; 330 return it;
327 } 331 }
328 332
diff --git a/OpenSim/Services/Interfaces/IGridService.cs b/OpenSim/Services/Interfaces/IGridService.cs
index 7137f9a..d809996 100644
--- a/OpenSim/Services/Interfaces/IGridService.cs
+++ b/OpenSim/Services/Interfaces/IGridService.cs
@@ -190,6 +190,7 @@ namespace OpenSim.Services.Interfaces
190 public UUID ScopeID = UUID.Zero; 190 public UUID ScopeID = UUID.Zero;
191 191
192 public UUID TerrainImage = UUID.Zero; 192 public UUID TerrainImage = UUID.Zero;
193 public UUID ParcelImage = UUID.Zero;
193 public byte Access; 194 public byte Access;
194 public int Maturity; 195 public int Maturity;
195 public string RegionSecret = string.Empty; 196 public string RegionSecret = string.Empty;
@@ -236,6 +237,7 @@ namespace OpenSim.Services.Interfaces
236 RegionID = ConvertFrom.RegionID; 237 RegionID = ConvertFrom.RegionID;
237 ServerURI = ConvertFrom.ServerURI; 238 ServerURI = ConvertFrom.ServerURI;
238 TerrainImage = ConvertFrom.RegionSettings.TerrainImageID; 239 TerrainImage = ConvertFrom.RegionSettings.TerrainImageID;
240 ParcelImage = ConvertFrom.RegionSettings.ParcelImageID;
239 Access = ConvertFrom.AccessLevel; 241 Access = ConvertFrom.AccessLevel;
240 Maturity = ConvertFrom.RegionSettings.Maturity; 242 Maturity = ConvertFrom.RegionSettings.Maturity;
241 RegionSecret = ConvertFrom.regionSecret; 243 RegionSecret = ConvertFrom.regionSecret;
@@ -253,6 +255,7 @@ namespace OpenSim.Services.Interfaces
253 RegionID = ConvertFrom.RegionID; 255 RegionID = ConvertFrom.RegionID;
254 ServerURI = ConvertFrom.ServerURI; 256 ServerURI = ConvertFrom.ServerURI;
255 TerrainImage = ConvertFrom.TerrainImage; 257 TerrainImage = ConvertFrom.TerrainImage;
258 ParcelImage = ConvertFrom.ParcelImage;
256 Access = ConvertFrom.Access; 259 Access = ConvertFrom.Access;
257 Maturity = ConvertFrom.Maturity; 260 Maturity = ConvertFrom.Maturity;
258 RegionSecret = ConvertFrom.RegionSecret; 261 RegionSecret = ConvertFrom.RegionSecret;
@@ -281,7 +284,7 @@ namespace OpenSim.Services.Interfaces
281 284
282 public override int GetHashCode() 285 public override int GetHashCode()
283 { 286 {
284 return RegionID.GetHashCode() ^ TerrainImage.GetHashCode(); 287 return RegionID.GetHashCode() ^ TerrainImage.GetHashCode() ^ ParcelImage.GetHashCode();
285 } 288 }
286 289
287 #endregion 290 #endregion
@@ -359,6 +362,7 @@ namespace OpenSim.Services.Interfaces
359 kvp["serverURI"] = ServerURI; 362 kvp["serverURI"] = ServerURI;
360 kvp["serverPort"] = InternalEndPoint.Port.ToString(); 363 kvp["serverPort"] = InternalEndPoint.Port.ToString();
361 kvp["regionMapTexture"] = TerrainImage.ToString(); 364 kvp["regionMapTexture"] = TerrainImage.ToString();
365 kvp["parcelMapTexture"] = ParcelImage.ToString();
362 kvp["access"] = Access.ToString(); 366 kvp["access"] = Access.ToString();
363 kvp["regionSecret"] = RegionSecret; 367 kvp["regionSecret"] = RegionSecret;
364 kvp["owner_uuid"] = EstateOwner.ToString(); 368 kvp["owner_uuid"] = EstateOwner.ToString();
@@ -411,6 +415,9 @@ namespace OpenSim.Services.Interfaces
411 if (kvp.ContainsKey("regionMapTexture")) 415 if (kvp.ContainsKey("regionMapTexture"))
412 UUID.TryParse((string)kvp["regionMapTexture"], out TerrainImage); 416 UUID.TryParse((string)kvp["regionMapTexture"], out TerrainImage);
413 417
418 if (kvp.ContainsKey("parcelMapTexture"))
419 UUID.TryParse((string)kvp["parcelMapTexture"], out ParcelImage);
420
414 if (kvp.ContainsKey("access")) 421 if (kvp.ContainsKey("access"))
415 Access = Byte.Parse((string)kvp["access"]); 422 Access = Byte.Parse((string)kvp["access"]);
416 423
diff --git a/OpenSim/Services/Interfaces/IGridUserService.cs b/OpenSim/Services/Interfaces/IGridUserService.cs
index 6613ae7..0a52bfa 100644
--- a/OpenSim/Services/Interfaces/IGridUserService.cs
+++ b/OpenSim/Services/Interfaces/IGridUserService.cs
@@ -131,5 +131,6 @@ namespace OpenSim.Services.Interfaces
131 bool SetLastPosition(string userID, UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt); 131 bool SetLastPosition(string userID, UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt);
132 132
133 GridUserInfo GetGridUserInfo(string userID); 133 GridUserInfo GetGridUserInfo(string userID);
134 GridUserInfo[] GetGridUserInfo(string[] userID);
134 } 135 }
135} \ No newline at end of file 136}
diff --git a/OpenSim/Services/UserAccountService/GridUserService.cs b/OpenSim/Services/UserAccountService/GridUserService.cs
index 9b18915..ac3d8fd 100644
--- a/OpenSim/Services/UserAccountService/GridUserService.cs
+++ b/OpenSim/Services/UserAccountService/GridUserService.cs
@@ -73,6 +73,16 @@ namespace OpenSim.Services.UserAccountService
73 return info; 73 return info;
74 } 74 }
75 75
76 public GridUserInfo[] GetGridUserInfo(string[] userIDs)
77 {
78 List<GridUserInfo> ret = new List<GridUserInfo>();
79
80 foreach (string id in userIDs)
81 ret.Add(GetGridUserInfo(id));
82
83 return ret.ToArray();
84 }
85
76 public GridUserInfo LoggedIn(string userID) 86 public GridUserInfo LoggedIn(string userID)
77 { 87 {
78 m_log.DebugFormat("[GRID USER SERVICE]: User {0} is online", userID); 88 m_log.DebugFormat("[GRID USER SERVICE]: User {0} is online", userID);
@@ -156,4 +166,4 @@ namespace OpenSim.Services.UserAccountService
156 return m_Database.Store(d); 166 return m_Database.Store(d);
157 } 167 }
158 } 168 }
159} \ No newline at end of file 169}