aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml1
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs628
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker2.cs556
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs111
-rw-r--r--OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs3
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs6
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs2
8 files changed, 360 insertions, 949 deletions
diff --git a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
index c738296..0a5ff3f 100644
--- a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
+++ b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
@@ -47,7 +47,6 @@
47 <RegionModule id="RemoteInventoryServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory.RemoteInventoryServicesConnector" /> 47 <RegionModule id="RemoteInventoryServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory.RemoteInventoryServicesConnector" />
48 <RegionModule id="RemoteXInventoryServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory.RemoteXInventoryServicesConnector" /> 48 <RegionModule id="RemoteXInventoryServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory.RemoteXInventoryServicesConnector" />
49 <RegionModule id="HGInventoryBroker" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory.HGInventoryBroker" /> 49 <RegionModule id="HGInventoryBroker" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory.HGInventoryBroker" />
50 <RegionModule id="HGInventoryBroker2" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory.HGInventoryBroker2" />
51 <RegionModule id="LocalNeighbourServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Neighbour.LocalNeighbourServicesConnector" /> 50 <RegionModule id="LocalNeighbourServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Neighbour.LocalNeighbourServicesConnector" />
52 <RegionModule id="RemoteNeighbourServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Neighbour.RemoteNeighbourServicesConnector" /> 51 <RegionModule id="RemoteNeighbourServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Neighbour.RemoteNeighbourServicesConnector" />
53 <RegionModule id="LocalLandServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Land.LocalLandServicesConnector" /> 52 <RegionModule id="LocalLandServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Land.LocalLandServicesConnector" />
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
index 54508cc..e09db15 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
@@ -41,20 +41,21 @@ using OpenMetaverse;
41 41
42namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory 42namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
43{ 43{
44 public class HGInventoryBroker : BaseInventoryConnector, INonSharedRegionModule, IInventoryService 44 public class HGInventoryBroker : ISharedRegionModule, IInventoryService
45 { 45 {
46 private static readonly ILog m_log = 46 private static readonly ILog m_log =
47 LogManager.GetLogger( 47 LogManager.GetLogger(
48 MethodBase.GetCurrentMethod().DeclaringType); 48 MethodBase.GetCurrentMethod().DeclaringType);
49 49
50 private static bool m_Initialized = false;
51 private static bool m_Enabled = false; 50 private static bool m_Enabled = false;
52 51
53 private static IInventoryService m_GridService; 52 private static IInventoryService m_LocalGridInventoryService;
54 private static ISessionAuthInventoryService m_HGService; 53 private Dictionary<string, IInventoryService> m_connectors = new Dictionary<string, IInventoryService>();
55 54
56 private Scene m_Scene; 55 // A cache of userIDs --> ServiceURLs, for HGBroker only
57 private IUserAccountService m_UserAccountService; 56 protected Dictionary<UUID, string> m_InventoryURLs = new Dictionary<UUID,string>();
57
58 private List<Scene> m_Scenes = new List<Scene>();
58 59
59 public Type ReplaceableInterface 60 public Type ReplaceableInterface
60 { 61 {
@@ -68,67 +69,45 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
68 69
69 public void Initialise(IConfigSource source) 70 public void Initialise(IConfigSource source)
70 { 71 {
71 if (!m_Initialized) 72 IConfig moduleConfig = source.Configs["Modules"];
73 if (moduleConfig != null)
72 { 74 {
73 IConfig moduleConfig = source.Configs["Modules"]; 75 string name = moduleConfig.GetString("InventoryServices", "");
74 if (moduleConfig != null) 76 if (name == Name)
75 { 77 {
76 string name = moduleConfig.GetString("InventoryServices", ""); 78 IConfig inventoryConfig = source.Configs["InventoryService"];
77 if (name == Name) 79 if (inventoryConfig == null)
78 { 80 {
79 IConfig inventoryConfig = source.Configs["InventoryService"]; 81 m_log.Error("[HG INVENTORY CONNECTOR]: InventoryService missing from OpenSim.ini");
80 if (inventoryConfig == null) 82 return;
81 { 83 }
82 m_log.Error("[HG INVENTORY CONNECTOR]: InventoryService missing from OpenSim.ini");
83 return;
84 }
85
86 string localDll = inventoryConfig.GetString("LocalGridInventoryService",
87 String.Empty);
88 string HGDll = inventoryConfig.GetString("HypergridInventoryService",
89 String.Empty);
90
91 if (localDll == String.Empty)
92 {
93 m_log.Error("[HG INVENTORY CONNECTOR]: No LocalGridInventoryService named in section InventoryService");
94 //return;
95 throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's");
96 }
97
98 if (HGDll == String.Empty)
99 {
100 m_log.Error("[HG INVENTORY CONNECTOR]: No HypergridInventoryService named in section InventoryService");
101 //return;
102 throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's");
103 }
104
105 Object[] args = new Object[] { source };
106 m_GridService =
107 ServerUtils.LoadPlugin<IInventoryService>(localDll,
108 args);
109 84
110 m_HGService = 85 string localDll = inventoryConfig.GetString("LocalGridInventoryService",
111 ServerUtils.LoadPlugin<ISessionAuthInventoryService>(HGDll, 86 String.Empty);
112 args); 87 //string HGDll = inventoryConfig.GetString("HypergridInventoryService",
88 // String.Empty);
113 89
114 if (m_GridService == null) 90 if (localDll == String.Empty)
115 { 91 {
116 m_log.Error("[HG INVENTORY CONNECTOR]: Can't load local inventory service"); 92 m_log.Error("[HG INVENTORY CONNECTOR]: No LocalGridInventoryService named in section InventoryService");
117 return; 93 //return;
118 } 94 throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's");
119 if (m_HGService == null) 95 }
120 {
121 m_log.Error("[HG INVENTORY CONNECTOR]: Can't load hypergrid inventory service");
122 return;
123 }
124 96
125 Init(source); 97 Object[] args = new Object[] { source };
98 m_LocalGridInventoryService =
99 ServerUtils.LoadPlugin<IInventoryService>(localDll,
100 args);
126 101
127 m_Enabled = true; 102 if (m_LocalGridInventoryService == null)
128 m_log.Info("[HG INVENTORY CONNECTOR]: HG inventory broker enabled"); 103 {
104 m_log.Error("[HG INVENTORY CONNECTOR]: Can't load local inventory service");
105 return;
129 } 106 }
107
108 m_Enabled = true;
109 m_log.InfoFormat("[HG INVENTORY CONNECTOR]: HG inventory broker enabled with inner connector of type {0}", m_LocalGridInventoryService.GetType());
130 } 110 }
131 m_Initialized = true;
132 } 111 }
133 } 112 }
134 113
@@ -145,19 +124,20 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
145 if (!m_Enabled) 124 if (!m_Enabled)
146 return; 125 return;
147 126
148 m_Scene = scene; 127 m_Scenes.Add(scene);
149 m_UserAccountService = m_Scene.UserAccountService;
150 128
151 scene.RegisterModuleInterface<IInventoryService>(this); 129 scene.RegisterModuleInterface<IInventoryService>(this);
152 m_cache.AddRegion(scene); 130
131 scene.EventManager.OnClientClosed += OnClientClosed;
132
153 } 133 }
154 134
155 public void RemoveRegion(Scene scene) 135 public void RemoveRegion(Scene scene)
156 { 136 {
157 if (!m_Enabled) 137 if (!m_Enabled)
158 return; 138 return;
159 139
160 m_cache.RemoveRegion(scene); 140 m_Scenes.Remove(scene);
161 } 141 }
162 142
163 public void RegionLoaded(Scene scene) 143 public void RegionLoaded(Scene scene)
@@ -169,260 +149,307 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
169 149
170 } 150 }
171 151
152 #region URL Cache
153
154 void OnClientClosed(UUID clientID, Scene scene)
155 {
156 if (m_InventoryURLs.ContainsKey(clientID)) // if it's in cache
157 {
158 ScenePresence sp = null;
159 foreach (Scene s in m_Scenes)
160 {
161 s.TryGetScenePresence(clientID, out sp);
162 if ((sp != null) && !sp.IsChildAgent && (s != scene))
163 {
164 m_log.DebugFormat("[INVENTORY CACHE]: OnClientClosed in {0}, but user {1} still in sim. Keeping inventoryURL in cache",
165 scene.RegionInfo.RegionName, clientID);
166 return;
167 }
168 }
169 DropInventoryServiceURL(clientID);
170 }
171 }
172
173 /// <summary>
174 /// Gets the user's inventory URL from its serviceURLs, if the user is foreign,
175 /// and sticks it in the cache
176 /// </summary>
177 /// <param name="userID"></param>
178 private void CacheInventoryServiceURL(UUID userID)
179 {
180 if (m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, userID) == null)
181 {
182 // The user does not have a local account; let's cache its service URL
183 string inventoryURL = string.Empty;
184 ScenePresence sp = null;
185 foreach (Scene scene in m_Scenes)
186 {
187 scene.TryGetScenePresence(userID, out sp);
188 if (sp != null)
189 {
190 AgentCircuitData aCircuit = scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
191 if (aCircuit.ServiceURLs.ContainsKey("InventoryServerURI"))
192 {
193 inventoryURL = aCircuit.ServiceURLs["InventoryServerURI"].ToString();
194 if (inventoryURL != null && inventoryURL != string.Empty)
195 {
196 inventoryURL = inventoryURL.Trim(new char[] { '/' });
197 m_InventoryURLs.Add(userID, inventoryURL);
198 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Added {0} to the cache of inventory URLs", inventoryURL);
199 return;
200 }
201 }
202 }
203 }
204 }
205
206 // else put a null; it means that the methods should forward to local grid's inventory
207 m_InventoryURLs.Add(userID, null);
208 }
209
210 private void DropInventoryServiceURL(UUID userID)
211 {
212 lock (m_InventoryURLs)
213 if (m_InventoryURLs.ContainsKey(userID))
214 {
215 string url = m_InventoryURLs[userID];
216 m_InventoryURLs.Remove(userID);
217 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Removed {0} from the cache of inventory URLs", url);
218 }
219 }
220
221 public string GetInventoryServiceURL(UUID userID)
222 {
223 if (m_InventoryURLs.ContainsKey(userID))
224 return m_InventoryURLs[userID];
225
226 else
227 CacheInventoryServiceURL(userID);
228
229 return m_InventoryURLs[userID];
230 }
231 #endregion
232
172 #region IInventoryService 233 #region IInventoryService
173 234
174 public override bool CreateUserInventory(UUID userID) 235 public bool CreateUserInventory(UUID userID)
175 { 236 {
176 return m_GridService.CreateUserInventory(userID); 237 return m_LocalGridInventoryService.CreateUserInventory(userID);
177 } 238 }
178 239
179 public override List<InventoryFolderBase> GetInventorySkeleton(UUID userId) 240 public List<InventoryFolderBase> GetInventorySkeleton(UUID userId)
180 { 241 {
181 return m_GridService.GetInventorySkeleton(userId); 242 return m_LocalGridInventoryService.GetInventorySkeleton(userId);
182 } 243 }
183 244
184 public override InventoryCollection GetUserInventory(UUID userID) 245 public InventoryCollection GetUserInventory(UUID userID)
185 { 246 {
186 return null; 247 return null;
187 } 248 }
188 249
189 public override void GetUserInventory(UUID userID, InventoryReceiptCallback callback) 250 public void GetUserInventory(UUID userID, InventoryReceiptCallback callback)
190 { 251 {
191 } 252 }
192 253
193 // Inherited. See base 254 public InventoryFolderBase GetRootFolder(UUID userID)
194 //public override InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
195 //{
196 // if (IsLocalGridUser(userID))
197 // return m_GridService.GetFolderForType(userID, type);
198 // else
199 // {
200 // UUID sessionID = GetSessionID(userID);
201 // string uri = GetUserInventoryURI(userID) + "/" + userID.ToString();
202 // // !!!!!!
203 // return null;
204 // //return m_HGService.GetFolderForType(uri, sessionID, type);
205 // }
206 //}
207
208 public override InventoryCollection GetFolderContent(UUID userID, UUID folderID)
209 { 255 {
210 string uri = string.Empty; 256 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetRootFolder for {0}", userID);
211 if (!IsForeignUser(userID, out uri)) 257
212 return m_GridService.GetFolderContent(userID, folderID); 258 string invURL = GetInventoryServiceURL(userID);
213 else 259
214 { 260 if (invURL == null) // not there, forward to local inventory connector to resolve
215 UUID sessionID = GetSessionID(userID); 261 return m_LocalGridInventoryService.GetRootFolder(userID);
216 uri = uri + "/" + userID.ToString(); 262
217 return m_HGService.GetFolderContent(uri, folderID, sessionID); 263 IInventoryService connector = GetConnector(invURL);
218 } 264
265 return connector.GetRootFolder(userID);
219 } 266 }
220 267
221 public override Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(UUID userID) 268 public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
222 { 269 {
223 string uri = string.Empty; 270 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetFolderForType {0} type {1}", userID, type);
224 if (!IsForeignUser(userID, out uri)) 271
225 { 272 string invURL = GetInventoryServiceURL(userID);
226 // This is not pretty, but it will have to do for now 273
227 if (m_GridService is BaseInventoryConnector) 274 if (invURL == null) // not there, forward to local inventory connector to resolve
228 { 275 return m_LocalGridInventoryService.GetFolderForType(userID, type);
229 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetSystemsFolders redirected to RemoteInventoryServiceConnector module"); 276
230 return ((BaseInventoryConnector)m_GridService).GetSystemFolders(userID); 277 IInventoryService connector = GetConnector(invURL);
231 } 278
232 else 279 return connector.GetFolderForType(userID, type);
233 {
234 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetSystemsFolders redirected to GetSystemFoldersLocal");
235 return GetSystemFoldersLocal(userID);
236 }
237 }
238 else
239 {
240 UUID sessionID = GetSessionID(userID);
241 uri = uri + "/" + userID.ToString();
242 return m_HGService.GetSystemFolders(uri, sessionID);
243 }
244 } 280 }
245 281
246 private Dictionary<AssetType, InventoryFolderBase> GetSystemFoldersLocal(UUID userID) 282 public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
247 { 283 {
248 InventoryFolderBase root = m_GridService.GetRootFolder(userID); 284 m_log.Debug("[HG INVENTORY CONNECTOR]: GetFolderContent " + folderID);
249 if (root != null)
250 {
251 InventoryCollection content = m_GridService.GetFolderContent(userID, root.ID);
252 if (content != null)
253 {
254 Dictionary<AssetType, InventoryFolderBase> folders = new Dictionary<AssetType, InventoryFolderBase>();
255 foreach (InventoryFolderBase folder in content.Folders)
256 {
257 //m_log.DebugFormat("[HG INVENTORY CONNECTOR]: scanning folder type {0}", (AssetType)folder.Type);
258 if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown))
259 folders[(AssetType)folder.Type] = folder;
260 }
261 // Put the root folder there, as type Folder
262 folders[AssetType.Folder] = root;
263 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: System folders count for {0}: {1}", userID, folders.Count);
264 return folders;
265 }
266 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Root folder content not found for {0}", userID);
267 285
268 } 286 string invURL = GetInventoryServiceURL(userID);
287
288 if (invURL == null) // not there, forward to local inventory connector to resolve
289 return m_LocalGridInventoryService.GetFolderContent(userID, folderID);
290
291 IInventoryService connector = GetConnector(invURL);
269 292
270 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Root folder not found for {0}", userID); 293 return connector.GetFolderContent(userID, folderID);
271 294
272 return new Dictionary<AssetType, InventoryFolderBase>();
273 } 295 }
274 296
275 public override List<InventoryItemBase> GetFolderItems(UUID userID, UUID folderID) 297 public List<InventoryItemBase> GetFolderItems(UUID userID, UUID folderID)
276 { 298 {
277 string uri = string.Empty; 299 m_log.Debug("[HG INVENTORY CONNECTOR]: GetFolderItems " + folderID);
278 if (!IsForeignUser(userID, out uri)) 300
279 return m_GridService.GetFolderItems(userID, folderID); 301 string invURL = GetInventoryServiceURL(userID);
280 else 302
281 { 303 if (invURL == null) // not there, forward to local inventory connector to resolve
282 UUID sessionID = GetSessionID(userID); 304 return m_LocalGridInventoryService.GetFolderItems(userID, folderID);
283 uri = uri + "/" + userID.ToString(); 305
284 return m_HGService.GetFolderItems(uri, folderID, sessionID); 306 IInventoryService connector = GetConnector(invURL);
285 } 307
308 return connector.GetFolderItems(userID, folderID);
309
286 } 310 }
287 311
288 public override bool AddFolder(InventoryFolderBase folder) 312 public bool AddFolder(InventoryFolderBase folder)
289 { 313 {
290 if (folder == null) 314 if (folder == null)
291 return false; 315 return false;
292 316
293 string uri = string.Empty; 317 m_log.Debug("[HG INVENTORY CONNECTOR]: AddFolder " + folder.ID);
294 if (!IsForeignUser(folder.Owner, out uri)) 318
295 return m_GridService.AddFolder(folder); 319 string invURL = GetInventoryServiceURL(folder.Owner);
296 else 320
297 { 321 if (invURL == null) // not there, forward to local inventory connector to resolve
298 UUID sessionID = GetSessionID(folder.Owner); 322 return m_LocalGridInventoryService.AddFolder(folder);
299 uri = uri + "/" + folder.Owner.ToString(); 323
300 return m_HGService.AddFolder(uri, folder, sessionID); 324 IInventoryService connector = GetConnector(invURL);
301 } 325
326 return connector.AddFolder(folder);
302 } 327 }
303 328
304 public override bool UpdateFolder(InventoryFolderBase folder) 329 public bool UpdateFolder(InventoryFolderBase folder)
305 { 330 {
306 if (folder == null) 331 if (folder == null)
307 return false; 332 return false;
308 333
309 string uri = string.Empty; 334 m_log.Debug("[HG INVENTORY CONNECTOR]: UpdateFolder " + folder.ID);
310 if (!IsForeignUser(folder.Owner, out uri)) 335
311 return m_GridService.UpdateFolder(folder); 336 string invURL = GetInventoryServiceURL(folder.Owner);
312 else 337
313 { 338 if (invURL == null) // not there, forward to local inventory connector to resolve
314 UUID sessionID = GetSessionID(folder.Owner); 339 return m_LocalGridInventoryService.UpdateFolder(folder);
315 uri = uri + "/" + folder.Owner.ToString(); 340
316 return m_HGService.UpdateFolder(uri, folder, sessionID); 341 IInventoryService connector = GetConnector(invURL);
317 } 342
343 return connector.UpdateFolder(folder);
318 } 344 }
319 345
320 public override bool DeleteFolders(UUID ownerID, List<UUID> folderIDs) 346 public bool DeleteFolders(UUID ownerID, List<UUID> folderIDs)
321 { 347 {
322 if (folderIDs == null) 348 if (folderIDs == null)
323 return false; 349 return false;
324 if (folderIDs.Count == 0) 350 if (folderIDs.Count == 0)
325 return false; 351 return false;
326 352
327 string uri = string.Empty; 353 m_log.Debug("[HG INVENTORY CONNECTOR]: DeleteFolders for " + ownerID);
328 if (!IsForeignUser(ownerID, out uri)) 354
329 return m_GridService.DeleteFolders(ownerID, folderIDs); 355 string invURL = GetInventoryServiceURL(ownerID);
330 else 356
331 { 357 if (invURL == null) // not there, forward to local inventory connector to resolve
332 UUID sessionID = GetSessionID(ownerID); 358 return m_LocalGridInventoryService.DeleteFolders(ownerID, folderIDs);
333 uri = uri + "/" + ownerID.ToString(); 359
334 return m_HGService.DeleteFolders(uri, folderIDs, sessionID); 360 IInventoryService connector = GetConnector(invURL);
335 } 361
362 return connector.DeleteFolders(ownerID, folderIDs);
336 } 363 }
337 364
338 public override bool MoveFolder(InventoryFolderBase folder) 365 public bool MoveFolder(InventoryFolderBase folder)
339 { 366 {
340 if (folder == null) 367 if (folder == null)
341 return false; 368 return false;
342 369
343 string uri = string.Empty; 370 m_log.Debug("[HG INVENTORY CONNECTOR]: MoveFolder for " + folder.Owner);
344 if (!IsForeignUser(folder.Owner, out uri)) 371
345 return m_GridService.MoveFolder(folder); 372 string invURL = GetInventoryServiceURL(folder.Owner);
346 else 373
347 { 374 if (invURL == null) // not there, forward to local inventory connector to resolve
348 UUID sessionID = GetSessionID(folder.Owner); 375 return m_LocalGridInventoryService.MoveFolder(folder);
349 uri = uri + "/" + folder.Owner.ToString(); 376
350 return m_HGService.MoveFolder(uri, folder, sessionID); 377 IInventoryService connector = GetConnector(invURL);
351 } 378
379 return connector.MoveFolder(folder);
352 } 380 }
353 381
354 public override bool PurgeFolder(InventoryFolderBase folder) 382 public bool PurgeFolder(InventoryFolderBase folder)
355 { 383 {
356 if (folder == null) 384 if (folder == null)
357 return false; 385 return false;
358 386
359 string uri = string.Empty; 387 m_log.Debug("[HG INVENTORY CONNECTOR]: PurgeFolder for " + folder.Owner);
360 if (!IsForeignUser(folder.Owner, out uri))
361 return m_GridService.PurgeFolder(folder);
362 else
363 {
364 UUID sessionID = GetSessionID(folder.Owner);
365 uri = uri + "/" + folder.Owner.ToString();
366 return m_HGService.PurgeFolder(uri, folder, sessionID);
367 }
368 }
369 388
370 // public bool AddItem(InventoryItemBase item) inherited 389 string invURL = GetInventoryServiceURL(folder.Owner);
371 // Uses AddItemPlain
372 390
373 protected override bool AddItemPlain(InventoryItemBase item) 391 if (invURL == null) // not there, forward to local inventory connector to resolve
392 return m_LocalGridInventoryService.PurgeFolder(folder);
393
394 IInventoryService connector = GetConnector(invURL);
395
396 return connector.PurgeFolder(folder);
397 }
398
399 public bool AddItem(InventoryItemBase item)
374 { 400 {
375 if (item == null) 401 if (item == null)
376 return false; 402 return false;
377 403
378 string uri = string.Empty; 404 m_log.Debug("[HG INVENTORY CONNECTOR]: AddItem " + item.ID);
379 if (!IsForeignUser(item.Owner, out uri)) 405
380 { 406 string invURL = GetInventoryServiceURL(item.Owner);
381 return m_GridService.AddItem(item); 407
382 } 408 if (invURL == null) // not there, forward to local inventory connector to resolve
383 else 409 return m_LocalGridInventoryService.AddItem(item);
384 { 410
385 UUID sessionID = GetSessionID(item.Owner); 411 IInventoryService connector = GetConnector(invURL);
386 uri = uri + "/" + item.Owner.ToString(); 412
387 return m_HGService.AddItem(uri, item, sessionID); 413 return connector.AddItem(item);
388 }
389 } 414 }
390 415
391 public override bool UpdateItem(InventoryItemBase item) 416 public bool UpdateItem(InventoryItemBase item)
392 { 417 {
393 if (item == null) 418 if (item == null)
394 return false; 419 return false;
395 420
396 string uri = string.Empty; 421 m_log.Debug("[HG INVENTORY CONNECTOR]: UpdateItem " + item.ID);
397 if (!IsForeignUser(item.Owner, out uri)) 422
398 return m_GridService.UpdateItem(item); 423 string invURL = GetInventoryServiceURL(item.Owner);
399 else 424
400 { 425 if (invURL == null) // not there, forward to local inventory connector to resolve
401 UUID sessionID = GetSessionID(item.Owner); 426 return m_LocalGridInventoryService.UpdateItem(item);
402 uri = uri + "/" + item.Owner.ToString(); 427
403 return m_HGService.UpdateItem(uri, item, sessionID); 428 IInventoryService connector = GetConnector(invURL);
404 } 429
430 return connector.UpdateItem(item);
405 } 431 }
406 432
407 public override bool MoveItems(UUID ownerID, List<InventoryItemBase> items) 433 public bool MoveItems(UUID ownerID, List<InventoryItemBase> items)
408 { 434 {
409 if (items == null) 435 if (items == null)
410 return false; 436 return false;
411 if (items.Count == 0) 437 if (items.Count == 0)
412 return true; 438 return true;
413 439
414 string uri = string.Empty; 440 m_log.Debug("[HG INVENTORY CONNECTOR]: MoveItems for " + ownerID);
415 if (!IsForeignUser(ownerID, out uri)) 441
416 return m_GridService.MoveItems(ownerID, items); 442 string invURL = GetInventoryServiceURL(ownerID);
417 else 443
418 { 444 if (invURL == null) // not there, forward to local inventory connector to resolve
419 UUID sessionID = GetSessionID(ownerID); 445 return m_LocalGridInventoryService.MoveItems(ownerID, items);
420 uri = uri + "/" + ownerID.ToString(); 446
421 return m_HGService.MoveItems(uri, items, sessionID); 447 IInventoryService connector = GetConnector(invURL);
422 } 448
449 return connector.MoveItems(ownerID, items);
423 } 450 }
424 451
425 public override bool DeleteItems(UUID ownerID, List<UUID> itemIDs) 452 public bool DeleteItems(UUID ownerID, List<UUID> itemIDs)
426 { 453 {
427 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Delete {0} items for user {1}", itemIDs.Count, ownerID); 454 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Delete {0} items for user {1}", itemIDs.Count, ownerID);
428 455
@@ -431,109 +458,98 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
431 if (itemIDs.Count == 0) 458 if (itemIDs.Count == 0)
432 return true; 459 return true;
433 460
434 string uri = string.Empty; 461 m_log.Debug("[HG INVENTORY CONNECTOR]: DeleteItems for " + ownerID);
435 if (!IsForeignUser(ownerID, out uri)) 462
436 return m_GridService.DeleteItems(ownerID, itemIDs); 463 string invURL = GetInventoryServiceURL(ownerID);
437 else 464
438 { 465 if (invURL == null) // not there, forward to local inventory connector to resolve
439 UUID sessionID = GetSessionID(ownerID); 466 return m_LocalGridInventoryService.DeleteItems(ownerID, itemIDs);
440 uri = uri + "/" + ownerID.ToString(); 467
441 return m_HGService.DeleteItems(uri, itemIDs, sessionID); 468 IInventoryService connector = GetConnector(invURL);
442 } 469
470 return connector.DeleteItems(ownerID, itemIDs);
443 } 471 }
444 472
445 public override InventoryItemBase GetItem(InventoryItemBase item) 473 public InventoryItemBase GetItem(InventoryItemBase item)
446 { 474 {
447 if (item == null) 475 if (item == null)
448 return null; 476 return null;
449 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetItem {0} for user {1}", item.ID, item.Owner); 477 m_log.Debug("[HG INVENTORY CONNECTOR]: GetItem " + item.ID);
450 string uri = string.Empty; 478
451 if (!IsForeignUser(item.Owner, out uri)) 479 string invURL = GetInventoryServiceURL(item.Owner);
452 return m_GridService.GetItem(item); 480
453 else 481 if (invURL == null) // not there, forward to local inventory connector to resolve
454 { 482 return m_LocalGridInventoryService.GetItem(item);
455 UUID sessionID = GetSessionID(item.Owner); 483
456 uri = uri + "/" + item.Owner.ToString(); 484 IInventoryService connector = GetConnector(invURL);
457 return m_HGService.QueryItem(uri, item, sessionID); 485
458 } 486 return connector.GetItem(item);
459 } 487 }
460 488
461 public override InventoryFolderBase GetFolder(InventoryFolderBase folder) 489 public InventoryFolderBase GetFolder(InventoryFolderBase folder)
462 { 490 {
463 if (folder == null) 491 if (folder == null)
464 return null; 492 return null;
465 493
466 string uri = string.Empty; 494 m_log.Debug("[HG INVENTORY CONNECTOR]: GetFolder " + folder.ID);
467 if (!IsForeignUser(folder.Owner, out uri)) 495
468 return m_GridService.GetFolder(folder); 496 string invURL = GetInventoryServiceURL(folder.Owner);
469 else 497
470 { 498 if (invURL == null) // not there, forward to local inventory connector to resolve
471 UUID sessionID = GetSessionID(folder.Owner); 499 return m_LocalGridInventoryService.GetFolder(folder);
472 uri = uri + "/" + folder.Owner.ToString(); 500
473 return m_HGService.QueryFolder(uri, folder, sessionID); 501 IInventoryService connector = GetConnector(invURL);
474 } 502
503 return connector.GetFolder(folder);
475 } 504 }
476 505
477 public override bool HasInventoryForUser(UUID userID) 506 public bool HasInventoryForUser(UUID userID)
478 { 507 {
479 return false; 508 return false;
480 } 509 }
481 510
482 public override List<InventoryItemBase> GetActiveGestures(UUID userId) 511 public List<InventoryItemBase> GetActiveGestures(UUID userId)
483 { 512 {
484 return new List<InventoryItemBase>(); 513 return new List<InventoryItemBase>();
485 } 514 }
486 515
487 public override int GetAssetPermissions(UUID userID, UUID assetID) 516 public int GetAssetPermissions(UUID userID, UUID assetID)
488 { 517 {
489 string uri = string.Empty; 518 m_log.Debug("[HG INVENTORY CONNECTOR]: GetAssetPermissions " + assetID);
490 if (!IsForeignUser(userID, out uri))
491 return m_GridService.GetAssetPermissions(userID, assetID);
492 else
493 {
494 UUID sessionID = GetSessionID(userID);
495 uri = uri + "/" + userID.ToString();
496 return m_HGService.GetAssetPermissions(uri, assetID, sessionID);
497 }
498 }
499 519
500 #endregion 520 string invURL = GetInventoryServiceURL(userID);
501 521
502 private UUID GetSessionID(UUID userID) 522 if (invURL == null) // not there, forward to local inventory connector to resolve
503 { 523 return m_LocalGridInventoryService.GetAssetPermissions(userID, assetID);
504 ScenePresence sp = null; 524
505 if (m_Scene.TryGetScenePresence(userID, out sp)) 525 IInventoryService connector = GetConnector(invURL);
506 {
507 return sp.ControllingClient.SessionId;
508 }
509 526
510 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: scene presence for {0} not found", userID); 527 return connector.GetAssetPermissions(userID, assetID);
511 return UUID.Zero;
512 } 528 }
513 529
514 private bool IsForeignUser(UUID userID, out string inventoryURL) 530 #endregion
515 {
516 inventoryURL = string.Empty;
517 UserAccount account = null;
518 if (m_Scene.UserAccountService != null)
519 account = m_Scene.UserAccountService.GetUserAccount(m_Scene.RegionInfo.ScopeID, userID);
520 531
521 if (account == null) // foreign user 532 private IInventoryService GetConnector(string url)
533 {
534 IInventoryService connector = null;
535 lock (m_connectors)
522 { 536 {
523 ScenePresence sp = null; 537 if (m_connectors.ContainsKey(url))
524 m_Scene.TryGetScenePresence(userID, out sp);
525 if (sp != null)
526 { 538 {
527 AgentCircuitData aCircuit = m_Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); 539 connector = m_connectors[url];
528 if (aCircuit.ServiceURLs.ContainsKey("InventoryServerURI")) 540 }
529 { 541 else
530 inventoryURL = aCircuit.ServiceURLs["InventoryServerURI"].ToString(); 542 {
531 inventoryURL = inventoryURL.Trim(new char[] { '/' }); 543 // We're instantiating this class explicitly, but this won't
532 return true; 544 // work in general, because the remote grid may be running
533 } 545 // an inventory server that has a different protocol.
546 // Eventually we will want a piece of protocol asking
547 // the remote server about its kind. Definitely cool thing to do!
548 connector = new RemoteXInventoryServicesConnector(url);
549 m_connectors.Add(url, connector);
534 } 550 }
535 } 551 }
536 return false; 552 return connector;
537 } 553 }
538 554
539 } 555 }
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker2.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker2.cs
deleted file mode 100644
index fc3393f..0000000
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker2.cs
+++ /dev/null
@@ -1,556 +0,0 @@
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
28using log4net;
29using Nini.Config;
30using System;
31using System.Collections.Generic;
32using System.Reflection;
33using OpenSim.Framework;
34
35using OpenSim.Server.Base;
36using OpenSim.Region.Framework.Interfaces;
37using OpenSim.Region.Framework.Scenes;
38using OpenSim.Services.Interfaces;
39using OpenSim.Services.Connectors;
40using OpenMetaverse;
41
42namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
43{
44 public class HGInventoryBroker2 : ISharedRegionModule, IInventoryService
45 {
46 private static readonly ILog m_log =
47 LogManager.GetLogger(
48 MethodBase.GetCurrentMethod().DeclaringType);
49
50 private static bool m_Enabled = false;
51
52 private static IInventoryService m_LocalGridInventoryService;
53 private Dictionary<string, IInventoryService> m_connectors = new Dictionary<string, IInventoryService>();
54
55 // A cache of userIDs --> ServiceURLs, for HGBroker only
56 protected Dictionary<UUID, string> m_InventoryURLs = new Dictionary<UUID,string>();
57
58 private List<Scene> m_Scenes = new List<Scene>();
59
60 public Type ReplaceableInterface
61 {
62 get { return null; }
63 }
64
65 public string Name
66 {
67 get { return "HGInventoryBroker2"; }
68 }
69
70 public void Initialise(IConfigSource source)
71 {
72 IConfig moduleConfig = source.Configs["Modules"];
73 if (moduleConfig != null)
74 {
75 string name = moduleConfig.GetString("InventoryServices", "");
76 if (name == Name)
77 {
78 IConfig inventoryConfig = source.Configs["InventoryService"];
79 if (inventoryConfig == null)
80 {
81 m_log.Error("[HG INVENTORY CONNECTOR]: InventoryService missing from OpenSim.ini");
82 return;
83 }
84
85 string localDll = inventoryConfig.GetString("LocalGridInventoryService",
86 String.Empty);
87 //string HGDll = inventoryConfig.GetString("HypergridInventoryService",
88 // String.Empty);
89
90 if (localDll == String.Empty)
91 {
92 m_log.Error("[HG INVENTORY CONNECTOR]: No LocalGridInventoryService named in section InventoryService");
93 //return;
94 throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's");
95 }
96
97 Object[] args = new Object[] { source };
98 m_LocalGridInventoryService =
99 ServerUtils.LoadPlugin<IInventoryService>(localDll,
100 args);
101
102 if (m_LocalGridInventoryService == null)
103 {
104 m_log.Error("[HG INVENTORY CONNECTOR]: Can't load local inventory service");
105 return;
106 }
107
108 m_Enabled = true;
109 m_log.InfoFormat("[HG INVENTORY CONNECTOR]: HG inventory broker enabled with inner connector of type {0}", m_LocalGridInventoryService.GetType());
110 }
111 }
112 }
113
114 public void PostInitialise()
115 {
116 }
117
118 public void Close()
119 {
120 }
121
122 public void AddRegion(Scene scene)
123 {
124 if (!m_Enabled)
125 return;
126
127 m_Scenes.Add(scene);
128
129 scene.RegisterModuleInterface<IInventoryService>(this);
130
131 scene.EventManager.OnClientClosed += OnClientClosed;
132
133 }
134
135 public void RemoveRegion(Scene scene)
136 {
137 if (!m_Enabled)
138 return;
139
140 m_Scenes.Remove(scene);
141 }
142
143 public void RegionLoaded(Scene scene)
144 {
145 if (!m_Enabled)
146 return;
147
148 m_log.InfoFormat("[HG INVENTORY CONNECTOR]: Enabled HG inventory for region {0}", scene.RegionInfo.RegionName);
149
150 }
151
152 #region URL Cache
153
154 void OnClientClosed(UUID clientID, Scene scene)
155 {
156 if (m_InventoryURLs.ContainsKey(clientID)) // if it's in cache
157 {
158 ScenePresence sp = null;
159 foreach (Scene s in m_Scenes)
160 {
161 s.TryGetScenePresence(clientID, out sp);
162 if ((sp != null) && !sp.IsChildAgent && (s != scene))
163 {
164 m_log.DebugFormat("[INVENTORY CACHE]: OnClientClosed in {0}, but user {1} still in sim. Keeping inventoryURL in cache",
165 scene.RegionInfo.RegionName, clientID);
166 return;
167 }
168 }
169 DropInventoryServiceURL(clientID);
170 }
171 }
172
173 /// <summary>
174 /// Gets the user's inventory URL from its serviceURLs, if the user is foreign,
175 /// and sticks it in the cache
176 /// </summary>
177 /// <param name="userID"></param>
178 private void CacheInventoryServiceURL(UUID userID)
179 {
180 if (m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, userID) == null)
181 {
182 // The user does not have a local account; let's cache its service URL
183 string inventoryURL = string.Empty;
184 ScenePresence sp = null;
185 foreach (Scene scene in m_Scenes)
186 {
187 scene.TryGetScenePresence(userID, out sp);
188 if (sp != null)
189 {
190 AgentCircuitData aCircuit = scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
191 if (aCircuit.ServiceURLs.ContainsKey("InventoryServerURI"))
192 {
193 inventoryURL = aCircuit.ServiceURLs["InventoryServerURI"].ToString();
194 if (inventoryURL != null && inventoryURL != string.Empty)
195 {
196 inventoryURL = inventoryURL.Trim(new char[] { '/' });
197 m_InventoryURLs.Add(userID, inventoryURL);
198 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Added {0} to the cache of inventory URLs", inventoryURL);
199 return;
200 }
201 }
202 }
203 }
204 }
205
206 // else put a null; it means that the methods should forward to local grid's inventory
207 m_InventoryURLs.Add(userID, null);
208 }
209
210 private void DropInventoryServiceURL(UUID userID)
211 {
212 lock (m_InventoryURLs)
213 if (m_InventoryURLs.ContainsKey(userID))
214 {
215 string url = m_InventoryURLs[userID];
216 m_InventoryURLs.Remove(userID);
217 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Removed {0} from the cache of inventory URLs", url);
218 }
219 }
220
221 public string GetInventoryServiceURL(UUID userID)
222 {
223 if (m_InventoryURLs.ContainsKey(userID))
224 return m_InventoryURLs[userID];
225
226 else
227 CacheInventoryServiceURL(userID);
228
229 return m_InventoryURLs[userID];
230 }
231 #endregion
232
233 #region IInventoryService
234
235 public bool CreateUserInventory(UUID userID)
236 {
237 return m_LocalGridInventoryService.CreateUserInventory(userID);
238 }
239
240 public List<InventoryFolderBase> GetInventorySkeleton(UUID userId)
241 {
242 return m_LocalGridInventoryService.GetInventorySkeleton(userId);
243 }
244
245 public InventoryCollection GetUserInventory(UUID userID)
246 {
247 return null;
248 }
249
250 public void GetUserInventory(UUID userID, InventoryReceiptCallback callback)
251 {
252 }
253
254 public InventoryFolderBase GetRootFolder(UUID userID)
255 {
256 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetRootFolder for {0}", userID);
257
258 string invURL = GetInventoryServiceURL(userID);
259
260 if (invURL == null) // not there, forward to local inventory connector to resolve
261 return m_LocalGridInventoryService.GetRootFolder(userID);
262
263 IInventoryService connector = GetConnector(invURL);
264
265 return connector.GetRootFolder(userID);
266 }
267
268 public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
269 {
270 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetFolderForType {0} type {1}", userID, type);
271
272 string invURL = GetInventoryServiceURL(userID);
273
274 if (invURL == null) // not there, forward to local inventory connector to resolve
275 return m_LocalGridInventoryService.GetFolderForType(userID, type);
276
277 IInventoryService connector = GetConnector(invURL);
278
279 return connector.GetFolderForType(userID, type);
280 }
281
282 public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
283 {
284 m_log.Debug("[HG INVENTORY CONNECTOR]: GetFolderContent " + folderID);
285
286 string invURL = GetInventoryServiceURL(userID);
287
288 if (invURL == null) // not there, forward to local inventory connector to resolve
289 return m_LocalGridInventoryService.GetFolderContent(userID, folderID);
290
291 IInventoryService connector = GetConnector(invURL);
292
293 return connector.GetFolderContent(userID, folderID);
294
295 }
296
297 public List<InventoryItemBase> GetFolderItems(UUID userID, UUID folderID)
298 {
299 m_log.Debug("[HG INVENTORY CONNECTOR]: GetFolderItems " + folderID);
300
301 string invURL = GetInventoryServiceURL(userID);
302
303 if (invURL == null) // not there, forward to local inventory connector to resolve
304 return m_LocalGridInventoryService.GetFolderItems(userID, folderID);
305
306 IInventoryService connector = GetConnector(invURL);
307
308 return connector.GetFolderItems(userID, folderID);
309
310 }
311
312 public bool AddFolder(InventoryFolderBase folder)
313 {
314 if (folder == null)
315 return false;
316
317 m_log.Debug("[HG INVENTORY CONNECTOR]: AddFolder " + folder.ID);
318
319 string invURL = GetInventoryServiceURL(folder.Owner);
320
321 if (invURL == null) // not there, forward to local inventory connector to resolve
322 return m_LocalGridInventoryService.AddFolder(folder);
323
324 IInventoryService connector = GetConnector(invURL);
325
326 return connector.AddFolder(folder);
327 }
328
329 public bool UpdateFolder(InventoryFolderBase folder)
330 {
331 if (folder == null)
332 return false;
333
334 m_log.Debug("[HG INVENTORY CONNECTOR]: UpdateFolder " + folder.ID);
335
336 string invURL = GetInventoryServiceURL(folder.Owner);
337
338 if (invURL == null) // not there, forward to local inventory connector to resolve
339 return m_LocalGridInventoryService.UpdateFolder(folder);
340
341 IInventoryService connector = GetConnector(invURL);
342
343 return connector.UpdateFolder(folder);
344 }
345
346 public bool DeleteFolders(UUID ownerID, List<UUID> folderIDs)
347 {
348 if (folderIDs == null)
349 return false;
350 if (folderIDs.Count == 0)
351 return false;
352
353 m_log.Debug("[HG INVENTORY CONNECTOR]: DeleteFolders for " + ownerID);
354
355 string invURL = GetInventoryServiceURL(ownerID);
356
357 if (invURL == null) // not there, forward to local inventory connector to resolve
358 return m_LocalGridInventoryService.DeleteFolders(ownerID, folderIDs);
359
360 IInventoryService connector = GetConnector(invURL);
361
362 return connector.DeleteFolders(ownerID, folderIDs);
363 }
364
365 public bool MoveFolder(InventoryFolderBase folder)
366 {
367 if (folder == null)
368 return false;
369
370 m_log.Debug("[HG INVENTORY CONNECTOR]: MoveFolder for " + folder.Owner);
371
372 string invURL = GetInventoryServiceURL(folder.Owner);
373
374 if (invURL == null) // not there, forward to local inventory connector to resolve
375 return m_LocalGridInventoryService.MoveFolder(folder);
376
377 IInventoryService connector = GetConnector(invURL);
378
379 return connector.MoveFolder(folder);
380 }
381
382 public bool PurgeFolder(InventoryFolderBase folder)
383 {
384 if (folder == null)
385 return false;
386
387 m_log.Debug("[HG INVENTORY CONNECTOR]: PurgeFolder for " + folder.Owner);
388
389 string invURL = GetInventoryServiceURL(folder.Owner);
390
391 if (invURL == null) // not there, forward to local inventory connector to resolve
392 return m_LocalGridInventoryService.PurgeFolder(folder);
393
394 IInventoryService connector = GetConnector(invURL);
395
396 return connector.PurgeFolder(folder);
397 }
398
399 public bool AddItem(InventoryItemBase item)
400 {
401 if (item == null)
402 return false;
403
404 m_log.Debug("[HG INVENTORY CONNECTOR]: AddItem " + item.ID);
405
406 string invURL = GetInventoryServiceURL(item.Owner);
407
408 if (invURL == null) // not there, forward to local inventory connector to resolve
409 return m_LocalGridInventoryService.AddItem(item);
410
411 IInventoryService connector = GetConnector(invURL);
412
413 return connector.AddItem(item);
414 }
415
416 public bool UpdateItem(InventoryItemBase item)
417 {
418 if (item == null)
419 return false;
420
421 m_log.Debug("[HG INVENTORY CONNECTOR]: UpdateItem " + item.ID);
422
423 string invURL = GetInventoryServiceURL(item.Owner);
424
425 if (invURL == null) // not there, forward to local inventory connector to resolve
426 return m_LocalGridInventoryService.UpdateItem(item);
427
428 IInventoryService connector = GetConnector(invURL);
429
430 return connector.UpdateItem(item);
431 }
432
433 public bool MoveItems(UUID ownerID, List<InventoryItemBase> items)
434 {
435 if (items == null)
436 return false;
437 if (items.Count == 0)
438 return true;
439
440 m_log.Debug("[HG INVENTORY CONNECTOR]: MoveItems for " + ownerID);
441
442 string invURL = GetInventoryServiceURL(ownerID);
443
444 if (invURL == null) // not there, forward to local inventory connector to resolve
445 return m_LocalGridInventoryService.MoveItems(ownerID, items);
446
447 IInventoryService connector = GetConnector(invURL);
448
449 return connector.MoveItems(ownerID, items);
450 }
451
452 public bool DeleteItems(UUID ownerID, List<UUID> itemIDs)
453 {
454 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Delete {0} items for user {1}", itemIDs.Count, ownerID);
455
456 if (itemIDs == null)
457 return false;
458 if (itemIDs.Count == 0)
459 return true;
460
461 m_log.Debug("[HG INVENTORY CONNECTOR]: DeleteItems for " + ownerID);
462
463 string invURL = GetInventoryServiceURL(ownerID);
464
465 if (invURL == null) // not there, forward to local inventory connector to resolve
466 return m_LocalGridInventoryService.DeleteItems(ownerID, itemIDs);
467
468 IInventoryService connector = GetConnector(invURL);
469
470 return connector.DeleteItems(ownerID, itemIDs);
471 }
472
473 public InventoryItemBase GetItem(InventoryItemBase item)
474 {
475 if (item == null)
476 return null;
477 m_log.Debug("[HG INVENTORY CONNECTOR]: GetItem " + item.ID);
478
479 string invURL = GetInventoryServiceURL(item.Owner);
480
481 if (invURL == null) // not there, forward to local inventory connector to resolve
482 return m_LocalGridInventoryService.GetItem(item);
483
484 IInventoryService connector = GetConnector(invURL);
485
486 return connector.GetItem(item);
487 }
488
489 public InventoryFolderBase GetFolder(InventoryFolderBase folder)
490 {
491 if (folder == null)
492 return null;
493
494 m_log.Debug("[HG INVENTORY CONNECTOR]: GetFolder " + folder.ID);
495
496 string invURL = GetInventoryServiceURL(folder.Owner);
497
498 if (invURL == null) // not there, forward to local inventory connector to resolve
499 return m_LocalGridInventoryService.GetFolder(folder);
500
501 IInventoryService connector = GetConnector(invURL);
502
503 return connector.GetFolder(folder);
504 }
505
506 public bool HasInventoryForUser(UUID userID)
507 {
508 return false;
509 }
510
511 public List<InventoryItemBase> GetActiveGestures(UUID userId)
512 {
513 return new List<InventoryItemBase>();
514 }
515
516 public int GetAssetPermissions(UUID userID, UUID assetID)
517 {
518 m_log.Debug("[HG INVENTORY CONNECTOR]: GetAssetPermissions " + assetID);
519
520 string invURL = GetInventoryServiceURL(userID);
521
522 if (invURL == null) // not there, forward to local inventory connector to resolve
523 return m_LocalGridInventoryService.GetAssetPermissions(userID, assetID);
524
525 IInventoryService connector = GetConnector(invURL);
526
527 return connector.GetAssetPermissions(userID, assetID);
528 }
529
530 #endregion
531
532 private IInventoryService GetConnector(string url)
533 {
534 IInventoryService connector = null;
535 lock (m_connectors)
536 {
537 if (m_connectors.ContainsKey(url))
538 {
539 connector = m_connectors[url];
540 }
541 else
542 {
543 // We're instantiating this class explicitly, but this won't
544 // work in general, because the remote grid may be running
545 // an inventory server that has a different protocol.
546 // Eventually we will want a piece of protocol asking
547 // the remote server about its kind. Definitely cool thing to do!
548 connector = new RemoteXInventoryServicesConnector(url);
549 m_connectors.Add(url, connector);
550 }
551 }
552 return connector;
553 }
554
555 }
556}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs
index a2f26d5..22bd04c 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs
@@ -41,7 +41,7 @@ using OpenMetaverse;
41 41
42namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory 42namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
43{ 43{
44 public class LocalInventoryServicesConnector : BaseInventoryConnector, ISharedRegionModule, IInventoryService 44 public class LocalInventoryServicesConnector : ISharedRegionModule, IInventoryService
45 { 45 {
46 private static readonly ILog m_log = 46 private static readonly ILog m_log =
47 LogManager.GetLogger( 47 LogManager.GetLogger(
@@ -50,7 +50,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
50 private IInventoryService m_InventoryService; 50 private IInventoryService m_InventoryService;
51 51
52 private bool m_Enabled = false; 52 private bool m_Enabled = false;
53 private bool m_Initialized = false;
54 53
55 public Type ReplaceableInterface 54 public Type ReplaceableInterface
56 { 55 {
@@ -93,23 +92,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
93 if (m_InventoryService == null) 92 if (m_InventoryService == null)
94 { 93 {
95 m_log.Error("[LOCAL INVENTORY SERVICES CONNECTOR]: Can't load inventory service"); 94 m_log.Error("[LOCAL INVENTORY SERVICES CONNECTOR]: Can't load inventory service");
96 //return;
97 throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's"); 95 throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's");
98 } 96 }
99 97
100 //List<IInventoryDataPlugin> plugins
101 // = DataPluginFactory.LoadDataPlugins<IInventoryDataPlugin>(
102 // configSettings.StandaloneInventoryPlugin,
103 // configSettings.StandaloneInventorySource);
104
105 //foreach (IInventoryDataPlugin plugin in plugins)
106 //{
107 // // Using the OSP wrapper plugin for database plugins should be made configurable at some point
108 // m_InventoryService.AddPlugin(new OspInventoryWrapperPlugin(plugin, this));
109 //}
110
111 Init(source);
112
113 m_Enabled = true; 98 m_Enabled = true;
114 m_log.Info("[LOCAL INVENTORY SERVICES CONNECTOR]: Local inventory connector enabled"); 99 m_log.Info("[LOCAL INVENTORY SERVICES CONNECTOR]: Local inventory connector enabled");
115 } 100 }
@@ -128,99 +113,60 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
128 { 113 {
129 if (!m_Enabled) 114 if (!m_Enabled)
130 return; 115 return;
131
132 if (!m_Initialized)
133 {
134 m_Initialized = true;
135 }
136
137// m_log.DebugFormat(
138// "[LOCAL INVENTORY SERVICES CONNECTOR]: Registering IInventoryService to scene {0}", scene.RegionInfo.RegionName);
139 116
140 scene.RegisterModuleInterface<IInventoryService>(this); 117 scene.RegisterModuleInterface<IInventoryService>(this);
141 m_cache.AddRegion(scene);
142 } 118 }
143 119
144 public void RemoveRegion(Scene scene) 120 public void RemoveRegion(Scene scene)
145 { 121 {
146 if (!m_Enabled) 122 if (!m_Enabled)
147 return; 123 return;
148
149 m_cache.RemoveRegion(scene);
150 } 124 }
151 125
152 public void RegionLoaded(Scene scene) 126 public void RegionLoaded(Scene scene)
153 { 127 {
154 if (!m_Enabled) 128 if (!m_Enabled)
155 return; 129 return;
156
157 m_log.InfoFormat(
158 "[LOCAL INVENTORY SERVICES CONNECTOR]: Enabled local inventory for region {0}", scene.RegionInfo.RegionName);
159 } 130 }
160 131
161 #region IInventoryService 132 #region IInventoryService
162 133
163 public override bool CreateUserInventory(UUID user) 134 public bool CreateUserInventory(UUID user)
164 { 135 {
165 return m_InventoryService.CreateUserInventory(user); 136 return m_InventoryService.CreateUserInventory(user);
166 } 137 }
167 138
168 public override List<InventoryFolderBase> GetInventorySkeleton(UUID userId) 139 public List<InventoryFolderBase> GetInventorySkeleton(UUID userId)
169 { 140 {
170 return m_InventoryService.GetInventorySkeleton(userId); 141 return m_InventoryService.GetInventorySkeleton(userId);
171 } 142 }
172 143
173 public override InventoryCollection GetUserInventory(UUID id) 144 public InventoryCollection GetUserInventory(UUID id)
174 { 145 {
175 return m_InventoryService.GetUserInventory(id); 146 return m_InventoryService.GetUserInventory(id);
176 } 147 }
177 148
178 public override void GetUserInventory(UUID userID, InventoryReceiptCallback callback) 149 public void GetUserInventory(UUID userID, InventoryReceiptCallback callback)
179 { 150 {
180 m_InventoryService.GetUserInventory(userID, callback); 151 m_InventoryService.GetUserInventory(userID, callback);
181 } 152 }
182 153
183 // Inherited. See base 154 public InventoryFolderBase GetRootFolder(UUID userID)
184 //public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
185 //{
186 // return m_InventoryService.GetFolderForType(userID, type);
187 //}
188
189 public override Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(UUID userID)
190 { 155 {
191 InventoryFolderBase root = m_InventoryService.GetRootFolder(userID); 156 return m_InventoryService.GetRootFolder(userID);
192 if (root != null) 157 }
193 {
194 InventoryCollection content = GetFolderContent(userID, root.ID);
195 if (content != null)
196 {
197 Dictionary<AssetType, InventoryFolderBase> folders = new Dictionary<AssetType, InventoryFolderBase>();
198 foreach (InventoryFolderBase folder in content.Folders)
199 {
200 if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown))
201 {
202 //m_log.InfoFormat("[INVENTORY CONNECTOR]: folder type {0} ", folder.Type);
203 folders[(AssetType)folder.Type] = folder;
204 }
205 }
206 // Put the root folder there, as type Folder
207 folders[AssetType.Folder] = root;
208 //m_log.InfoFormat("[INVENTORY CONNECTOR]: root folder is type {0} ", root.Type);
209 158
210 return folders; 159 public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
211 } 160 {
212 } 161 return m_InventoryService.GetFolderForType(userID, type);
213 m_log.WarnFormat("[LOCAL INVENTORY SERVICES CONNECTOR]: System folders for {0} not found", userID);
214 return new Dictionary<AssetType, InventoryFolderBase>();
215 } 162 }
216 163
217 public override InventoryCollection GetFolderContent(UUID userID, UUID folderID) 164 public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
218 { 165 {
219 return m_InventoryService.GetFolderContent(userID, folderID); 166 return m_InventoryService.GetFolderContent(userID, folderID);
220 } 167 }
221 168
222 169 public List<InventoryItemBase> GetFolderItems(UUID userID, UUID folderID)
223 public override List<InventoryItemBase> GetFolderItems(UUID userID, UUID folderID)
224 { 170 {
225 return m_InventoryService.GetFolderItems(userID, folderID); 171 return m_InventoryService.GetFolderItems(userID, folderID);
226 } 172 }
@@ -230,7 +176,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
230 /// </summary> 176 /// </summary>
231 /// <param name="folder"></param> 177 /// <param name="folder"></param>
232 /// <returns>true if the folder was successfully added</returns> 178 /// <returns>true if the folder was successfully added</returns>
233 public override bool AddFolder(InventoryFolderBase folder) 179 public bool AddFolder(InventoryFolderBase folder)
234 { 180 {
235 return m_InventoryService.AddFolder(folder); 181 return m_InventoryService.AddFolder(folder);
236 } 182 }
@@ -240,7 +186,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
240 /// </summary> 186 /// </summary>
241 /// <param name="folder"></param> 187 /// <param name="folder"></param>
242 /// <returns>true if the folder was successfully updated</returns> 188 /// <returns>true if the folder was successfully updated</returns>
243 public override bool UpdateFolder(InventoryFolderBase folder) 189 public bool UpdateFolder(InventoryFolderBase folder)
244 { 190 {
245 return m_InventoryService.UpdateFolder(folder); 191 return m_InventoryService.UpdateFolder(folder);
246 } 192 }
@@ -250,12 +196,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
250 /// </summary> 196 /// </summary>
251 /// <param name="folder">A folder containing the details of the new location</param> 197 /// <param name="folder">A folder containing the details of the new location</param>
252 /// <returns>true if the folder was successfully moved</returns> 198 /// <returns>true if the folder was successfully moved</returns>
253 public override bool MoveFolder(InventoryFolderBase folder) 199 public bool MoveFolder(InventoryFolderBase folder)
254 { 200 {
255 return m_InventoryService.MoveFolder(folder); 201 return m_InventoryService.MoveFolder(folder);
256 } 202 }
257 203
258 public override bool DeleteFolders(UUID ownerID, List<UUID> folderIDs) 204 public bool DeleteFolders(UUID ownerID, List<UUID> folderIDs)
259 { 205 {
260 return m_InventoryService.DeleteFolders(ownerID, folderIDs); 206 return m_InventoryService.DeleteFolders(ownerID, folderIDs);
261 } 207 }
@@ -265,18 +211,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
265 /// </summary> 211 /// </summary>
266 /// <param name="folder"></param> 212 /// <param name="folder"></param>
267 /// <returns>true if the folder was successfully purged</returns> 213 /// <returns>true if the folder was successfully purged</returns>
268 public override bool PurgeFolder(InventoryFolderBase folder) 214 public bool PurgeFolder(InventoryFolderBase folder)
269 { 215 {
270 return m_InventoryService.PurgeFolder(folder); 216 return m_InventoryService.PurgeFolder(folder);
271 } 217 }
272 218
273 /// <summary> 219 /// <summary>
274 /// Add a new item to the user's inventory, plain 220 /// Add a new item to the user's inventory
275 /// Called by base class AddItem
276 /// </summary> 221 /// </summary>
277 /// <param name="item"></param> 222 /// <param name="item"></param>
278 /// <returns>true if the item was successfully added</returns> 223 /// <returns>true if the item was successfully added</returns>
279 protected override bool AddItemPlain(InventoryItemBase item) 224 public bool AddItem(InventoryItemBase item)
280 { 225 {
281 return m_InventoryService.AddItem(item); 226 return m_InventoryService.AddItem(item);
282 } 227 }
@@ -286,13 +231,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
286 /// </summary> 231 /// </summary>
287 /// <param name="item"></param> 232 /// <param name="item"></param>
288 /// <returns>true if the item was successfully updated</returns> 233 /// <returns>true if the item was successfully updated</returns>
289 public override bool UpdateItem(InventoryItemBase item) 234 public bool UpdateItem(InventoryItemBase item)
290 { 235 {
291 return m_InventoryService.UpdateItem(item); 236 return m_InventoryService.UpdateItem(item);
292 } 237 }
293 238
294 239
295 public override bool MoveItems(UUID ownerID, List<InventoryItemBase> items) 240 public bool MoveItems(UUID ownerID, List<InventoryItemBase> items)
296 { 241 {
297 return m_InventoryService.MoveItems(ownerID, items); 242 return m_InventoryService.MoveItems(ownerID, items);
298 } 243 }
@@ -302,12 +247,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
302 /// </summary> 247 /// </summary>
303 /// <param name="item"></param> 248 /// <param name="item"></param>
304 /// <returns>true if the item was successfully deleted</returns> 249 /// <returns>true if the item was successfully deleted</returns>
305 public override bool DeleteItems(UUID ownerID, List<UUID> itemIDs) 250 public bool DeleteItems(UUID ownerID, List<UUID> itemIDs)
306 { 251 {
307 return m_InventoryService.DeleteItems(ownerID, itemIDs); 252 return m_InventoryService.DeleteItems(ownerID, itemIDs);
308 } 253 }
309 254
310 public override InventoryItemBase GetItem(InventoryItemBase item) 255 public InventoryItemBase GetItem(InventoryItemBase item)
311 { 256 {
312// m_log.DebugFormat("[LOCAL INVENTORY SERVICES CONNECTOR]: Requesting inventory item {0}", item.ID); 257// m_log.DebugFormat("[LOCAL INVENTORY SERVICES CONNECTOR]: Requesting inventory item {0}", item.ID);
313 258
@@ -322,7 +267,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
322 return item; 267 return item;
323 } 268 }
324 269
325 public override InventoryFolderBase GetFolder(InventoryFolderBase folder) 270 public InventoryFolderBase GetFolder(InventoryFolderBase folder)
326 { 271 {
327 return m_InventoryService.GetFolder(folder); 272 return m_InventoryService.GetFolder(folder);
328 } 273 }
@@ -332,17 +277,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
332 /// </summary> 277 /// </summary>
333 /// <param name="userID"></param> 278 /// <param name="userID"></param>
334 /// <returns></returns> 279 /// <returns></returns>
335 public override bool HasInventoryForUser(UUID userID) 280 public bool HasInventoryForUser(UUID userID)
336 { 281 {
337 return m_InventoryService.HasInventoryForUser(userID); 282 return m_InventoryService.HasInventoryForUser(userID);
338 } 283 }
339 284
340 public override List<InventoryItemBase> GetActiveGestures(UUID userId) 285 public List<InventoryItemBase> GetActiveGestures(UUID userId)
341 { 286 {
342 return m_InventoryService.GetActiveGestures(userId); 287 return m_InventoryService.GetActiveGestures(userId);
343 } 288 }
344 289
345 public override int GetAssetPermissions(UUID userID, UUID assetID) 290 public int GetAssetPermissions(UUID userID, UUID assetID)
346 { 291 {
347 return m_InventoryService.GetAssetPermissions(userID, assetID); 292 return m_InventoryService.GetAssetPermissions(userID, assetID);
348 } 293 }
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs
index 56b50dc..a1a4f9e 100644
--- a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs
+++ b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs
@@ -135,7 +135,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
135 data.Y = 0; 135 data.Y = 0;
136 blocks.Add(data); 136 blocks.Add(data);
137 137
138 remoteClient.SendMapBlock(blocks, 0); 138 remoteClient.SendMapBlock(blocks, 2);
139 } 139 }
140 140
141 private Scene GetClientScene(IClientAPI client) 141 private Scene GetClientScene(IClientAPI client)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 8ceb109..3e78a08 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -4556,6 +4556,7 @@ namespace OpenSim.Region.Framework.Scenes
4556 foreach (SceneObjectPart child in partList) 4556 foreach (SceneObjectPart child in partList)
4557 { 4557 {
4558 child.Inventory.ChangeInventoryOwner(remoteClient.AgentId); 4558 child.Inventory.ChangeInventoryOwner(remoteClient.AgentId);
4559 child.TriggerScriptChangedEvent(Changed.OWNER);
4559 child.ApplyNextOwnerPermissions(); 4560 child.ApplyNextOwnerPermissions();
4560 } 4561 }
4561 } 4562 }
@@ -4565,6 +4566,8 @@ namespace OpenSim.Region.Framework.Scenes
4565 4566
4566 group.HasGroupChanged = true; 4567 group.HasGroupChanged = true;
4567 part.GetProperties(remoteClient); 4568 part.GetProperties(remoteClient);
4569 part.TriggerScriptChangedEvent(Changed.OWNER);
4570 group.ResumeScripts();
4568 part.ScheduleFullUpdate(); 4571 part.ScheduleFullUpdate();
4569 4572
4570 break; 4573 break;
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index bc3225a..64282d1 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -1082,12 +1082,11 @@ namespace OpenSim.Region.Framework.Scenes
1082 item.CurrentPermissions &= ~(uint)PermissionMask.Modify; 1082 item.CurrentPermissions &= ~(uint)PermissionMask.Modify;
1083 item.CurrentPermissions |= 8; 1083 item.CurrentPermissions |= 8;
1084 } 1084 }
1085 item.OwnerChanged = true;
1085 item.CurrentPermissions &= item.NextPermissions; 1086 item.CurrentPermissions &= item.NextPermissions;
1086 item.BasePermissions &= item.NextPermissions; 1087 item.BasePermissions &= item.NextPermissions;
1087 item.EveryonePermissions &= item.NextPermissions; 1088 item.EveryonePermissions &= item.NextPermissions;
1088 } 1089 }
1089
1090 m_part.TriggerScriptChangedEvent(Changed.OWNER);
1091 } 1090 }
1092 1091
1093 public void ApplyGodPermissions(uint perms) 1092 public void ApplyGodPermissions(uint perms)
@@ -1180,7 +1179,10 @@ namespace OpenSim.Region.Framework.Scenes
1180 foreach (IScriptModule engine in engines) 1179 foreach (IScriptModule engine in engines)
1181 { 1180 {
1182 if (engine != null) 1181 if (engine != null)
1182 {
1183 engine.PostScriptEvent(item.ItemID, "changed", new Object[] { Changed.OWNER });
1183 engine.ResumeScript(item.ItemID); 1184 engine.ResumeScript(item.ItemID);
1185 }
1184 } 1186 }
1185 } 1187 }
1186 } 1188 }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index b3e4740..96f6486 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
@@ -549,5 +549,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
549 public const int STATS_ACTIVE_SCRIPTS = 19; 549 public const int STATS_ACTIVE_SCRIPTS = 19;
550 public const int STATS_SCRIPT_LPS = 20; 550 public const int STATS_SCRIPT_LPS = 20;
551 551
552 public const string URL_REQUEST_GRANTED = "URL_REQUEST_GRANTED";
553 public const string URL_REQUEST_DENIED = "URL_REQUEST_DENIED";
552 } 554 }
553} 555}