aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules')
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs39
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs115
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs2
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs4
-rw-r--r--OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs25
-rw-r--r--OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs5
-rw-r--r--OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs62
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs63
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs57
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs19
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs768
-rw-r--r--OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs10
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs74
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs17
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs15
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs5
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs18
-rw-r--r--OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs37
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs351
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandObject.cs39
-rw-r--r--OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs2
-rw-r--r--OpenSim/Region/CoreModules/World/Region/RestartModule.cs35
-rw-r--r--OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs2
-rw-r--r--OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs4
24 files changed, 1311 insertions, 457 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 1f49a01..f924b30 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -28,6 +28,7 @@
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Reflection; 30using System.Reflection;
31using System.Xml;
31using log4net; 32using log4net;
32using Mono.Addins; 33using Mono.Addins;
33using Nini.Config; 34using Nini.Config;
@@ -228,15 +229,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
228 public UUID RezSingleAttachmentFromInventory( 229 public UUID RezSingleAttachmentFromInventory(
229 IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus) 230 IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus)
230 { 231 {
231 m_log.DebugFormat( 232 return RezSingleAttachmentFromInventory(remoteClient, itemID, AttachmentPt, true, null);
232 "[ATTACHMENTS MODULE]: Rezzing attachment to point {0} from item {1} for {2}", 233 }
233 (AttachmentPoint)AttachmentPt, itemID, remoteClient.Name); 234
234 235 public UUID RezSingleAttachmentFromInventory(
236 IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc)
237 {
235 // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should 238 // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should
236 // be removed when that functionality is implemented in opensim 239 // be removed when that functionality is implemented in opensim
237 AttachmentPt &= 0x7f; 240 AttachmentPt &= 0x7f;
238 241
239 SceneObjectGroup att = RezSingleAttachmentFromInventoryInternal(remoteClient, itemID, AttachmentPt); 242 SceneObjectGroup att = RezSingleAttachmentFromInventoryInternal(remoteClient, itemID, AttachmentPt, doc);
240 243
241 if (updateInventoryStatus) 244 if (updateInventoryStatus)
242 { 245 {
@@ -253,7 +256,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
253 } 256 }
254 257
255 protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal( 258 protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal(
256 IClientAPI remoteClient, UUID itemID, uint AttachmentPt) 259 IClientAPI remoteClient, UUID itemID, uint AttachmentPt, XmlDocument doc)
257 { 260 {
258 IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>(); 261 IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
259 if (invAccess != null) 262 if (invAccess != null)
@@ -291,13 +294,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
291 if (tainted) 294 if (tainted)
292 objatt.HasGroupChanged = true; 295 objatt.HasGroupChanged = true;
293 296
297 if (doc != null)
298 {
299 objatt.LoadScriptState(doc);
300 objatt.ResetOwnerChangeFlag();
301 }
302
294 // Fire after attach, so we don't get messy perms dialogs 303 // Fire after attach, so we don't get messy perms dialogs
295 // 4 == AttachedRez 304 // 4 == AttachedRez
296 objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 4); 305 objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 4);
297 objatt.ResumeScripts(); 306 objatt.ResumeScripts();
298 307
299 // Do this last so that event listeners have access to all the effects of the attachment 308 // Do this last so that event listeners have access to all the effects of the attachment
300 m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, remoteClient.AgentId); 309 //m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, remoteClient.AgentId);
301 } 310 }
302 else 311 else
303 { 312 {
@@ -334,9 +343,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
334 if (m_scene.TryGetScenePresence(remoteClient.AgentId, out presence)) 343 if (m_scene.TryGetScenePresence(remoteClient.AgentId, out presence))
335 { 344 {
336 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); 345 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
337 item = m_scene.InventoryService.GetItem(item); 346 if (m_scene.InventoryService != null)
347 item = m_scene.InventoryService.GetItem(item);
338 348
339 presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/); 349 if (presence.Appearance != null)
350 presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/);
340 } 351 }
341 352
342 return att.UUID; 353 return att.UUID;
@@ -379,6 +390,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
379 { 390 {
380 // XXYY!! 391 // XXYY!!
381 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); 392 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
393 if (item == null)
394 m_log.Error("[ATTACHMENT]: item == null");
395 if (m_scene == null)
396 m_log.Error("[ATTACHMENT]: m_scene == null");
397 if (m_scene.InventoryService == null)
398 m_log.Error("[ATTACHMENT]: m_scene.InventoryService == null");
382 item = m_scene.InventoryService.GetItem(item); 399 item = m_scene.InventoryService.GetItem(item);
383 presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */); 400 presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */);
384 401
@@ -467,6 +484,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
467 if (group.GetFromItemID() == itemID) 484 if (group.GetFromItemID() == itemID)
468 { 485 {
469 m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero); 486 m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero);
487 // CM / XMREngine!!!! Needed to conclude attach event
488 //SceneObjectSerializer.ToOriginalXmlFormat(group);
470 group.DetachToInventoryPrep(); 489 group.DetachToInventoryPrep();
471 m_log.Debug("[ATTACHMENTS MODULE]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString()); 490 m_log.Debug("[ATTACHMENTS MODULE]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString());
472 491
@@ -593,7 +612,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
593 // 612 //
594 if (so.IsSelected) 613 if (so.IsSelected)
595 { 614 {
596 m_scene.SendKillObject(so.RootPart.LocalId); 615 m_scene.SendKillObject(new List<uint> { so.RootPart.LocalId });
597 } 616 }
598 617
599 so.IsSelected = false; // fudge.... 618 so.IsSelected = false; // fudge....
diff --git a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs
index 4359c01..35a3f43 100644
--- a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs
@@ -49,7 +49,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
49 private int m_shoutdistance = 100; 49 private int m_shoutdistance = 100;
50 private int m_whisperdistance = 10; 50 private int m_whisperdistance = 10;
51 private List<Scene> m_scenes = new List<Scene>(); 51 private List<Scene> m_scenes = new List<Scene>();
52 52 private List<string> FreezeCache = new List<string>();
53 private string m_adminPrefix = "";
53 internal object m_syncy = new object(); 54 internal object m_syncy = new object();
54 55
55 internal IConfig m_config; 56 internal IConfig m_config;
@@ -76,6 +77,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
76 m_whisperdistance = config.Configs["Chat"].GetInt("whisper_distance", m_whisperdistance); 77 m_whisperdistance = config.Configs["Chat"].GetInt("whisper_distance", m_whisperdistance);
77 m_saydistance = config.Configs["Chat"].GetInt("say_distance", m_saydistance); 78 m_saydistance = config.Configs["Chat"].GetInt("say_distance", m_saydistance);
78 m_shoutdistance = config.Configs["Chat"].GetInt("shout_distance", m_shoutdistance); 79 m_shoutdistance = config.Configs["Chat"].GetInt("shout_distance", m_shoutdistance);
80 m_adminPrefix = config.Configs["Chat"].GetString("admin_prefix", "");
79 } 81 }
80 82
81 public virtual void AddRegion(Scene scene) 83 public virtual void AddRegion(Scene scene)
@@ -171,7 +173,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
171 return; 173 return;
172 } 174 }
173 175
174 DeliverChatToAvatars(ChatSourceType.Agent, c); 176 if (FreezeCache.Contains(c.Sender.AgentId.ToString()))
177 {
178 if (c.Type != ChatTypeEnum.StartTyping || c.Type != ChatTypeEnum.StopTyping)
179 c.Sender.SendAgentAlertMessage("You may not talk as you are frozen.", false);
180 }
181 else
182 {
183 DeliverChatToAvatars(ChatSourceType.Agent, c);
184 }
175 } 185 }
176 186
177 public virtual void OnChatFromWorld(Object sender, OSChatMessage c) 187 public virtual void OnChatFromWorld(Object sender, OSChatMessage c)
@@ -185,6 +195,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
185 protected virtual void DeliverChatToAvatars(ChatSourceType sourceType, OSChatMessage c) 195 protected virtual void DeliverChatToAvatars(ChatSourceType sourceType, OSChatMessage c)
186 { 196 {
187 string fromName = c.From; 197 string fromName = c.From;
198 string fromNamePrefix = "";
188 UUID fromID = UUID.Zero; 199 UUID fromID = UUID.Zero;
189 string message = c.Message; 200 string message = c.Message;
190 IScene scene = c.Scene; 201 IScene scene = c.Scene;
@@ -207,7 +218,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
207 fromPos = avatar.AbsolutePosition; 218 fromPos = avatar.AbsolutePosition;
208 fromName = avatar.Name; 219 fromName = avatar.Name;
209 fromID = c.Sender.AgentId; 220 fromID = c.Sender.AgentId;
210 221 if (avatar.GodLevel >= 200)
222 {
223 fromNamePrefix = m_adminPrefix;
224 }
211 break; 225 break;
212 226
213 case ChatSourceType.Object: 227 case ChatSourceType.Object:
@@ -231,8 +245,20 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
231 s.ForEachScenePresence( 245 s.ForEachScenePresence(
232 delegate(ScenePresence presence) 246 delegate(ScenePresence presence)
233 { 247 {
234 if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromName, c.Type, message, sourceType)) 248 ILandObject Presencecheck = s.LandChannel.GetLandObject(presence.AbsolutePosition.X, presence.AbsolutePosition.Y);
235 receiverIDs.Add(presence.UUID); 249 if (Presencecheck != null)
250 {
251 // This will pass all chat from objects. Not
252 // perfect, but it will do. For now. Better
253 // than the prior behavior of muting all
254 // objects on a parcel with access restrictions
255 if (c.Sender == null || Presencecheck.IsEitherBannedOrRestricted(c.Sender.AgentId) != true)
256 {
257 if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromNamePrefix + fromName, c.Type, message, sourceType))
258 receiverIDs.Add(presence.UUID);
259 }
260 }
261
236 } 262 }
237 ); 263 );
238 } 264 }
@@ -276,31 +302,34 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
276 } 302 }
277 303
278 // m_log.DebugFormat("[CHAT] Broadcast: fromID {0} fromName {1}, cType {2}, sType {3}", fromID, fromName, cType, sourceType); 304 // m_log.DebugFormat("[CHAT] Broadcast: fromID {0} fromName {1}, cType {2}, sType {3}", fromID, fromName, cType, sourceType);
279
280 HashSet<UUID> receiverIDs = new HashSet<UUID>(); 305 HashSet<UUID> receiverIDs = new HashSet<UUID>();
281 306
282 ((Scene)c.Scene).ForEachScenePresence( 307 if (c.Scene != null)
283 delegate(ScenePresence presence) 308 {
284 { 309 ((Scene)c.Scene).ForEachScenePresence
285 // ignore chat from child agents 310 (
286 if (presence.IsChildAgent) return; 311 delegate(ScenePresence presence)
287 312 {
288 IClientAPI client = presence.ControllingClient; 313 // ignore chat from child agents
289 314 if (presence.IsChildAgent) return;
290 // don't forward SayOwner chat from objects to 315
291 // non-owner agents 316 IClientAPI client = presence.ControllingClient;
292 if ((c.Type == ChatTypeEnum.Owner) && 317
293 (null != c.SenderObject) && 318 // don't forward SayOwner chat from objects to
294 (((SceneObjectPart)c.SenderObject).OwnerID != client.AgentId)) 319 // non-owner agents
295 return; 320 if ((c.Type == ChatTypeEnum.Owner) &&
296 321 (null != c.SenderObject) &&
297 client.SendChatMessage(c.Message, (byte)cType, CenterOfRegion, fromName, fromID, 322 (((SceneObjectPart)c.SenderObject).OwnerID != client.AgentId))
298 (byte)sourceType, (byte)ChatAudibleLevel.Fully); 323 return;
299 receiverIDs.Add(presence.UUID); 324
300 }); 325 client.SendChatMessage(c.Message, (byte)cType, CenterOfRegion, fromName, fromID,
301 326 (byte)sourceType, (byte)ChatAudibleLevel.Fully);
302 (c.Scene as Scene).EventManager.TriggerOnChatToClients( 327 receiverIDs.Add(presence.UUID);
303 fromID, receiverIDs, c.Message, cType, CenterOfRegion, fromName, sourceType, ChatAudibleLevel.Fully); 328 }
329 );
330 (c.Scene as Scene).EventManager.TriggerOnChatToClients(
331 fromID, receiverIDs, c.Message, cType, CenterOfRegion, fromName, sourceType, ChatAudibleLevel.Fully);
332 }
304 } 333 }
305 334
306 /// <summary> 335 /// <summary>
@@ -343,5 +372,35 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
343 372
344 return true; 373 return true;
345 } 374 }
375
376 Dictionary<UUID, System.Threading.Timer> Timers = new Dictionary<UUID, System.Threading.Timer>();
377 public void ParcelFreezeUser(IClientAPI client, UUID parcelowner, uint flags, UUID target)
378 {
379 System.Threading.Timer Timer;
380 if (flags == 0)
381 {
382 FreezeCache.Add(target.ToString());
383 System.Threading.TimerCallback timeCB = new System.Threading.TimerCallback(OnEndParcelFrozen);
384 Timer = new System.Threading.Timer(timeCB, target, 30000, 0);
385 Timers.Add(target, Timer);
386 }
387 else
388 {
389 FreezeCache.Remove(target.ToString());
390 Timers.TryGetValue(target, out Timer);
391 Timers.Remove(target);
392 Timer.Dispose();
393 }
394 }
395
396 private void OnEndParcelFrozen(object avatar)
397 {
398 UUID target = (UUID)avatar;
399 FreezeCache.Remove(target.ToString());
400 System.Threading.Timer Timer;
401 Timers.TryGetValue(target, out Timer);
402 Timers.Remove(target);
403 Timer.Dispose();
404 }
346 } 405 }
347} 406}
diff --git a/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs b/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs
index 2b3d2a9..a514a83 100644
--- a/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs
@@ -239,4 +239,4 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog
239 return result; 239 return result;
240 } 240 }
241 } 241 }
242} \ No newline at end of file 242}
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
index b3f0a25..45c3f49 100644
--- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
@@ -273,7 +273,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
273 273
274 // Inform the friends that this user is online 274 // Inform the friends that this user is online
275 StatusChange(agentID, true); 275 StatusChange(agentID, true);
276 276
277 // Register that we need to send the list of online friends to this user 277 // Register that we need to send the list of online friends to this user
278 lock (m_NeedsListOfFriends) 278 lock (m_NeedsListOfFriends)
279 m_NeedsListOfFriends.Add(agentID); 279 m_NeedsListOfFriends.Add(agentID);
@@ -701,7 +701,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
701 // we're done 701 // we're done
702 return true; 702 return true;
703 } 703 }
704 704
705 return false; 705 return false;
706 } 706 }
707 707
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs
index af39565..347708d 100644
--- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs
@@ -156,6 +156,31 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
156 return; 156 return;
157 } 157 }
158 158
159 DateTime dt = DateTime.UtcNow;
160
161 // Ticks from UtcNow, but make it look like local. Evil, huh?
162 dt = DateTime.SpecifyKind(dt, DateTimeKind.Local);
163
164 try
165 {
166 // Convert that to the PST timezone
167 TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("America/Los_Angeles");
168 dt = TimeZoneInfo.ConvertTime(dt, timeZoneInfo);
169 }
170 catch
171 {
172 //m_log.Info("[OFFLINE MESSAGING]: No PST timezone found on this machine. Saving with local timestamp.");
173 }
174
175 // And make it look local again to fool the unix time util
176 dt = DateTime.SpecifyKind(dt, DateTimeKind.Utc);
177
178 im.timestamp = (uint)Util.ToUnixTime(dt);
179
180 // If client is null, this message comes from storage and IS offline
181 if (client != null)
182 im.offline = 0;
183
159 if (m_TransferModule != null) 184 if (m_TransferModule != null)
160 { 185 {
161 if (client != null) 186 if (client != null)
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
index 918fa04..d8e0f96 100644
--- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
@@ -145,8 +145,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
145 ScenePresence user = (ScenePresence) scene.Entities[toAgentID]; 145 ScenePresence user = (ScenePresence) scene.Entities[toAgentID];
146 if (!user.IsChildAgent) 146 if (!user.IsChildAgent)
147 { 147 {
148 // Local message 148 // m_log.DebugFormat("[INSTANT MESSAGE]: Delivering to client");
149 m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to root agent {0} {1}", user.Name, toAgentID);
150 user.ControllingClient.SendInstantMessage(im); 149 user.ControllingClient.SendInstantMessage(im);
151 150
152 // Message sent 151 // Message sent
@@ -168,7 +167,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
168 // Local message 167 // Local message
169 ScenePresence user = (ScenePresence) scene.Entities[toAgentID]; 168 ScenePresence user = (ScenePresence) scene.Entities[toAgentID];
170 169
171 m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to child agent {0} {1}", user.Name, toAgentID); 170 // m_log.DebugFormat("[INSTANT MESSAGE]: Delivering to client");
172 user.ControllingClient.SendInstantMessage(im); 171 user.ControllingClient.SendInstantMessage(im);
173 172
174 // Message sent 173 // Message sent
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs
index fdfcd10..164ae50 100644
--- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs
@@ -172,13 +172,16 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
172 172
173 private void RetrieveInstantMessages(IClientAPI client) 173 private void RetrieveInstantMessages(IClientAPI client)
174 { 174 {
175 if (m_RestURL != "") 175 if (m_RestURL == String.Empty)
176 { 176 return;
177 m_log.DebugFormat("[OFFLINE MESSAGING] Retrieving stored messages for {0}", client.AgentId);
178 177
179 List<GridInstantMessage> msglist = SynchronousRestObjectPoster.BeginPostObject<UUID, List<GridInstantMessage>>( 178 m_log.DebugFormat("[OFFLINE MESSAGING] Retrieving stored messages for {0}", client.AgentId);
179
180 List<GridInstantMessage> msglist = SynchronousRestObjectPoster.BeginPostObject<UUID, List<GridInstantMessage>>(
180 "POST", m_RestURL + "/RetrieveMessages/", client.AgentId); 181 "POST", m_RestURL + "/RetrieveMessages/", client.AgentId);
181 182
183 if (msglist != null)
184 {
182 foreach (GridInstantMessage im in msglist) 185 foreach (GridInstantMessage im in msglist)
183 { 186 {
184 // client.SendInstantMessage(im); 187 // client.SendInstantMessage(im);
@@ -189,6 +192,9 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
189 // Needed for proper state management for stored group 192 // Needed for proper state management for stored group
190 // invitations 193 // invitations
191 // 194 //
195
196 im.offline = 1;
197
192 Scene s = FindScene(client.AgentId); 198 Scene s = FindScene(client.AgentId);
193 if (s != null) 199 if (s != null)
194 s.EventManager.TriggerIncomingInstantMessage(im); 200 s.EventManager.TriggerIncomingInstantMessage(im);
@@ -198,26 +204,38 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
198 204
199 private void UndeliveredMessage(GridInstantMessage im) 205 private void UndeliveredMessage(GridInstantMessage im)
200 { 206 {
201 if ((im.offline != 0) 207 if (im.dialog != (byte)InstantMessageDialog.MessageFromObject &&
202 && (!im.fromGroup || (im.fromGroup && m_ForwardOfflineGroupMessages))) 208 im.dialog != (byte)InstantMessageDialog.MessageFromAgent &&
209 im.dialog != (byte)InstantMessageDialog.GroupNotice &&
210 im.dialog != (byte)InstantMessageDialog.GroupInvitation &&
211 im.dialog != (byte)InstantMessageDialog.InventoryOffered)
203 { 212 {
204 bool success = SynchronousRestObjectPoster.BeginPostObject<GridInstantMessage, bool>( 213 return;
205 "POST", m_RestURL+"/SaveMessage/", im); 214 }
206 215
207 if (im.dialog == (byte)InstantMessageDialog.MessageFromAgent) 216 // It's not delivered. Make sure the scope id is saved
208 { 217 // We don't need the imSessionID here anymore, overwrite it
209 IClientAPI client = FindClient(new UUID(im.fromAgentID)); 218 Scene scene = FindScene(new UUID(im.fromAgentID));
210 if (client == null) 219 if (scene == null)
211 return; 220 scene = m_SceneList[0];
212 221
213 client.SendInstantMessage(new GridInstantMessage( 222 bool success = SynchronousRestObjectPoster.BeginPostObject<GridInstantMessage, bool>(
214 null, new UUID(im.toAgentID), 223 "POST", m_RestURL+"/SaveMessage/?scope=" +
215 "System", new UUID(im.fromAgentID), 224 scene.RegionInfo.ScopeID.ToString(), im);
216 (byte)InstantMessageDialog.MessageFromAgent, 225
217 "User is not logged in. "+ 226 if (im.dialog == (byte)InstantMessageDialog.MessageFromAgent)
218 (success ? "Message saved." : "Message not saved"), 227 {
219 false, new Vector3())); 228 IClientAPI client = FindClient(new UUID(im.fromAgentID));
220 } 229 if (client == null)
230 return;
231
232 client.SendInstantMessage(new GridInstantMessage(
233 null, new UUID(im.toAgentID),
234 "System", new UUID(im.fromAgentID),
235 (byte)InstantMessageDialog.MessageFromAgent,
236 "User is not logged in. "+
237 (success ? "Message saved." : "Message not saved"),
238 false, new Vector3()));
221 } 239 }
222 } 240 }
223 } 241 }
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
index e3d4969..528bc8d 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
@@ -175,8 +175,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
175 if (im.binaryBucket.Length < 17) // Invalid 175 if (im.binaryBucket.Length < 17) // Invalid
176 return; 176 return;
177 177
178 UUID receipientID = new UUID(im.toAgentID); 178 UUID recipientID = new UUID(im.toAgentID);
179 ScenePresence user = scene.GetScenePresence(receipientID); 179 ScenePresence user = scene.GetScenePresence(recipientID);
180 UUID copyID; 180 UUID copyID;
181 181
182 // First byte is the asset type 182 // First byte is the asset type
@@ -191,7 +191,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
191 folderID, new UUID(im.toAgentID)); 191 folderID, new UUID(im.toAgentID));
192 192
193 InventoryFolderBase folderCopy 193 InventoryFolderBase folderCopy
194 = scene.GiveInventoryFolder(receipientID, client.AgentId, folderID, UUID.Zero); 194 = scene.GiveInventoryFolder(recipientID, client.AgentId, folderID, UUID.Zero);
195 195
196 if (folderCopy == null) 196 if (folderCopy == null)
197 { 197 {
@@ -248,6 +248,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
248 im.imSessionID = itemID.Guid; 248 im.imSessionID = itemID.Guid;
249 } 249 }
250 250
251 im.offline = 1; // Remember these
252
251 // Send the IM to the recipient. The item is already 253 // Send the IM to the recipient. The item is already
252 // in their inventory, so it will not be lost if 254 // in their inventory, so it will not be lost if
253 // they are offline. 255 // they are offline.
@@ -417,22 +419,67 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
417 /// 419 ///
418 /// </summary> 420 /// </summary>
419 /// <param name="msg"></param> 421 /// <param name="msg"></param>
420 private void OnGridInstantMessage(GridInstantMessage msg) 422 private void OnGridInstantMessage(GridInstantMessage im)
421 { 423 {
422 // Check if this is ours to handle 424 // Check if this is ours to handle
423 // 425 //
424 Scene scene = FindClientScene(new UUID(msg.toAgentID)); 426 Scene scene = FindClientScene(new UUID(im.toAgentID));
425 427
426 if (scene == null) 428 if (scene == null)
427 return; 429 return;
428 430
429 // Find agent to deliver to 431 // Find agent to deliver to
430 // 432 //
431 ScenePresence user = scene.GetScenePresence(new UUID(msg.toAgentID)); 433 ScenePresence user = scene.GetScenePresence(new UUID(im.toAgentID));
434 if (user == null)
435 return;
436
437 // This requires a little bit of processing because we have to make the
438 // new item visible in the recipient's inventory here
439 //
440 if (im.dialog == (byte) InstantMessageDialog.InventoryOffered)
441 {
442 if (im.binaryBucket.Length < 17) // Invalid
443 return;
444
445 UUID recipientID = new UUID(im.toAgentID);
446
447 // First byte is the asset type
448 AssetType assetType = (AssetType)im.binaryBucket[0];
449
450 if (AssetType.Folder == assetType)
451 {
452 UUID folderID = new UUID(im.binaryBucket, 1);
453
454 InventoryFolderBase given =
455 new InventoryFolderBase(folderID, recipientID);
456 InventoryFolderBase folder =
457 scene.InventoryService.GetFolder(given);
458
459 if (folder != null)
460 user.ControllingClient.SendBulkUpdateInventory(folder);
461 }
462 else
463 {
464 UUID itemID = new UUID(im.binaryBucket, 1);
432 465
433 // Just forward to local handling 466 InventoryItemBase given =
434 OnInstantMessage(user.ControllingClient, msg); 467 new InventoryItemBase(itemID, recipientID);
468 InventoryItemBase item =
469 scene.InventoryService.GetItem(given);
435 470
471 if (item != null)
472 {
473 user.ControllingClient.SendBulkUpdateInventory(item);
474 }
475 }
476 user.ControllingClient.SendInstantMessage(im);
477 }
478 else if (im.dialog == (byte) InstantMessageDialog.InventoryAccepted ||
479 im.dialog == (byte) InstantMessageDialog.InventoryDeclined)
480 {
481 user.ControllingClient.SendInstantMessage(im);
482 }
436 } 483 }
437 } 484 }
438} 485}
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index b57dc88..aa7a1cd 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -99,7 +99,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
99 99
100 protected virtual void OnNewClient(IClientAPI client) 100 protected virtual void OnNewClient(IClientAPI client)
101 { 101 {
102 client.OnTeleportHomeRequest += TeleportHome; 102 client.OnTeleportHomeRequest += TeleportHomeFired;
103 } 103 }
104 104
105 public virtual void Close() 105 public virtual void Close()
@@ -269,7 +269,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
269 // This may be a costly operation. The reg.ExternalEndPoint field is not a passive field, 269 // This may be a costly operation. The reg.ExternalEndPoint field is not a passive field,
270 // it's actually doing a lot of work. 270 // it's actually doing a lot of work.
271 IPEndPoint endPoint = finalDestination.ExternalEndPoint; 271 IPEndPoint endPoint = finalDestination.ExternalEndPoint;
272 if (endPoint.Address != null) 272 if (endPoint != null && endPoint.Address != null)
273 { 273 {
274 // Fixing a bug where teleporting while sitting results in the avatar ending up removed from 274 // Fixing a bug where teleporting while sitting results in the avatar ending up removed from
275 // both regions 275 // both regions
@@ -529,7 +529,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
529 529
530 protected void KillEntity(Scene scene, uint localID) 530 protected void KillEntity(Scene scene, uint localID)
531 { 531 {
532 scene.SendKillObject(localID); 532 scene.SendKillObject(new List<uint>() { localID });
533 } 533 }
534 534
535 protected virtual GridRegion GetFinalDestination(GridRegion region) 535 protected virtual GridRegion GetFinalDestination(GridRegion region)
@@ -567,7 +567,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
567 567
568 #region Teleport Home 568 #region Teleport Home
569 569
570 public virtual void TeleportHome(UUID id, IClientAPI client) 570 public void TeleportHomeFired(UUID id, IClientAPI client)
571 {
572 TeleportHome(id, client);
573 }
574
575 public virtual bool TeleportHome(UUID id, IClientAPI client)
571 { 576 {
572 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName); 577 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName);
573 578
@@ -576,12 +581,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
576 581
577 if (uinfo != null) 582 if (uinfo != null)
578 { 583 {
584 if (uinfo.HomeRegionID == UUID.Zero)
585 {
586 // can't find the Home region: Tell viewer and abort
587 client.SendTeleportFailed("You don't have a home position set.");
588 return false;
589 }
579 GridRegion regionInfo = m_aScene.GridService.GetRegionByUUID(UUID.Zero, uinfo.HomeRegionID); 590 GridRegion regionInfo = m_aScene.GridService.GetRegionByUUID(UUID.Zero, uinfo.HomeRegionID);
580 if (regionInfo == null) 591 if (regionInfo == null)
581 { 592 {
582 // can't find the Home region: Tell viewer and abort 593 // can't find the Home region: Tell viewer and abort
583 client.SendTeleportFailed("Your home region could not be found."); 594 client.SendTeleportFailed("Your home region could not be found.");
584 return; 595 return false;
585 } 596 }
586 597
587 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: User's home region is {0} {1} ({2}-{3})", 598 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: User's home region is {0} {1} ({2}-{3})",
@@ -592,6 +603,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
592 client, regionInfo.RegionHandle, uinfo.HomePosition, uinfo.HomeLookAt, 603 client, regionInfo.RegionHandle, uinfo.HomePosition, uinfo.HomeLookAt,
593 (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome)); 604 (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome));
594 } 605 }
606 else
607 {
608 // can't find the Home region: Tell viewer and abort
609 client.SendTeleportFailed("Your home region could not be found.");
610 return false;
611 }
612 return true;
595 } 613 }
596 614
597 #endregion 615 #endregion
@@ -879,15 +897,19 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
879 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID); 897 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID);
880 898
881 IEventQueue eq = agent.Scene.RequestModuleInterface<IEventQueue>(); 899 IEventQueue eq = agent.Scene.RequestModuleInterface<IEventQueue>();
882 if (eq != null) 900 IPEndPoint neighbourExternal = neighbourRegion.ExternalEndPoint;
901 if (neighbourExternal != null)
883 { 902 {
884 eq.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, 903 if (eq != null)
885 capsPath, agent.UUID, agent.ControllingClient.SessionId); 904 {
886 } 905 eq.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourExternal,
887 else 906 capsPath, agent.UUID, agent.ControllingClient.SessionId);
888 { 907 }
889 agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, 908 else
890 capsPath); 909 {
910 agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourExternal,
911 capsPath);
912 }
891 } 913 }
892 914
893 if (!WaitForCallback(agent.UUID)) 915 if (!WaitForCallback(agent.UUID))
@@ -991,10 +1013,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
991 agent.Id0 = currentAgentCircuit.Id0; 1013 agent.Id0 = currentAgentCircuit.Id0;
992 } 1014 }
993 1015
994 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; 1016 IPEndPoint external = region.ExternalEndPoint;
995 d.BeginInvoke(sp, agent, region, region.ExternalEndPoint, true, 1017 if (external != null)
1018 {
1019 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync;
1020 d.BeginInvoke(sp, agent, region, external, true,
996 InformClientOfNeighbourCompleted, 1021 InformClientOfNeighbourCompleted,
997 d); 1022 d);
1023 }
998 } 1024 }
999 #endregion 1025 #endregion
1000 1026
@@ -1127,6 +1153,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1127 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; 1153 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync;
1128 try 1154 try
1129 { 1155 {
1156 //neighbour.ExternalEndPoint may return null, which will be caught
1130 d.BeginInvoke(sp, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent, 1157 d.BeginInvoke(sp, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent,
1131 InformClientOfNeighbourCompleted, 1158 InformClientOfNeighbourCompleted,
1132 d); 1159 d);
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
index 1ac7508..47898cc 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
@@ -86,7 +86,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
86 86
87 protected override void OnNewClient(IClientAPI client) 87 protected override void OnNewClient(IClientAPI client)
88 { 88 {
89 client.OnTeleportHomeRequest += TeleportHome; 89 client.OnTeleportHomeRequest += TeleportHomeFired;
90 client.OnConnectionClosed += new Action<IClientAPI>(OnConnectionClosed); 90 client.OnConnectionClosed += new Action<IClientAPI>(OnConnectionClosed);
91 } 91 }
92 92
@@ -174,7 +174,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
174 return m_aScene.SimulationService.CreateAgent(reg, agentCircuit, teleportFlags, out reason); 174 return m_aScene.SimulationService.CreateAgent(reg, agentCircuit, teleportFlags, out reason);
175 } 175 }
176 176
177 public override void TeleportHome(UUID id, IClientAPI client) 177 public void TeleportHomeFired(UUID id, IClientAPI client)
178 {
179 TeleportHome(id, client);
180 }
181
182 public override bool TeleportHome(UUID id, IClientAPI client)
178 { 183 {
179 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName); 184 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName);
180 185
@@ -184,8 +189,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
184 { 189 {
185 // local grid user 190 // local grid user
186 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: User is local"); 191 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: User is local");
187 base.TeleportHome(id, client); 192 return base.TeleportHome(id, client);
188 return;
189 } 193 }
190 194
191 // Foreign user wants to go home 195 // Foreign user wants to go home
@@ -195,7 +199,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
195 { 199 {
196 client.SendTeleportFailed("Your information has been lost"); 200 client.SendTeleportFailed("Your information has been lost");
197 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Unable to locate agent's gateway information"); 201 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Unable to locate agent's gateway information");
198 return; 202 return false;
199 } 203 }
200 204
201 IUserAgentService userAgentService = new UserAgentServiceConnector(aCircuit.ServiceURLs["HomeURI"].ToString()); 205 IUserAgentService userAgentService = new UserAgentServiceConnector(aCircuit.ServiceURLs["HomeURI"].ToString());
@@ -205,7 +209,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
205 { 209 {
206 client.SendTeleportFailed("Your home region could not be found"); 210 client.SendTeleportFailed("Your home region could not be found");
207 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent's home region not found"); 211 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent's home region not found");
208 return; 212 return false;
209 } 213 }
210 214
211 ScenePresence sp = ((Scene)(client.Scene)).GetScenePresence(client.AgentId); 215 ScenePresence sp = ((Scene)(client.Scene)).GetScenePresence(client.AgentId);
@@ -213,7 +217,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
213 { 217 {
214 client.SendTeleportFailed("Internal error"); 218 client.SendTeleportFailed("Internal error");
215 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent not found in the scene where it is supposed to be"); 219 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent not found in the scene where it is supposed to be");
216 return; 220 return false;
217 } 221 }
218 222
219 IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>(); 223 IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>();
@@ -223,6 +227,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
223 aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ExternalHostName, homeGatekeeper.HttpPort, homeGatekeeper.RegionName); 227 aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ExternalHostName, homeGatekeeper.HttpPort, homeGatekeeper.RegionName);
224 228
225 DoTeleport(sp, homeGatekeeper, finalDestination, position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome), eq); 229 DoTeleport(sp, homeGatekeeper, finalDestination, position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome), eq);
230 return true;
226 } 231 }
227 #endregion 232 #endregion
228 233
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index 67732ff..22da665 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -28,6 +28,7 @@
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Net; 30using System.Net;
31using System.Xml;
31using System.Reflection; 32using System.Reflection;
32using System.Threading; 33using System.Threading;
33 34
@@ -191,11 +192,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
191 public virtual UUID DeleteToInventory(DeRezAction action, UUID folderID, 192 public virtual UUID DeleteToInventory(DeRezAction action, UUID folderID,
192 List<SceneObjectGroup> objectGroups, IClientAPI remoteClient) 193 List<SceneObjectGroup> objectGroups, IClientAPI remoteClient)
193 { 194 {
194 // HACK: This is only working for lists containing a single item!
195 // It's just a hack to make this WIP compile and run. Nothing
196 // currently calls this with multiple items.
197 UUID ret = UUID.Zero; 195 UUID ret = UUID.Zero;
198 196
197 // The following code groups the SOG's by owner. No objects
198 // belonging to different people can be coalesced, for obvious
199 // reasons.
199 Dictionary<UUID, List<SceneObjectGroup>> deletes = 200 Dictionary<UUID, List<SceneObjectGroup>> deletes =
200 new Dictionary<UUID, List<SceneObjectGroup>>(); 201 new Dictionary<UUID, List<SceneObjectGroup>>();
201 202
@@ -207,265 +208,340 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
207 deletes[g.OwnerID].Add(g); 208 deletes[g.OwnerID].Add(g);
208 } 209 }
209 210
211 // This is pethod scoped and will be returned. It will be the
212 // last created asset id
213 UUID assetID = UUID.Zero;
214
215 // Each iteration is really a separate asset being created,
216 // with distinct destinations as well.
210 foreach (List<SceneObjectGroup> objlist in deletes.Values) 217 foreach (List<SceneObjectGroup> objlist in deletes.Values)
211 { 218 {
212 foreach (SceneObjectGroup g in objlist) 219 Dictionary<UUID, string> xmlStrings =
213 ret = DeleteToInventory(action, folderID, g, remoteClient); 220 new Dictionary<UUID, string>();
214 }
215
216 return ret;
217 }
218 221
219 private UUID DeleteToInventory(DeRezAction action, UUID folderID, 222 foreach (SceneObjectGroup objectGroup in objlist)
220 SceneObjectGroup objectGroup, IClientAPI remoteClient) 223 {
221 { 224 Vector3 inventoryStoredPosition = new Vector3
222 UUID assetID = UUID.Zero; 225 (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize)
226 ? 250
227 : objectGroup.AbsolutePosition.X)
228 ,
229 (objectGroup.AbsolutePosition.X > (int)Constants.RegionSize)
230 ? 250
231 : objectGroup.AbsolutePosition.X,
232 objectGroup.AbsolutePosition.Z);
223 233
224 Vector3 inventoryStoredPosition = new Vector3 234 Vector3 originalPosition = objectGroup.AbsolutePosition;
225 (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize)
226 ? 250
227 : objectGroup.AbsolutePosition.X)
228 ,
229 (objectGroup.AbsolutePosition.X > (int)Constants.RegionSize)
230 ? 250
231 : objectGroup.AbsolutePosition.X,
232 objectGroup.AbsolutePosition.Z);
233 235
234 Vector3 originalPosition = objectGroup.AbsolutePosition; 236 // Restore attachment data after trip through the sim
237 if (objectGroup.RootPart.AttachPoint > 0)
238 inventoryStoredPosition = objectGroup.RootPart.AttachOffset;
239 objectGroup.RootPart.Shape.State = objectGroup.RootPart.AttachPoint;
235 240
236 objectGroup.AbsolutePosition = inventoryStoredPosition; 241 objectGroup.AbsolutePosition = inventoryStoredPosition;
237 242
238 string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(objectGroup); 243 // Make sure all bits but the ones we want are clear
244 // on take.
245 // This will be applied to the current perms, so
246 // it will do what we want.
247 objectGroup.RootPart.NextOwnerMask &=
248 ((uint)PermissionMask.Copy |
249 (uint)PermissionMask.Transfer |
250 (uint)PermissionMask.Modify);
251 objectGroup.RootPart.NextOwnerMask |=
252 (uint)PermissionMask.Move;
239 253
240 objectGroup.AbsolutePosition = originalPosition; 254 string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(objectGroup);
241 255
242 // Get the user info of the item destination 256 objectGroup.AbsolutePosition = originalPosition;
243 //
244 UUID userID = UUID.Zero;
245 257
246 if (action == DeRezAction.Take || action == DeRezAction.TakeCopy || 258 xmlStrings[objectGroup.UUID] = sceneObjectXml;
247 action == DeRezAction.SaveToExistingUserInventoryItem) 259 }
248 {
249 // Take or take copy require a taker
250 // Saving changes requires a local user
251 //
252 if (remoteClient == null)
253 return UUID.Zero;
254 260
255 userID = remoteClient.AgentId; 261 string itemXml;
256 }
257 else
258 {
259 // All returns / deletes go to the object owner
260 //
261 262
262 userID = objectGroup.RootPart.OwnerID; 263 if (objlist.Count > 1)
263 } 264 {
265 float minX, minY, minZ;
266 float maxX, maxY, maxZ;
264 267
265 if (userID == UUID.Zero) // Can't proceed 268 Vector3[] offsets = m_Scene.GetCombinedBoundingBox(objlist,
266 { 269 out minX, out maxX, out minY, out maxY,
267 return UUID.Zero; 270 out minZ, out maxZ);
268 }
269 271
270 // If we're returning someone's item, it goes back to the 272 // CreateWrapper
271 // owner's Lost And Found folder. 273 XmlDocument itemDoc = new XmlDocument();
272 // Delete is treated like return in this case 274 XmlElement root = itemDoc.CreateElement("", "CoalescedObject", "");
273 // Deleting your own items makes them go to trash 275 itemDoc.AppendChild(root);
274 //
275 276
276 InventoryFolderBase folder = null; 277 // Embed the offsets into the group XML
277 InventoryItemBase item = null; 278 for ( int i = 0 ; i < objlist.Count ; i++ )
279 {
280 XmlDocument doc = new XmlDocument();
281 SceneObjectGroup g = objlist[i];
282 doc.LoadXml(xmlStrings[g.UUID]);
283 XmlElement e = (XmlElement)doc.SelectSingleNode("/SceneObjectGroup");
284 e.SetAttribute("offsetx", offsets[i].X.ToString());
285 e.SetAttribute("offsety", offsets[i].Y.ToString());
286 e.SetAttribute("offsetz", offsets[i].Z.ToString());
287
288 XmlNode objectNode = itemDoc.ImportNode(e, true);
289 root.AppendChild(objectNode);
290 }
278 291
279 if (DeRezAction.SaveToExistingUserInventoryItem == action) 292 float sizeX = maxX - minX;
280 { 293 float sizeY = maxY - minY;
281 item = new InventoryItemBase(objectGroup.RootPart.FromUserInventoryItemID, userID); 294 float sizeZ = maxZ - minZ;
282 item = m_Scene.InventoryService.GetItem(item);
283 295
284 //item = userInfo.RootFolder.FindItem( 296 root.SetAttribute("x", sizeX.ToString());
285 // objectGroup.RootPart.FromUserInventoryItemID); 297 root.SetAttribute("y", sizeY.ToString());
298 root.SetAttribute("z", sizeZ.ToString());
286 299
287 if (null == item) 300 itemXml = itemDoc.InnerXml;
301 }
302 else
288 { 303 {
289 m_log.DebugFormat( 304 itemXml = xmlStrings[objlist[0].UUID];
290 "[AGENT INVENTORY]: Object {0} {1} scheduled for save to inventory has already been deleted.",
291 objectGroup.Name, objectGroup.UUID);
292 return UUID.Zero;
293 } 305 }
294 } 306
295 else 307 // Get the user info of the item destination
296 {
297 // Folder magic
298 // 308 //
299 if (action == DeRezAction.Delete) 309 UUID userID = UUID.Zero;
310
311 if (action == DeRezAction.Take || action == DeRezAction.TakeCopy ||
312 action == DeRezAction.SaveToExistingUserInventoryItem)
300 { 313 {
301 // Deleting someone else's item 314 // Take or take copy require a taker
315 // Saving changes requires a local user
302 // 316 //
303 if (remoteClient == null || 317 if (remoteClient == null)
304 objectGroup.OwnerID != remoteClient.AgentId) 318 return UUID.Zero;
305 {
306 319
307 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); 320 userID = remoteClient.AgentId;
308 }
309 else
310 {
311 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder);
312 }
313 } 321 }
314 else if (action == DeRezAction.Return) 322 else
315 { 323 {
316 324 // All returns / deletes go to the object owner
317 // Dump to lost + found unconditionally
318 // 325 //
319 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); 326
327 userID = objlist[0].RootPart.OwnerID;
320 } 328 }
321 329
322 if (folderID == UUID.Zero && folder == null) 330 if (userID == UUID.Zero) // Can't proceed
323 { 331 {
324 if (action == DeRezAction.Delete) 332 return UUID.Zero;
333 }
334
335 // If we're returning someone's item, it goes back to the
336 // owner's Lost And Found folder.
337 // Delete is treated like return in this case
338 // Deleting your own items makes them go to trash
339 //
340
341 InventoryFolderBase folder = null;
342 InventoryItemBase item = null;
343
344 if (DeRezAction.SaveToExistingUserInventoryItem == action)
345 {
346 item = new InventoryItemBase(objlist[0].RootPart.FromUserInventoryItemID, userID);
347 item = m_Scene.InventoryService.GetItem(item);
348
349 //item = userInfo.RootFolder.FindItem(
350 // objectGroup.RootPart.FromUserInventoryItemID);
351
352 if (null == item)
325 { 353 {
326 // Deletes go to trash by default 354 m_log.DebugFormat(
327 // 355 "[AGENT INVENTORY]: Object {0} {1} scheduled for save to inventory has already been deleted.",
328 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder); 356 objlist[0].Name, objlist[0].UUID);
357 return UUID.Zero;
329 } 358 }
330 else 359 }
360 else
361 {
362 // Folder magic
363 //
364 if (action == DeRezAction.Delete)
331 { 365 {
366 // Deleting someone else's item
367 //
332 if (remoteClient == null || 368 if (remoteClient == null ||
333 objectGroup.OwnerID != remoteClient.AgentId) 369 objlist[0].OwnerID != remoteClient.AgentId)
334 { 370 {
335 // Taking copy of another person's item. Take to 371
336 // Objects folder. 372 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
337 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.Object);
338 } 373 }
339 else 374 else
340 { 375 {
341 // Catch all. Use lost & found 376 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder);
377 }
378 }
379 else if (action == DeRezAction.Return)
380 {
381
382 // Dump to lost + found unconditionally
383 //
384 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
385 }
386
387 if (folderID == UUID.Zero && folder == null)
388 {
389 if (action == DeRezAction.Delete)
390 {
391 // Deletes go to trash by default
342 // 392 //
393 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder);
394 }
395 else
396 {
397 if (remoteClient == null ||
398 objlist[0].OwnerID != remoteClient.AgentId)
399 {
400 // Taking copy of another person's item. Take to
401 // Objects folder.
402 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.Object);
403 }
404 else
405 {
406 // Catch all. Use lost & found
407 //
343 408
344 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); 409 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
410 }
345 } 411 }
346 } 412 }
347 }
348 413
349 // Override and put into where it came from, if it came 414 // Override and put into where it came from, if it came
350 // from anywhere in inventory 415 // from anywhere in inventory
351 // 416 //
352 if (action == DeRezAction.Take || action == DeRezAction.TakeCopy) 417 if (action == DeRezAction.Take || action == DeRezAction.TakeCopy)
353 {
354 if (objectGroup.RootPart.FromFolderID != UUID.Zero)
355 { 418 {
356 InventoryFolderBase f = new InventoryFolderBase(objectGroup.RootPart.FromFolderID, userID); 419 if (objlist[0].RootPart.FromFolderID != UUID.Zero)
357 folder = m_Scene.InventoryService.GetFolder(f); 420 {
421 InventoryFolderBase f = new InventoryFolderBase(objlist[0].RootPart.FromFolderID, userID);
422 folder = m_Scene.InventoryService.GetFolder(f);
423 }
358 } 424 }
359 }
360 425
361 if (folder == null) // None of the above 426 if (folder == null) // None of the above
362 { 427 {
363 folder = new InventoryFolderBase(folderID); 428 folder = new InventoryFolderBase(folderID);
364 429
365 if (folder == null) // Nowhere to put it 430 if (folder == null) // Nowhere to put it
431 {
432 return UUID.Zero;
433 }
434 }
435
436 item = new InventoryItemBase();
437 // Can't know creator is the same, so null it in inventory
438 if (objlist.Count > 1)
366 { 439 {
367 return UUID.Zero; 440 item.CreatorId = UUID.Zero.ToString();
441 item.CreatorData = String.Empty;
442 }
443 else
444 {
445 item.CreatorId = objlist[0].RootPart.CreatorID.ToString();
446 item.CreatorData = objlist[0].RootPart.CreatorData;
447 }
448 item.ID = UUID.Random();
449 item.InvType = (int)InventoryType.Object;
450 item.Folder = folder.ID;
451 item.Owner = userID;
452 if (objlist.Count > 1)
453 {
454 item.Flags = (uint)InventoryItemFlags.ObjectHasMultipleItems;
455 }
456 else
457 {
458 item.SaleType = objlist[0].RootPart.ObjectSaleType;
459 item.SalePrice = objlist[0].RootPart.SalePrice;
368 } 460 }
369 } 461 }
370 462
371 item = new InventoryItemBase(); 463 AssetBase asset = CreateAsset(
372 item.CreatorId = objectGroup.RootPart.CreatorID.ToString(); 464 objlist[0].GetPartName(objlist[0].RootPart.LocalId),
373 item.CreatorData = objectGroup.RootPart.CreatorData; 465 objlist[0].GetPartDescription(objlist[0].RootPart.LocalId),
374 item.ID = UUID.Random(); 466 (sbyte)AssetType.Object,
375 item.InvType = (int)InventoryType.Object; 467 Utils.StringToBytes(itemXml),
376 item.Folder = folder.ID; 468 objlist[0].OwnerID.ToString());
377 item.Owner = userID; 469 m_Scene.AssetService.Store(asset);
378 } 470 assetID = asset.FullID;
379
380 AssetBase asset = CreateAsset(
381 objectGroup.GetPartName(objectGroup.RootPart.LocalId),
382 objectGroup.GetPartDescription(objectGroup.RootPart.LocalId),
383 (sbyte)AssetType.Object,
384 Utils.StringToBytes(sceneObjectXml),
385 objectGroup.OwnerID.ToString());
386 m_Scene.AssetService.Store(asset);
387 assetID = asset.FullID;
388
389 if (DeRezAction.SaveToExistingUserInventoryItem == action)
390 {
391 item.AssetID = asset.FullID;
392 m_Scene.InventoryService.UpdateItem(item);
393 }
394 else
395 {
396 item.AssetID = asset.FullID;
397 471
398 if (remoteClient != null && (remoteClient.AgentId != objectGroup.RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions()) 472 if (DeRezAction.SaveToExistingUserInventoryItem == action)
399 { 473 {
400 uint perms = objectGroup.GetEffectivePermissions(); 474 item.AssetID = asset.FullID;
401 uint nextPerms = (perms & 7) << 13; 475 m_Scene.InventoryService.UpdateItem(item);
402 if ((nextPerms & (uint)PermissionMask.Copy) == 0)
403 perms &= ~(uint)PermissionMask.Copy;
404 if ((nextPerms & (uint)PermissionMask.Transfer) == 0)
405 perms &= ~(uint)PermissionMask.Transfer;
406 if ((nextPerms & (uint)PermissionMask.Modify) == 0)
407 perms &= ~(uint)PermissionMask.Modify;
408
409 // Make sure all bits but the ones we want are clear
410 // on take.
411 // This will be applied to the current perms, so
412 // it will do what we want.
413 objectGroup.RootPart.NextOwnerMask &=
414 ((uint)PermissionMask.Copy |
415 (uint)PermissionMask.Transfer |
416 (uint)PermissionMask.Modify);
417 objectGroup.RootPart.NextOwnerMask |=
418 (uint)PermissionMask.Move;
419
420 item.BasePermissions = perms & objectGroup.RootPart.NextOwnerMask;
421 item.CurrentPermissions = item.BasePermissions;
422 item.NextPermissions = objectGroup.RootPart.NextOwnerMask;
423 item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask & objectGroup.RootPart.NextOwnerMask;
424 item.GroupPermissions = objectGroup.RootPart.GroupMask & objectGroup.RootPart.NextOwnerMask;
425
426 // Magic number badness. Maybe this deserves an enum.
427 // bit 4 (16) is the "Slam" bit, it means treat as passed
428 // and apply next owner perms on rez
429 item.CurrentPermissions |= 16; // Slam!
430 } 476 }
431 else 477 else
432 { 478 {
433 item.BasePermissions = objectGroup.GetEffectivePermissions(); 479 item.AssetID = asset.FullID;
434 item.CurrentPermissions = objectGroup.GetEffectivePermissions();
435 item.NextPermissions = objectGroup.RootPart.NextOwnerMask;
436 item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask;
437 item.GroupPermissions = objectGroup.RootPart.GroupMask;
438 480
439 item.CurrentPermissions &= 481 uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move) | 7;
440 ((uint)PermissionMask.Copy | 482 foreach (SceneObjectGroup grp in objlist)
441 (uint)PermissionMask.Transfer | 483 effectivePerms &= grp.GetEffectivePermissions();
442 (uint)PermissionMask.Modify | 484 effectivePerms |= (uint)PermissionMask.Move;
443 (uint)PermissionMask.Move |
444 7); // Preserve folded permissions
445 }
446 485
447 // TODO: add the new fields (Flags, Sale info, etc) 486 if (remoteClient != null && (remoteClient.AgentId != objlist[0].RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions())
448 item.CreationDate = Util.UnixTimeSinceEpoch(); 487 {
449 item.Description = asset.Description; 488 uint perms = effectivePerms;
450 item.Name = asset.Name; 489 uint nextPerms = (perms & 7) << 13;
451 item.AssetType = asset.Type; 490 if ((nextPerms & (uint)PermissionMask.Copy) == 0)
491 perms &= ~(uint)PermissionMask.Copy;
492 if ((nextPerms & (uint)PermissionMask.Transfer) == 0)
493 perms &= ~(uint)PermissionMask.Transfer;
494 if ((nextPerms & (uint)PermissionMask.Modify) == 0)
495 perms &= ~(uint)PermissionMask.Modify;
496
497 item.BasePermissions = perms & objlist[0].RootPart.NextOwnerMask;
498 item.CurrentPermissions = item.BasePermissions;
499 item.NextPermissions = perms & objlist[0].RootPart.NextOwnerMask;
500 item.EveryOnePermissions = objlist[0].RootPart.EveryoneMask & objlist[0].RootPart.NextOwnerMask;
501 item.GroupPermissions = objlist[0].RootPart.GroupMask & objlist[0].RootPart.NextOwnerMask;
502
503 // Magic number badness. Maybe this deserves an enum.
504 // bit 4 (16) is the "Slam" bit, it means treat as passed
505 // and apply next owner perms on rez
506 item.CurrentPermissions |= 16; // Slam!
507 }
508 else
509 {
510 item.BasePermissions = effectivePerms;
511 item.CurrentPermissions = effectivePerms;
512 item.NextPermissions = objlist[0].RootPart.NextOwnerMask & effectivePerms;
513 item.EveryOnePermissions = objlist[0].RootPart.EveryoneMask & effectivePerms;
514 item.GroupPermissions = objlist[0].RootPart.GroupMask & effectivePerms;
515
516 item.CurrentPermissions &=
517 ((uint)PermissionMask.Copy |
518 (uint)PermissionMask.Transfer |
519 (uint)PermissionMask.Modify |
520 (uint)PermissionMask.Move |
521 7); // Preserve folded permissions
522 }
452 523
453 m_Scene.AddInventoryItem(item); 524 item.CreationDate = Util.UnixTimeSinceEpoch();
525 item.Description = asset.Description;
526 item.Name = asset.Name;
527 item.AssetType = asset.Type;
454 528
455 if (remoteClient != null && item.Owner == remoteClient.AgentId) 529 m_Scene.AddInventoryItem(item);
456 { 530
457 remoteClient.SendInventoryItemCreateUpdate(item, 0); 531 if (remoteClient != null && item.Owner == remoteClient.AgentId)
458 }
459 else
460 {
461 ScenePresence notifyUser = m_Scene.GetScenePresence(item.Owner);
462 if (notifyUser != null)
463 { 532 {
464 notifyUser.ControllingClient.SendInventoryItemCreateUpdate(item, 0); 533 remoteClient.SendInventoryItemCreateUpdate(item, 0);
534 }
535 else
536 {
537 ScenePresence notifyUser = m_Scene.GetScenePresence(item.Owner);
538 if (notifyUser != null)
539 {
540 notifyUser.ControllingClient.SendInventoryItemCreateUpdate(item, 0);
541 }
465 } 542 }
466 } 543 }
467 } 544 }
468
469 return assetID; 545 return assetID;
470 } 546 }
471 547
@@ -516,8 +592,15 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
516 592
517 if (item != null) 593 if (item != null)
518 { 594 {
595 if (item.ID == UUID.Zero)
596 {
597 m_log.Debug("[InventoryAccessModule]: Inventory object has UUID.Zero! Position 1");
598 }
599
519 AssetBase rezAsset = m_Scene.AssetService.Get(item.AssetID.ToString()); 600 AssetBase rezAsset = m_Scene.AssetService.Get(item.AssetID.ToString());
520 601
602 SceneObjectGroup group = null;
603
521 if (rezAsset != null) 604 if (rezAsset != null)
522 { 605 {
523 UUID itemId = UUID.Zero; 606 UUID itemId = UUID.Zero;
@@ -526,32 +609,83 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
526 // item that it came from. This allows us to enable 'save object to inventory' 609 // item that it came from. This allows us to enable 'save object to inventory'
527 if (!m_Scene.Permissions.BypassPermissions()) 610 if (!m_Scene.Permissions.BypassPermissions())
528 { 611 {
529 if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == (uint)PermissionMask.Copy) 612 if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == (uint)PermissionMask.Copy && (item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
530 { 613 {
531 itemId = item.ID; 614 itemId = item.ID;
532 } 615 }
533 } 616 }
534 else 617 else
535 { 618 {
536 // Brave new fullperm world 619 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
537 // 620 {
538 itemId = item.ID; 621 // Brave new fullperm world
622 itemId = item.ID;
623 }
624 }
625
626 if (item.ID == UUID.Zero)
627 {
628 m_log.Debug("[InventoryAccessModule]: Inventory object has UUID.Zero! Position 2");
539 } 629 }
540 630
541 string xmlData = Utils.BytesToString(rezAsset.Data); 631 string xmlData = Utils.BytesToString(rezAsset.Data);
542 SceneObjectGroup group 632 List<SceneObjectGroup> objlist =
543 = SceneObjectSerializer.FromOriginalXmlFormat(itemId, xmlData); 633 new List<SceneObjectGroup>();
634 List<Vector3> veclist = new List<Vector3>();
635
636 XmlDocument doc = new XmlDocument();
637 doc.LoadXml(xmlData);
638 XmlElement e = (XmlElement)doc.SelectSingleNode("/CoalescedObject");
639 if (e == null || attachment) // Single
640 {
641 SceneObjectGroup g =
642 SceneObjectSerializer.FromOriginalXmlFormat(
643 itemId, xmlData);
644 objlist.Add(g);
645 veclist.Add(new Vector3(0, 0, 0));
646
647 float offsetHeight = 0;
648 pos = m_Scene.GetNewRezLocation(
649 RayStart, RayEnd, RayTargetID, Quaternion.Identity,
650 BypassRayCast, bRayEndIsIntersection, true, g.GetAxisAlignedBoundingBox(out offsetHeight), false);
651 pos.Z += offsetHeight;
652 }
653 else
654 {
655 XmlElement coll = (XmlElement)e;
656 float bx = Convert.ToSingle(coll.GetAttribute("x"));
657 float by = Convert.ToSingle(coll.GetAttribute("y"));
658 float bz = Convert.ToSingle(coll.GetAttribute("z"));
659 Vector3 bbox = new Vector3(bx, by, bz);
544 660
545 group.RootPart.FromFolderID = item.Folder; 661 pos = m_Scene.GetNewRezLocation(RayStart, RayEnd,
662 RayTargetID, Quaternion.Identity,
663 BypassRayCast, bRayEndIsIntersection, true,
664 bbox, false);
546 665
547 // If it's rezzed in world, select it. Much easier to 666 pos -= bbox / 2;
548 // find small items. 667
549 // 668 XmlNodeList groups = e.SelectNodes("SceneObjectGroup");
550 if (!attachment) 669 foreach (XmlNode n in groups)
551 group.RootPart.CreateSelected = true; 670 {
671 SceneObjectGroup g =
672 SceneObjectSerializer.FromOriginalXmlFormat(
673 itemId, n.OuterXml);
674 objlist.Add(g);
675 XmlElement el = (XmlElement)n;
676 float x = Convert.ToSingle(el.GetAttribute("offsetx"));
677 float y = Convert.ToSingle(el.GetAttribute("offsety"));
678 float z = Convert.ToSingle(el.GetAttribute("offsetz"));
679 veclist.Add(new Vector3(x, y, z));
680 }
681 }
682
683 int primcount = 0;
684 foreach (SceneObjectGroup g in objlist)
685 primcount += g.PrimCount;
552 686
553 if (!m_Scene.Permissions.CanRezObject( 687 if (!m_Scene.Permissions.CanRezObject(
554 group.PrimCount, remoteClient.AgentId, pos) 688 primcount, remoteClient.AgentId, pos)
555 && !attachment) 689 && !attachment)
556 { 690 {
557 // The client operates in no fail mode. It will 691 // The client operates in no fail mode. It will
@@ -564,116 +698,147 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
564 return null; 698 return null;
565 } 699 }
566 700
567 group.ResetIDs(); 701 for (int i = 0 ; i < objlist.Count ; i++ )
568
569 if (attachment)
570 {
571 group.RootPart.Flags |= PrimFlags.Phantom;
572 group.RootPart.IsAttachment = true;
573
574 // If we're rezzing an attachment then don't ask
575 // AddNewSceneObject() to update the client since
576 // we'll be doing that later on. Scheduling more
577 // than one full update during the attachment
578 // process causes some clients to fail to display
579 // the attachment properly.
580 // Also, don't persist attachments.
581 m_Scene.AddNewSceneObject(group, false, false);
582 }
583 else
584 { 702 {
585 m_Scene.AddNewSceneObject(group, true, false); 703 group = objlist[i];
586 }
587 704
588 // m_log.InfoFormat("ray end point for inventory rezz is {0} {1} {2} ", RayEnd.X, RayEnd.Y, RayEnd.Z); 705 Vector3 storedPosition = group.AbsolutePosition;
589 // if attachment we set it's asset id so object updates can reflect that 706 if (group.UUID == UUID.Zero)
590 // if not, we set it's position in world. 707 {
591 if (!attachment) 708 m_log.Debug("[InventoryAccessModule]: Inventory object has UUID.Zero! Position 3");
592 { 709 }
593 group.ScheduleGroupForFullUpdate(); 710 group.RootPart.FromFolderID = item.Folder;
594
595 float offsetHeight = 0;
596 pos = m_Scene.GetNewRezLocation(
597 RayStart, RayEnd, RayTargetID, Quaternion.Identity,
598 BypassRayCast, bRayEndIsIntersection, true, group.GetAxisAlignedBoundingBox(out offsetHeight), false);
599 pos.Z += offsetHeight;
600 group.AbsolutePosition = pos;
601 // m_log.InfoFormat("rezx point for inventory rezz is {0} {1} {2} and offsetheight was {3}", pos.X, pos.Y, pos.Z, offsetHeight);
602 711
603 } 712 // If it's rezzed in world, select it. Much easier to
604 else 713 // find small items.
605 { 714 //
606 group.SetFromItemID(itemID); 715 if (!attachment)
607 } 716 {
717 group.RootPart.CreateSelected = true;
718 foreach (SceneObjectPart child in group.Parts)
719 child.CreateSelected = true;
720 }
608 721
609 SceneObjectPart rootPart = null; 722 group.ResetIDs();
610 try
611 {
612 rootPart = group.GetChildPart(group.UUID);
613 }
614 catch (NullReferenceException)
615 {
616 string isAttachment = "";
617 723
618 if (attachment) 724 if (attachment)
619 isAttachment = " Object was an attachment"; 725 {
726 group.RootPart.Flags |= PrimFlags.Phantom;
727 group.RootPart.IsAttachment = true;
728
729 // If we're rezzing an attachment then don't ask
730 // AddNewSceneObject() to update the client since
731 // we'll be doing that later on. Scheduling more
732 // than one full update during the attachment
733 // process causes some clients to fail to display
734 // the attachment properly.
735 // Also, don't persist attachments.
736 m_Scene.AddNewSceneObject(group, false, false);
737 }
738 else
739 {
740 m_Scene.AddNewSceneObject(group, true, false);
741 }
620 742
621 m_log.Error("[AGENT INVENTORY]: Error rezzing ItemID: " + itemID + " object has no rootpart." + isAttachment); 743 // if attachment we set it's asset id so object updates
622 } 744 // can reflect that, if not, we set it's position in world.
745 if (!attachment)
746 {
747 group.ScheduleGroupForFullUpdate();
748
749 group.AbsolutePosition = pos + veclist[i];
750 }
751 else
752 {
753 group.SetFromItemID(itemID);
754 }
623 755
624 // Since renaming the item in the inventory does not affect the name stored 756 SceneObjectPart rootPart = null;
625 // in the serialization, transfer the correct name from the inventory to the
626 // object itself before we rez.
627 rootPart.Name = item.Name;
628 rootPart.Description = item.Description;
629 757
630 group.SetGroup(remoteClient.ActiveGroupId, remoteClient); 758 try
631 if ((rootPart.OwnerID != item.Owner) || (item.CurrentPermissions & 16) != 0) 759 {
632 { 760 rootPart = group.GetChildPart(group.UUID);
633 //Need to kill the for sale here 761 }
634 rootPart.ObjectSaleType = 0; 762 catch (NullReferenceException)
635 rootPart.SalePrice = 10; 763 {
764 string isAttachment = "";
636 765
637 if (m_Scene.Permissions.PropagatePermissions()) 766 if (attachment)
767 isAttachment = " Object was an attachment";
768
769 m_log.Error("[AGENT INVENTORY]: Error rezzing ItemID: " + itemID + " object has no rootpart." + isAttachment);
770 }
771
772 // Since renaming the item in the inventory does not
773 // affect the name stored in the serialization, transfer
774 // the correct name from the inventory to the
775 // object itself before we rez.
776 // On coalesced objects, this has no effect.
777 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
778 {
779 rootPart.Name = item.Name;
780 rootPart.Description = item.Description;
781 rootPart.ObjectSaleType = item.SaleType;
782 rootPart.SalePrice = item.SalePrice;
783 }
784
785 group.SetGroup(remoteClient.ActiveGroupId, remoteClient);
786 if ((rootPart.OwnerID != item.Owner) ||
787 (item.CurrentPermissions & 16) != 0)
638 { 788 {
639 foreach (SceneObjectPart part in group.Parts) 789 //Need to kill the for sale here
790 rootPart.ObjectSaleType = 0;
791 rootPart.SalePrice = 10;
792
793 if (m_Scene.Permissions.PropagatePermissions())
640 { 794 {
641 part.EveryoneMask = item.EveryOnePermissions; 795 foreach (SceneObjectPart part in group.Parts)
642 part.NextOwnerMask = item.NextPermissions; 796 {
643 part.GroupMask = 0; // DO NOT propagate here 797 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
798 {
799 part.EveryoneMask = item.EveryOnePermissions;
800 part.NextOwnerMask = item.NextPermissions;
801 }
802 part.GroupMask = 0; // DO NOT propagate here
803 }
804
805 group.ApplyNextOwnerPermissions();
644 } 806 }
645
646 group.ApplyNextOwnerPermissions();
647 } 807 }
648 }
649 808
650 foreach (SceneObjectPart part in group.Parts) 809 foreach (SceneObjectPart part in group.Parts)
651 {
652 if ((part.OwnerID != item.Owner) || (item.CurrentPermissions & 16) != 0)
653 { 810 {
654 part.LastOwnerID = part.OwnerID; 811 if ((part.OwnerID != item.Owner) ||
655 part.OwnerID = item.Owner; 812 (item.CurrentPermissions & 16) != 0)
656 part.Inventory.ChangeInventoryOwner(item.Owner); 813 {
657 part.GroupMask = 0; // DO NOT propagate here 814 part.LastOwnerID = part.OwnerID;
815 part.OwnerID = item.Owner;
816 part.Inventory.ChangeInventoryOwner(item.Owner);
817 part.GroupMask = 0; // DO NOT propagate here
818 }
819 part.EveryoneMask = item.EveryOnePermissions;
820 part.NextOwnerMask = item.NextPermissions;
658 } 821 }
659 part.EveryoneMask = item.EveryOnePermissions;
660 part.NextOwnerMask = item.NextPermissions;
661 }
662 822
663 rootPart.TrimPermissions(); 823 rootPart.TrimPermissions();
664 824
665 if (!attachment) 825 if (!attachment)
666 {
667 if (group.RootPart.Shape.PCode == (byte)PCode.Prim)
668 { 826 {
669 group.ClearPartAttachmentData(); 827 if (group.RootPart.Shape.PCode == (byte)PCode.Prim)
670 } 828 {
671 829 // Save attachment data
672 // Fire on_rez 830 group.RootPart.AttachPoint = group.RootPart.Shape.State;
673 group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 1); 831 group.RootPart.AttachOffset = storedPosition;
674 rootPart.ParentGroup.ResumeScripts();
675 832
676 rootPart.ScheduleFullUpdate(); 833 group.ClearPartAttachmentData();
834 }
835
836 // Fire on_rez
837 group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 1);
838 rootPart.ParentGroup.ResumeScripts();
839
840 rootPart.ScheduleFullUpdate();
841 }
677 } 842 }
678 843
679 if (!m_Scene.Permissions.BypassPermissions()) 844 if (!m_Scene.Permissions.BypassPermissions())
@@ -691,9 +856,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
691 } 856 }
692 } 857 }
693 } 858 }
694
695 return rootPart.ParentGroup;
696 } 859 }
860 return group;
697 } 861 }
698 862
699 return null; 863 return null;
diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
index 9b565ed..1fd1f47 100644
--- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
@@ -142,7 +142,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
142 engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" }); 142 engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" });
143 return urlcode; 143 return urlcode;
144 } 144 }
145 string url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString() + "/"; 145 string url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString();
146 146
147 UrlData urlData = new UrlData(); 147 UrlData urlData = new UrlData();
148 urlData.hostID = host.UUID; 148 urlData.hostID = host.UUID;
@@ -152,10 +152,9 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
152 urlData.urlcode = urlcode; 152 urlData.urlcode = urlcode;
153 urlData.requests = new Dictionary<UUID, RequestData>(); 153 urlData.requests = new Dictionary<UUID, RequestData>();
154 154
155
156 m_UrlMap[url] = urlData; 155 m_UrlMap[url] = urlData;
157 156
158 string uri = "/lslhttp/" + urlcode.ToString() + "/"; 157 string uri = "/lslhttp/" + urlcode.ToString();
159 158
160 m_HttpServer.AddPollServiceHTTPHandler(uri,HandleHttpPoll, 159 m_HttpServer.AddPollServiceHTTPHandler(uri,HandleHttpPoll,
161 new PollServiceEventArgs(HttpRequestHandler,HasEvents, GetEvents, NoEvents, 160 new PollServiceEventArgs(HttpRequestHandler,HasEvents, GetEvents, NoEvents,
@@ -386,6 +385,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
386 385
387 return response; 386 return response;
388 } 387 }
388
389 public void HttpRequestHandler(UUID requestID, Hashtable request) 389 public void HttpRequestHandler(UUID requestID, Hashtable request)
390 { 390 {
391 lock (request) 391 lock (request)
@@ -400,8 +400,8 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
400 400
401 int pos1 = uri.IndexOf("/");// /lslhttp 401 int pos1 = uri.IndexOf("/");// /lslhttp
402 int pos2 = uri.IndexOf("/", pos1 + 1);// /lslhttp/ 402 int pos2 = uri.IndexOf("/", pos1 + 1);// /lslhttp/
403 int pos3 = uri.IndexOf("/", pos2 + 1);// /lslhttp/<UUID>/ 403 int pos3 = pos2 + 37; // /lslhttp/urlcode
404 string uri_tmp = uri.Substring(0, pos3 + 1); 404 string uri_tmp = uri.Substring(0, pos3);
405 //HTTP server code doesn't provide us with QueryStrings 405 //HTTP server code doesn't provide us with QueryStrings
406 string pathInfo; 406 string pathInfo;
407 string queryString; 407 string queryString;
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs
index e54ee02..ebfba2b 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs
@@ -57,9 +57,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests
57 config.Configs["Modules"].Set("GridServices", "LocalGridServicesConnector"); 57 config.Configs["Modules"].Set("GridServices", "LocalGridServicesConnector");
58 config.Configs["GridService"].Set("LocalServiceModule", "OpenSim.Services.GridService.dll:GridService"); 58 config.Configs["GridService"].Set("LocalServiceModule", "OpenSim.Services.GridService.dll:GridService");
59 config.Configs["GridService"].Set("StorageProvider", "OpenSim.Data.Null.dll"); 59 config.Configs["GridService"].Set("StorageProvider", "OpenSim.Data.Null.dll");
60 config.Configs["GridService"].Set("Region_Test_Region_1", "DefaultRegion"); 60 config.Configs["GridService"].Set("Region_Test_Region_1", "DefaultRegion");
61 config.Configs["GridService"].Set("Region_Test_Region_2", "FallbackRegion"); 61 config.Configs["GridService"].Set("Region_Test_Region_2", "FallbackRegion");
62 config.Configs["GridService"].Set("Region_Test_Region_3", "FallbackRegion"); 62 config.Configs["GridService"].Set("Region_Test_Region_3", "FallbackRegion");
63 config.Configs["GridService"].Set("Region_Other_Region_4", "FallbackRegion"); 63 config.Configs["GridService"].Set("Region_Other_Region_4", "FallbackRegion");
64 64
65 m_LocalConnector = new LocalGridServicesConnector(config); 65 m_LocalConnector = new LocalGridServicesConnector(config);
@@ -128,8 +128,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests
128 Assert.IsNotNull(result, "Retrieved GetRegionByName is null"); 128 Assert.IsNotNull(result, "Retrieved GetRegionByName is null");
129 Assert.That(result.RegionName, Is.EqualTo("Test Region 1"), "Retrieved region's name does not match"); 129 Assert.That(result.RegionName, Is.EqualTo("Test Region 1"), "Retrieved region's name does not match");
130 130
131 m_LocalConnector.RegisterRegion(UUID.Zero, r2); 131 m_LocalConnector.RegisterRegion(UUID.Zero, r2);
132 m_LocalConnector.RegisterRegion(UUID.Zero, r3); 132 m_LocalConnector.RegisterRegion(UUID.Zero, r3);
133 m_LocalConnector.RegisterRegion(UUID.Zero, r4); 133 m_LocalConnector.RegisterRegion(UUID.Zero, r4);
134 134
135 result = m_LocalConnector.GetRegionByUUID(UUID.Zero, new UUID(1)); 135 result = m_LocalConnector.GetRegionByUUID(UUID.Zero, new UUID(1));
@@ -154,38 +154,38 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests
154 Assert.IsNotNull(results, "Retrieved GetRegionRange collection is null"); 154 Assert.IsNotNull(results, "Retrieved GetRegionRange collection is null");
155 Assert.That(results.Count, Is.EqualTo(2), "Retrieved neighbour collection is not the number expected"); 155 Assert.That(results.Count, Is.EqualTo(2), "Retrieved neighbour collection is not the number expected");
156 156
157 results = m_LocalConnector.GetDefaultRegions(UUID.Zero); 157 results = m_LocalConnector.GetDefaultRegions(UUID.Zero);
158 Assert.IsNotNull(results, "Retrieved GetDefaultRegions collection is null"); 158 Assert.IsNotNull(results, "Retrieved GetDefaultRegions collection is null");
159 Assert.That(results.Count, Is.EqualTo(1), "Retrieved default regions collection has not the expected size"); 159 Assert.That(results.Count, Is.EqualTo(1), "Retrieved default regions collection has not the expected size");
160 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(1)), "Retrieved default region's UUID does not match"); 160 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(1)), "Retrieved default region's UUID does not match");
161 161
162 results = m_LocalConnector.GetFallbackRegions(UUID.Zero, r1.RegionLocX, r1.RegionLocY); 162 results = m_LocalConnector.GetFallbackRegions(UUID.Zero, r1.RegionLocX, r1.RegionLocY);
163 Assert.IsNotNull(results, "Retrieved GetFallbackRegions collection for region 1 is null"); 163 Assert.IsNotNull(results, "Retrieved GetFallbackRegions collection for region 1 is null");
164 Assert.That(results.Count, Is.EqualTo(3), "Retrieved fallback regions collection for region 1 has not the expected size"); 164 Assert.That(results.Count, Is.EqualTo(3), "Retrieved fallback regions collection for region 1 has not the expected size");
165 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(2)), "Retrieved fallback regions for default region are not in the expected order 2-4-3"); 165 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(2)), "Retrieved fallback regions for default region are not in the expected order 2-4-3");
166 Assert.That(results[1].RegionID, Is.EqualTo(new UUID(4)), "Retrieved fallback regions for default region are not in the expected order 2-4-3"); 166 Assert.That(results[1].RegionID, Is.EqualTo(new UUID(4)), "Retrieved fallback regions for default region are not in the expected order 2-4-3");
167 Assert.That(results[2].RegionID, Is.EqualTo(new UUID(3)), "Retrieved fallback regions for default region are not in the expected order 2-4-3"); 167 Assert.That(results[2].RegionID, Is.EqualTo(new UUID(3)), "Retrieved fallback regions for default region are not in the expected order 2-4-3");
168 168
169 results = m_LocalConnector.GetFallbackRegions(UUID.Zero, r2.RegionLocX, r2.RegionLocY); 169 results = m_LocalConnector.GetFallbackRegions(UUID.Zero, r2.RegionLocX, r2.RegionLocY);
170 Assert.IsNotNull(results, "Retrieved GetFallbackRegions collection for region 2 is null"); 170 Assert.IsNotNull(results, "Retrieved GetFallbackRegions collection for region 2 is null");
171 Assert.That(results.Count, Is.EqualTo(3), "Retrieved fallback regions collection for region 2 has not the expected size"); 171 Assert.That(results.Count, Is.EqualTo(3), "Retrieved fallback regions collection for region 2 has not the expected size");
172 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(2)), "Retrieved fallback regions are not in the expected order 2-4-3"); 172 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(2)), "Retrieved fallback regions are not in the expected order 2-4-3");
173 Assert.That(results[1].RegionID, Is.EqualTo(new UUID(4)), "Retrieved fallback regions are not in the expected order 2-4-3"); 173 Assert.That(results[1].RegionID, Is.EqualTo(new UUID(4)), "Retrieved fallback regions are not in the expected order 2-4-3");
174 Assert.That(results[2].RegionID, Is.EqualTo(new UUID(3)), "Retrieved fallback regions are not in the expected order 2-4-3"); 174 Assert.That(results[2].RegionID, Is.EqualTo(new UUID(3)), "Retrieved fallback regions are not in the expected order 2-4-3");
175 175
176 results = m_LocalConnector.GetFallbackRegions(UUID.Zero, r3.RegionLocX, r3.RegionLocY); 176 results = m_LocalConnector.GetFallbackRegions(UUID.Zero, r3.RegionLocX, r3.RegionLocY);
177 Assert.IsNotNull(results, "Retrieved GetFallbackRegions collection for region 3 is null"); 177 Assert.IsNotNull(results, "Retrieved GetFallbackRegions collection for region 3 is null");
178 Assert.That(results.Count, Is.EqualTo(3), "Retrieved fallback regions collection for region 3 has not the expected size"); 178 Assert.That(results.Count, Is.EqualTo(3), "Retrieved fallback regions collection for region 3 has not the expected size");
179 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(3)), "Retrieved fallback regions are not in the expected order 3-4-2"); 179 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(3)), "Retrieved fallback regions are not in the expected order 3-4-2");
180 Assert.That(results[1].RegionID, Is.EqualTo(new UUID(4)), "Retrieved fallback regions are not in the expected order 3-4-2"); 180 Assert.That(results[1].RegionID, Is.EqualTo(new UUID(4)), "Retrieved fallback regions are not in the expected order 3-4-2");
181 Assert.That(results[2].RegionID, Is.EqualTo(new UUID(2)), "Retrieved fallback regions are not in the expected order 3-4-2"); 181 Assert.That(results[2].RegionID, Is.EqualTo(new UUID(2)), "Retrieved fallback regions are not in the expected order 3-4-2");
182 182
183 results = m_LocalConnector.GetFallbackRegions(UUID.Zero, r4.RegionLocX, r4.RegionLocY); 183 results = m_LocalConnector.GetFallbackRegions(UUID.Zero, r4.RegionLocX, r4.RegionLocY);
184 Assert.IsNotNull(results, "Retrieved GetFallbackRegions collection for region 4 is null"); 184 Assert.IsNotNull(results, "Retrieved GetFallbackRegions collection for region 4 is null");
185 Assert.That(results.Count, Is.EqualTo(3), "Retrieved fallback regions collection for region 4 has not the expected size"); 185 Assert.That(results.Count, Is.EqualTo(3), "Retrieved fallback regions collection for region 4 has not the expected size");
186 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(4)), "Retrieved fallback regions are not in the expected order 4-3-2"); 186 Assert.That(results[0].RegionID, Is.EqualTo(new UUID(4)), "Retrieved fallback regions are not in the expected order 4-3-2");
187 Assert.That(results[1].RegionID, Is.EqualTo(new UUID(3)), "Retrieved fallback regions are not in the expected order 4-3-2"); 187 Assert.That(results[1].RegionID, Is.EqualTo(new UUID(3)), "Retrieved fallback regions are not in the expected order 4-3-2");
188 Assert.That(results[2].RegionID, Is.EqualTo(new UUID(2)), "Retrieved fallback regions are not in the expected order 4-3-2"); 188 Assert.That(results[2].RegionID, Is.EqualTo(new UUID(2)), "Retrieved fallback regions are not in the expected order 4-3-2");
189 189
190 results = m_LocalConnector.GetHyperlinks(UUID.Zero); 190 results = m_LocalConnector.GetHyperlinks(UUID.Zero);
191 Assert.IsNotNull(results, "Retrieved GetHyperlinks list is null"); 191 Assert.IsNotNull(results, "Retrieved GetHyperlinks list is null");
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
index e32dbb3..329a259 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
@@ -290,6 +290,23 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
290 return false; 290 return false;
291 } 291 }
292 292
293 public bool CloseChildAgent(GridRegion destination, UUID id)
294 {
295 if (destination == null)
296 return false;
297
298 foreach (Scene s in m_sceneList)
299 {
300 if (s.RegionInfo.RegionID == destination.RegionID)
301 {
302 //m_log.Debug("[LOCAL COMMS]: Found region to SendCloseAgent");
303 return s.IncomingCloseChildAgent(id);
304 }
305 }
306 //m_log.Debug("[LOCAL COMMS]: region not found in SendCloseAgent");
307 return false;
308 }
309
293 /** 310 /**
294 * Object-related communications 311 * Object-related communications
295 */ 312 */
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
index 3f577f2..e16e273 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
@@ -252,6 +252,21 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
252 return false; 252 return false;
253 } 253 }
254 254
255 public bool CloseChildAgent(GridRegion destination, UUID id)
256 {
257 if (destination == null)
258 return false;
259
260 // Try local first
261 if (m_localBackend.CloseChildAgent(destination, id))
262 return true;
263
264 // else do the remote thing
265 if (!m_localBackend.IsLocalRegion(destination.RegionHandle))
266 return m_remoteConnector.CloseChildAgent(destination, id);
267
268 return false;
269 }
255 270
256 public bool CloseAgent(GridRegion destination, UUID id) 271 public bool CloseAgent(GridRegion destination, UUID id)
257 { 272 {
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs
index 30ebb21..9ecbcc6 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs
@@ -172,6 +172,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
172 return m_UserService.GetUserAccount(scopeID, Email); 172 return m_UserService.GetUserAccount(scopeID, Email);
173 } 173 }
174 174
175 public List<UserAccount> GetUserAccountsWhere(UUID scopeID, string query)
176 {
177 return null;
178 }
179
175 public List<UserAccount> GetUserAccounts(UUID scopeID, string query) 180 public List<UserAccount> GetUserAccounts(UUID scopeID, string query)
176 { 181 {
177 return m_UserService.GetUserAccounts(scopeID, query); 182 return m_UserService.GetUserAccounts(scopeID, query);
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
index 3238a81..d948b82 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
@@ -287,6 +287,23 @@ namespace OpenSim.Region.CoreModules.World.Archiver
287 // being no copy/no mod for everyone 287 // being no copy/no mod for everyone
288 lock (part.TaskInventory) 288 lock (part.TaskInventory)
289 { 289 {
290 if (!ResolveUserUuid(part.CreatorID))
291 part.CreatorID = m_scene.RegionInfo.EstateSettings.EstateOwner;
292
293 if (!ResolveUserUuid(part.OwnerID))
294 part.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
295
296 if (!ResolveUserUuid(part.LastOwnerID))
297 part.LastOwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
298
299 // And zap any troublesome sit target information
300 part.SitTargetOrientation = new Quaternion(0, 0, 0, 1);
301 part.SitTargetPosition = new Vector3(0, 0, 0);
302
303 // Fix ownership/creator of inventory items
304 // Not doing so results in inventory items
305 // being no copy/no mod for everyone
306 part.TaskInventory.LockItemsForRead(true);
290 TaskInventoryDictionary inv = part.TaskInventory; 307 TaskInventoryDictionary inv = part.TaskInventory;
291 foreach (KeyValuePair<UUID, TaskInventoryItem> kvp in inv) 308 foreach (KeyValuePair<UUID, TaskInventoryItem> kvp in inv)
292 { 309 {
@@ -302,6 +319,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
302 if (UserManager != null) 319 if (UserManager != null)
303 UserManager.AddUser(kvp.Value.CreatorID, kvp.Value.CreatorData); 320 UserManager.AddUser(kvp.Value.CreatorID, kvp.Value.CreatorData);
304 } 321 }
322 part.TaskInventory.LockItemsForRead(false);
305 } 323 }
306 } 324 }
307 325
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
index ddae20f..75cf0c6 100644
--- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
@@ -29,6 +29,7 @@ using System.Collections.Generic;
29using System.IO; 29using System.IO;
30using System.Reflection; 30using System.Reflection;
31using System.Security; 31using System.Security;
32using System.Timers;
32using log4net; 33using log4net;
33using Nini.Config; 34using Nini.Config;
34using OpenMetaverse; 35using OpenMetaverse;
@@ -45,6 +46,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
45 private delegate void LookupUUIDS(List<UUID> uuidLst); 46 private delegate void LookupUUIDS(List<UUID> uuidLst);
46 47
47 private Scene m_scene; 48 private Scene m_scene;
49 private Timer m_regionChangeTimer = new Timer();
48 50
49 private EstateTerrainXferHandler TerrainUploader; 51 private EstateTerrainXferHandler TerrainUploader;
50 52
@@ -266,7 +268,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
266 268
267 if ((estateAccessType & 4) != 0) // User add 269 if ((estateAccessType & 4) != 0) // User add
268 { 270 {
269 if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || m_scene.Permissions.BypassPermissions()) 271 if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false) || m_scene.Permissions.BypassPermissions())
270 { 272 {
271 m_scene.RegionInfo.EstateSettings.AddEstateUser(user); 273 m_scene.RegionInfo.EstateSettings.AddEstateUser(user);
272 m_scene.RegionInfo.EstateSettings.Save(); 274 m_scene.RegionInfo.EstateSettings.Save();
@@ -281,7 +283,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
281 } 283 }
282 if ((estateAccessType & 8) != 0) // User remove 284 if ((estateAccessType & 8) != 0) // User remove
283 { 285 {
284 if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || m_scene.Permissions.BypassPermissions()) 286 if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false) || m_scene.Permissions.BypassPermissions())
285 { 287 {
286 m_scene.RegionInfo.EstateSettings.RemoveEstateUser(user); 288 m_scene.RegionInfo.EstateSettings.RemoveEstateUser(user);
287 m_scene.RegionInfo.EstateSettings.Save(); 289 m_scene.RegionInfo.EstateSettings.Save();
@@ -296,7 +298,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
296 } 298 }
297 if ((estateAccessType & 16) != 0) // Group add 299 if ((estateAccessType & 16) != 0) // Group add
298 { 300 {
299 if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || m_scene.Permissions.BypassPermissions()) 301 if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false) || m_scene.Permissions.BypassPermissions())
300 { 302 {
301 m_scene.RegionInfo.EstateSettings.AddEstateGroup(user); 303 m_scene.RegionInfo.EstateSettings.AddEstateGroup(user);
302 m_scene.RegionInfo.EstateSettings.Save(); 304 m_scene.RegionInfo.EstateSettings.Save();
@@ -310,7 +312,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
310 } 312 }
311 if ((estateAccessType & 32) != 0) // Group remove 313 if ((estateAccessType & 32) != 0) // Group remove
312 { 314 {
313 if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true) || m_scene.Permissions.BypassPermissions()) 315 if (m_scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false) || m_scene.Permissions.BypassPermissions())
314 { 316 {
315 m_scene.RegionInfo.EstateSettings.RemoveEstateGroup(user); 317 m_scene.RegionInfo.EstateSettings.RemoveEstateGroup(user);
316 m_scene.RegionInfo.EstateSettings.Save(); 318 m_scene.RegionInfo.EstateSettings.Save();
@@ -359,7 +361,11 @@ namespace OpenSim.Region.CoreModules.World.Estate
359 { 361 {
360 if (!s.IsChildAgent) 362 if (!s.IsChildAgent)
361 { 363 {
362 m_scene.TeleportClientHome(user, s.ControllingClient); 364 if (!m_scene.TeleportClientHome(user, s.ControllingClient))
365 {
366 s.ControllingClient.Kick("Your access to the region was revoked and TP home failed - you have been logged out.");
367 s.ControllingClient.Close();
368 }
363 } 369 }
364 } 370 }
365 371
@@ -493,7 +499,11 @@ namespace OpenSim.Region.CoreModules.World.Estate
493 ScenePresence s = m_scene.GetScenePresence(prey); 499 ScenePresence s = m_scene.GetScenePresence(prey);
494 if (s != null) 500 if (s != null)
495 { 501 {
496 m_scene.TeleportClientHome(prey, s.ControllingClient); 502 if (!m_scene.TeleportClientHome(prey, s.ControllingClient))
503 {
504 s.ControllingClient.Kick("You were teleported home by the region owner, but the TP failed - you have been logged out.");
505 s.ControllingClient.Close();
506 }
497 } 507 }
498 } 508 }
499 } 509 }
@@ -512,7 +522,11 @@ namespace OpenSim.Region.CoreModules.World.Estate
512 // Also make sure they are actually in the region 522 // Also make sure they are actually in the region
513 if (p != null && !p.IsChildAgent) 523 if (p != null && !p.IsChildAgent)
514 { 524 {
515 m_scene.TeleportClientHome(p.UUID, p.ControllingClient); 525 if (!m_scene.TeleportClientHome(p.UUID, p.ControllingClient))
526 {
527 p.ControllingClient.Kick("You were teleported home by the region owner, but the TP failed - you have been logged out.");
528 p.ControllingClient.Close();
529 }
516 } 530 }
517 } 531 }
518 }); 532 });
@@ -921,6 +935,9 @@ namespace OpenSim.Region.CoreModules.World.Estate
921 m_scene.RegisterModuleInterface<IEstateModule>(this); 935 m_scene.RegisterModuleInterface<IEstateModule>(this);
922 m_scene.EventManager.OnNewClient += EventManager_OnNewClient; 936 m_scene.EventManager.OnNewClient += EventManager_OnNewClient;
923 m_scene.EventManager.OnRequestChangeWaterHeight += changeWaterHeight; 937 m_scene.EventManager.OnRequestChangeWaterHeight += changeWaterHeight;
938 m_regionChangeTimer.AutoReset = false;
939 m_regionChangeTimer.Interval = 2000;
940 m_regionChangeTimer.Elapsed += RaiseRegionInfoChange;
924 941
925 m_scene.AddCommand(this, "set terrain texture", 942 m_scene.AddCommand(this, "set terrain texture",
926 "set terrain texture <number> <uuid> [<x>] [<y>]", 943 "set terrain texture <number> <uuid> [<x>] [<y>]",
@@ -1193,6 +1210,12 @@ namespace OpenSim.Region.CoreModules.World.Estate
1193 1210
1194 protected void TriggerRegionInfoChange() 1211 protected void TriggerRegionInfoChange()
1195 { 1212 {
1213 m_regionChangeTimer.Stop();
1214 m_regionChangeTimer.Start();
1215 }
1216
1217 protected void RaiseRegionInfoChange(object sender, ElapsedEventArgs e)
1218 {
1196 ChangeDelegate change = OnRegionInfoChange; 1219 ChangeDelegate change = OnRegionInfoChange;
1197 1220
1198 if (change != null) 1221 if (change != null)
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
index 695202f..9779c68 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
@@ -85,6 +85,8 @@ namespace OpenSim.Region.CoreModules.World.Land
85 private int m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1; 85 private int m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1;
86 86
87 private bool m_allowedForcefulBans = true; 87 private bool m_allowedForcefulBans = true;
88 private UUID DefaultGodParcelGroup;
89 private string DefaultGodParcelName;
88 90
89 // caches ExtendedLandData 91 // caches ExtendedLandData
90 private Cache parcelInfoCache; 92 private Cache parcelInfoCache;
@@ -100,6 +102,12 @@ namespace OpenSim.Region.CoreModules.World.Land
100 102
101 public void Initialise(IConfigSource source) 103 public void Initialise(IConfigSource source)
102 { 104 {
105 IConfig cnf = source.Configs["LandManagement"];
106 if (cnf != null)
107 {
108 DefaultGodParcelGroup = new UUID(cnf.GetString("DefaultAdministratorGroupUUID", UUID.Zero.ToString()));
109 DefaultGodParcelName = cnf.GetString("DefaultAdministratorParcelName", "Default Parcel");
110 }
103 } 111 }
104 112
105 public void AddRegion(Scene scene) 113 public void AddRegion(Scene scene)
@@ -351,7 +359,7 @@ namespace OpenSim.Region.CoreModules.World.Land
351 { 359 {
352 if (avatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT) 360 if (avatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT)
353 { 361 {
354 if (parcelAvatarIsEntering.IsBannedFromLand(avatar.UUID)) 362 if (parcelAvatarIsEntering.IsEitherBannedOrRestricted(avatar.UUID))
355 { 363 {
356 SendYouAreBannedNotice(avatar); 364 SendYouAreBannedNotice(avatar);
357 ForceAvatarToPosition(avatar, m_scene.GetNearestAllowedPosition(avatar)); 365 ForceAvatarToPosition(avatar, m_scene.GetNearestAllowedPosition(avatar));
@@ -648,7 +656,7 @@ namespace OpenSim.Region.CoreModules.World.Land
648 int x; 656 int x;
649 int y; 657 int y;
650 658
651 if (x_float > Constants.RegionSize || x_float <= 0 || y_float > Constants.RegionSize || y_float <= 0) 659 if (x_float > Constants.RegionSize || x_float < 0 || y_float > Constants.RegionSize || y_float < 0)
652 return null; 660 return null;
653 661
654 try 662 try
@@ -991,6 +999,10 @@ namespace OpenSim.Region.CoreModules.World.Land
991 //Owner Flag 999 //Owner Flag
992 tempByte = Convert.ToByte(tempByte | LandChannel.LAND_TYPE_OWNED_BY_REQUESTER); 1000 tempByte = Convert.ToByte(tempByte | LandChannel.LAND_TYPE_OWNED_BY_REQUESTER);
993 } 1001 }
1002 else if (currentParcelBlock.LandData.IsGroupOwned && remote_client.IsGroupMember(currentParcelBlock.LandData.GroupID))
1003 {
1004 tempByte = Convert.ToByte(tempByte | LandChannel.LAND_TYPE_OWNED_BY_GROUP);
1005 }
994 else if (currentParcelBlock.LandData.SalePrice > 0 && 1006 else if (currentParcelBlock.LandData.SalePrice > 0 &&
995 (currentParcelBlock.LandData.AuthBuyerID == UUID.Zero || 1007 (currentParcelBlock.LandData.AuthBuyerID == UUID.Zero ||
996 currentParcelBlock.LandData.AuthBuyerID == remote_client.AgentId)) 1008 currentParcelBlock.LandData.AuthBuyerID == remote_client.AgentId))
@@ -1285,7 +1297,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1285 { 1297 {
1286 land.DeedToGroup(groupID); 1298 land.DeedToGroup(groupID);
1287 } 1299 }
1288 1300 EventManagerOnParcelPrimCountTainted();
1289 } 1301 }
1290 1302
1291 1303
@@ -1293,18 +1305,31 @@ namespace OpenSim.Region.CoreModules.World.Land
1293 1305
1294 public void EventManagerOnIncomingLandDataFromStorage(List<LandData> data) 1306 public void EventManagerOnIncomingLandDataFromStorage(List<LandData> data)
1295 { 1307 {
1296 for (int i = 0; i < data.Count; i++) 1308 lock (m_landList)
1297 { 1309 {
1298 IncomingLandObjectFromStorage(data[i]); 1310 //Remove all the land objects in the sim and then process our new data
1311 foreach (int n in m_landList.Keys)
1312 {
1313 m_scene.EventManager.TriggerLandObjectRemoved(m_landList[n].LandData.GlobalID);
1314 }
1315 m_landIDList.Initialize();
1316 m_landList.Clear();
1317
1318 for (int i = 0; i < data.Count; i++)
1319 {
1320 IncomingLandObjectFromStorage(data[i]);
1321 }
1299 } 1322 }
1300 } 1323 }
1301 1324
1302 public void IncomingLandObjectFromStorage(LandData data) 1325 public void IncomingLandObjectFromStorage(LandData data)
1303 { 1326 {
1327
1304 ILandObject new_land = new LandObject(data.OwnerID, data.IsGroupOwned, m_scene); 1328 ILandObject new_land = new LandObject(data.OwnerID, data.IsGroupOwned, m_scene);
1305 new_land.LandData = data.Copy(); 1329 new_land.LandData = data.Copy();
1306 new_land.SetLandBitmapFromByteArray(); 1330 new_land.SetLandBitmapFromByteArray();
1307 AddLandObject(new_land); 1331 AddLandObject(new_land);
1332 new_land.SendLandUpdateToAvatarsOverMe();
1308 } 1333 }
1309 1334
1310 public void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient) 1335 public void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient)
@@ -1577,5 +1602,321 @@ namespace OpenSim.Region.CoreModules.World.Land
1577 1602
1578 UpdateLandObject(localID, land.LandData); 1603 UpdateLandObject(localID, land.LandData);
1579 } 1604 }
1605
1606 public void ClientOnParcelGodMark(IClientAPI client, UUID god, int landID)
1607 {
1608 ILandObject land = null;
1609 List<ILandObject> Land = ((Scene)client.Scene).LandChannel.AllParcels();
1610 foreach (ILandObject landObject in Land)
1611 {
1612 if (landObject.LandData.LocalID == landID)
1613 {
1614 land = landObject;
1615 }
1616 }
1617 land.DeedToGroup(DefaultGodParcelGroup);
1618 land.LandData.Name = DefaultGodParcelName;
1619 land.SendLandUpdateToAvatarsOverMe();
1620 }
1621
1622 private void ClientOnSimWideDeletes(IClientAPI client, UUID agentID, int flags, UUID targetID)
1623 {
1624 ScenePresence SP;
1625 ((Scene)client.Scene).TryGetScenePresence(client.AgentId, out SP);
1626 List<SceneObjectGroup> returns = new List<SceneObjectGroup>();
1627 if (SP.GodLevel != 0)
1628 {
1629 if (flags == 0) //All parcels, scripted or not
1630 {
1631 ((Scene)client.Scene).ForEachSOG(delegate(SceneObjectGroup e)
1632 {
1633 if (e.OwnerID == targetID)
1634 {
1635 returns.Add(e);
1636 }
1637 }
1638 );
1639 }
1640 if (flags == 4) //All parcels, scripted object
1641 {
1642 ((Scene)client.Scene).ForEachSOG(delegate(SceneObjectGroup e)
1643 {
1644 if (e.OwnerID == targetID)
1645 {
1646 if (e.scriptScore >= 0.01)
1647 {
1648 returns.Add(e);
1649 }
1650 }
1651 }
1652 );
1653 }
1654 if (flags == 4) //not target parcel, scripted object
1655 {
1656 ((Scene)client.Scene).ForEachSOG(delegate(SceneObjectGroup e)
1657 {
1658 if (e.OwnerID == targetID)
1659 {
1660 ILandObject landobject = ((Scene)client.Scene).LandChannel.GetLandObject(e.AbsolutePosition.X, e.AbsolutePosition.Y);
1661 if (landobject.LandData.OwnerID != e.OwnerID)
1662 {
1663 if (e.scriptScore >= 0.01)
1664 {
1665 returns.Add(e);
1666 }
1667 }
1668 }
1669 }
1670 );
1671 }
1672 foreach (SceneObjectGroup ol in returns)
1673 {
1674 ReturnObject(ol, client);
1675 }
1676 }
1677 }
1678 public void ReturnObject(SceneObjectGroup obj, IClientAPI client)
1679 {
1680 SceneObjectGroup[] objs = new SceneObjectGroup[1];
1681 objs[0] = obj;
1682 ((Scene)client.Scene).returnObjects(objs, client.AgentId);
1683 }
1684
1685 Dictionary<UUID, System.Threading.Timer> Timers = new Dictionary<UUID, System.Threading.Timer>();
1686
1687 public void ClientOnParcelFreezeUser(IClientAPI client, UUID parcelowner, uint flags, UUID target)
1688 {
1689 ScenePresence targetAvatar = null;
1690 ((Scene)client.Scene).TryGetScenePresence(target, out targetAvatar);
1691 ScenePresence parcelManager = null;
1692 ((Scene)client.Scene).TryGetScenePresence(client.AgentId, out parcelManager);
1693 System.Threading.Timer Timer;
1694
1695 if (targetAvatar.GodLevel == 0)
1696 {
1697 ILandObject land = ((Scene)client.Scene).LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y);
1698 if (!((Scene)client.Scene).Permissions.CanEditParcel(client.AgentId, land))
1699 return;
1700 if (flags == 0)
1701 {
1702 targetAvatar.AllowMovement = false;
1703 targetAvatar.ControllingClient.SendAlertMessage(parcelManager.Firstname + " " + parcelManager.Lastname + " has frozen you for 30 seconds. You cannot move or interact with the world.");
1704 parcelManager.ControllingClient.SendAlertMessage("Avatar Frozen.");
1705 System.Threading.TimerCallback timeCB = new System.Threading.TimerCallback(OnEndParcelFrozen);
1706 Timer = new System.Threading.Timer(timeCB, targetAvatar, 30000, 0);
1707 Timers.Add(targetAvatar.UUID, Timer);
1708 }
1709 else
1710 {
1711 targetAvatar.AllowMovement = true;
1712 targetAvatar.ControllingClient.SendAlertMessage(parcelManager.Firstname + " " + parcelManager.Lastname + " has unfrozen you.");
1713 parcelManager.ControllingClient.SendAlertMessage("Avatar Unfrozen.");
1714 Timers.TryGetValue(targetAvatar.UUID, out Timer);
1715 Timers.Remove(targetAvatar.UUID);
1716 Timer.Dispose();
1717 }
1718 }
1719 }
1720 private void OnEndParcelFrozen(object avatar)
1721 {
1722 ScenePresence targetAvatar = (ScenePresence)avatar;
1723 targetAvatar.AllowMovement = true;
1724 System.Threading.Timer Timer;
1725 Timers.TryGetValue(targetAvatar.UUID, out Timer);
1726 Timers.Remove(targetAvatar.UUID);
1727 targetAvatar.ControllingClient.SendAgentAlertMessage("The freeze has worn off; you may go about your business.", false);
1728 }
1729
1730
1731 public void ClientOnParcelEjectUser(IClientAPI client, UUID parcelowner, uint flags, UUID target)
1732 {
1733 ScenePresence targetAvatar = null;
1734 ((Scene)client.Scene).TryGetScenePresence(target, out targetAvatar);
1735 ScenePresence parcelManager = null;
1736 ((Scene)client.Scene).TryGetScenePresence(client.AgentId, out parcelManager);
1737 //Just eject
1738 if (flags == 0)
1739 {
1740 if (targetAvatar.GodLevel == 0)
1741 {
1742 ILandObject land = ((Scene)client.Scene).LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y);
1743 if (!((Scene)client.Scene).Permissions.CanEditParcel(client.AgentId, land))
1744 return;
1745
1746 Vector3 position = new Vector3(0, 0, 0);
1747 List<ILandObject> allParcels = new List<ILandObject>();
1748 allParcels = AllParcels();
1749 if (allParcels.Count != 1)
1750 {
1751 foreach (ILandObject parcel in allParcels)
1752 {
1753 if (parcel.LandData.GlobalID != land.LandData.GlobalID)
1754 {
1755 if (parcel.IsEitherBannedOrRestricted(targetAvatar.UUID) != true)
1756 {
1757 for (int x = 1; x <= Constants.RegionSize; x += 2)
1758 {
1759 for (int y = 1; y <= Constants.RegionSize; y += 2)
1760 {
1761 if (parcel.ContainsPoint(x, y))
1762 {
1763 position = new Vector3(x, y, targetAvatar.AbsolutePosition.Z);
1764 targetAvatar.TeleportWithMomentum(position);
1765 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1766 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected.");
1767 return;
1768 }
1769 }
1770 }
1771 }
1772 }
1773 }
1774 }
1775 Vector3 targetVector;
1776 if (targetAvatar.AbsolutePosition.X > targetAvatar.AbsolutePosition.Y)
1777 {
1778 if (targetAvatar.AbsolutePosition.X > .5 * Constants.RegionSize)
1779 {
1780 targetVector = new Vector3(Constants.RegionSize, targetAvatar.AbsolutePosition.Y, targetAvatar.AbsolutePosition.Z); ;
1781 targetAvatar.TeleportWithMomentum(targetVector);
1782 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1783 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected.");
1784 return;
1785 }
1786 else
1787 {
1788 targetVector = new Vector3(0, targetAvatar.AbsolutePosition.Y, targetAvatar.AbsolutePosition.Z); ;
1789 targetAvatar.TeleportWithMomentum(targetVector);
1790 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1791 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected.");
1792 return;
1793 }
1794 }
1795 else
1796 {
1797 if (targetAvatar.AbsolutePosition.Y > .5 * Constants.RegionSize)
1798 {
1799 targetVector = new Vector3(targetAvatar.AbsolutePosition.X, Constants.RegionSize, targetAvatar.AbsolutePosition.Z); ;
1800 targetAvatar.TeleportWithMomentum(targetVector);
1801 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1802 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected.");
1803 return;
1804 }
1805 else
1806 {
1807 targetVector = new Vector3(targetAvatar.AbsolutePosition.X, 0, targetAvatar.AbsolutePosition.Z); ;
1808 targetAvatar.TeleportWithMomentum(targetVector);
1809 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1810 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected.");
1811 return;
1812 }
1813 }
1814 }
1815 }
1816 //Eject and ban
1817 if (flags == 1)
1818 {
1819 if (targetAvatar.GodLevel == 0)
1820 {
1821 ILandObject land = ((Scene)client.Scene).LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y);
1822 if (!((Scene)client.Scene).Permissions.CanEditParcel(client.AgentId, land))
1823 return;
1824
1825 Vector3 position = new Vector3(0, 0, 0);
1826 List<ILandObject> allParcels = new List<ILandObject>();
1827 allParcels = AllParcels();
1828 if (allParcels.Count != 1)
1829 {
1830 foreach (ILandObject parcel in allParcels)
1831 {
1832 if (parcel.LandData.GlobalID != land.LandData.GlobalID)
1833 {
1834 if (parcel.IsEitherBannedOrRestricted(targetAvatar.UUID) != true)
1835 {
1836 for (int x = 1; x <= Constants.RegionSize; x += 2)
1837 {
1838 for (int y = 1; y <= Constants.RegionSize; y += 2)
1839 {
1840 if (parcel.ContainsPoint(x, y))
1841 {
1842 position = new Vector3(x, y, targetAvatar.AbsolutePosition.Z);
1843 targetAvatar.TeleportWithMomentum(position);
1844 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected and banned by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1845 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected and Banned.");
1846 ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
1847 entry.AgentID = targetAvatar.UUID;
1848 entry.Flags = AccessList.Ban;
1849 entry.Time = new DateTime();
1850 land.LandData.ParcelAccessList.Add(entry);
1851 return;
1852 }
1853 }
1854 }
1855 }
1856 }
1857 }
1858 }
1859 Vector3 targetVector;
1860 if (targetAvatar.AbsolutePosition.X > targetAvatar.AbsolutePosition.Y)
1861 {
1862 if (targetAvatar.AbsolutePosition.X > .5 * Constants.RegionSize)
1863 {
1864 targetVector = new Vector3(Constants.RegionSize, targetAvatar.AbsolutePosition.Y, targetAvatar.AbsolutePosition.Z); ;
1865 targetAvatar.TeleportWithMomentum(targetVector);
1866 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected and banned by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1867 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected and Banned.");
1868 ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
1869 entry.AgentID = targetAvatar.UUID;
1870 entry.Flags = AccessList.Ban;
1871 entry.Time = new DateTime();
1872 land.LandData.ParcelAccessList.Add(entry);
1873 return;
1874 }
1875 else
1876 {
1877 targetVector = new Vector3(0, targetAvatar.AbsolutePosition.Y, targetAvatar.AbsolutePosition.Z); ;
1878 targetAvatar.TeleportWithMomentum(targetVector);
1879 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected and banned by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1880 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected and Banned.");
1881 ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
1882 entry.AgentID = targetAvatar.UUID;
1883 entry.Flags = AccessList.Ban;
1884 entry.Time = new DateTime();
1885 land.LandData.ParcelAccessList.Add(entry);
1886 return;
1887 }
1888 }
1889 else
1890 {
1891 if (targetAvatar.AbsolutePosition.Y > .5 * Constants.RegionSize)
1892 {
1893 targetVector = new Vector3(targetAvatar.AbsolutePosition.X, Constants.RegionSize, targetAvatar.AbsolutePosition.Z); ;
1894 targetAvatar.TeleportWithMomentum(targetVector);
1895 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected and banned by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1896 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected and Banned.");
1897 ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
1898 entry.AgentID = targetAvatar.UUID;
1899 entry.Flags = AccessList.Ban;
1900 entry.Time = new DateTime();
1901 land.LandData.ParcelAccessList.Add(entry);
1902 return;
1903 }
1904 else
1905 {
1906 targetVector = new Vector3(targetAvatar.AbsolutePosition.X, 0, targetAvatar.AbsolutePosition.Z); ;
1907 targetAvatar.TeleportWithMomentum(targetVector);
1908 targetAvatar.ControllingClient.SendAlertMessage("You have been ejected and banned by " + parcelManager.Firstname + " " + parcelManager.Lastname);
1909 parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected and Banned.");
1910 ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
1911 entry.AgentID = targetAvatar.UUID;
1912 entry.Flags = AccessList.Ban;
1913 entry.Time = new DateTime();
1914 land.LandData.ParcelAccessList.Add(entry);
1915 return;
1916 }
1917 }
1918 }
1919 }
1920 }
1580 } 1921 }
1581} 1922}
diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
index d87352f..d596887 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
@@ -288,6 +288,37 @@ namespace OpenSim.Region.CoreModules.World.Land
288 return false; 288 return false;
289 } 289 }
290 290
291 public bool HasGroupAccess(UUID avatar)
292 {
293 if (LandData.GroupID != UUID.Zero && (LandData.Flags & (uint)ParcelFlags.UseAccessGroup) == (uint)ParcelFlags.UseAccessGroup)
294 {
295 ScenePresence sp;
296 if (!m_scene.TryGetScenePresence(avatar, out sp))
297 {
298 IGroupsModule groupsModule = m_scene.RequestModuleInterface<IGroupsModule>();
299 if (groupsModule == null)
300 return false;
301
302 GroupMembershipData[] membership = groupsModule.GetMembershipData(avatar);
303 if (membership == null || membership.Length == 0)
304 return false;
305
306 foreach (GroupMembershipData d in membership)
307 {
308 if (d.GroupID == LandData.GroupID)
309 return true;
310 }
311 return false;
312 }
313
314 if (!sp.ControllingClient.IsGroupMember(LandData.GroupID))
315 return false;
316
317 return true;
318 }
319 return false;
320 }
321
291 public bool IsBannedFromLand(UUID avatar) 322 public bool IsBannedFromLand(UUID avatar)
292 { 323 {
293 if (m_scene.Permissions.IsAdministrator(avatar)) 324 if (m_scene.Permissions.IsAdministrator(avatar))
@@ -324,10 +355,14 @@ namespace OpenSim.Region.CoreModules.World.Land
324 //If they are not on the access list and are not the owner 355 //If they are not on the access list and are not the owner
325 if (!LandData.ParcelAccessList.Contains(entry) && LandData.OwnerID != avatar) 356 if (!LandData.ParcelAccessList.Contains(entry) && LandData.OwnerID != avatar)
326 { 357 {
327 //They are not allowed in this parcel, but not banned, so lets send them a notice about this parcel 358 if (!HasGroupAccess(avatar))
328 return true; 359 {
360 //They are not allowed in this parcel, but not banned, so lets send them a notice about this parcel
361 return true;
362 }
329 } 363 }
330 } 364 }
365
331 return false; 366 return false;
332 } 367 }
333 368
diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
index f5f3839..289741f 100644
--- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
+++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
@@ -412,7 +412,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
412 412
413 public string Name 413 public string Name
414 { 414 {
415 get { return "PermissionsModule"; } 415 get { return "DefaultPermissionsModule"; }
416 } 416 }
417 417
418 public bool IsSharedModule 418 public bool IsSharedModule
diff --git a/OpenSim/Region/CoreModules/World/Region/RestartModule.cs b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs
index c65aa6a..6e1ee10 100644
--- a/OpenSim/Region/CoreModules/World/Region/RestartModule.cs
+++ b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs
@@ -28,6 +28,8 @@
28using System; 28using System;
29using System.Reflection; 29using System.Reflection;
30using System.Timers; 30using System.Timers;
31using System.IO;
32using System.Diagnostics;
31using System.Threading; 33using System.Threading;
32using System.Collections.Generic; 34using System.Collections.Generic;
33using log4net; 35using log4net;
@@ -56,13 +58,23 @@ namespace OpenSim.Region.CoreModules.World.Region
56 protected UUID m_Initiator; 58 protected UUID m_Initiator;
57 protected bool m_Notice = false; 59 protected bool m_Notice = false;
58 protected IDialogModule m_DialogModule = null; 60 protected IDialogModule m_DialogModule = null;
61 protected string m_MarkerPath;
59 62
60 public void Initialise(IConfigSource config) 63 public void Initialise(IConfigSource config)
61 { 64 {
65 IConfig restartConfig = config.Configs["RestartModule"];
66 if (restartConfig != null)
67 {
68 m_MarkerPath = restartConfig.GetString("MarkerPath", String.Empty);
69 }
62 } 70 }
63 71
64 public void AddRegion(Scene scene) 72 public void AddRegion(Scene scene)
65 { 73 {
74 if (m_MarkerPath != String.Empty)
75 File.Delete(Path.Combine(m_MarkerPath,
76 scene.RegionInfo.RegionID.ToString()));
77
66 m_Scene = scene; 78 m_Scene = scene;
67 scene.RegisterModuleInterface<IRestartModule>(this); 79 scene.RegisterModuleInterface<IRestartModule>(this);
68 MainConsole.Instance.Commands.AddCommand("RestartModule", 80 MainConsole.Instance.Commands.AddCommand("RestartModule",
@@ -114,6 +126,7 @@ namespace OpenSim.Region.CoreModules.World.Region
114 126
115 if (alerts == null) 127 if (alerts == null)
116 { 128 {
129 CreateMarkerFile();
117 m_Scene.RestartNow(); 130 m_Scene.RestartNow();
118 return; 131 return;
119 } 132 }
@@ -127,6 +140,7 @@ namespace OpenSim.Region.CoreModules.World.Region
127 140
128 if (m_Alerts[0] == 0) 141 if (m_Alerts[0] == 0)
129 { 142 {
143 CreateMarkerFile();
130 m_Scene.RestartNow(); 144 m_Scene.RestartNow();
131 return; 145 return;
132 } 146 }
@@ -140,6 +154,7 @@ namespace OpenSim.Region.CoreModules.World.Region
140 { 154 {
141 if (m_Alerts.Count == 0 || m_Alerts[0] == 0) 155 if (m_Alerts.Count == 0 || m_Alerts[0] == 0)
142 { 156 {
157 CreateMarkerFile();
143 m_Scene.RestartNow(); 158 m_Scene.RestartNow();
144 return 0; 159 return 0;
145 } 160 }
@@ -259,5 +274,25 @@ namespace OpenSim.Region.CoreModules.World.Region
259 274
260 ScheduleRestart(UUID.Zero, args[3], times.ToArray(), notice); 275 ScheduleRestart(UUID.Zero, args[3], times.ToArray(), notice);
261 } 276 }
277
278 protected void CreateMarkerFile()
279 {
280 if (m_MarkerPath == String.Empty)
281 return;
282
283 string path = Path.Combine(m_MarkerPath, m_Scene.RegionInfo.RegionID.ToString());
284 try
285 {
286 string pidstring = System.Diagnostics.Process.GetCurrentProcess().Id.ToString();
287 FileStream fs = File.Create(path);
288 System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
289 Byte[] buf = enc.GetBytes(pidstring);
290 fs.Write(buf, 0, buf.Length);
291 fs.Close();
292 }
293 catch (Exception)
294 {
295 }
296 }
262 } 297 }
263} 298}
diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
index 25d73c2..4611352 100644
--- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
+++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
@@ -549,6 +549,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain
549 m_scene.PhysicsScene.SetTerrain(m_channel.GetFloatsSerialised()); 549 m_scene.PhysicsScene.SetTerrain(m_channel.GetFloatsSerialised());
550 m_scene.SaveTerrain(); 550 m_scene.SaveTerrain();
551 551
552 m_scene.EventManager.TriggerTerrainUpdate();
553
552 // Clients who look at the map will never see changes after they looked at the map, so i've commented this out. 554 // Clients who look at the map will never see changes after they looked at the map, so i've commented this out.
553 //m_scene.CreateTerrainTexture(true); 555 //m_scene.CreateTerrainTexture(true);
554 } 556 }
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs
index 9f88517..d2c3afb 100644
--- a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs
+++ b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs
@@ -86,9 +86,9 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
86 86
87 private void OnMapNameRequest(IClientAPI remoteClient, string mapName) 87 private void OnMapNameRequest(IClientAPI remoteClient, string mapName)
88 { 88 {
89 if (mapName.Length < 3) 89 if (mapName.Length < 2)
90 { 90 {
91 remoteClient.SendAlertMessage("Use a search string with at least 3 characters"); 91 remoteClient.SendAlertMessage("Use a search string with at least 2 characters");
92 return; 92 return;
93 } 93 }
94 94